ng-jvx-multiselect 17.0.3 → 17.0.6

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.
@@ -3,8 +3,8 @@ import { NgJvxOptionsTemplateDirective } from './directives/ng-jvx-options-templ
3
3
  import { UntypedFormControl } from '@angular/forms';
4
4
  import { NgJvxOptionComponent } from './ng-jvx-option/ng-jvx-option.component';
5
5
  import { HttpHeaders } from '@angular/common/http';
6
- import { debounceTime, distinctUntilChanged, map, switchMap, takeUntil, tap } from 'rxjs/operators';
7
- import { BehaviorSubject, forkJoin, fromEvent, noop, of, Subject, timer } from 'rxjs';
6
+ import { catchError, debounceTime, distinctUntilChanged, map, switchMap, takeUntil, tap } from 'rxjs/operators';
7
+ import { BehaviorSubject, forkJoin, fromEvent, noop, of, Subject, throwError, timer } from 'rxjs';
8
8
  import { NgJvxSelectionTemplateDirective } from './directives/ng-jvx-selection-template.directive';
9
9
  import { MatFormFieldControl } from '@angular/material/form-field';
10
10
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
@@ -27,14 +27,19 @@ export class NgJvxMultiselectComponent {
27
27
  return this.focused || !this.empty || this.value.length > 0 || !!this.isPlaceholderActive;
28
28
  }
29
29
  set value(value) {
30
- this.pValue = value ?? [];
31
- if (value) {
32
- this.form.get('selectionValue').setValue(this.pValue.map(v => v[this.itemValue]));
33
- }
34
- else {
35
- this.form.get('selectionValue').setValue(value);
30
+ if (!this.areArraysEqual(value, this.pValue)) {
31
+ this.pValue = value ?? [];
32
+ this.showList = !this.showList;
33
+ if (value) {
34
+ this.form.get('selectionValue').setValue(this.pValue.map(v => v[this.itemValue]));
35
+ }
36
+ else {
37
+ this.form.get('selectionValue').setValue(value);
38
+ }
39
+ this.changeDetectorRef.detectChanges();
40
+ this.showList = !this.showList;
41
+ this.stateChanges.next();
36
42
  }
37
- this.stateChanges.next();
38
43
  }
39
44
  get value() {
40
45
  return this.pValue;
@@ -207,6 +212,40 @@ export class NgJvxMultiselectComponent {
207
212
  this.changeDetectorRef.markForCheck();
208
213
  });
209
214
  }
215
+ areArraysEqual(arr1, arr2) {
216
+ // Se entrambi sono null o undefined, sono uguali
217
+ if (!arr1 && !arr2) {
218
+ return true;
219
+ }
220
+ // Se solo uno dei due è null/undefined, sono diversi
221
+ if (!arr1 || !arr2) {
222
+ return false;
223
+ }
224
+ // Se hanno lunghezza diversa, sono diversi
225
+ if (arr1.length !== arr2.length) {
226
+ return false;
227
+ }
228
+ // Verifica che ogni elemento di arr1 abbia una corrispondenza in arr2
229
+ return arr1.every(item1 => {
230
+ return arr2.some(item2 => {
231
+ if (typeof item1 === 'object' && item1 !== null) {
232
+ // Se gli elementi sono oggetti, confronta i valori itemValue
233
+ return item1[this.itemValue] === item2[this.itemValue];
234
+ }
235
+ // Altrimenti confronta direttamente i valori
236
+ return item1 === item2;
237
+ });
238
+ }) &&
239
+ // Verifica anche il contrario per assicurarsi che non ci siano elementi extra
240
+ arr2.every(item2 => {
241
+ return arr1.some(item1 => {
242
+ if (typeof item2 === 'object' && item2 !== null) {
243
+ return item2[this.itemValue] === item1[this.itemValue];
244
+ }
245
+ return item2 === item1;
246
+ });
247
+ });
248
+ }
210
249
  clientSearch() {
211
250
  let obs;
212
251
  if (this.url && this.url.length > 0) {
@@ -363,7 +402,7 @@ export class NgJvxMultiselectComponent {
363
402
  });
364
403
  }
365
404
  clickOnMenuTrigger(e) {
366
- if (!this.disabled) {
405
+ if (!this.disabled && !this.isLoading) {
367
406
  this.showList = false;
368
407
  this.shouldLoadMore = true;
369
408
  timer(0).subscribe(() => {
@@ -430,6 +469,10 @@ export class NgJvxMultiselectComponent {
430
469
  return val;
431
470
  }), tap(() => {
432
471
  this.changeDetectorRef.markForCheck();
472
+ }), catchError((error) => {
473
+ this.isLoading = false;
474
+ this.changeDetectorRef.markForCheck();
475
+ return throwError(() => error);
433
476
  }));
434
477
  }
435
478
  onScrolled(e) {
@@ -512,16 +555,19 @@ export class NgJvxMultiselectComponent {
512
555
  closeMenu() {
513
556
  this.trigger.closeMenu();
514
557
  }
515
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgJvxMultiselectComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.NgJvxMultiselectService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
516
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.8", type: NgJvxMultiselectComponent, selector: "ng-jvx-multiselect", inputs: { options: "options", multi: "multi", url: "url", requestType: "requestType", itemValue: "itemValue", itemText: "itemText", ignorePagination: "ignorePagination", clearable: "clearable", closeOnClick: "closeOnClick", hasErrors: "hasErrors", searchMode: "searchMode", searchInput: "searchInput", searchLabel: "searchLabel", listProp: "listProp", totalRowsProp: "totalRowsProp", panelClass: "panelClass", searchProp: "searchProp", closeButton: "closeButton", mapper: "mapper", multiMapper: "multiMapper", searchMapper: "searchMapper", groupBy: "groupBy", value: "value", requestHeaders: "requestHeaders", required: "required", disabled: "disabled", pageSize: "pageSize" }, outputs: { valueChange: "valueChange", jvxMultiselectOpen: "jvxMultiselectOpen", jvxMultiselectOpened: "jvxMultiselectOpened", jvxMultiselectClose: "jvxMultiselectClose", jvxMultiselectClosed: "jvxMultiselectClosed", scrollEnd: "scrollEnd" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat" } }, providers: [
558
+ optionsIsSelected(option) {
559
+ return this.form.get('selectionValue').value.some(s => s === option[this.itemValue]);
560
+ }
561
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgJvxMultiselectComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.NgJvxMultiselectService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
562
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NgJvxMultiselectComponent, selector: "ng-jvx-multiselect", inputs: { options: "options", multi: "multi", url: "url", requestType: "requestType", itemValue: "itemValue", itemText: "itemText", ignorePagination: "ignorePagination", clearable: "clearable", closeOnClick: "closeOnClick", hasErrors: "hasErrors", searchMode: "searchMode", searchInput: "searchInput", searchLabel: "searchLabel", listProp: "listProp", totalRowsProp: "totalRowsProp", panelClass: "panelClass", searchProp: "searchProp", closeButton: "closeButton", mapper: "mapper", multiMapper: "multiMapper", searchMapper: "searchMapper", groupBy: "groupBy", value: "value", requestHeaders: "requestHeaders", required: "required", disabled: "disabled", pageSize: "pageSize" }, outputs: { valueChange: "valueChange", jvxMultiselectOpen: "jvxMultiselectOpen", jvxMultiselectOpened: "jvxMultiselectOpened", jvxMultiselectClose: "jvxMultiselectClose", jvxMultiselectClosed: "jvxMultiselectClosed", scrollEnd: "scrollEnd" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat" } }, providers: [
517
563
  {
518
564
  provide: MatFormFieldControl,
519
565
  useExisting: forwardRef(() => NgJvxMultiselectComponent),
520
566
  multi: true,
521
567
  }
522
- ], queries: [{ propertyName: "optionsTemplate", first: true, predicate: NgJvxOptionsTemplateDirective, descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: NgJvxSelectionTemplateDirective, descendants: true }, { propertyName: "groupHeaderTemplate", first: true, predicate: NgJvxGroupHeaderDirective, descendants: true }], viewQueries: [{ propertyName: "jvxMultiselect", first: true, predicate: ["jvxMultiselect"], descendants: true, static: true }, { propertyName: "valueContainer", first: true, predicate: ["valueContainer"], descendants: true, static: true }, { propertyName: "selectionContainer", first: true, predicate: ["selectionContainer"], descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true, static: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, static: true }, { propertyName: "scrollbar", first: true, predicate: ["scrollbar"], descendants: true }, { propertyName: "multiContainer", first: true, predicate: ["multiContainer"], descendants: true }, { propertyName: "placeholderContainer", first: true, predicate: ["placeholderContainer"], descendants: true }, { propertyName: "optionComp", predicate: NgJvxOptionComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\">\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'min-width.px': 112, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div\r\n [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n ngDefaultControl\r\n formControlName=\"selectionValue\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\">\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n @if (value.length === 0) {\r\n <div class=\"ng-jvx-multiselect__placeholder\" #placeholderContainer>\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{ option[itemText] }}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{ value[itemText] }}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-listbox #chipList [disabled]=\"this.disabled\">\r\n <mat-chip-option [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{ val[itemText] }}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{ opt.group }}</strong></div>\r\n</ng-template>\r\n", styles: ["ng-jvx-multiselect{display:flex;align-items:center;width:100%}ng-jvx-multiselect .ng-jvx-multiselect{width:100%;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container{width:100%;display:flex;cursor:pointer;position:relative;justify-content:space-between;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__placeholder{height:100%;display:flex;align-items:center;position:absolute}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value{flex:1 1 100%;max-width:calc(100% - 28px);display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip{padding:0 5px 0 7px;margin:4px 5px 0}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip .chip-content{margin-left:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__remove-button{display:flex;height:100%;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow{width:24px;padding-right:4px;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow mat-icon{transition:transform .3s ease-in-out}@keyframes lds-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring{display:inline-block;position:relative;width:24px;height:24px}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div{box-sizing:border-box;display:block;position:absolute;width:6px;height:16px;margin:4px;border:2px solid;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--jvx-multiselect-accent) transparent transparent transparent}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(1){animation-delay:-.45s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(2){animation-delay:-.3s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(3){animation-delay:-.15s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container.is-open .ng-jvx-multiselect-arrow mat-icon{transform:rotate(180deg)}ng-jvx-multiselect .ng-jvx-multiselect.disabled{pointer-events:none}ng-jvx-multiselect .ng-jvx-multiselect.disabled .ng-jvx-multiselect-arrow mat-icon{opacity:.3}ng-jvx-multiselect .ng-jvx-multiselect.has-errors{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.single-value-container{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.multi-value-container{width:100%}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-arrow mat-icon{color:red}.mat-select-test{width:250px}.menu-list-container{max-height:300px;display:flex;flex-direction:column}.menu-footer{max-height:30px;overflow:hidden}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel{max-width:100%;position:relative;overflow:visible}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton{height:22px;width:22px;background-color:var(--jvx-multiselect-primary);position:absolute;top:-11px;right:11px;border-radius:100%;cursor:pointer;color:#fff;z-index:10}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton mat-icon{color:#fff;font-size:15px;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .menu-list-container ng-scrollbar{--scrollbar-color: transparent;--scrollbar-container-color: transparent;--scrollbar-thumb-color: var(--jvx-multiselect-accent);--scrollbar-thumb-hover-color: var(--jvx-multiselect-accent);--scrollbar-border-radius: 4px;--scrollbar-size: 6px;--scrollbar-padding: 8px;--scroll-view-margin: 0;--scroll-view-color: transparent}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container{height:40px;display:flex;align-items:center;padding:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input{width:100%;outline:none;border:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:focus{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:active{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .ng-jvx-option-wrapper,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .ng-jvx-option-wrapper{padding-inline:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .mdc-list-item__end,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .mdc-list-item__end{display:none}\n"], dependencies: [{ kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i7.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i7.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["color", "disabled", "disableRipple", "tabIndex", "selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "directive", type: i9.SmoothScroll, selector: "[smoothScroll], [smooth-scroll]", exportAs: ["smoothScroll"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgJvxOptionComponent, selector: "ng-jvx-option", inputs: ["value"] }, { kind: "directive", type: i11.NgJvxFocusDirective, selector: "[ngJvxFocus]", inputs: ["ngJvxFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
568
+ ], queries: [{ propertyName: "optionsTemplate", first: true, predicate: NgJvxOptionsTemplateDirective, descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: NgJvxSelectionTemplateDirective, descendants: true }, { propertyName: "groupHeaderTemplate", first: true, predicate: NgJvxGroupHeaderDirective, descendants: true }], viewQueries: [{ propertyName: "jvxMultiselect", first: true, predicate: ["jvxMultiselect"], descendants: true, static: true }, { propertyName: "valueContainer", first: true, predicate: ["valueContainer"], descendants: true, static: true }, { propertyName: "selectionContainer", first: true, predicate: ["selectionContainer"], descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true, static: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, static: true }, { propertyName: "scrollbar", first: true, predicate: ["scrollbar"], descendants: true }, { propertyName: "multiContainer", first: true, predicate: ["multiContainer"], descendants: true }, { propertyName: "placeholderContainer", first: true, predicate: ["placeholderContainer"], descendants: true }, { propertyName: "optionComp", predicate: NgJvxOptionComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\">\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'min-width.px': 112, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div\r\n [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n ngDefaultControl\r\n formControlName=\"selectionValue\">\r\n\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\" [isSelected]=\"optionsIsSelected(option)\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\" [isSelected]=\"optionsIsSelected(option)\">\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n @if (value.length === 0) {\r\n <div class=\"ng-jvx-multiselect__placeholder\" #placeholderContainer>\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{ option[itemText] }}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{ value[itemText] }}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-listbox #chipList [disabled]=\"this.disabled\">\r\n <mat-chip-option [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{ val[itemText] }}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{ opt.group }}</strong></div>\r\n</ng-template>\r\n", styles: ["ng-jvx-multiselect{display:flex;align-items:center;width:100%}ng-jvx-multiselect .ng-jvx-multiselect{width:100%;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container{width:100%;display:flex;cursor:pointer;position:relative;justify-content:space-between;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__placeholder{height:100%;display:flex;align-items:center;position:absolute}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value{flex:1 1 100%;max-width:calc(100% - 28px);display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip{padding:0 5px 0 7px;margin:4px 5px 0}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip .chip-content{margin-left:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__remove-button{display:flex;height:100%;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow{width:24px;padding-right:4px;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow mat-icon{transition:transform .3s ease-in-out}@keyframes lds-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring{display:inline-block;position:relative;width:24px;height:24px}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div{box-sizing:border-box;display:block;position:absolute;width:6px;height:16px;margin:4px;border:2px solid;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--jvx-multiselect-accent) transparent transparent transparent}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(1){animation-delay:-.45s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(2){animation-delay:-.3s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(3){animation-delay:-.15s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container.is-open .ng-jvx-multiselect-arrow mat-icon{transform:rotate(180deg)}ng-jvx-multiselect .ng-jvx-multiselect.disabled{pointer-events:none}ng-jvx-multiselect .ng-jvx-multiselect.disabled .ng-jvx-multiselect-arrow mat-icon{opacity:.3}ng-jvx-multiselect .ng-jvx-multiselect.has-errors{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.single-value-container{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.multi-value-container{width:100%}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-arrow mat-icon{color:red}.mat-select-test{width:250px}.menu-list-container{max-height:300px;display:flex;flex-direction:column}.menu-footer{max-height:30px;overflow:hidden}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel{max-width:100%;position:relative;overflow:visible}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton{height:22px;width:22px;background-color:var(--jvx-multiselect-primary);position:absolute;top:-11px;right:11px;border-radius:100%;cursor:pointer;color:#fff;z-index:10}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton mat-icon{color:#fff;font-size:15px;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .menu-list-container ng-scrollbar{--scrollbar-color: transparent;--scrollbar-container-color: transparent;--scrollbar-thumb-color: var(--jvx-multiselect-accent);--scrollbar-thumb-hover-color: var(--jvx-multiselect-accent);--scrollbar-border-radius: 4px;--scrollbar-size: 6px;--scrollbar-padding: 8px;--scroll-view-margin: 0;--scroll-view-color: transparent}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container{height:40px;display:flex;align-items:center;padding:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input{width:100%;outline:none;border:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:focus{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:active{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .ng-jvx-option-wrapper,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .ng-jvx-option-wrapper{padding-inline:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .mdc-list-item__end,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .mdc-list-item__end{display:none}\n"], dependencies: [{ kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i7.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i7.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "directive", type: i7.MatChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "directive", type: i9.SmoothScroll, selector: "[smoothScroll], [smooth-scroll]", exportAs: ["smoothScroll"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgJvxOptionComponent, selector: "ng-jvx-option", inputs: ["value", "isSelected"] }, { kind: "directive", type: i11.NgJvxFocusDirective, selector: "[ngJvxFocus]", inputs: ["ngJvxFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
523
569
  }
524
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImport: i0, type: NgJvxMultiselectComponent, decorators: [{
570
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgJvxMultiselectComponent, decorators: [{
525
571
  type: Component,
526
572
  args: [{ selector: 'ng-jvx-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
527
573
  {
@@ -529,7 +575,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
529
575
  useExisting: forwardRef(() => NgJvxMultiselectComponent),
530
576
  multi: true,
531
577
  }
532
- ], template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\">\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'min-width.px': 112, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div\r\n [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n ngDefaultControl\r\n formControlName=\"selectionValue\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\">\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n @if (value.length === 0) {\r\n <div class=\"ng-jvx-multiselect__placeholder\" #placeholderContainer>\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{ option[itemText] }}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{ value[itemText] }}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-listbox #chipList [disabled]=\"this.disabled\">\r\n <mat-chip-option [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{ val[itemText] }}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{ opt.group }}</strong></div>\r\n</ng-template>\r\n", styles: ["ng-jvx-multiselect{display:flex;align-items:center;width:100%}ng-jvx-multiselect .ng-jvx-multiselect{width:100%;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container{width:100%;display:flex;cursor:pointer;position:relative;justify-content:space-between;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__placeholder{height:100%;display:flex;align-items:center;position:absolute}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value{flex:1 1 100%;max-width:calc(100% - 28px);display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip{padding:0 5px 0 7px;margin:4px 5px 0}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip .chip-content{margin-left:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__remove-button{display:flex;height:100%;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow{width:24px;padding-right:4px;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow mat-icon{transition:transform .3s ease-in-out}@keyframes lds-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring{display:inline-block;position:relative;width:24px;height:24px}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div{box-sizing:border-box;display:block;position:absolute;width:6px;height:16px;margin:4px;border:2px solid;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--jvx-multiselect-accent) transparent transparent transparent}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(1){animation-delay:-.45s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(2){animation-delay:-.3s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(3){animation-delay:-.15s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container.is-open .ng-jvx-multiselect-arrow mat-icon{transform:rotate(180deg)}ng-jvx-multiselect .ng-jvx-multiselect.disabled{pointer-events:none}ng-jvx-multiselect .ng-jvx-multiselect.disabled .ng-jvx-multiselect-arrow mat-icon{opacity:.3}ng-jvx-multiselect .ng-jvx-multiselect.has-errors{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.single-value-container{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.multi-value-container{width:100%}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-arrow mat-icon{color:red}.mat-select-test{width:250px}.menu-list-container{max-height:300px;display:flex;flex-direction:column}.menu-footer{max-height:30px;overflow:hidden}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel{max-width:100%;position:relative;overflow:visible}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton{height:22px;width:22px;background-color:var(--jvx-multiselect-primary);position:absolute;top:-11px;right:11px;border-radius:100%;cursor:pointer;color:#fff;z-index:10}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton mat-icon{color:#fff;font-size:15px;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .menu-list-container ng-scrollbar{--scrollbar-color: transparent;--scrollbar-container-color: transparent;--scrollbar-thumb-color: var(--jvx-multiselect-accent);--scrollbar-thumb-hover-color: var(--jvx-multiselect-accent);--scrollbar-border-radius: 4px;--scrollbar-size: 6px;--scrollbar-padding: 8px;--scroll-view-margin: 0;--scroll-view-color: transparent}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container{height:40px;display:flex;align-items:center;padding:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input{width:100%;outline:none;border:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:focus{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:active{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .ng-jvx-option-wrapper,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .ng-jvx-option-wrapper{padding-inline:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .mdc-list-item__end,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .mdc-list-item__end{display:none}\n"] }]
578
+ ], template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\">\r\n <mat-icon>close</mat-icon>\r\n </div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'min-width.px': 112, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div\r\n [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n ngDefaultControl\r\n formControlName=\"selectionValue\">\r\n\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\" [isSelected]=\"optionsIsSelected(option)\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\" [isSelected]=\"optionsIsSelected(option)\">\r\n <div class=\"ng-jvx-option-wrapper\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </div>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n @if (value.length === 0) {\r\n <div class=\"ng-jvx-multiselect__placeholder\" #placeholderContainer>\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n }\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container>\r\n </div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{ option[itemText] }}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{ value[itemText] }}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-listbox #chipList [disabled]=\"this.disabled\">\r\n <mat-chip-option [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{ val[itemText] }}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip-option>\r\n </mat-chip-listbox>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{ opt.group }}</strong></div>\r\n</ng-template>\r\n", styles: ["ng-jvx-multiselect{display:flex;align-items:center;width:100%}ng-jvx-multiselect .ng-jvx-multiselect{width:100%;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container{width:100%;display:flex;cursor:pointer;position:relative;justify-content:space-between;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__placeholder{height:100%;display:flex;align-items:center;position:absolute}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value{flex:1 1 100%;max-width:calc(100% - 28px);display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip{padding:0 5px 0 7px;margin:4px 5px 0}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-value .mat-chip-list-wrapper .mat-mdc-standard-chip .chip-content{margin-left:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect__remove-button{display:flex;height:100%;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow{width:24px;padding-right:4px;display:flex;align-items:center}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow mat-icon{transition:transform .3s ease-in-out}@keyframes lds-ring{0%{transform:rotate(0)}to{transform:rotate(360deg)}}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring{display:inline-block;position:relative;width:24px;height:24px}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div{box-sizing:border-box;display:block;position:absolute;width:6px;height:16px;margin:4px;border:2px solid;border-radius:50%;animation:lds-ring 1.2s cubic-bezier(.5,0,.5,1) infinite;border-color:var(--jvx-multiselect-accent) transparent transparent transparent}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(1){animation-delay:-.45s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(2){animation-delay:-.3s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container .ng-jvx-multiselect-arrow .lds-ring div:nth-child(3){animation-delay:-.15s}ng-jvx-multiselect .ng-jvx-multiselect .ng-jvx-multiselect-value-container.is-open .ng-jvx-multiselect-arrow mat-icon{transform:rotate(180deg)}ng-jvx-multiselect .ng-jvx-multiselect.disabled{pointer-events:none}ng-jvx-multiselect .ng-jvx-multiselect.disabled .ng-jvx-multiselect-arrow mat-icon{opacity:.3}ng-jvx-multiselect .ng-jvx-multiselect.has-errors{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.single-value-container{color:red}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-value.multi-value-container{width:100%}ng-jvx-multiselect .ng-jvx-multiselect.has-errors .ng-jvx-multiselect-arrow mat-icon{color:red}.mat-select-test{width:250px}.menu-list-container{max-height:300px;display:flex;flex-direction:column}.menu-footer{max-height:30px;overflow:hidden}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel{max-width:100%;position:relative;overflow:visible}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton{height:22px;width:22px;background-color:var(--jvx-multiselect-primary);position:absolute;top:-11px;right:11px;border-radius:100%;cursor:pointer;color:#fff;z-index:10}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .closeMenuButton mat-icon{color:#fff;font-size:15px;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .menu-list-container ng-scrollbar{--scrollbar-color: transparent;--scrollbar-container-color: transparent;--scrollbar-thumb-color: var(--jvx-multiselect-accent);--scrollbar-thumb-hover-color: var(--jvx-multiselect-accent);--scrollbar-border-radius: 4px;--scrollbar-size: 6px;--scrollbar-padding: 8px;--scroll-view-margin: 0;--scroll-view-color: transparent}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container{height:40px;display:flex;align-items:center;padding:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input{width:100%;outline:none;border:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:focus{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .search-input-container input:active{outline:none}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list{padding-top:0!important;padding-bottom:0!important}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .ng-jvx-option-wrapper,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .ng-jvx-option-wrapper{padding-inline:10px}.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=true] .mdc-list-item__end,.cdk-overlay-pane .mat-mdc-menu-panel.jvx-multiselect-panel .mat-mdc-menu-content .mat-mdc-selection-list .mat-mdc-list-option[aria-selected=false] .mdc-list-item__end{display:none}\n"] }]
533
579
  }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.NgJvxMultiselectService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
534
580
  type: Optional
535
581
  }, {
@@ -642,4 +688,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.8", ngImpor
642
688
  }], scrollEnd: [{
643
689
  type: Output
644
690
  }] } });
645
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWp2eC1tdWx0aXNlbGVjdC9zcmMvbGliL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1qdngtbXVsdGlzZWxlY3Qvc3JjL2xpYi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLElBQUksRUFFSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RixPQUFPLEVBQXNELGtCQUFrQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXpILE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBRzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBZSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hILE9BQU8sRUFBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEcsT0FBTyxFQUFDLCtCQUErQixFQUFDLE1BQU0sa0RBQWtELENBQUM7QUFDakcsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENB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Y0csY0FBYztzQkFBdEIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7Z0JBY0YsUUFBUTtzQkFEWCxLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkF3QkksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLCBEb0NoZWNrLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTZWxmLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LW9wdGlvbnMtdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge01hdFNlbGVjdGlvbkxpc3QsIE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xyXG5pbXBvcnQge05nSnZ4T3B0aW9uQ29tcG9uZW50fSBmcm9tICcuL25nLWp2eC1vcHRpb24vbmctanZ4LW9wdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQge01hdE1lbnVUcmlnZ2VyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHtOZ0p2eE11bHRpc2VsZWN0U2VydmljZX0gZnJvbSAnLi9uZy1qdngtbXVsdGlzZWxlY3Quc2VydmljZSc7XHJcbmltcG9ydCB7SHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtOZ1Njcm9sbGJhcn0gZnJvbSAnbmd4LXNjcm9sbGJhcic7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwLCB0aHJvdHRsZVRpbWV9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIGZvcmtKb2luLCBmcm9tRXZlbnQsIG5vb3AsIE9ic2VydmFibGUsIG9mLCBTdWJqZWN0LCB0aW1lcn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7TmdKdnhNdWx0aU9wdGlvbk1hcHBlciwgTmdKdnhPcHRpb25NYXBwZXJ9IGZyb20gJy4vaW50ZXJmYWNlcy9uZy1qdngtb3B0aW9uLW1hcHBlcic7XHJcbmltcG9ydCB7TmdKdnhTZWxlY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nLWp2eC1zZWxlY3Rpb24tdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtNYXRGb3JtRmllbGRDb250cm9sfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHtjb2VyY2VCb29sZWFuUHJvcGVydHl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7TmdKdnhHcm91cEhlYWRlckRpcmVjdGl2ZX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nLWp2eC1ncm91cC1oZWFkZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtOZ0p2eFNlYXJjaE1hcHBlcn0gZnJvbSAnLi9pbnRlcmZhY2VzL25nLWp2eC1zZWFyY2gtbWFwcGVyJztcclxuaW1wb3J0IHtOZ0p2eEdyb3VwLCBOZ0p2eEdyb3VwTWFwcGVyfSBmcm9tICcuL2ludGVyZmFjZXMvbmctanZ4LWdyb3VwLW1hcHBlcic7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICduZy1qdngtbXVsdGlzZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ0p2eE11bHRpc2VsZWN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEb0NoZWNrLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgTWF0Rm9ybUZpZWxkQ29udHJvbDxhbnk+LFxyXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBzdGF0aWMgbmV4dElkID0gMDtcclxuICBASG9zdEJpbmRpbmcoKSBpZCA9IGBqdngtbXVsdGlzZWxlY3QtJHtOZ0p2eE11bHRpc2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmxvYXRpbmcnKVxyXG4gIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eSB8fCB0aGlzLnZhbHVlLmxlbmd0aCA+IDAgfHwgISF0aGlzLmlzUGxhY2Vob2xkZXJBY3RpdmU7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdqdnhNdWx0aXNlbGVjdCcsIHtzdGF0aWM6IHRydWV9KSBqdnhNdWx0aXNlbGVjdDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd2YWx1ZUNvbnRhaW5lcicsIHtzdGF0aWM6IHRydWV9KSB2YWx1ZUNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3Rpb25Db250YWluZXInLCB7c3RhdGljOiBmYWxzZX0pIHNlbGVjdGlvbkNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3Rpb24nLCB7c3RhdGljOiB0cnVlfSkgc2VsZWN0aW9uOiBNYXRTZWxlY3Rpb25MaXN0O1xyXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXInLCB7c3RhdGljOiB0cnVlfSkgdHJpZ2dlcjogTWF0TWVudVRyaWdnZXI7XHJcbiAgQFZpZXdDaGlsZCgnc2Nyb2xsYmFyJywge3N0YXRpYzogZmFsc2V9KSBzY3JvbGxiYXI6IE5nU2Nyb2xsYmFyO1xyXG4gIEBWaWV3Q2hpbGQoJ211bHRpQ29udGFpbmVyJywge3N0YXRpYzogZmFsc2V9KSBtdWx0aUNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdwbGFjZWhvbGRlckNvbnRhaW5lcicsIHtzdGF0aWM6IGZhbHNlfSkgcGxhY2Vob2xkZXJDb250YWluZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbihOZ0p2eE9wdGlvbkNvbXBvbmVudCkgb3B0aW9uQ29tcDogUXVlcnlMaXN0PE5nSnZ4T3B0aW9uQ29tcG9uZW50PjtcclxuICBAQ29udGVudENoaWxkKE5nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlKSBvcHRpb25zVGVtcGxhdGU6IE5nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlIHwgbnVsbCA9IG51bGw7XHJcbiAgQENvbnRlbnRDaGlsZChOZ0p2eFNlbGVjdGlvblRlbXBsYXRlRGlyZWN0aXZlKSBzZWxlY3Rpb25UZW1wbGF0ZTogTmdKdnhTZWxlY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBDb250ZW50Q2hpbGQoTmdKdnhHcm91cEhlYWRlckRpcmVjdGl2ZSkgZ3JvdXBIZWFkZXJUZW1wbGF0ZTogTmdKdnhHcm91cEhlYWRlckRpcmVjdGl2ZSB8IG51bGwgPSBudWxsO1xyXG4gIC8vIEBDb250ZW50Q2hpbGQoTmdKdnhPcHRpb25Db21wb25lbnQpIG9wdGlvbkNvbXA6IE5nSnZ4T3B0aW9uQ29tcG9uZW50O1xyXG4gIC8vIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIG9wdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgbXVsdGkgPSBmYWxzZTtcclxuICBASW5wdXQoKSB1cmwgPSAnJztcclxuICBASW5wdXQoKSByZXF1ZXN0VHlwZTogJ2dldCcgfCAncG9zdCcgPSAnZ2V0JztcclxuICBASW5wdXQoKSBpdGVtVmFsdWUgPSAndmFsdWUnO1xyXG4gIEBJbnB1dCgpIGl0ZW1UZXh0ID0gJ3RleHQnO1xyXG4gIEBJbnB1dCgpIGlnbm9yZVBhZ2luYXRpb24gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbGVhcmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2sgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlYXJjaE1vZGU6IG51bGwgfCAnc2VydmVyJyB8ICdjbGllbnQnID0gbnVsbDtcclxuICBASW5wdXQoKSBzZWFyY2hJbnB1dCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlYXJjaExhYmVsID0gJ3NlYXJjaCc7XHJcbiAgQElucHV0KCkgbGlzdFByb3AgPSAnJztcclxuICBASW5wdXQoKSB0b3RhbFJvd3NQcm9wID0gJyc7XHJcbiAgQElucHV0KCkgcGFuZWxDbGFzcyA9ICcnO1xyXG4gIEBJbnB1dCgpIHNlYXJjaFByb3AgPSAnc2VhcmNoJztcclxuICBASW5wdXQoKSBjbG9zZUJ1dHRvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1hcHBlcjogTmdKdnhPcHRpb25NYXBwZXI8YW55PiA9IHtcclxuICAgIG1hcE9wdGlvbihzb3VyY2U6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiBvZihzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgbXVsdGlNYXBwZXI6IE5nSnZ4TXVsdGlPcHRpb25NYXBwZXI8YW55PiA9IHtcclxuICAgIG1hcE9wdGlvbnMoc291cmNlOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiBvZihzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgc2VhcmNoTWFwcGVyOiBOZ0p2eFNlYXJjaE1hcHBlcjxhbnk+ID0ge1xyXG4gICAgbWFwU2VhcmNoOiAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgICAgcmV0dXJuIG9mKG9wdGlvbnMuZmlsdGVyKG8gPT4gb1t0aGlzLml0ZW1UZXh0XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc291cmNlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpKTtcclxuICAgIH1cclxuICB9O1xyXG4gIEBJbnB1dCgpIGdyb3VwQnk6IE5nSnZ4R3JvdXBNYXBwZXI8YW55PiB8IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogYW55W10pIHtcclxuICAgIHRoaXMucFZhbHVlID0gdmFsdWUgPz8gW107XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLnBWYWx1ZS5tYXAodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdEhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJlcXVpcmVkKHJlcSkge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICAgIHRoaXMuX2Rpc2FibGVkID8gdGhpcy5wYXJ0cy5kaXNhYmxlKCkgOiB0aGlzLnBhcnRzLmVuYWJsZSgpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmludFBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBhZ2VTaXplKHZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsIDwgMTUpIHtcclxuICAgICAgdGhpcy5pbnRQYWdlU2l6ZSA9IDE1O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRQYWdlU2l6ZSA9IHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGVycm9yU3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCAmJiB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuICBAT3V0cHV0KCkganZ4TXVsdGlzZWxlY3RPcGVuOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0T3BlbmVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0Q2xvc2U6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkganZ4TXVsdGlzZWxlY3RDbG9zZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2Nyb2xsRW5kOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBjb250cm9sVHlwZSA9ICduZy1qdngtbXVsdGlzZWxlY3QnO1xyXG4gIHB1YmxpYyBkb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gIHB1YmxpYyB3aW5kb3cgPSB3aW5kb3c7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0xpc3QgPSB0cnVlO1xyXG4gIHB1YmxpYyBhc3luY09wdGlvbnM6IGFueSA9IFtdO1xyXG4gIHB1YmxpYyBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gIHB1YmxpYyBvcmRlcmVkT3B0aW9uczogeyBncm91cDogYW55LCBvcHRpb25zOiBhbnlbXSB9W10gPSBbXTtcclxuICBwdWJsaWMgc2VhcmNoVmFsdWUgPSAnJztcclxuICBwdWJsaWMgeVBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyA9ICdhYm92ZSc7XHJcbiAgcHVibGljIHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHVibGljIGN1cnJlbnRQYWdlID0gMDtcclxuICBwdWJsaWMgbGlzdENvbnRhaW5lclNpemU6IHsgaGVpZ2h0OiBzdHJpbmcsIG1pbkhlaWdodDogc3RyaW5nLCB3aWR0aDogc3RyaW5nIH0gPSB7aGVpZ2h0OiAnYXV0bycsIG1pbkhlaWdodDogJzAnLCB3aWR0aDogJzEwMCUnfTtcclxuICBwdWJsaWMgcGFydHM6IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyB0b3VjaGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIHB1YmxpYyBmb2N1c2VkID0gZmFsc2U7XHJcbiAgcHVibGljIG11bHRpQ29udGFpbmVyV2lkdGggPSAxMDA7XHJcbiAgcHJpdmF0ZSBpc1BsYWNlaG9sZGVyQWN0aXZlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUgaXNQbGFjZWhvbGRlckFjdGl2ZSA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc2VhcmNoVmFsdWVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIHByaXZhdGUgc2VhcmNoVmFsdWUkID0gdGhpcy5zZWFyY2hWYWx1ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSBwVmFsdWU6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSB0aGlzLnVuc3Vic2NyaWJlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgaW50UGFnZVNpemUgPSAxNTtcclxuICBwdWJsaWMgb25Ub3VjaGVkID0gKCkgPT4ge1xyXG4gIH07XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2VydmljZTogTmdKdnhNdWx0aXNlbGVjdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBmYjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAvLyBTZXR0aW5nIHRoZSB2YWx1ZSBhY2Nlc3NvciBkaXJlY3RseSAoaW5zdGVhZCBvZiB1c2luZ1xyXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1BsYWNlaG9sZGVyQWN0aXZlU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDApKS5zdWJzY3JpYmUoKHYpID0+IHtcclxuICAgICAgdGhpcy5pc1BsYWNlaG9sZGVyQWN0aXZlID0gdjtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhcnRzID0gZmIuZ3JvdXAoe1xyXG4gICAgICBhcmVhOiAnJyxcclxuICAgICAgZXhjaGFuZ2U6ICcnLFxyXG4gICAgICBzdWJzY3JpYmVyOiAnJyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHNlbGVjdGlvblZhbHVlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHRoaXMuc2VsZWN0aW9uVmFsdWUpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNQbGFjZWhvbGRlckFjdGl2ZVN1YmplY3QubmV4dCh0aGlzLnBsYWNlaG9sZGVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5oYXNDaGlsZE5vZGVzKCkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gICAgLy8gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zXTtcclxuICAgIHRoaXMudXBkYXRlT3JkZXJlZE9wdGlvbnModGhpcy5zZWxlY3RhYmxlT3B0aW9ucykuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoMTAwKSwgbWFwKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG5cclxuICAgIH0pLCBzd2l0Y2hNYXAoKCkgPT4gdGltZXIoMTAwKSksIHRhcCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250YWluZXJXaWR0aCA9IHRoaXMubXVsdGlDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoID8/IDEwMDtcclxuICAgICAgdGhpcy55UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpPy50b3AgPCAyNjAgPyAnYWJvdmUnIDogJ2JlbG93JztcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pKS5zdWJzY3JpYmUobm9vcCk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSksIGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdXJyID09PSB0aGlzLnNlYXJjaFZhbHVlO1xyXG4gICAgICB9KSwgc3dpdGNoTWFwKCh2YWw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbDtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZSA9PT0gJ2NsaWVudCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U2VhcmNoKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyU2VhcmNoKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApLnN1YnNjcmliZSgodmFsOiBhbnlbXSkgPT4ge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsaWVudFNlYXJjaCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IG9iczogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gICAgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgICB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICAgIG9icyA9IHRoaXMuZ2V0TGlzdCgpLnBpcGUobWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RhYmxlT3B0aW9ucztcclxuICAgICAgfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb2JzID0gb2YodGhpcy5vcHRpb25zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYnMucGlwZShzd2l0Y2hNYXAoKHZhbCkgPT4gdGhpcy5zZWFyY2hNYXBwZXIubWFwU2VhcmNoKHRoaXMuc2VhcmNoVmFsdWUsIHZhbCkpLCBzd2l0Y2hNYXAoKHJlcykgPT4ge1xyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLnNldFNlbGVjdGFibGVPcHRpb25zKHJlcyk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMucHVzaCguLi5yZXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0YWJsZU9wdGlvbnMob3B0aW9uczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPGFueT5bXSA9IG9wdGlvbnMucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcclxuICAgICAgYWNjLnB1c2godGhpcy5tYXBwZXIubWFwT3B0aW9uKGN1cnIpKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIFtdKTtcclxuXHJcbiAgICAvLyB0aGlzLm1hcHBlci5tYXBPcHRpb24ob3B0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4oWy4uLm9ic10pLnBpcGUoc3dpdGNoTWFwKCh2YWwpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5wdXNoKC4uLnZhbCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXJ2ZXJTZWFyY2goKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlLm5leHQoKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLndpZHRoID0gdGhpcy5qdnhNdWx0aXNlbGVjdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICB0aGlzLnNjcm9sbGJhci5zY3JvbGxlZC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblNjcm9sbGVkKGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRpbWVyKDApLnBpcGUodGFwKCgpID0+IHtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRhaW5lcldpZHRoID0gdGhpcy5tdWx0aUNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8ub2Zmc2V0V2lkdGggPz8gMTAwO1xyXG4gICAgICB0aGlzLnlQb3NpdGlvbiA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuanZ4TXVsdGlzZWxlY3QubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk/LnRvcCA8IDI2MCA/ICdhYm92ZScgOiAnYmVsb3cnO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSkpLnN1YnNjcmliZShub29wKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuICAgICAgLy8gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBzZWxlY3Rpb25WYWx1ZSgpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5tYXAoKHYpID0+IHtcclxuICAgICAgcmV0dXJuIHZbdGhpcy5pdGVtVmFsdWVdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5wYXJ0cy52YWx1ZTtcclxuICAgIHJldHVybiAhbi5hcmVhICYmICFuLmV4Y2hhbmdlICYmICFuLnN1YnNjcmliZXIgJiYgIXRoaXMuaXNQbGFjZWhvbGRlckFjdGl2ZTtcclxuICB9XHJcblxyXG4gIG9uQ0xpY2tPbk1lbnUoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubXVsdGkgfHwgdGhpcy5jbG9zZU9uQ2xpY2sgPT09IGZhbHNlKSB7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBwcm9wYWdhdGVDaGFuZ2UoXzogYW55KTogYW55IHtcclxuICB9XHJcblxyXG4gIC8vIHRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IHRvIHRoZSBjb21wb25lbnRcclxuICBwdWJsaWMgd3JpdGVWYWx1ZShvYmo6IGFueVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gb2JqO1xyXG4gIH1cclxuXHJcbiAgLy8gcmVnaXN0ZXJzICdmbicgdGhhdCB3aWxsIGJlIGZpcmVkIHdoZW4gY2hhbmdlcyBhcmUgbWFkZVxyXG4gIC8vIHRoaXMgaXMgaG93IHdlIGVtaXQgdGhlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybVxyXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgb25DaGFuZ2UoZTogTWF0U2VsZWN0aW9uTGlzdENoYW5nZSk6IHZvaWQge1xyXG5cclxuICAgIGxldCB2YWxzID0gZS5zb3VyY2Uuc2VsZWN0ZWRPcHRpb25zLnNlbGVjdGVkLm1hcChvID0+IG8udmFsdWUpO1xyXG4gICAgdmFscyA9IHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMuZmlsdGVyKG8gPT4gdmFscy5pbmNsdWRlcyhvW3RoaXMuaXRlbVZhbHVlXSkpO1xyXG4gICAgY29uc3Qgc2VsZWN0YWJsZUlkcyA9IHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMubWFwKHMgPT4gc1t0aGlzLml0ZW1WYWx1ZV0pO1xyXG4gICAgaWYgKHRoaXMubXVsdGkpIHtcclxuICAgICAgLy8gaWYgc2VhcmNoIGlzIGFjdGl2ZSwgcHJvYmFibHkgc29tZSBvZiB0aGUgYWxyZWFkeSBzZWxlY3RlZCB2YWx1ZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgc2VsZWN0YWJsZSBvcHRpb25zLFxyXG4gICAgICAvLyBzbyB3ZSBoYXZlIHRvIHB1c2ggdGhlbSBpbiB0aGUgc2VsZWN0ZWQgdmFsdWVzIG9mIHRoZSBsaXN0O1xyXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgdGhpcy52YWx1ZSkge1xyXG4gICAgICAgIGlmICghc2VsZWN0YWJsZUlkcy5pbmNsdWRlcyh2W3RoaXMuaXRlbVZhbHVlXSkpIHtcclxuICAgICAgICAgIHZhbHMgPSBbdiwgLi4udmFsc107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YWxzLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgcmV0dXJuIHR5cGVvZiBhW3RoaXMuaXRlbVZhbHVlXSA9PT0gJ3N0cmluZycgP1xyXG4gICAgICAgIGFbdGhpcy5pdGVtVmFsdWVdLmxvY2FsZUNvbXBhcmUoYlt0aGlzLml0ZW1WYWx1ZV0pIDogYVt0aGlzLml0ZW1WYWx1ZV0gLSBiW3RoaXMuaXRlbVZhbHVlXTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy52YWx1ZSA9IFsuLi52YWxzXTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGlvblZhbHVlJykuc2V0VmFsdWUodGhpcy52YWx1ZS5tYXAodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSkpO1xyXG5cclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG5cclxuICBvbkZvY3VzSW4oZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRm9jdXNPdXQoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCBhcyBFbGVtZW50KSkge1xyXG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25NZW51T3BlbigpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0T3Blbi5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbk1lbnVDbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0Q2xvc2UuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgZGVzZWxlY3QodmFsOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMudmFsdWUgPSBbLi4udGhpcy52YWx1ZS5maWx0ZXIodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSAhPT0gdmFsW3RoaXMuaXRlbVZhbHVlXSldO1xyXG4gICAgLy8gdGhpcy52YWx1ZS5zcGxpY2UodGhpcy52YWx1ZS5maW5kSW5kZXgodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSA9PT0gdmFsW3RoaXMuaXRlbVZhbHVlXSksIDEpO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLnZhbHVlLm1hcChtID0+IG0udmFsdWUpKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0aW9uQ29udGFpbmVyU2l6ZSgpOiB2b2lkIHtcclxuICAgIHRpbWVyKDApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGlvbkNvbnRhaW5lcikge1xyXG4gICAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUuaGVpZ2h0ID0gdGhpcy5zZWxlY3Rpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPiAyNjAgPyAnMjYwcHgnIDogJ2F1dG8nO1xyXG4gICAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUubWluSGVpZ2h0ID0gdGhpcy5zZWxlY3Rpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gMjYwID9cclxuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ICsgJ3B4JyA6ICcyNjBweCc7XHJcbiAgICAgICAgdGhpcy5saXN0Q29udGFpbmVyU2l6ZS53aWR0aCA9IHRoaXMuanZ4TXVsdGlzZWxlY3QubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsaWNrT25NZW51VHJpZ2dlcihlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5zaG93TGlzdCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3VsZExvYWRNb3JlID0gdHJ1ZTtcclxuICAgICAgdGltZXIoMCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dMaXN0ID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy51cmwubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgIHRoaXMudXBkYXRlT3JkZXJlZE9wdGlvbnModGhpcy5zZWxlY3RhYmxlT3B0aW9ucyk7XHJcbiAgICAgICAgICB0aGlzLmdldExpc3QoKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudHJpZ2dlci5vcGVuTWVudSgpO1xyXG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25Db250YWluZXJTaXplKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TGlzdCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5nZXRMaXN0KHtcclxuICAgICAgdXJsOiB0aGlzLnVybCxcclxuICAgICAgcmVxdWVzdFR5cGU6IHRoaXMucmVxdWVzdFR5cGUsXHJcbiAgICAgIGRhdGE6IHt9LFxyXG4gICAgICBjdXJyZW50UGFnZTogKyt0aGlzLmN1cnJlbnRQYWdlLFxyXG4gICAgICBpZ25vcmVQYWdpbmF0aW9uOiB0aGlzLmlnbm9yZVBhZ2luYXRpb24sXHJcbiAgICAgIHJlcXVlc3RIZWFkZXJzOiB0aGlzLnJlcXVlc3RIZWFkZXJzLFxyXG4gICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVmFsdWUsXHJcbiAgICAgIHNlYXJjaFByb3A6IHRoaXMuc2VhcmNoUHJvcCxcclxuICAgICAgcGFnZVNpemU6IHRoaXMuaW50UGFnZVNpemVcclxuICAgIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgodmFsKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHZhbCA/PyBbXTtcclxuICAgICAgfSksXHJcbiAgICAgIHN3aXRjaE1hcCgodmFsKSA9PiB0aGlzLm11bHRpTWFwcGVyLm1hcE9wdGlvbnModmFsKSksIHN3aXRjaE1hcCgodmFsKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIGlmICghdmFsKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBbXTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGlzdFByb3AubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmVzdWx0ID0gWy4uLih2YWxbdGhpcy5saXN0UHJvcF0gPz8gW10pXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gWy4uLnZhbF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdCBvZiByZXN1bHQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3T3B0aW9uID0gdGhpcy5tYXBwZXIubWFwT3B0aW9uKG9wdCk7XHJcbiAgICAgICAgICAgIG5ld09wdGlvbnMucHVzaChuZXdPcHRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG5ld09wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksIHN3aXRjaE1hcCgoZmluVmFsOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLnB1c2goLi4uZmluVmFsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKTtcclxuICAgICAgfSksIG1hcCgodmFsKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyaWdnZXIub3Blbk1lbnUoKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9KSwgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbGVkKGU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGUudGFyZ2V0LnNjcm9sbFRvcCArIDIyMCArICgodGhpcy5zZWFyY2hJbnB1dCA/IDAgOiAxKSAqIDQwKSA9PT0gdGhpcy5zZWxlY3Rpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgJiYgIXRoaXMuaXNMb2FkaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsRW5kLmVtaXQoKTtcclxuICAgICAgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDAgJiYgIXRoaXMuaWdub3JlUGFnaW5hdGlvbiAmJiB0aGlzLnNob3VsZExvYWRNb3JlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRMaXN0KCkuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1lbnVPcGVuZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0T3BlbmVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uTWVudUNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICgoIXRoaXMudXJsIHx8IHRoaXMudXJsLmxlbmd0aCA9PT0gMCkgJiYgdGhpcy5zZWFyY2hNb2RlID09PSAnY2xpZW50Jykge1xyXG4gICAgICB0aGlzLnNlYXJjaFZhbHVlU3ViamVjdC5uZXh0KCcnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0Q2xvc2VkLmVtaXQoKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaElucHV0Q2xpY2soZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoVmFsdWVDaGFuZ2UoZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlYXJjaFZhbHVlU3ViamVjdC5uZXh0KGUudGFyZ2V0LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGNsZWFyKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLnZhbHVlLm1hcCh2ID0+IHZbdGhpcy5pdGVtVmFsdWVdKSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yKCcubmctanZ4LW11bHRpc2VsZWN0Jyk7XHJcbiAgICBjb250cm9sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMuam9pbignICcpKTtcclxuICB9XHJcblxyXG4gIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmICgoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2lucHV0Jykge1xyXG4gICAgLy8gICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmZvY3VzKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBzdGF0ZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlQ2hhbmdlcy5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9yZGVyZWRPcHRpb25zKG9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IG9icyA9IG9mKG9wdGlvbnMpO1xyXG4gICAgaWYgKHRoaXMuZ3JvdXBCeSkge1xyXG4gICAgICB0aGlzLm9yZGVyZWRPcHRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgIGNvbnN0IG9ic0FyciA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdyb3VwQnkgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBvYnNBcnIucHVzaCh0aGlzLmdyb3VwQnkubWFwR3JvdXAob3B0aW9uKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG9ic0Fyci5wdXNoKG9mKHtncm91cDogb3B0aW9uW3RoaXMuZ3JvdXBCeV0sIG9wdGlvbn0gYXMgTmdKdnhHcm91cDxhbnk+KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIG9icyA9IGZvcmtKb2luKG9ic0FycikucGlwZShtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gWy4uLm5ldyBTZXQocmVzLm1hcChpdGVtID0+IGl0ZW0uZ3JvdXApKV07XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcclxuICAgICAgICAgIHRoaXMub3JkZXJlZE9wdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBvcHRpb25zOiByZXMuZmlsdGVyKHIgPT4gci5ncm91cCA9PT0gZ3JvdXApLm1hcChvID0+IG8ub3B0aW9uKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyZWRPcHRpb25zO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlTWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMudHJpZ2dlci5jbG9zZU1lbnUoKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3RcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogZGlzYWJsZWQsICdoYXMtZXJyb3JzJzogaGFzRXJyb3JzfVwiICNqdnhNdWx0aXNlbGVjdD5cclxuICA8IS0tIFNUQVJUIE1FTlUgLS0+XHJcbiAgPGRpdiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVJlZlwiIChvbk1lbnVPcGVuKT1cIm9uTWVudU9wZW4oKVwiIChtZW51T3BlbmVkKT1cIm9uTWVudU9wZW5lZCgpXCJcclxuICAgICAgIChvbk1lbnVDbG9zZSk9XCJvbk1lbnVDbG9zZSgpXCIgKG1lbnVDbG9zZWQpPVwib25NZW51Q2xvc2VkKClcIlxyXG4gICAgICAgI3RyaWdnZXI9XCJtYXRNZW51VHJpZ2dlclwiPlxyXG4gICAgPG1hdC1tZW51ICNtZW51UmVmPVwibWF0TWVudVwiIFtjbGFzc109XCJbJ2p2eC1tdWx0aXNlbGVjdC1wYW5lbCcsIHBhbmVsQ2xhc3NdLmpvaW4oJyAnKVwiIFtmb3JtR3JvdXBdPVwiZm9ybVwiXHJcbiAgICAgICAgICAgICAgW3lQb3NpdGlvbl09XCJ5UG9zaXRpb25cIj5cclxuICAgICAgPGRpdiAqbmdJZj1cImNsb3NlQnV0dG9uXCIgY2xhc3M9XCJjbG9zZU1lbnVCdXR0b25cIj5cclxuICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtbGlzdC1jb250YWluZXJcIlxyXG4gICAgICAgICAgICNtZW51TElzdENvbnRhaW5lclxyXG4gICAgICAgICAgIFtuZ1N0eWxlXT1cInsnb3ZlcmZsb3cteSc6ICdoaWRkZW4nLCAnd2lkdGgnOiBsaXN0Q29udGFpbmVyU2l6ZS53aWR0aCwgJ21pbi13aWR0aC5weCc6IDExMiwgJ21heC1oZWlnaHQnOiAnMjYwcHgnLCAnaGVpZ2h0JzogbGlzdENvbnRhaW5lclNpemUuaGVpZ2h0LCAnbWluLWhlaWdodCc6IGxpc3RDb250YWluZXJTaXplLm1pbkhlaWdodH1cIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cIiEhc2VhcmNoSW5wdXRcIiAoY2xpY2spPVwib25TZWFyY2hJbnB1dENsaWNrKCRldmVudClcIj5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJzZWFyY2hMYWJlbFwiIFtuZ01vZGVsXT1cInNlYXJjaFZhbHVlXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgW25nSnZ4Rm9jdXNdPVwiaXNPcGVuXCJcclxuICAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25TZWFyY2hWYWx1ZUNoYW5nZSgkZXZlbnQpXCIvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXZcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cIntoZWlnaHQ6IHNlYXJjaElucHV0ICYmIHNlbGVjdGlvbkNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAyMjAgfHwgc2VsZWN0aW9uQ29udGFpbmVyLmNsaWVudEhlaWdodCA+IDI2MD8gMjYwIC0gKHNlYXJjaElucHV0PyA0MCA6IDApICsgJ3B4JzogJ2F1dG8nfVwiPlxyXG4gICAgICAgICAgPG5nLXNjcm9sbGJhciBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIidob3ZlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCInY29tcGFjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2Vuc29yRGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9IZWlnaHREaXNhYmxlZF09XCJmYWxzZVwiICNzY3JvbGxiYXI+XHJcbiAgICAgICAgICAgIDxkaXYgI3NlbGVjdGlvbkNvbnRhaW5lciAoY2xpY2spPVwib25DTGlja09uTWVudSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCAjc2VsZWN0aW9uIFttdWx0aXBsZV09XCJtdWx0aVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsncGFkZGluZyc6IDAsICd3aWR0aCc6IGxpc3RDb250YWluZXJTaXplLndpZHRoLCAnbWluLXdpZHRoLnB4JzogMTEyfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZWZhdWx0Q29udHJvbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0aW9uVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWdyb3VwQnlcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0IG9mIG9yZGVyZWRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZT8gZ3JvdXBIZWFkZXJUZW1wbGF0ZS50ZW1wbGF0ZTogZGVmYXVsdEdyb3VwSGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWp2eC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHQub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25baXRlbVZhbHVlXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1vcHRpb24td3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZT8gb3B0aW9uc1RlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1qdngtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFncm91cEJ5IHx8IGdyb3VwQnkubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1qdngtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc2VsZWN0YWJsZU9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uW2l0ZW1WYWx1ZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW9wdGlvbi13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb259XCI+PC9uZy1jb250YWluZXI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZT8gb3B0aW9uc1RlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1qdngtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1zY3JvbGxiYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtZm9vdGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25nLWp2eC1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L21hdC1tZW51PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gRU5EIE1FTlUgLS0+XHJcbiAgPCEtLSBTVEFSVCBJTlBVVCAtLT5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cInsnbmctanZ4LW11bHRpc2VsZWN0LXZhbHVlLWNvbnRhaW5lcic6IHRydWUsICdpcy1vcGVuJzogaXNPcGVufVwiXHJcbiAgICAgICAoY2xpY2spPVwiY2xpY2tPbk1lbnVUcmlnZ2VyKCRldmVudClcIlxyXG4gICAgICAgI3ZhbHVlQ29udGFpbmVyPlxyXG4gICAgQGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdF9fcGxhY2Vob2xkZXJcIiAjcGxhY2Vob2xkZXJDb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BsYWNlaG9sZGVyXVwiPjwvbmctY29udGVudD5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0LXZhbHVlIG11bHRpLXZhbHVlLWNvbnRhaW5lclwiICpuZ0lmPVwibXVsdGlcIiAjbXVsdGlDb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGlvblRlbXBsYXRlPyBzZWxlY3Rpb25UZW1wbGF0ZS50ZW1wbGF0ZSA6IGRlZmF1bHRNdWx0aVNlbGVjdGlvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdmFsdWV9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtdmFsdWUgc2luZ2xlLXZhbHVlLWNvbnRhaW5lclwiICpuZ0lmPVwiIW11bHRpXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHZhbCBvZiB2YWx1ZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3Rpb25UZW1wbGF0ZT8gc2VsZWN0aW9uVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0U2VsZWN0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHZhbH1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3RfX3JlbW92ZS1idXR0b25cIiAqbmdJZj1cImNsZWFyYWJsZSAmJiB2YWx1ZS5sZW5ndGggPiAwXCIgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIj5cclxuICAgICAgPG1hdC1pY29uIHN0eWxlPVwiZm9udC1zaXplOiAxOHB4O1xyXG4gICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcIj5jbGVhclxyXG4gICAgICA8L21hdC1pY29uPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0LWFycm93XCI+XHJcbiAgICAgIDxtYXQtaWNvbiAqbmdJZj1cIiFpc0xvYWRpbmdcIj5leHBhbmRfbW9yZTwvbWF0LWljb24+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIiBjbGFzcz1cImxkcy1yaW5nXCI+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIEVORCBJTlBVVCAtLT5cclxuPC9kaXY+XHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlIGxldC1vcHRpb24+XHJcbiAgPGRpdiBzdHlsZT1cIm1heC13aWR0aDogMTAwJTtcclxuICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XCI+e3sgb3B0aW9uW2l0ZW1UZXh0XSB9fVxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VsZWN0aW9uVGVtcGxhdGUgbGV0LXZhbHVlPlxyXG4gIHt7IHZhbHVlW2l0ZW1UZXh0XSB9fVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3Rpb25UZW1wbGF0ZSBsZXQtdmFsdWU+XHJcbiAgPG1hdC1jaGlwLWxpc3Rib3ggI2NoaXBMaXN0IFtkaXNhYmxlZF09XCJ0aGlzLmRpc2FibGVkXCI+XHJcbiAgICA8bWF0LWNoaXAtb3B0aW9uIFtjb2xvcl09XCIncHJpbWFyeSdcIiBzZWxlY3RlZCAqbmdGb3I9XCJsZXQgdmFsIG9mIHZhbHVlXCIgW3NlbGVjdGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdC1jaGlwXCJcclxuICAgICAgICAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwiZGVzZWxlY3QodmFsKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXgtd2lkdGgnOiBtdWx0aUNvbnRhaW5lcldpZHRoIC0gNTAgKydweCd9XCI+e3sgdmFsW2l0ZW1UZXh0XSB9fTwvc3Bhbj5cclxuXHJcbiAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+XHJcbiAgICA8L21hdC1jaGlwLW9wdGlvbj5cclxuICA8L21hdC1jaGlwLWxpc3Rib3g+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyb3VwSGVhZGVyVGVtcGxhdGUgbGV0LW9wdD5cclxuICA8ZGl2IHN0eWxlPVwicGFkZGluZy1pbmxpbmU6IDE1cHhcIj48c3Ryb25nPnt7IG9wdC5ncm91cCB9fTwvc3Ryb25nPjwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
691
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWp2eC1tdWx0aXNlbGVjdC9zcmMvbGliL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1qdngtbXVsdGlzZWxlY3Qvc3JjL2xpYi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLElBQUksRUFFSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RixPQUFPLEVBQXNELGtCQUFrQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXpILE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBRzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1SCxPQUFPLEVBQUMsZUFBZSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUU1RyxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUNqRyxPQUFPLEVBQUMsbUJBQW1C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LFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFFTyxLQUFLO3NCQUFqQixLQUFLO2dCQW1CRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdGLFFBQVE7c0JBRFgsS0FBSztnQkFjRixRQUFRO3NCQURYLEtBQUs7Z0JBWUYsUUFBUTtzQkFEWCxLQUFLO2dCQXdCSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsIERvQ2hlY2ssXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgZm9yd2FyZFJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFNlbGYsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TmdKdnhPcHRpb25zVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4vZGlyZWN0aXZlcy9uZy1qdngtb3B0aW9ucy10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2wsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Db250cm9sLCBVbnR5cGVkRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7TWF0U2VsZWN0aW9uTGlzdCwgTWF0U2VsZWN0aW9uTGlzdENoYW5nZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGlzdCc7XHJcbmltcG9ydCB7TmdKdnhPcHRpb25Db21wb25lbnR9IGZyb20gJy4vbmctanZ4LW9wdGlvbi9uZy1qdngtb3B0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TWF0TWVudVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xyXG5pbXBvcnQge05nSnZ4TXVsdGlzZWxlY3RTZXJ2aWNlfSBmcm9tICcuL25nLWp2eC1tdWx0aXNlbGVjdC5zZXJ2aWNlJztcclxuaW1wb3J0IHtIdHRwSGVhZGVyc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge05nU2Nyb2xsYmFyfSBmcm9tICduZ3gtc2Nyb2xsYmFyJztcclxuaW1wb3J0IHtjYXRjaEVycm9yLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAsIHRocm90dGxlVGltZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgZm9ya0pvaW4sIGZyb21FdmVudCwgbm9vcCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRocm93RXJyb3IsIHRpbWVyfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtOZ0p2eE11bHRpT3B0aW9uTWFwcGVyLCBOZ0p2eE9wdGlvbk1hcHBlcn0gZnJvbSAnLi9pbnRlcmZhY2VzL25nLWp2eC1vcHRpb24tbWFwcGVyJztcclxuaW1wb3J0IHtOZ0p2eFNlbGVjdGlvblRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LXNlbGVjdGlvbi10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge01hdEZvcm1GaWVsZENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQge2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHtOZ0p2eEdyb3VwSGVhZGVyRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LWdyb3VwLWhlYWRlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge05nSnZ4U2VhcmNoTWFwcGVyfSBmcm9tICcuL2ludGVyZmFjZXMvbmctanZ4LXNlYXJjaC1tYXBwZXInO1xyXG5pbXBvcnQge05nSnZ4R3JvdXAsIE5nSnZ4R3JvdXBNYXBwZXJ9IGZyb20gJy4vaW50ZXJmYWNlcy9uZy1qdngtZ3JvdXAtbWFwcGVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ25nLWp2eC1tdWx0aXNlbGVjdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdKdnhNdWx0aXNlbGVjdENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2ssIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBNYXRGb3JtRmllbGRDb250cm9sPGFueT4sXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG4gIEBIb3N0QmluZGluZygpIGlkID0gYGp2eC1tdWx0aXNlbGVjdC0ke05nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXHJcbiAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5IHx8IHRoaXMudmFsdWUubGVuZ3RoID4gMCB8fCAhIXRoaXMuaXNQbGFjZWhvbGRlckFjdGl2ZTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2p2eE11bHRpc2VsZWN0Jywge3N0YXRpYzogdHJ1ZX0pIGp2eE11bHRpc2VsZWN0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3ZhbHVlQ29udGFpbmVyJywge3N0YXRpYzogdHJ1ZX0pIHZhbHVlQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbkNvbnRhaW5lcicsIHtzdGF0aWM6IGZhbHNlfSkgc2VsZWN0aW9uQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3Rpb246IE1hdFNlbGVjdGlvbkxpc3Q7XHJcbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicsIHtzdGF0aWM6IHRydWV9KSB0cmlnZ2VyOiBNYXRNZW51VHJpZ2dlcjtcclxuICBAVmlld0NoaWxkKCdzY3JvbGxiYXInLCB7c3RhdGljOiBmYWxzZX0pIHNjcm9sbGJhcjogTmdTY3JvbGxiYXI7XHJcbiAgQFZpZXdDaGlsZCgnbXVsdGlDb250YWluZXInLCB7c3RhdGljOiBmYWxzZX0pIG11bHRpQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3BsYWNlaG9sZGVyQ29udGFpbmVyJywge3N0YXRpYzogZmFsc2V9KSBwbGFjZWhvbGRlckNvbnRhaW5lcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkcmVuKE5nSnZ4T3B0aW9uQ29tcG9uZW50KSBvcHRpb25Db21wOiBRdWVyeUxpc3Q8TmdKdnhPcHRpb25Db21wb25lbnQ+O1xyXG4gIEBDb250ZW50Q2hpbGQoTmdKdnhPcHRpb25zVGVtcGxhdGVEaXJlY3RpdmUpIG9wdGlvbnNUZW1wbGF0ZTogTmdKdnhPcHRpb25zVGVtcGxhdGVEaXJlY3RpdmUgfCBudWxsID0gbnVsbDtcclxuICBAQ29udGVudENoaWxkKE5nSnZ4U2VsZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmUpIHNlbGVjdGlvblRlbXBsYXRlOiBOZ0p2eFNlbGVjdGlvblRlbXBsYXRlRGlyZWN0aXZlIHwgbnVsbCA9IG51bGw7XHJcbiAgQENvbnRlbnRDaGlsZChOZ0p2eEdyb3VwSGVhZGVyRGlyZWN0aXZlKSBncm91cEhlYWRlclRlbXBsYXRlOiBOZ0p2eEdyb3VwSGVhZGVyRGlyZWN0aXZlIHwgbnVsbCA9IG51bGw7XHJcbiAgLy8gQENvbnRlbnRDaGlsZChOZ0p2eE9wdGlvbkNvbXBvbmVudCkgb3B0aW9uQ29tcDogTmdKdnhPcHRpb25Db21wb25lbnQ7XHJcbiAgLy8gQENvbnRlbnRDaGlsZChUZW1wbGF0ZVJlZikgb3B0aW9uc1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCA9IG51bGw7XHJcbiAgQElucHV0KCkgb3B0aW9uczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKSBtdWx0aSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHVybCA9ICcnO1xyXG4gIEBJbnB1dCgpIHJlcXVlc3RUeXBlOiAnZ2V0JyB8ICdwb3N0JyA9ICdnZXQnO1xyXG4gIEBJbnB1dCgpIGl0ZW1WYWx1ZSA9ICd2YWx1ZSc7XHJcbiAgQElucHV0KCkgaXRlbVRleHQgPSAndGV4dCc7XHJcbiAgQElucHV0KCkgaWdub3JlUGFnaW5hdGlvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNsb3NlT25DbGljayA9IHRydWU7XHJcbiAgQElucHV0KCkgaGFzRXJyb3JzID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VhcmNoTW9kZTogbnVsbCB8ICdzZXJ2ZXInIHwgJ2NsaWVudCcgPSBudWxsO1xyXG4gIEBJbnB1dCgpIHNlYXJjaElucHV0ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VhcmNoTGFiZWwgPSAnc2VhcmNoJztcclxuICBASW5wdXQoKSBsaXN0UHJvcCA9ICcnO1xyXG4gIEBJbnB1dCgpIHRvdGFsUm93c1Byb3AgPSAnJztcclxuICBASW5wdXQoKSBwYW5lbENsYXNzID0gJyc7XHJcbiAgQElucHV0KCkgc2VhcmNoUHJvcCA9ICdzZWFyY2gnO1xyXG4gIEBJbnB1dCgpIGNsb3NlQnV0dG9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgbWFwcGVyOiBOZ0p2eE9wdGlvbk1hcHBlcjxhbnk+ID0ge1xyXG4gICAgbWFwT3B0aW9uKHNvdXJjZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIG9mKHNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBASW5wdXQoKSBtdWx0aU1hcHBlcjogTmdKdnhNdWx0aU9wdGlvbk1hcHBlcjxhbnk+ID0ge1xyXG4gICAgbWFwT3B0aW9ucyhzb3VyY2U6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIG9mKHNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBASW5wdXQoKSBzZWFyY2hNYXBwZXI6IE5nSnZ4U2VhcmNoTWFwcGVyPGFueT4gPSB7XHJcbiAgICBtYXBTZWFyY2g6IChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xyXG4gICAgICByZXR1cm4gb2Yob3B0aW9ucy5maWx0ZXIobyA9PiBvW3RoaXMuaXRlbVRleHRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzb3VyY2UudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgZ3JvdXBCeTogTmdKdnhHcm91cE1hcHBlcjxhbnk+IHwgc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmFyZUFycmF5c0VxdWFsKHZhbHVlLCB0aGlzLnBWYWx1ZSkpIHtcclxuICAgICAgdGhpcy5wVmFsdWUgPSB2YWx1ZSA/PyBbXTtcclxuICAgICAgdGhpcy5zaG93TGlzdCA9ICF0aGlzLnNob3dMaXN0O1xyXG4gICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMucFZhbHVlLm1hcCh2ID0+IHZbdGhpcy5pdGVtVmFsdWVdKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIHRoaXMuc2hvd0xpc3QgPSAhdGhpcy5zaG93TGlzdDtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHZhbHVlKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLnBWYWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHJlcXVlc3RIZWFkZXJzOiBIdHRwSGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcclxuICB9XHJcblxyXG4gIHNldCByZXF1aXJlZChyZXEpIHtcclxuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHJlcSk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX3JlcXVpcmVkID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA/IHRoaXMucGFydHMuZGlzYWJsZSgpIDogdGhpcy5wYXJ0cy5lbmFibGUoKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnRQYWdlU2l6ZTtcclxuICB9XHJcblxyXG4gIHNldCBwYWdlU2l6ZSh2YWw6IG51bWJlcikge1xyXG4gICAgaWYgKHZhbCA8IDE1KSB7XHJcbiAgICAgIHRoaXMuaW50UGFnZVNpemUgPSAxNTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaW50UGFnZVNpemUgPSB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIGdldCBlcnJvclN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmludmFsaWQgJiYgdGhpcy5uZ0NvbnRyb2wudG91Y2hlZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0T3BlbjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBqdnhNdWx0aXNlbGVjdE9wZW5lZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBqdnhNdWx0aXNlbGVjdENsb3NlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHNjcm9sbEVuZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgY29udHJvbFR5cGUgPSAnbmctanZ4LW11bHRpc2VsZWN0JztcclxuICBwdWJsaWMgZG9jdW1lbnQgPSBkb2N1bWVudDtcclxuICBwdWJsaWMgd2luZG93ID0gd2luZG93O1xyXG4gIHB1YmxpYyBmb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dMaXN0ID0gdHJ1ZTtcclxuICBwdWJsaWMgYXN5bmNPcHRpb25zOiBhbnkgPSBbXTtcclxuICBwdWJsaWMgc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICBwdWJsaWMgb3JkZXJlZE9wdGlvbnM6IHsgZ3JvdXA6IGFueSwgb3B0aW9uczogYW55W10gfVtdID0gW107XHJcbiAgcHVibGljIHNlYXJjaFZhbHVlID0gJyc7XHJcbiAgcHVibGljIHlQb3NpdGlvbjogJ2Fib3ZlJyB8ICdiZWxvdycgPSAnYWJvdmUnO1xyXG4gIHB1YmxpYyBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHB1YmxpYyBjdXJyZW50UGFnZSA9IDA7XHJcbiAgcHVibGljIGxpc3RDb250YWluZXJTaXplOiB7IGhlaWdodDogc3RyaW5nLCBtaW5IZWlnaHQ6IHN0cmluZywgd2lkdGg6IHN0cmluZyB9ID0ge2hlaWdodDogJ2F1dG8nLCBtaW5IZWlnaHQ6ICcwJywgd2lkdGg6ICcxMDAlJ307XHJcbiAgcHVibGljIHBhcnRzOiBVbnR5cGVkRm9ybUdyb3VwO1xyXG5cclxuICBwdWJsaWMgdG91Y2hlZCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZztcclxuICBwdWJsaWMgZm9jdXNlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBtdWx0aUNvbnRhaW5lcldpZHRoID0gMTAwO1xyXG4gIHByaXZhdGUgaXNQbGFjZWhvbGRlckFjdGl2ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwcml2YXRlIGlzUGxhY2Vob2xkZXJBY3RpdmUgPSBmYWxzZTtcclxuICBwcml2YXRlIHNlYXJjaFZhbHVlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICBwcml2YXRlIHNlYXJjaFZhbHVlJCA9IHRoaXMuc2VhcmNoVmFsdWVTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgcFZhbHVlOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmUkID0gdGhpcy51bnN1YnNjcmliZS5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIGludFBhZ2VTaXplID0gMTU7XHJcbiAgcHVibGljIG9uVG91Y2hlZCA9ICgpID0+IHtcclxuICB9XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2VydmljZTogTmdKdnhNdWx0aXNlbGVjdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBmYjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAvLyBTZXR0aW5nIHRoZSB2YWx1ZSBhY2Nlc3NvciBkaXJlY3RseSAoaW5zdGVhZCBvZiB1c2luZ1xyXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc1BsYWNlaG9sZGVyQWN0aXZlU3ViamVjdC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDApKS5zdWJzY3JpYmUoKHYpID0+IHtcclxuICAgICAgdGhpcy5pc1BsYWNlaG9sZGVyQWN0aXZlID0gdjtcclxuICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhcnRzID0gZmIuZ3JvdXAoe1xyXG4gICAgICBhcmVhOiAnJyxcclxuICAgICAgZXhjaGFuZ2U6ICcnLFxyXG4gICAgICBzdWJzY3JpYmVyOiAnJyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHNlbGVjdGlvblZhbHVlOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKHRoaXMuc2VsZWN0aW9uVmFsdWUpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNQbGFjZWhvbGRlckFjdGl2ZVN1YmplY3QubmV4dCh0aGlzLnBsYWNlaG9sZGVyQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5oYXNDaGlsZE5vZGVzKCkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gICAgLy8gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zXTtcclxuICAgIHRoaXMudXBkYXRlT3JkZXJlZE9wdGlvbnModGhpcy5zZWxlY3RhYmxlT3B0aW9ucykuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoMTAwKSwgbWFwKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG5cclxuICAgIH0pLCBzd2l0Y2hNYXAoKCkgPT4gdGltZXIoMTAwKSksIHRhcCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250YWluZXJXaWR0aCA9IHRoaXMubXVsdGlDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoID8/IDEwMDtcclxuICAgICAgdGhpcy55UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpPy50b3AgPCAyNjAgPyAnYWJvdmUnIDogJ2JlbG93JztcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pKS5zdWJzY3JpYmUobm9vcCk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSksIGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdXJyID09PSB0aGlzLnNlYXJjaFZhbHVlO1xyXG4gICAgICB9KSwgc3dpdGNoTWFwKCh2YWw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbDtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZSA9PT0gJ2NsaWVudCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U2VhcmNoKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyU2VhcmNoKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApLnN1YnNjcmliZSgodmFsOiBhbnlbXSkgPT4ge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgYXJlQXJyYXlzRXF1YWwoYXJyMTogYW55W10gfCBudWxsLCBhcnIyOiBhbnlbXSB8IG51bGwpOiBib29sZWFuIHtcclxuICAgIC8vIFNlIGVudHJhbWJpIHNvbm8gbnVsbCBvIHVuZGVmaW5lZCwgc29ubyB1Z3VhbGlcclxuICAgIGlmICghYXJyMSAmJiAhYXJyMikgeyByZXR1cm4gdHJ1ZTsgfVxyXG4gICAgLy8gU2Ugc29sbyB1bm8gZGVpIGR1ZSDDqCBudWxsL3VuZGVmaW5lZCwgc29ubyBkaXZlcnNpXHJcbiAgICBpZiAoIWFycjEgfHwgIWFycjIpIHsgcmV0dXJuIGZhbHNlOyB9XHJcbiAgICAvLyBTZSBoYW5ubyBsdW5naGV6emEgZGl2ZXJzYSwgc29ubyBkaXZlcnNpXHJcbiAgICBpZiAoYXJyMS5sZW5ndGggIT09IGFycjIubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxyXG5cclxuICAgIC8vIFZlcmlmaWNhIGNoZSBvZ25pIGVsZW1lbnRvIGRpIGFycjEgYWJiaWEgdW5hIGNvcnJpc3BvbmRlbnphIGluIGFycjJcclxuICAgIHJldHVybiBhcnIxLmV2ZXJ5KGl0ZW0xID0+IHtcclxuICAgICAgICByZXR1cm4gYXJyMi5zb21lKGl0ZW0yID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgaXRlbTEgPT09ICdvYmplY3QnICYmIGl0ZW0xICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIFNlIGdsaSBlbGVtZW50aSBzb25vIG9nZ2V0dGksIGNvbmZyb250YSBpIHZhbG9yaSBpdGVtVmFsdWVcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0xW3RoaXMuaXRlbVZhbHVlXSA9PT0gaXRlbTJbdGhpcy5pdGVtVmFsdWVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gQWx0cmltZW50aSBjb25mcm9udGEgZGlyZXR0YW1lbnRlIGkgdmFsb3JpXHJcbiAgICAgICAgICByZXR1cm4gaXRlbTEgPT09IGl0ZW0yO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KSAmJlxyXG4gICAgICAvLyBWZXJpZmljYSBhbmNoZSBpbCBjb250cmFyaW8gcGVyIGFzc2ljdXJhcnNpIGNoZSBub24gY2kgc2lhbm8gZWxlbWVudGkgZXh0cmFcclxuICAgICAgYXJyMi5ldmVyeShpdGVtMiA9PiB7XHJcbiAgICAgICAgcmV0dXJuIGFycjEuc29tZShpdGVtMSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0yID09PSAnb2JqZWN0JyAmJiBpdGVtMiAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTJbdGhpcy5pdGVtVmFsdWVdID09PSBpdGVtMVt0aGlzLml0ZW1WYWx1ZV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gaXRlbTIgPT09IGl0ZW0xO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBjbGllbnRTZWFyY2goKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBvYnM6IE9ic2VydmFibGU8YW55PjtcclxuICAgIGlmICh0aGlzLnVybCAmJiB0aGlzLnVybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgICBvYnMgPSB0aGlzLmdldExpc3QoKS5waXBlKG1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnM7XHJcbiAgICAgIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9icyA9IG9mKHRoaXMub3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzLnBpcGUoc3dpdGNoTWFwKCh2YWwpID0+IHRoaXMuc2VhcmNoTWFwcGVyLm1hcFNlYXJjaCh0aGlzLnNlYXJjaFZhbHVlLCB2YWwpKSwgc3dpdGNoTWFwKChyZXMpID0+IHtcclxuICAgICAgICAvLyByZXR1cm4gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyhyZXMpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLnB1c2goLi4ucmVzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGFibGVPcHRpb25zKG9wdGlvbnM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICAgIGNvbnN0IG9iczogT2JzZXJ2YWJsZTxhbnk+W10gPSBvcHRpb25zLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiB7XHJcbiAgICAgIGFjYy5wdXNoKHRoaXMubWFwcGVyLm1hcE9wdGlvbihjdXJyKSk7XHJcbiAgICAgIHJldHVybiBhY2M7XHJcbiAgICB9LCBbXSk7XHJcblxyXG4gICAgLy8gdGhpcy5tYXBwZXIubWFwT3B0aW9uKG9wdGlvbik7XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKFsuLi5vYnNdKS5waXBlKHN3aXRjaE1hcCgodmFsKSA9PiB7XHJcbiAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMucHVzaCguLi52YWwpO1xyXG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKTtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VydmVyU2VhcmNoKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLnNob3VsZExvYWRNb3JlID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnN1YnNjcmliZS5uZXh0KCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGltZXIoMCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5saXN0Q29udGFpbmVyU2l6ZS53aWR0aCA9IHRoaXMuanZ4TXVsdGlzZWxlY3QubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCArICdweCc7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAodGhpcy5zY3JvbGxiYXIpIHtcclxuICAgICAgdGhpcy5zY3JvbGxiYXIuc2Nyb2xsZWQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKS5zdWJzY3JpYmUoKGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMub25TY3JvbGxlZChlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aW1lcigwKS5waXBlKHRhcCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250YWluZXJXaWR0aCA9IHRoaXMubXVsdGlDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoID8/IDEwMDtcclxuICAgICAgdGhpcy55UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpPy50b3AgPCAyNjAgPyAnYWJvdmUnIDogJ2JlbG93JztcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcbiAgICAgIC8vIHRoaXMuc2V0U2VsZWN0YWJsZU9wdGlvbnModGhpcy5vcHRpb25zKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zXTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBnZXQgc2VsZWN0aW9uVmFsdWUoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsdWUubWFwKCh2KSA9PiB7XHJcbiAgICAgIHJldHVybiB2W3RoaXMuaXRlbVZhbHVlXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgbiA9IHRoaXMucGFydHMudmFsdWU7XHJcbiAgICByZXR1cm4gIW4uYXJlYSAmJiAhbi5leGNoYW5nZSAmJiAhbi5zdWJzY3JpYmVyICYmICF0aGlzLmlzUGxhY2Vob2xkZXJBY3RpdmU7XHJcbiAgfVxyXG5cclxuICBvbkNMaWNrT25NZW51KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm11bHRpIHx8IHRoaXMuY2xvc2VPbkNsaWNrID09PSBmYWxzZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlKF86IGFueSk6IGFueSB7XHJcbiAgfVxyXG5cclxuICAvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XHJcbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICB9XHJcblxyXG4gIC8vIHJlZ2lzdGVycyAnZm4nIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGNoYW5nZXMgYXJlIG1hZGVcclxuICAvLyB0aGlzIGlzIGhvdyB3ZSBlbWl0IHRoZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm1cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGU6IE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdmFscyA9IGUuc291cmNlLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5tYXAobyA9PiBvLnZhbHVlKTtcclxuICAgIHZhbHMgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmZpbHRlcihvID0+IHZhbHMuaW5jbHVkZXMob1t0aGlzLml0ZW1WYWx1ZV0pKTtcclxuICAgIGNvbnN0IHNlbGVjdGFibGVJZHMgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLm1hcChzID0+IHNbdGhpcy5pdGVtVmFsdWVdKTtcclxuICAgIGlmICh0aGlzLm11bHRpKSB7XHJcbiAgICAgIC8vIGlmIHNlYXJjaCBpcyBhY3RpdmUsIHByb2JhYmx5IHNvbWUgb2YgdGhlIGFscmVhZHkgc2VsZWN0ZWQgdmFsdWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHNlbGVjdGFibGUgb3B0aW9ucyxcclxuICAgICAgLy8gc28gd2UgaGF2ZSB0byBwdXNoIHRoZW0gaW4gdGhlIHNlbGVjdGVkIHZhbHVlcyBvZiB0aGUgbGlzdDtcclxuICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICBpZiAoIXNlbGVjdGFibGVJZHMuaW5jbHVkZXModlt0aGlzLml0ZW1WYWx1ZV0pKSB7XHJcbiAgICAgICAgICB2YWxzID0gW3YsIC4uLnZhbHNdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFscy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgYVt0aGlzLml0ZW1WYWx1ZV0gPT09ICdzdHJpbmcnID9cclxuICAgICAgICBhW3RoaXMuaXRlbVZhbHVlXS5sb2NhbGVDb21wYXJlKGJbdGhpcy5pdGVtVmFsdWVdKSA6IGFbdGhpcy5pdGVtVmFsdWVdIC0gYlt0aGlzLml0ZW1WYWx1ZV07XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFsdWUgPSBbLi4udmFsc107XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMudmFsdWUubWFwKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0pKTtcclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25Gb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcclxuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWVudU9wZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdE9wZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25NZW51Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdENsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGRlc2VsZWN0KHZhbDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gIT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pXTtcclxuICAgIC8vIHRoaXMudmFsdWUuc3BsaWNlKHRoaXMudmFsdWUuZmluZEluZGV4KHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gPT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pLCAxKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGlvblZhbHVlJykuc2V0VmFsdWUodGhpcy52YWx1ZS5tYXAobSA9PiBtLnZhbHVlKSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTogdm9pZCB7XHJcbiAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLmhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMjYwID8gJzI2MHB4JyA6ICdhdXRvJztcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLm1pbkhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IDI2MCA/XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCcgOiAnMjYwcHgnO1xyXG4gICAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGlja09uTWVudVRyaWdnZXIoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICB0aGlzLnNob3dMaXN0ID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd0xpc3QgPSB0cnVlO1xyXG4gICAgICAgIGlmICh0aGlzLnVybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKTtcclxuICAgICAgICAgIHRoaXMuZ2V0TGlzdCgpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQ29udGFpbmVyU2l6ZSgpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy50cmlnZ2VyLm9wZW5NZW51KCk7XHJcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaXN0KCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmdldExpc3Qoe1xyXG4gICAgICB1cmw6IHRoaXMudXJsLFxyXG4gICAgICByZXF1ZXN0VHlwZTogdGhpcy5yZXF1ZXN0VHlwZSxcclxuICAgICAgZGF0YToge30sXHJcbiAgICAgIGN1cnJlbnRQYWdlOiArK3RoaXMuY3VycmVudFBhZ2UsXHJcbiAgICAgIGlnbm9yZVBhZ2luYXRpb246IHRoaXMuaWdub3JlUGFnaW5hdGlvbixcclxuICAgICAgcmVxdWVzdEhlYWRlcnM6IHRoaXMucmVxdWVzdEhlYWRlcnMsXHJcbiAgICAgIHNlYXJjaDogdGhpcy5zZWFyY2hWYWx1ZSxcclxuICAgICAgc2VhcmNoUHJvcDogdGhpcy5zZWFyY2hQcm9wLFxyXG4gICAgICBwYWdlU2l6ZTogdGhpcy5pbnRQYWdlU2l6ZVxyXG4gICAgfSkucGlwZShcclxuICAgICAgbWFwKCh2YWwpID0+IHtcclxuICAgICAgICByZXR1cm4gdmFsID8/IFtdO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKCh2YWwpID0+IHRoaXMubXVsdGlNYXBwZXIubWFwT3B0aW9ucyh2YWwpKSwgc3dpdGNoTWFwKCh2YWwpID0+IHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gW107XHJcbiAgICAgICAgaWYgKCF2YWwpIHtcclxuICAgICAgICAgIHJlc3VsdCA9IFtdO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5saXN0UHJvcC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBbLi4uKHZhbFt0aGlzLmxpc3RQcm9wXSA/PyBbXSldO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBbLi4udmFsXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3VsZExvYWRNb3JlID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICAgIGZvciAoY29uc3Qgb3B0IG9mIHJlc3VsdCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdPcHRpb24gPSB0aGlzLm1hcHBlci5tYXBPcHRpb24ob3B0KTtcclxuICAgICAgICAgICAgbmV3T3B0aW9ucy5wdXNoKG5ld09wdGlvbik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gZm9ya0pvaW4obmV3T3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSwgc3dpdGNoTWFwKChmaW5WYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMucHVzaCguLi5maW5WYWwpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgICB9KSwgbWFwKCh2YWwpID0+IHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudHJpZ2dlci5vcGVuTWVudSgpO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQ29udGFpbmVyU2l6ZSgpO1xyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxlZChlOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChlLnRhcmdldC5zY3JvbGxUb3AgKyAyMjAgKyAoKHRoaXMuc2VhcmNoSW5wdXQgPyAwIDogMSkgKiA0MCkgPT09IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XHJcbiAgICAgICYmICF0aGlzLmlzTG9hZGluZykge1xyXG4gICAgICB0aGlzLnNjcm9sbEVuZC5lbWl0KCk7XHJcbiAgICAgIGlmICh0aGlzLnVybCAmJiB0aGlzLnVybC5sZW5ndGggPiAwICYmICF0aGlzLmlnbm9yZVBhZ2luYXRpb24gJiYgdGhpcy5zaG91bGRMb2FkTW9yZSkge1xyXG4gICAgICAgIHRoaXMuZ2V0TGlzdCgpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25NZW51T3BlbmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdE9wZW5lZC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBvbk1lbnVDbG9zZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoKCF0aGlzLnVybCB8fCB0aGlzLnVybC5sZW5ndGggPT09IDApICYmIHRoaXMuc2VhcmNoTW9kZSA9PT0gJ2NsaWVudCcpIHtcclxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZVN1YmplY3QubmV4dCgnJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdENsb3NlZC5lbWl0KCk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hJbnB1dENsaWNrKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaFZhbHVlQ2hhbmdlKGU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZVN1YmplY3QubmV4dChlLnRhcmdldC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBjbGVhcihlOiBFdmVudCk6IHZvaWQge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMudmFsdWUgPSBbXTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGlvblZhbHVlJykuc2V0VmFsdWUodGhpcy52YWx1ZS5tYXAodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSkpO1xyXG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVzY3JpYmVkQnlJZHMoaWRzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udHJvbEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAucXVlcnlTZWxlY3RvcignLm5nLWp2eC1tdWx0aXNlbGVjdCcpO1xyXG4gICAgY29udHJvbEVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgaWRzLmpvaW4oJyAnKSk7XHJcbiAgfVxyXG5cclxuICBvbkNvbnRhaW5lckNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICAvLyBpZiAoKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdpbnB1dCcpIHtcclxuICAgIC8vICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgc3RhdGVDaGFuZ2UkKCk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZUNoYW5nZXMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVPcmRlcmVkT3B0aW9ucyhvcHRpb25zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBvYnMgPSBvZihvcHRpb25zKTtcclxuICAgIGlmICh0aGlzLmdyb3VwQnkpIHtcclxuICAgICAgdGhpcy5vcmRlcmVkT3B0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICBjb25zdCBvYnNBcnIgPSBbXTtcclxuICAgICAgZm9yIChjb25zdCBvcHRpb24gb2Ygb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5ncm91cEJ5ICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgb2JzQXJyLnB1c2godGhpcy5ncm91cEJ5Lm1hcEdyb3VwKG9wdGlvbikpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYnNBcnIucHVzaChvZih7Z3JvdXA6IG9wdGlvblt0aGlzLmdyb3VwQnldLCBvcHRpb259IGFzIE5nSnZ4R3JvdXA8YW55PikpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBvYnMgPSBmb3JrSm9pbihvYnNBcnIpLnBpcGUobWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IFsuLi5uZXcgU2V0KHJlcy5tYXAoaXRlbSA9PiBpdGVtLmdyb3VwKSldO1xyXG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XHJcbiAgICAgICAgICB0aGlzLm9yZGVyZWRPcHRpb25zLnB1c2goe1xyXG4gICAgICAgICAgICBncm91cCxcclxuICAgICAgICAgICAgb3B0aW9uczogcmVzLmZpbHRlcihyID0+IHIuZ3JvdXAgPT09IGdyb3VwKS5tYXAobyA9PiBvLm9wdGlvbilcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5vcmRlcmVkT3B0aW9ucztcclxuICAgICAgfSkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9icztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZU1lbnUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRyaWdnZXIuY2xvc2VNZW51KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3B0aW9uc0lzU2VsZWN0ZWQob3B0aW9uOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnZhbHVlLnNvbWUocyA9PiBzID09PSBvcHRpb25bdGhpcy5pdGVtVmFsdWVdKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdFwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBkaXNhYmxlZCwgJ2hhcy1lcnJvcnMnOiBoYXNFcnJvcnN9XCIgI2p2eE11bHRpc2VsZWN0PlxyXG4gIDwhLS0gU1RBUlQgTUVOVSAtLT5cclxuICA8ZGl2IFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51UmVmXCIgKG9uTWVudU9wZW4pPVwib25NZW51T3BlbigpXCIgKG1lbnVPcGVuZWQpPVwib25NZW51T3BlbmVkKClcIlxyXG4gICAgICAgKG9uTWVudUNsb3NlKT1cIm9uTWVudUNsb3NlKClcIiAobWVudUNsb3NlZCk9XCJvbk1lbnVDbG9zZWQoKVwiXHJcbiAgICAgICAjdHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCI+XHJcbiAgICA8bWF0LW1lbnUgI21lbnVSZWY9XCJtYXRNZW51XCIgW2NsYXNzXT1cIlsnanZ4LW11bHRpc2VsZWN0LXBhbmVsJywgcGFuZWxDbGFzc10uam9pbignICcpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCJcclxuICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cInlQb3NpdGlvblwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY2xvc2VCdXR0b25cIiBjbGFzcz1cImNsb3NlTWVudUJ1dHRvblwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1saXN0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgI21lbnVMSXN0Q29udGFpbmVyXHJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieydvdmVyZmxvdy15JzogJ2hpZGRlbicsICd3aWR0aCc6IGxpc3RDb250YWluZXJTaXplLndpZHRoLCAnbWluLXdpZHRoLnB4JzogMTEyLCAnbWF4LWhlaWdodCc6ICcyNjBweCcsICdoZWlnaHQnOiBsaXN0Q29udGFpbmVyU2l6ZS5oZWlnaHQsICdtaW4taGVpZ2h0JzogbGlzdENvbnRhaW5lclNpemUubWluSGVpZ2h0fVwiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LWNvbnRhaW5lclwiICpuZ0lmPVwiISFzZWFyY2hJbnB1dFwiIChjbGljayk9XCJvblNlYXJjaElucHV0Q2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaExhYmVsXCIgW25nTW9kZWxdPVwic2VhcmNoVmFsdWVcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICBbbmdKdnhGb2N1c109XCJpc09wZW5cIlxyXG4gICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIi8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwie2hlaWdodDogc2VhcmNoSW5wdXQgJiYgc2VsZWN0aW9uQ29udGFpbmVyLmNsaWVudEhlaWdodCA+IDIyMCB8fCBzZWxlY3Rpb25Db250YWluZXIuY2xpZW50SGVpZ2h0ID4gMjYwPyAyNjAgLSAoc2VhcmNoSW5wdXQ/IDQwIDogMCkgKyAncHgnOiAnYXV0byd9XCI+XHJcbiAgICAgICAgICA8bmctc2Nyb2xsYmFyIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhTY3JvbGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiJ2hvdmVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlYXJhbmNlXT1cIidjb21wYWN0J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZW5zb3JEaXNhYmxlZF09XCJpc0xvYWRpbmdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0hlaWdodERpc2FibGVkXT1cImZhbHNlXCIgI3Njcm9sbGJhcj5cclxuICAgICAgICAgICAgPGRpdiAjc2VsZWN0aW9uQ29udGFpbmVyIChjbGljayk9XCJvbkNMaWNrT25NZW51KCRldmVudClcIj5cclxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdGlvbi1saXN0ICNzZWxlY3Rpb24gW211bHRpcGxlXT1cIm11bHRpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0xpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydwYWRkaW5nJzogMCwgJ3dpZHRoJzogbGlzdENvbnRhaW5lclNpemUud2lkdGgsICdtaW4td2lkdGgucHgnOiAxMTJ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0RlZmF1bHRDb250cm9sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzZWxlY3Rpb25WYWx1ZVwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWdyb3VwQnlcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0IG9mIG9yZGVyZWRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZT8gZ3JvdXBIZWFkZXJUZW1wbGF0ZS50ZW1wbGF0ZTogZGVmYXVsdEdyb3VwSGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWp2eC1vcHRpb24gKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBvcHQub3B0aW9uc1wiIFt2YWx1ZV09XCJvcHRpb25baXRlbVZhbHVlXVwiIFtpc1NlbGVjdGVkXT1cIm9wdGlvbnNJc1NlbGVjdGVkKG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtb3B0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zVGVtcGxhdGU/IG9wdGlvbnNUZW1wbGF0ZS50ZW1wbGF0ZSA6IGRlZmF1bHRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctanZ4LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBCeSB8fCBncm91cEJ5Lmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctanZ4LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGFibGVPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbltpdGVtVmFsdWVdXCIgW2lzU2VsZWN0ZWRdPVwib3B0aW9uc0lzU2VsZWN0ZWQob3B0aW9uKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtb3B0aW9uLXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlPyBvcHRpb25zVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWp2eC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXNjcm9sbGJhcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1mb290ZXJcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbmctanZ4LWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSBFTkQgTUVOVSAtLT5cclxuICA8IS0tIFNUQVJUIElOUFVUIC0tPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwieyduZy1qdngtbXVsdGlzZWxlY3QtdmFsdWUtY29udGFpbmVyJzogdHJ1ZSwgJ2lzLW9wZW4nOiBpc09wZW59XCJcclxuICAgICAgIChjbGljayk9XCJjbGlja09uTWVudVRyaWdnZXIoJGV2ZW50KVwiXHJcbiAgICAgICAjdmFsdWVDb250YWluZXI+XHJcbiAgICBAaWYgKHZhbHVlLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0X19wbGFjZWhvbGRlclwiICNwbGFjZWhvbGRlckNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcGxhY2Vob2xkZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtdmFsdWUgbXVsdGktdmFsdWUtY29udGFpbmVyXCIgKm5nSWY9XCJtdWx0aVwiICNtdWx0aUNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uVGVtcGxhdGU/IHNlbGVjdGlvblRlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdE11bHRpU2VsZWN0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB2YWx1ZX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdC12YWx1ZSBzaW5nbGUtdmFsdWUtY29udGFpbmVyXCIgKm5nSWY9XCIhbXVsdGlcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFsIG9mIHZhbHVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlbGVjdGlvblRlbXBsYXRlPyBzZWxlY3Rpb25UZW1wbGF0ZS50ZW1wbGF0ZSA6IGRlZmF1bHRTZWxlY3Rpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdmFsfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdF9fcmVtb3ZlLWJ1dHRvblwiICpuZ0lmPVwiY2xlYXJhYmxlICYmIHZhbHVlLmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiPlxyXG4gICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPmNsZWFyXHJcbiAgICAgIDwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtYXJyb3dcIj5cclxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzTG9hZGluZ1wiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibGRzLXJpbmdcIj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gRU5EIElOUFVUIC0tPlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGUgbGV0LW9wdGlvbj5cclxuICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj57eyBvcHRpb25baXRlbVRleHRdIH19XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3Rpb25UZW1wbGF0ZSBsZXQtdmFsdWU+XHJcbiAge3sgdmFsdWVbaXRlbVRleHRdIH19XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRNdWx0aVNlbGVjdGlvblRlbXBsYXRlIGxldC12YWx1ZT5cclxuICA8bWF0LWNoaXAtbGlzdGJveCAjY2hpcExpc3QgW2Rpc2FibGVkXT1cInRoaXMuZGlzYWJsZWRcIj5cclxuICAgIDxtYXQtY2hpcC1vcHRpb24gW2NvbG9yXT1cIidwcmltYXJ5J1wiIHNlbGVjdGVkICpuZ0Zvcj1cImxldCB2YWwgb2YgdmFsdWVcIiBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0LWNoaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbcmVtb3ZhYmxlXT1cInRydWVcIiAocmVtb3ZlZCk9XCJkZXNlbGVjdCh2YWwpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoaXAtY29udGVudFwiXHJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J21heC13aWR0aCc6IG11bHRpQ29udGFpbmVyV2lkdGggLSA1MCArJ3B4J31cIj57eyB2YWxbaXRlbVRleHRdIH19PC9zcGFuPlxyXG5cclxuICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgIDwvbWF0LWNoaXAtb3B0aW9uPlxyXG4gIDwvbWF0LWNoaXAtbGlzdGJveD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0R3JvdXBIZWFkZXJUZW1wbGF0ZSBsZXQtb3B0PlxyXG4gIDxkaXYgc3R5bGU9XCJwYWRkaW5nLWlubGluZTogMTVweFwiPjxzdHJvbmc+e3sgb3B0Lmdyb3VwIH19PC9zdHJvbmc+PC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==