@tilde-nlp/ngx-common 4.1.49 → 4.1.50

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.
@@ -6,16 +6,15 @@ import * as i2 from "@angular/common";
6
6
  import * as i3 from "@angular/material/input";
7
7
  import * as i4 from "@angular/material/form-field";
8
8
  import * as i5 from "@angular/flex-layout/flex";
9
- import * as i6 from "@angular/flex-layout/extended";
10
- import * as i7 from "@angular/material/select";
11
- import * as i8 from "@angular/material/core";
12
- import * as i9 from "@angular/forms";
13
- import * as i10 from "@angular/material/tooltip";
14
- import * as i11 from "@angular/material/button";
15
- import * as i12 from "@angular/material/chips";
16
- import * as i13 from "@angular/material/icon";
17
- import * as i14 from "../pipes/sort-translations-by-property/sort-translations-by-property.pipe";
18
- import * as i15 from "../pipes/sort-alphabetically/sort-alphabetically.pipe";
9
+ import * as i6 from "@angular/material/select";
10
+ import * as i7 from "@angular/material/core";
11
+ import * as i8 from "@angular/forms";
12
+ import * as i9 from "@angular/material/tooltip";
13
+ import * as i10 from "@angular/material/button";
14
+ import * as i11 from "@angular/material/chips";
15
+ import * as i12 from "@angular/material/icon";
16
+ import * as i13 from "../pipes/sort-translations-by-property/sort-translations-by-property.pipe";
17
+ import * as i14 from "../pipes/sort-alphabetically/sort-alphabetically.pipe";
19
18
  export class FilterBarComponent {
20
19
  onResize() {
21
20
  this.checkOverflow();
@@ -40,6 +39,9 @@ export class FilterBarComponent {
40
39
  get outputFilterKeyAndValue() {
41
40
  return this.settings?.outputFilterKeyAndValue;
42
41
  }
42
+ get currentFilters() {
43
+ return this.settings?.splittedFilters?.length ? this.settings.splittedFilters[this.activeFilterIndex] : this.settings?.filters;
44
+ }
43
45
  // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures
44
46
  set inputText(value) {
45
47
  this._inputText = value;
@@ -77,6 +79,7 @@ export class FilterBarComponent {
77
79
  this.prefixIcon = this.settings?.prefixIcon ?? "filter_alt";
78
80
  this.suffixIcon = this.settings?.suffixIcon ?? "question_mark";
79
81
  this.showSuffixIcon = this.settings?.showSuffixIcon ?? true;
82
+ this.activeFilterIndex = this.showSearch ? this.searchIndex : 0;
80
83
  }
81
84
  ngAfterViewInit() {
82
85
  this.checkOverflow();
@@ -135,7 +138,7 @@ export class FilterBarComponent {
135
138
  this.filterBarChange.next(this.filters);
136
139
  }
137
140
  switchRight() {
138
- if (this.settings?.filters && this.settings?.filters.length === this.activeFilterIndex + 1) {
141
+ if (this.settings?.splittedFilters?.length === this.activeFilterIndex + 1) {
139
142
  return;
140
143
  }
141
144
  this.activeFilterIndex += 1;
@@ -156,8 +159,32 @@ export class FilterBarComponent {
156
159
  control.setValue(newArray);
157
160
  }
158
161
  checkOverflow() {
159
- if (this.filterWrapper) {
160
- this.filterOverflow = this.filterWrapper.nativeElement.clientWidth < this.filterWrapper.nativeElement.scrollWidth;
162
+ if (this.filterWrapper?.nativeElement) {
163
+ const minFilterWidth = 100;
164
+ if (this.settings?.filters?.length) {
165
+ const containerWidth = this.filterWrapper.nativeElement.clientWidth;
166
+ // Calculate the total width needed for all filters
167
+ const totalWidthNeeded = this.settings.filters.length * minFilterWidth + (this.showSearch ? 100 : 0);
168
+ // If all filters can fit within the container, no need to split
169
+ if (totalWidthNeeded <= containerWidth) {
170
+ this.settings.splittedFilters = [];
171
+ this.filterOverflow = false;
172
+ return;
173
+ }
174
+ // Calculate how many filters can fit per row based on the container width
175
+ const filtersPerRow = Math.floor(containerWidth / minFilterWidth);
176
+ // Determine how many groups are needed
177
+ const groupCount = Math.ceil(this.settings.filters.length / filtersPerRow);
178
+ // Calculate group size based on the number of groups
179
+ const groupSize = Math.ceil(this.settings.filters.length / groupCount);
180
+ // Split filters into the calculated number of groups
181
+ const newSplittedFilters = [];
182
+ for (let i = 0; i < this.settings.filters.length; i += groupSize) {
183
+ newSplittedFilters.push(this.settings.filters.slice(i, i + groupSize));
184
+ }
185
+ this.settings.splittedFilters = newSplittedFilters;
186
+ this.filterOverflow = true;
187
+ }
161
188
  }
162
189
  }
163
190
  subscribeToFormValueChanges() {
@@ -175,11 +202,11 @@ export class FilterBarComponent {
175
202
  });
176
203
  }
177
204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterBarComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
178
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterBarComponent, selector: "tld-filter-bar", inputs: { settings: "settings", filterRowVisible: "filterRowVisible" }, outputs: { filterBarChange: "filterBarChange" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "filterWrapper", first: true, predicate: ["filterWrapper"], descendants: true }, { propertyName: "optionSearchInputs", predicate: ["optionSearchInput"], descendants: true }], ngImport: i0, template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch && !filterOverflow || activeFilterIndex === searchIndex\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field [ngClass]=\"{'hidden': filterOverflow && activeFilterIndex !== i}\" *ngFor=\"let filter of settings?.filters; let i = index\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select \r\n multiple \r\n [panelWidth]=\"filter?.maxPanelWidth ?? 'auto'\" \r\n [formControlName]=\"filter.fieldName\" \r\n (openedChange)=\"$event === true ? focusOptionSearchInput(filter, i) : clearOptionSearchInput(filter, i)\"\r\n (selectionChange)=\"selectEvent($event, filter)\" \r\n >\r\n <ng-container *ngIf=\"filter?.search?.placeholder\">\r\n <input #optionSearchInput class=\"option-search-input\" type=\"text\" [placeholder]=\"filter.search?.placeholder ?? '' | translate\" (keyup)=\"filterOptions($event, filter)\" (keydown)=\"$event.stopPropagation()\">\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"filter.values.length\">\r\n <ng-container *ngIf=\"filter.translated; else sortedValuesByProperty\">\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortAlphabetically:'key'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n {{ filter.disableTitleCase ? value.key : (value.key | titlecase) }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-template #sortedValuesByProperty>\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortTranslationsByProperty:'key':'value'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n <ng-container *ngIf=\"!filter.disableTitleCase; else defaultCase\">\r\n {{ value.key | translate : { default: value.value | titlecase } }}\r\n </ng-container>\r\n \r\n <ng-template #defaultCase>\r\n {{ value.key | translate : { default: value.value } }} \r\n </ng-template>\r\n </mat-option>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <button mat-icon-button (click)=\"switchLeft()\" *ngIf=\"filterOverflow\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <button mat-icon-button *ngIf=\"filterOverflow\" (click)=\"switchRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n</div>\r\n<mat-chip-listbox>\r\n <div *ngFor=\"let filter of settings?.filters\">\r\n <mat-chip-option *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{(filter.translated ? filterValue.key : filterValue.key | translate : {default: filterValue.value}) | titlecase\r\n }}</span>\r\n </mat-chip-option>\r\n </div>\r\n</mat-chip-listbox>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem .75rem;max-width:100%;align-items:baseline;margin-bottom:.5rem}.option-search-input{font-size:14px;width:100%;padding:.5rem 1rem;margin-bottom:.5rem}.search-input{background-color:unset;border:none}.filter-bar-search-input{width:100%;margin-right:5px}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom;padding:0 5px}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-mdc-chip.mat-mdc-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-mdc-chip.mat-mdc-standard-chip span{display:inline-block}.mat-mdc-chip.mat-mdc-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.chip-filter-title{margin-left:.5em}.hidden{display:none}:host ::ng-deep .mat-mdc-form-field-focus-overlay,:host ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--base-95)}:host ::ng-deep .mdc-text-field--focused{background-color:var(--base-70)!important}:host ::ng-deep .mat-mdc-chip-graphic{display:none}:host ::ng-deep .mat-mdc-chip-remove{color:var(--base-40)!important}:host ::ng-deep .search-input,:host ::ng-deep .mat-mdc-select-placeholder,:host ::ng-deep .mat-mdc-select-value-text,:host ::ng-deep .mdc-floating-label{font-size:14px!important}:host ::ng-deep .mdc-text-field--filled{--mdc-filled-text-field-active-indicator-height: 0;--mdc-filled-text-field-focus-active-indicator-height: 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}:host ::ng-deep .mat-mdc-text-field-wrapper:hover{background-color:var(--base-70)!important;transition:.1s}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mdc-floating-label--float-above{margin-top:3px}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i6.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "component", type: i7.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i8.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i12.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i12.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: i12.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.SortTranslationsByPropertyPipe, name: "sortTranslationsByProperty" }, { kind: "pipe", type: i15.SortAlphabeticallyPipe, name: "sortAlphabetically" }] }); }
205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FilterBarComponent, selector: "tld-filter-bar", inputs: { settings: "settings", filterRowVisible: "filterRowVisible" }, outputs: { filterBarChange: "filterBarChange" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "filterWrapper", first: true, predicate: ["filterWrapper"], descendants: true }, { propertyName: "optionSearchInputs", predicate: ["optionSearchInput"], descendants: true }], ngImport: i0, template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch && !filterOverflow || activeFilterIndex === searchIndex\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field *ngFor=\"let filter of currentFilters; let i = index\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select \r\n multiple \r\n [panelWidth]=\"filter?.maxPanelWidth ?? 'auto'\" \r\n [formControlName]=\"filter.fieldName\" \r\n (openedChange)=\"$event === true ? focusOptionSearchInput(filter, i) : clearOptionSearchInput(filter, i)\"\r\n (selectionChange)=\"selectEvent($event, filter)\" \r\n >\r\n <ng-container *ngIf=\"filter?.search?.placeholder\">\r\n <input #optionSearchInput class=\"option-search-input\" type=\"text\" [placeholder]=\"filter.search?.placeholder ?? '' | translate\" (keyup)=\"filterOptions($event, filter)\" (keydown)=\"$event.stopPropagation()\">\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"filter.values.length\">\r\n <ng-container *ngIf=\"filter.translated; else sortedValuesByProperty\">\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortAlphabetically:'key'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n {{ filter.disableTitleCase ? value.key : (value.key | titlecase) }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-template #sortedValuesByProperty>\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortTranslationsByProperty:'key':'value'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n <ng-container *ngIf=\"!filter.disableTitleCase; else defaultCase\">\r\n {{ value.key | translate : { default: value.value | titlecase } }}\r\n </ng-container>\r\n \r\n <ng-template #defaultCase>\r\n {{ value.key | translate : { default: value.value } }} \r\n </ng-template>\r\n </mat-option>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"filterOverflow\">\r\n <button mat-icon-button (click)=\"switchLeft()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <button mat-icon-button (click)=\"switchRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n </ng-container>\r\n</div>\r\n<mat-chip-listbox>\r\n <div *ngFor=\"let filter of settings?.filters\">\r\n <mat-chip-option *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{(filter.translated ? filterValue.key : filterValue.key | translate : {default: filterValue.value}) | titlecase\r\n }}</span>\r\n </mat-chip-option>\r\n </div>\r\n</mat-chip-listbox>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem .75rem;max-width:100%;align-items:center;margin-bottom:.5rem}.option-search-input{font-size:14px;width:100%;padding:.5rem 1rem;margin-bottom:.5rem}.search-input{background-color:unset;border:none}.filter-bar-search-input{width:100%;margin-right:5px}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom;padding:0 5px}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-mdc-chip.mat-mdc-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-mdc-chip.mat-mdc-standard-chip span{display:inline-block}.mat-mdc-chip.mat-mdc-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.chip-filter-title{margin-left:.5em}.hidden{display:none}:host ::ng-deep .mat-mdc-form-field-focus-overlay,:host ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--base-95)}:host ::ng-deep .mdc-text-field--focused{background-color:var(--base-70)!important}:host ::ng-deep .mat-mdc-chip-graphic{display:none}:host ::ng-deep .mat-mdc-chip-remove{color:var(--base-40)!important}:host ::ng-deep .search-input,:host ::ng-deep .mat-mdc-select-placeholder,:host ::ng-deep .mat-mdc-select-value-text,:host ::ng-deep .mdc-floating-label{font-size:14px!important}:host ::ng-deep .mdc-text-field--filled{--mdc-filled-text-field-active-indicator-height: 0;--mdc-filled-text-field-focus-active-indicator-height: 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}:host ::ng-deep .mat-mdc-text-field-wrapper:hover{background-color:var(--base-70)!important;transition:.1s}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mdc-floating-label--float-above{margin-top:3px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i5.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "component", type: i6.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "panelWidth", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i7.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatChipListbox, selector: "mat-chip-listbox", inputs: ["tabIndex", "multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i11.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: i11.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i13.SortTranslationsByPropertyPipe, name: "sortTranslationsByProperty" }, { kind: "pipe", type: i14.SortAlphabeticallyPipe, name: "sortAlphabetically" }] }); }
179
206
  }
180
207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FilterBarComponent, decorators: [{
181
208
  type: Component,
182
- args: [{ selector: 'tld-filter-bar', template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch && !filterOverflow || activeFilterIndex === searchIndex\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field [ngClass]=\"{'hidden': filterOverflow && activeFilterIndex !== i}\" *ngFor=\"let filter of settings?.filters; let i = index\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select \r\n multiple \r\n [panelWidth]=\"filter?.maxPanelWidth ?? 'auto'\" \r\n [formControlName]=\"filter.fieldName\" \r\n (openedChange)=\"$event === true ? focusOptionSearchInput(filter, i) : clearOptionSearchInput(filter, i)\"\r\n (selectionChange)=\"selectEvent($event, filter)\" \r\n >\r\n <ng-container *ngIf=\"filter?.search?.placeholder\">\r\n <input #optionSearchInput class=\"option-search-input\" type=\"text\" [placeholder]=\"filter.search?.placeholder ?? '' | translate\" (keyup)=\"filterOptions($event, filter)\" (keydown)=\"$event.stopPropagation()\">\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"filter.values.length\">\r\n <ng-container *ngIf=\"filter.translated; else sortedValuesByProperty\">\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortAlphabetically:'key'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n {{ filter.disableTitleCase ? value.key : (value.key | titlecase) }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-template #sortedValuesByProperty>\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortTranslationsByProperty:'key':'value'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n <ng-container *ngIf=\"!filter.disableTitleCase; else defaultCase\">\r\n {{ value.key | translate : { default: value.value | titlecase } }}\r\n </ng-container>\r\n \r\n <ng-template #defaultCase>\r\n {{ value.key | translate : { default: value.value } }} \r\n </ng-template>\r\n </mat-option>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <button mat-icon-button (click)=\"switchLeft()\" *ngIf=\"filterOverflow\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <button mat-icon-button *ngIf=\"filterOverflow\" (click)=\"switchRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n</div>\r\n<mat-chip-listbox>\r\n <div *ngFor=\"let filter of settings?.filters\">\r\n <mat-chip-option *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{(filter.translated ? filterValue.key : filterValue.key | translate : {default: filterValue.value}) | titlecase\r\n }}</span>\r\n </mat-chip-option>\r\n </div>\r\n</mat-chip-listbox>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem .75rem;max-width:100%;align-items:baseline;margin-bottom:.5rem}.option-search-input{font-size:14px;width:100%;padding:.5rem 1rem;margin-bottom:.5rem}.search-input{background-color:unset;border:none}.filter-bar-search-input{width:100%;margin-right:5px}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom;padding:0 5px}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-mdc-chip.mat-mdc-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-mdc-chip.mat-mdc-standard-chip span{display:inline-block}.mat-mdc-chip.mat-mdc-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.chip-filter-title{margin-left:.5em}.hidden{display:none}:host ::ng-deep .mat-mdc-form-field-focus-overlay,:host ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--base-95)}:host ::ng-deep .mdc-text-field--focused{background-color:var(--base-70)!important}:host ::ng-deep .mat-mdc-chip-graphic{display:none}:host ::ng-deep .mat-mdc-chip-remove{color:var(--base-40)!important}:host ::ng-deep .search-input,:host ::ng-deep .mat-mdc-select-placeholder,:host ::ng-deep .mat-mdc-select-value-text,:host ::ng-deep .mdc-floating-label{font-size:14px!important}:host ::ng-deep .mdc-text-field--filled{--mdc-filled-text-field-active-indicator-height: 0;--mdc-filled-text-field-focus-active-indicator-height: 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}:host ::ng-deep .mat-mdc-text-field-wrapper:hover{background-color:var(--base-70)!important;transition:.1s}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mdc-floating-label--float-above{margin-top:3px}\n"] }]
209
+ args: [{ selector: 'tld-filter-bar', template: "<div class=\"filter-row\" *ngIf=\"filterRowVisible\">\r\n <div fxLayout=\"row\" class=\"filter-wrapper\" #filterWrapper [formGroup]=\"form\">\r\n <mat-form-field fxFlex *ngIf=\"showSearch && !filterOverflow || activeFilterIndex === searchIndex\" class=\"filter-bar-search-input\">\r\n <span matPrefix class=\"material-icons-outlined\">\r\n {{prefixIcon}}\r\n </span>\r\n <span matSuffix class=\"material-icons-outlined\" *ngIf=\"showSuffixIcon\" [matTooltip]=\"searchTooltip | translate\">\r\n {{suffixIcon}}\r\n </span>\r\n <input class=\"search-input\" matInput [placeholder]=\"searchTitle | translate\"\r\n [formControlName]=\"inputFormControlName\">\r\n </mat-form-field>\r\n <ng-container [formGroup]=\"filterFormGroup\">\r\n\r\n <mat-form-field *ngFor=\"let filter of currentFilters; let i = index\">\r\n <mat-label>{{filter.title | translate}}</mat-label>\r\n <mat-select \r\n multiple \r\n [panelWidth]=\"filter?.maxPanelWidth ?? 'auto'\" \r\n [formControlName]=\"filter.fieldName\" \r\n (openedChange)=\"$event === true ? focusOptionSearchInput(filter, i) : clearOptionSearchInput(filter, i)\"\r\n (selectionChange)=\"selectEvent($event, filter)\" \r\n >\r\n <ng-container *ngIf=\"filter?.search?.placeholder\">\r\n <input #optionSearchInput class=\"option-search-input\" type=\"text\" [placeholder]=\"filter.search?.placeholder ?? '' | translate\" (keyup)=\"filterOptions($event, filter)\" (keydown)=\"$event.stopPropagation()\">\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"filter.values.length\">\r\n <ng-container *ngIf=\"filter.translated; else sortedValuesByProperty\">\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortAlphabetically:'key'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n {{ filter.disableTitleCase ? value.key : (value.key | titlecase) }}\r\n </mat-option>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <ng-template #sortedValuesByProperty>\r\n <ng-container *ngFor=\"let value of (filter.search?.filteredValues ?? filter.values) | sortTranslationsByProperty:'key':'value'\">\r\n <mat-option [class.hidden]=\"filter.search?.searchCriteria && value.isSelected && !value.matchesSearchCriteria\" class=\"filter-option\" [disabled]=\"filter.singleSelection?.selected && filter.singleSelection?.value !== value.value\" [value]=\"value\">\r\n <ng-container *ngIf=\"!filter.disableTitleCase; else defaultCase\">\r\n {{ value.key | translate : { default: value.value | titlecase } }}\r\n </ng-container>\r\n \r\n <ng-template #defaultCase>\r\n {{ value.key | translate : { default: value.value } }} \r\n </ng-template>\r\n </mat-option>\r\n </ng-container>\r\n </ng-template>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"filterOverflow\">\r\n <button mat-icon-button (click)=\"switchLeft()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_back_ios\r\n </span>\r\n </button>\r\n <button mat-icon-button (click)=\"switchRight()\">\r\n <span class=\"material-icons-outlined\">\r\n arrow_forward_ios\r\n </span>\r\n </button>\r\n </ng-container>\r\n</div>\r\n<mat-chip-listbox>\r\n <div *ngFor=\"let filter of settings?.filters\">\r\n <mat-chip-option *ngFor=\"let filterValue of filterFormGroupValue[filter.fieldName]; let ix=index\"\r\n (removed)=\"removeFilter(filter.fieldName, ix)\" class=\"text-s\">\r\n <button matChipRemove>\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n <span class=\"chip-filter-title\">{{filter.title | translate}}:</span>\r\n <span class=\"chip-value semi-bold\"> {{(filter.translated ? filterValue.key : filterValue.key | translate : {default: filterValue.value}) | titlecase\r\n }}</span>\r\n </mat-chip-option>\r\n </div>\r\n</mat-chip-listbox>\r\n", styles: [":host{display:inline-block}.filter-row{display:flex;background-color:var(--base-95);min-height:40px;min-width:100%;border-radius:.5rem;padding:.5rem .75rem;max-width:100%;align-items:center;margin-bottom:.5rem}.option-search-input{font-size:14px;width:100%;padding:.5rem 1rem;margin-bottom:.5rem}.search-input{background-color:unset;border:none}.filter-bar-search-input{width:100%;margin-right:5px}.filter-bar-search-input::ng-deep .material-icons-outlined{vertical-align:bottom;padding:0 5px}.material-icons-outlined{color:var(--base-40)}.filter-wrapper{max-width:100%;overflow-x:hidden;overflow-y:hidden;display:flex;flex:1}.mat-mdc-chip.mat-mdc-standard-chip{background-color:var(--base-95);padding-left:.5em;padding-right:.75em;border:.5px solid var(--base-70)}.mat-mdc-chip.mat-mdc-standard-chip span{display:inline-block}.mat-mdc-chip.mat-mdc-standard-chip .chip-filter-title+.chip-value{margin-left:.25rem}.chip-filter-title{margin-left:.5em}.hidden{display:none}:host ::ng-deep .mat-mdc-form-field-focus-overlay,:host ::ng-deep .mdc-text-field--filled:not(.mdc-text-field--disabled){background-color:var(--base-95)}:host ::ng-deep .mdc-text-field--focused{background-color:var(--base-70)!important}:host ::ng-deep .mat-mdc-chip-graphic{display:none}:host ::ng-deep .mat-mdc-chip-remove{color:var(--base-40)!important}:host ::ng-deep .search-input,:host ::ng-deep .mat-mdc-select-placeholder,:host ::ng-deep .mat-mdc-select-value-text,:host ::ng-deep .mdc-floating-label{font-size:14px!important}:host ::ng-deep .mdc-text-field--filled{--mdc-filled-text-field-active-indicator-height: 0;--mdc-filled-text-field-focus-active-indicator-height: 0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}:host ::ng-deep .mat-mdc-text-field-wrapper:hover{background-color:var(--base-70)!important;transition:.1s}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mdc-floating-label--float-above{margin-top:3px}\n"] }]
183
210
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.TranslateService }]; }, propDecorators: { filterWrapper: [{
184
211
  type: ViewChild,
185
212
  args: ["filterWrapper"]
@@ -196,4 +223,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
196
223
  }], filterBarChange: [{
197
224
  type: Output
198
225
  }] } });
199
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvZmlsdGVyLWJhci9maWx0ZXItYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9maWx0ZXItYmFyL2ZpbHRlci1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9LLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYXhELE1BQU0sT0FBTyxrQkFBa0I7SUFJN0IsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBR0QsSUFBYSxnQkFBZ0IsQ0FBQyxLQUFjO1FBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWdDRCxtQ0FBbUM7SUFDbkMsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztJQUNwQyxDQUFDO0lBQ0QsMkVBQTJFO0lBQzNFLElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUks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QkFFakMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFO2dCQUt4QixRQUFRO3NCQUFoQixLQUFLO2dCQUNPLGdCQUFnQjtzQkFBNUIsS0FBSztnQkFNSSxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRmlsdGVyQmFyRmlsdGVyLCBGaWx0ZXJCYXJGaWx0ZXJJdGVtIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJDaGFuZ2VFdmVudCB9IGZyb20gJy4vbW9kZWxzL2ZpbHRlci1iYXItY2hhbmdlLWV2ZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRmlsdGVyQmFyU2V0dGluZ3MgfSBmcm9tICcuL21vZGVscy9maWx0ZXItYmFyLXNldHRpbmdzLm1vZGVsJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3RsZC1maWx0ZXItYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZmlsdGVyLWJhci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBGaWx0ZXJCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQFZpZXdDaGlsZChcImZpbHRlcldyYXBwZXJcIikgZmlsdGVyV3JhcHBlciE6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbignb3B0aW9uU2VhcmNoSW5wdXQnKSBvcHRpb25TZWFyY2hJbnB1dHMhOiBFbGVtZW50UmVmW107XHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFtdKVxyXG4gIG9uUmVzaXplKCkge1xyXG4gICAgdGhpcy5jaGVja092ZXJmbG93KCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXR0aW5ncyE6IEZpbHRlckJhclNldHRpbmdzO1xyXG4gIEBJbnB1dCgpIHNldCBmaWx0ZXJSb3dWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9maWx0ZXJSb3dWaXNpYmxlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNkcmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpO1xyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIGZpbHRlckJhckNoYW5nZTogRXZlbnRFbWl0dGVyPEZpbHRlckJhckNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX2lucHV0VGV4dCA9IFwiXCI7XHJcbiAgcHJpdmF0ZSBfZmlsdGVyUm93VmlzaWJsZSE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBmb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbiE6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqIFRvIGhpZGUgZmlsdGVycywgYnV0IGxlYXZlIGNoaXBzIHZpc2libGUgKi9cclxuICByZWFkb25seSBpbnB1dEZvcm1Db250cm9sTmFtZSA9IFwiaW5wdXRcIjtcclxuICByZWFkb25seSBmaWx0ZXJGb3JtR3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9KTtcclxuICByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICBbdGhpcy5pbnB1dEZvcm1Db250cm9sTmFtZV06IG5ldyBGb3JtQ29udHJvbChcIlwiKSxcclxuICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVyRm9ybUdyb3VwXHJcbiAgfSk7XHJcblxyXG4gIHNlYXJjaFRpdGxlITogc3RyaW5nO1xyXG4gIHNlYXJjaFRvb2x0aXAhOiBzdHJpbmc7XHJcbiAgc3VmZml4SWNvbiE6IHN0cmluZztcclxuICBwcmVmaXhJY29uITogc3RyaW5nO1xyXG4gIHNob3dTdWZmaXhJY29uITogYm9vbGVhbjtcclxuICBmaWx0ZXJzOiBGaWx0ZXJCYXJDaGFuZ2VFdmVudCA9IHtcclxuICAgIGZpbHRlcnM6IHt9LFxyXG4gICAgaW5wdXQ6IFwiXCJcclxuICB9O1xyXG5cclxuICBmaWx0ZXJPdmVyZmxvdyA9IGZhbHNlO1xyXG4gIGFjdGl2ZUZpbHRlckluZGV4ID0gMDtcclxuXHJcbiAgLy8gd2hlbiB0byBzaG93IGZpbHRlciBieSBuYW1lIG9yIGlkIG9uIG1vYmlsZVxyXG4gIHNlYXJjaEluZGV4ID0gLTE7XHJcblxyXG4gIC8vIGdldHRlciBmb3IgY2xlYW5lciB0ZW1wbGF0ZSBodG1sXHJcbiAgZ2V0IGZpbHRlckZvcm1Hcm91cFZhbHVlKCk6IHsgW2tleTogc3RyaW5nXTogRmlsdGVyQmFyRmlsdGVySXRlbVtdIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyRm9ybUdyb3VwLnZhbHVlO1xyXG4gIH1cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2FkamFjZW50LW92ZXJsb2FkLXNpZ25hdHVyZXNcclxuICBnZXQgZmlsdGVyUm93VmlzaWJsZSgpIHsgcmV0dXJuIHRoaXMuX2ZpbHRlclJvd1Zpc2libGU7IH1cclxuICBnZXQgaW5wdXRUZXh0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lucHV0VGV4dDtcclxuICB9XHJcbiAgZ2V0IHNob3dTZWFyY2goKSB7XHJcbiAgICByZXR1cm4gIXRoaXMuc2V0dGluZ3M/LmhpZGVTZWFyY2g7XHJcbiAgfVxyXG4gIGdldCBvdXRwdXRGaWx0ZXJLZXlBbmRWYWx1ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5vdXRwdXRGaWx0ZXJLZXlBbmRWYWx1ZTtcclxuICB9XHJcblxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYWRqYWNlbnQtb3ZlcmxvYWQtc2lnbmF0dXJlc1xyXG4gIHNldCBpbnB1dFRleHQodmFsdWUpIHtcclxuICAgIHRoaXMuX2lucHV0VGV4dCA9IHZhbHVlO1xyXG4gICAgdGhpcy5maWx0ZXJzLmlucHV0ID0gdGhpcy5faW5wdXRUZXh0O1xyXG4gICAgdGhpcy5lbWl0RmlsdGVycygpO1xyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldHRpbmdzLmZpbHRlcnM/LmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgIHRoaXMuZmlsdGVyRm9ybUdyb3VwLmFkZENvbnRyb2woZmllbGQuZmllbGROYW1lLCBuZXcgRm9ybUNvbnRyb2woW10pKTtcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVUb0Zvcm1WYWx1ZUNoYW5nZXMoKTtcclxuICAgIHRoaXMuc2VhcmNoVG9vbHRpcCA9IHRoaXMuc2V0dGluZ3M/LnNlYXJjaFRvb2x0aXAgPz8gJ0ZJTFRFUl9CQVIuU0VBUkNIX1RPT0xUSVAnO1xyXG4gICAgdGhpcy5zZWFyY2hUaXRsZSA9IHRoaXMuc2V0dGluZ3M/LnNlYXJjaFRpdGxlID8/ICdGSUxURVJfQkFSLlNFQVJDSCc7XHJcbiAgICB0aGlzLnByZWZpeEljb24gPSB0aGlzLnNldHRpbmdzPy5wcmVmaXhJY29uID8/IFwiZmlsdGVyX2FsdFwiO1xyXG4gICAgdGhpcy5zdWZmaXhJY29uID0gdGhpcy5zZXR0aW5ncz8uc3VmZml4SWNvbiA/PyBcInF1ZXN0aW9uX21hcmtcIjtcclxuICAgIHRoaXMuc2hvd1N1ZmZpeEljb24gPSB0aGlzLnNldHRpbmdzPy5zaG93U3VmZml4SWNvbiA/PyB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGVja092ZXJmbG93KCk7XHJcbiAgICB0aGlzLmNkcmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtQ2hhbmdlc1N1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZm9jdXNPcHRpb25TZWFyY2hJbnB1dChmaWx0ZXI6IEZpbHRlckJhckZpbHRlciwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKCFmaWx0ZXIuc2VhcmNoPy5wbGFjZWhvbGRlciB8fCBmaWx0ZXIuc2VsZWN0ZWRWYWx1ZXM/Lmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5vcHRpb25TZWFyY2hJbnB1dHMuZmluZCgoX2l0ZW0sIGkpID0+IGkgPT09IGluZGV4KT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG5cclxuICAgIGlmIChmaWx0ZXIubWF4UGFuZWxXaWR0aCA9PT0gJycgJiYgZmlsdGVyLnNlYXJjaC5wbGFjZWhvbGRlcikge1xyXG4gICAgICB0aGlzLnNldFBhbmVsV2lkdGgoZmlsdGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyT3B0aW9uU2VhcmNoSW5wdXQoZmlsdGVyOiBGaWx0ZXJCYXJGaWx0ZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghZmlsdGVyLnNlYXJjaD8ucGxhY2Vob2xkZXIpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5vcHRpb25TZWFyY2hJbnB1dHMuZmluZCgoX2l0ZW0sIGkpID0+IGkgPT09IGluZGV4KT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlucHV0LnZhbHVlID0gJyc7XHJcbiAgICBmaWx0ZXIuc2VhcmNoLnNlYXJjaENyaXRlcmlhID0gJyc7XHJcbiAgICB0aGlzLmZpbHRlck9wdGlvbnMobnVsbCwgZmlsdGVyKTtcclxuICB9XHJcblxyXG4gIGZpbHRlck9wdGlvbnMoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBudWxsLCBmaWx0ZXI6IEZpbHRlckJhckZpbHRlcikge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xyXG4gICAgZmlsdGVyLnNlYXJjaCEuc2VhcmNoQ3JpdGVyaWEgPSB0YXJnZXQ/LnZhbHVlID8/ICcnO1xyXG4gICAgdGhpcy5zZXR0aW5ncy5maWx0ZXJzPy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmZpZWxkTmFtZSA9PT0gZmlsdGVyLmZpZWxkTmFtZSAmJiBpdGVtLnNlYXJjaCkge1xyXG4gICAgICAgIGl0ZW0uc2VhcmNoLmZpbHRlcmVkVmFsdWVzID0gZmlsdGVyLnZhbHVlcy5maWx0ZXIoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB2YWx1ZUtleSA9IGl0ZW0udHJhbnNsYXRlZCA/IHZhbHVlLmtleSA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodmFsdWUua2V5KTtcclxuICAgICAgICAgIGNvbnN0IG1hdGNoZXNTZWFyY2ggPSB2YWx1ZUtleS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRhcmdldD8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPz8gJycpO1xyXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGZpbHRlci5zZWxlY3RlZFZhbHVlcz8uc29tZSgoc2VsZWN0ZWRWYWx1ZSkgPT4gc2VsZWN0ZWRWYWx1ZS5rZXkgPT09IHZhbHVlLmtleSk7XHJcbiAgICAgICAgICB2YWx1ZS5pc1NlbGVjdGVkID0gaXNTZWxlY3RlZCA/PyBmYWxzZTtcclxuICAgICAgICAgIHZhbHVlLm1hdGNoZXNTZWFyY2hDcml0ZXJpYSA9IG1hdGNoZXNTZWFyY2ggPz8gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm4gbWF0Y2hlc1NlYXJjaCB8fCBpc1NlbGVjdGVkO1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RXZlbnQoZXZlbnQ6IGFueSwgZmlsdGVyOiBGaWx0ZXJCYXJGaWx0ZXIpIHtcclxuICAgIGNvbnN0IHNldHRpbmdGaWx0ZXIgPSB0aGlzLnNldHRpbmdzLmZpbHRlcnM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0uZmllbGROYW1lID09PSBmaWx0ZXIuZmllbGROYW1lKSBhcyBGaWx0ZXJCYXJGaWx0ZXI7XHJcbiAgICBzZXR0aW5nRmlsdGVyLnNlbGVjdGVkVmFsdWVzID0gZXZlbnQudmFsdWU7XHJcbiAgfVxyXG5cclxuICBzZXRQYW5lbFdpZHRoKGZpbHRlcjogRmlsdGVyQmFyRmlsdGVyKTogdm9pZCB7XHJcbiAgICAvLyBXZSBtdXN0IHNhdmUgcGFuZWwgd2lkdGgsIHNvIGZpbHRlcmluZyBkb2VzIG5vdCBhZmZlY3QgaXRgcyBzaXplLlxyXG4gICAgY29uc3Qgc2VsZWN0UGFuZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuY2RrLW92ZXJsYXktcGFuZScpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3Qgc2VsZWN0UGFuZWxXaWR0aCA9IHNlbGVjdFBhbmVsLmNsaWVudFdpZHRoIGFzIG51bWJlcjtcclxuICAgIGNvbnN0IGZpbHRlck9iaiA9IHRoaXMuc2V0dGluZ3MuZmlsdGVycz8uZmluZCgoaXRlbSkgPT4gaXRlbS5maWVsZE5hbWUgPT09IGZpbHRlci5maWVsZE5hbWUpIGFzIEZpbHRlckJhckZpbHRlcjtcclxuICAgIGZpbHRlck9iai5tYXhQYW5lbFdpZHRoID0gc2VsZWN0UGFuZWxXaWR0aDtcclxuICAgIHNlbGVjdFBhbmVsLnN0eWxlLm1pbldpZHRoID0gYCR7c2VsZWN0UGFuZWxXaWR0aH1weGA7XHJcbiAgfVxyXG5cclxuICBlbWl0RmlsdGVycygpIHtcclxuICAgIHRoaXMuZmlsdGVyQmFyQ2hhbmdlLm5leHQodGhpcy5maWx0ZXJzKTtcclxuICB9XHJcblxyXG4gIHN3aXRjaFJpZ2h0KCkge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3M/LmZpbHRlcnMgJiYgdGhpcy5zZXR0aW5ncz8uZmlsdGVycy5sZW5ndGggPT09IHRoaXMuYWN0aXZlRmlsdGVySW5kZXggKyAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlRmlsdGVySW5kZXggKz0gMTtcclxuICB9XHJcblxyXG4gIHN3aXRjaExlZnQoKSB7XHJcbiAgICBpZiAodGhpcy5hY3RpdmVGaWx0ZXJJbmRleCA9PT0gdGhpcy5zZWFyY2hJbmRleCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZUZpbHRlckluZGV4IC09IDE7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGaWx0ZXIoa2V5OiBzdHJpbmcsIGl4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZpbHRlckZvcm1Hcm91cC5nZXQoa2V5KTtcclxuXHJcbiAgICBpZiAoIWNvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld0FycmF5ID0gY29udHJvbC52YWx1ZSBhcyBbXTtcclxuICAgIG5ld0FycmF5LnNwbGljZShpeCwgMSk7XHJcbiAgICBjb250cm9sLnNldFZhbHVlKG5ld0FycmF5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tPdmVyZmxvdygpIHtcclxuICAgIGlmICh0aGlzLmZpbHRlcldyYXBwZXIpIHtcclxuICAgICAgdGhpcy5maWx0ZXJPdmVyZmxvdyA9IHRoaXMuZmlsdGVyV3JhcHBlci5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIDwgdGhpcy5maWx0ZXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN1YnNjcmliZVRvRm9ybVZhbHVlQ2hhbmdlcygpIHtcclxuICAgIHRoaXMuZm9ybUNoYW5nZXNTdWJzY3JpcHRpb24gPSB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZmlsdGVycyA9IHtcclxuICAgICAgICBpbnB1dDogdGhpcy5mb3JtLnZhbHVlLmlucHV0ID8/IFwiXCIsXHJcbiAgICAgICAgZmlsdGVyczoge31cclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZvciAoY29uc3QgZmlsdGVyS2V5IGluIHRoaXMuZm9ybS52YWx1ZS5maWx0ZXJzKSB7XHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICAgICAgICBjb25zdCBmaWx0ZXI6IEZpbHRlckJhckZpbHRlckl0ZW1bXSA9ICh0aGlzLmZvcm0udmFsdWUuZmlsdGVycyBhcyBhbnkpW2ZpbHRlcktleV0gYXMgRmlsdGVyQmFyRmlsdGVySXRlbVtdO1xyXG4gICAgICAgIHRoaXMuZmlsdGVycy5maWx0ZXJzW2ZpbHRlcktleV0gPSBmaWx0ZXIubWFwKChpdGVtKSA9PiB0aGlzLm91dHB1dEZpbHRlcktleUFuZFZhbHVlID8gaXRlbSA6IGl0ZW0udmFsdWUpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5lbWl0RmlsdGVycygpO1xyXG4gICAgfSlcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZpbHRlci1yb3dcIiAqbmdJZj1cImZpbHRlclJvd1Zpc2libGVcIj5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgY2xhc3M9XCJmaWx0ZXItd3JhcHBlclwiICNmaWx0ZXJXcmFwcGVyIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleCAqbmdJZj1cInNob3dTZWFyY2ggJiYgIWZpbHRlck92ZXJmbG93IHx8IGFjdGl2ZUZpbHRlckluZGV4ID09PSBzZWFyY2hJbmRleFwiIGNsYXNzPVwiZmlsdGVyLWJhci1zZWFyY2gtaW5wdXRcIj5cclxuICAgICAgPHNwYW4gbWF0UHJlZml4IGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5cclxuICAgICAgICB7e3ByZWZpeEljb259fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxzcGFuIG1hdFN1ZmZpeCBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCIgKm5nSWY9XCJzaG93U3VmZml4SWNvblwiIFttYXRUb29sdGlwXT1cInNlYXJjaFRvb2x0aXAgfCB0cmFuc2xhdGVcIj5cclxuICAgICAgICB7e3N1ZmZpeEljb259fVxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxpbnB1dCBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIG1hdElucHV0IFtwbGFjZWhvbGRlcl09XCJzZWFyY2hUaXRsZSB8IHRyYW5zbGF0ZVwiXHJcbiAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpbnB1dEZvcm1Db250cm9sTmFtZVwiPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxuZy1jb250YWluZXIgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtR3JvdXBcIj5cclxuXHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZCBbbmdDbGFzc109XCJ7J2hpZGRlbic6IGZpbHRlck92ZXJmbG93ICYmIGFjdGl2ZUZpbHRlckluZGV4ICE9PSBpfVwiICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2Ygc2V0dGluZ3M/LmZpbHRlcnM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICA8bWF0LWxhYmVsPnt7ZmlsdGVyLnRpdGxlIHwgdHJhbnNsYXRlfX08L21hdC1sYWJlbD5cclxuICAgICAgICA8bWF0LXNlbGVjdCBcclxuICAgICAgICAgIG11bHRpcGxlIFxyXG4gICAgICAgICAgW3BhbmVsV2lkdGhdPVwiZmlsdGVyPy5tYXhQYW5lbFdpZHRoID8/ICdhdXRvJ1wiIFxyXG4gICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWx0ZXIuZmllbGROYW1lXCIgXHJcbiAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIiRldmVudCA9PT0gdHJ1ZSA/IGZvY3VzT3B0aW9uU2VhcmNoSW5wdXQoZmlsdGVyLCBpKSA6IGNsZWFyT3B0aW9uU2VhcmNoSW5wdXQoZmlsdGVyLCBpKVwiXHJcbiAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cInNlbGVjdEV2ZW50KCRldmVudCwgZmlsdGVyKVwiIFxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXI/LnNlYXJjaD8ucGxhY2Vob2xkZXJcIj5cclxuICAgICAgICAgICAgPGlucHV0ICNvcHRpb25TZWFyY2hJbnB1dCBjbGFzcz1cIm9wdGlvbi1zZWFyY2gtaW5wdXRcIiB0eXBlPVwidGV4dFwiIFtwbGFjZWhvbGRlcl09XCJmaWx0ZXIuc2VhcmNoPy5wbGFjZWhvbGRlciA/PyAnJyB8IHRyYW5zbGF0ZVwiIChrZXl1cCk9XCJmaWx0ZXJPcHRpb25zKCRldmVudCwgZmlsdGVyKVwiIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci52YWx1ZXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXIudHJhbnNsYXRlZDsgZWxzZSBzb3J0ZWRWYWx1ZXNCeVByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgKGZpbHRlci5zZWFyY2g/LmZpbHRlcmVkVmFsdWVzID8/IGZpbHRlci52YWx1ZXMpIHwgc29ydEFscGhhYmV0aWNhbGx5OidrZXknXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3MuaGlkZGVuXT1cImZpbHRlci5zZWFyY2g/LnNlYXJjaENyaXRlcmlhICYmIHZhbHVlLmlzU2VsZWN0ZWQgJiYgIXZhbHVlLm1hdGNoZXNTZWFyY2hDcml0ZXJpYVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiIFtkaXNhYmxlZF09XCJmaWx0ZXIuc2luZ2xlU2VsZWN0aW9uPy5zZWxlY3RlZCAmJiBmaWx0ZXIuc2luZ2xlU2VsZWN0aW9uPy52YWx1ZSAhPT0gdmFsdWUudmFsdWVcIiBbdmFsdWVdPVwidmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgZmlsdGVyLmRpc2FibGVUaXRsZUNhc2UgPyB2YWx1ZS5rZXkgOiAodmFsdWUua2V5IHwgdGl0bGVjYXNlKSB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc29ydGVkVmFsdWVzQnlQcm9wZXJ0eT5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiAoZmlsdGVyLnNlYXJjaD8uZmlsdGVyZWRWYWx1ZXMgPz8gZmlsdGVyLnZhbHVlcykgfCBzb3J0VHJhbnNsYXRpb25zQnlQcm9wZXJ0eTona2V5JzondmFsdWUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbY2xhc3MuaGlkZGVuXT1cImZpbHRlci5zZWFyY2g/LnNlYXJjaENyaXRlcmlhICYmIHZhbHVlLmlzU2VsZWN0ZWQgJiYgIXZhbHVlLm1hdGNoZXNTZWFyY2hDcml0ZXJpYVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvblwiIFtkaXNhYmxlZF09XCJmaWx0ZXIuc2luZ2xlU2VsZWN0aW9uPy5zZWxlY3RlZCAmJiBmaWx0ZXIuc2luZ2xlU2VsZWN0aW9uPy52YWx1ZSAhPT0gdmFsdWUudmFsdWVcIiBbdmFsdWVdPVwidmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmaWx0ZXIuZGlzYWJsZVRpdGxlQ2FzZTsgZWxzZSBkZWZhdWx0Q2FzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAge3sgdmFsdWUua2V5IHwgdHJhbnNsYXRlIDogeyBkZWZhdWx0OiB2YWx1ZS52YWx1ZSB8IHRpdGxlY2FzZSB9IH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDYXNlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IHZhbHVlLmtleSB8IHRyYW5zbGF0ZSA6IHsgZGVmYXVsdDogdmFsdWUudmFsdWUgfSB9fSBcclxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzd2l0Y2hMZWZ0KClcIiAqbmdJZj1cImZpbHRlck92ZXJmbG93XCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+XHJcbiAgICAgIGFycm93X2JhY2tfaW9zXHJcbiAgICA8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCJmaWx0ZXJPdmVyZmxvd1wiIChjbGljayk9XCJzd2l0Y2hSaWdodCgpXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+XHJcbiAgICAgIGFycm93X2ZvcndhcmRfaW9zXHJcbiAgICA8L3NwYW4+XHJcbiAgPC9idXR0b24+XHJcbjwvZGl2PlxyXG48bWF0LWNoaXAtbGlzdGJveD5cclxuICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2Ygc2V0dGluZ3M/LmZpbHRlcnNcIj5cclxuICAgIDxtYXQtY2hpcC1vcHRpb24gKm5nRm9yPVwibGV0IGZpbHRlclZhbHVlIG9mIGZpbHRlckZvcm1Hcm91cFZhbHVlW2ZpbHRlci5maWVsZE5hbWVdOyBsZXQgaXg9aW5kZXhcIlxyXG4gICAgICAocmVtb3ZlZCk9XCJyZW1vdmVGaWx0ZXIoZmlsdGVyLmZpZWxkTmFtZSwgaXgpXCIgY2xhc3M9XCJ0ZXh0LXNcIj5cclxuICAgICAgPGJ1dHRvbiBtYXRDaGlwUmVtb3ZlPlxyXG4gICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImNoaXAtZmlsdGVyLXRpdGxlXCI+e3tmaWx0ZXIudGl0bGUgfCB0cmFuc2xhdGV9fTo8L3NwYW4+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcC12YWx1ZSBzZW1pLWJvbGRcIj4ge3soZmlsdGVyLnRyYW5zbGF0ZWQgPyBmaWx0ZXJWYWx1ZS5rZXkgOiBmaWx0ZXJWYWx1ZS5rZXkgfCB0cmFuc2xhdGUgOiB7ZGVmYXVsdDogZmlsdGVyVmFsdWUudmFsdWV9KSB8IHRpdGxlY2FzZVxyXG4gICAgICAgIH19PC9zcGFuPlxyXG4gICAgPC9tYXQtY2hpcC1vcHRpb24+XHJcbiAgPC9kaXY+XHJcbjwvbWF0LWNoaXAtbGlzdGJveD5cclxuIl19
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvZmlsdGVyLWJhci9maWx0ZXItYmFyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9maWx0ZXItYmFyL2ZpbHRlci1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQyxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9LLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFheEQsTUFBTSxPQUFPLGtCQUFrQjtJQUk3QixRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFHRCxJQUFhLGdCQUFnQixDQUFDLEtBQWM7UUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBZ0NELG1DQUFtQztJQUNuQyxJQUFJLG9CQUFvQjtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFDRCwyRUFBMkU7SUFDM0UsSUFBSSxnQkFBZ0IsS0FBSyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLENBQUMsSUFBSSxD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LE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3pHO1lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQzsrR0F4T1Usa0JBQWtCO21HQUFsQixrQkFBa0Isb2JDZC9CLDI3SUFnRkE7OzRGRGxFYSxrQkFBa0I7a0JBTjlCLFNBQVM7K0JBRUUsZ0JBQWdCO3VJQUtFLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFDUyxrQkFBa0I7c0JBQXBELFlBQVk7dUJBQUMsbUJBQW1CO2dCQUVqQyxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLEVBQUU7Z0JBS3hCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ08sZ0JBQWdCO3NCQUE1QixLQUFLO2dCQU1JLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJGaWx0ZXIsIEZpbHRlckJhckZpbHRlckl0ZW0gfSBmcm9tICcuL21vZGVscyc7XHJcbmltcG9ydCB7IEZpbHRlckJhckNoYW5nZUV2ZW50IH0gZnJvbSAnLi9tb2RlbHMvZmlsdGVyLWJhci1jaGFuZ2UtZXZlbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBGaWx0ZXJCYXJTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWxzL2ZpbHRlci1iYXItc2V0dGluZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAndGxkLWZpbHRlci1iYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9maWx0ZXItYmFyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9maWx0ZXItYmFyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEZpbHRlckJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICBAVmlld0NoaWxkKFwiZmlsdGVyV3JhcHBlclwiKSBmaWx0ZXJXcmFwcGVyITogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkcmVuKCdvcHRpb25TZWFyY2hJbnB1dCcpIG9wdGlvblNlYXJjaElucHV0cyE6IEVsZW1lbnRSZWZbXTtcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgW10pXHJcbiAgb25SZXNpemUoKSB7XHJcbiAgICB0aGlzLmNoZWNrT3ZlcmZsb3coKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldHRpbmdzITogRmlsdGVyQmFyU2V0dGluZ3M7XHJcbiAgQElucHV0KCkgc2V0IGZpbHRlclJvd1Zpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2ZpbHRlclJvd1Zpc2libGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuY2RyZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5jaGVja092ZXJmbG93KCk7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgZmlsdGVyQmFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJCYXJDaGFuZ2VFdmVudD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaW5wdXRUZXh0ID0gXCJcIjtcclxuICBwcml2YXRlIF9maWx0ZXJSb3dWaXNpYmxlITogYm9vbGVhbjtcclxuICBwcml2YXRlIGZvcm1DaGFuZ2VzU3Vic2NyaXB0aW9uITogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKiogVG8gaGlkZSBmaWx0ZXJzLCBidXQgbGVhdmUgY2hpcHMgdmlzaWJsZSAqL1xyXG4gIHJlYWRvbmx5IGlucHV0Rm9ybUNvbnRyb2xOYW1lID0gXCJpbnB1dFwiO1xyXG4gIHJlYWRvbmx5IGZpbHRlckZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIFt0aGlzLmlucHV0Rm9ybUNvbnRyb2xOYW1lXTogbmV3IEZvcm1Db250cm9sKFwiXCIpLFxyXG4gICAgZmlsdGVyczogdGhpcy5maWx0ZXJGb3JtR3JvdXBcclxuICB9KTtcclxuXHJcbiAgc2VhcmNoVGl0bGUhOiBzdHJpbmc7XHJcbiAgc2VhcmNoVG9vbHRpcCE6IHN0cmluZztcclxuICBzdWZmaXhJY29uITogc3RyaW5nO1xyXG4gIHByZWZpeEljb24hOiBzdHJpbmc7XHJcbiAgc2hvd1N1ZmZpeEljb24hOiBib29sZWFuO1xyXG4gIGZpbHRlcnM6IEZpbHRlckJhckNoYW5nZUV2ZW50ID0ge1xyXG4gICAgZmlsdGVyczoge30sXHJcbiAgICBpbnB1dDogXCJcIlxyXG4gIH07XHJcblxyXG4gIGZpbHRlck92ZXJmbG93ID0gZmFsc2U7XHJcbiAgYWN0aXZlRmlsdGVySW5kZXggPSAwO1xyXG5cclxuICAvLyB3aGVuIHRvIHNob3cgZmlsdGVyIGJ5IG5hbWUgb3IgaWQgb24gbW9iaWxlXHJcbiAgc2VhcmNoSW5kZXggPSAtMTtcclxuXHJcbiAgLy8gZ2V0dGVyIGZvciBjbGVhbmVyIHRlbXBsYXRlIGh0bWxcclxuICBnZXQgZmlsdGVyRm9ybUdyb3VwVmFsdWUoKTogeyBba2V5OiBzdHJpbmddOiBGaWx0ZXJCYXJGaWx0ZXJJdGVtW10gfSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJGb3JtR3JvdXAudmFsdWU7XHJcbiAgfVxyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYWRqYWNlbnQtb3ZlcmxvYWQtc2lnbmF0dXJlc1xyXG4gIGdldCBmaWx0ZXJSb3dWaXNpYmxlKCkgeyByZXR1cm4gdGhpcy5fZmlsdGVyUm93VmlzaWJsZTsgfVxyXG4gIGdldCBpbnB1dFRleHQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5faW5wdXRUZXh0O1xyXG4gIH1cclxuICBnZXQgc2hvd1NlYXJjaCgpIHtcclxuICAgIHJldHVybiAhdGhpcy5zZXR0aW5ncz8uaGlkZVNlYXJjaDtcclxuICB9XHJcbiAgZ2V0IG91dHB1dEZpbHRlcktleUFuZFZhbHVlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3M/Lm91dHB1dEZpbHRlcktleUFuZFZhbHVlO1xyXG4gIH1cclxuICBnZXQgY3VycmVudEZpbHRlcnMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5ncz8uc3BsaXR0ZWRGaWx0ZXJzPy5sZW5ndGggPyB0aGlzLnNldHRpbmdzLnNwbGl0dGVkRmlsdGVyc1t0aGlzLmFjdGl2ZUZpbHRlckluZGV4XSA6IHRoaXMuc2V0dGluZ3M/LmZpbHRlcnM7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2FkamFjZW50LW92ZXJsb2FkLXNpZ25hdHVyZXNcclxuICBzZXQgaW5wdXRUZXh0KHZhbHVlKSB7XHJcbiAgICB0aGlzLl9pbnB1dFRleHQgPSB2YWx1ZTtcclxuICAgIHRoaXMuZmlsdGVycy5pbnB1dCA9IHRoaXMuX2lucHV0VGV4dDtcclxuICAgIHRoaXMuZW1pdEZpbHRlcnMoKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zZXR0aW5ncy5maWx0ZXJzPy5mb3JFYWNoKChmaWVsZCkgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlckZvcm1Hcm91cC5hZGRDb250cm9sKGZpZWxkLmZpZWxkTmFtZSwgbmV3IEZvcm1Db250cm9sKFtdKSk7XHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMuc3Vic2NyaWJlVG9Gb3JtVmFsdWVDaGFuZ2VzKCk7XHJcbiAgICB0aGlzLnNlYXJjaFRvb2x0aXAgPSB0aGlzLnNldHRpbmdzPy5zZWFyY2hUb29sdGlwID8/ICdGSUxURVJfQkFSLlNFQVJDSF9UT09MVElQJztcclxuICAgIHRoaXMuc2VhcmNoVGl0bGUgPSB0aGlzLnNldHRpbmdzPy5zZWFyY2hUaXRsZSA/PyAnRklMVEVSX0JBUi5TRUFSQ0gnO1xyXG4gICAgdGhpcy5wcmVmaXhJY29uID0gdGhpcy5zZXR0aW5ncz8ucHJlZml4SWNvbiA/PyBcImZpbHRlcl9hbHRcIjtcclxuICAgIHRoaXMuc3VmZml4SWNvbiA9IHRoaXMuc2V0dGluZ3M/LnN1ZmZpeEljb24gPz8gXCJxdWVzdGlvbl9tYXJrXCI7XHJcbiAgICB0aGlzLnNob3dTdWZmaXhJY29uID0gdGhpcy5zZXR0aW5ncz8uc2hvd1N1ZmZpeEljb24gPz8gdHJ1ZTtcclxuICAgIHRoaXMuYWN0aXZlRmlsdGVySW5kZXggPSB0aGlzLnNob3dTZWFyY2ggPyB0aGlzLnNlYXJjaEluZGV4IDogMDtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hlY2tPdmVyZmxvdygpO1xyXG4gICAgdGhpcy5jZHJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZm9ybUNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIGZvY3VzT3B0aW9uU2VhcmNoSW5wdXQoZmlsdGVyOiBGaWx0ZXJCYXJGaWx0ZXIsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICghZmlsdGVyLnNlYXJjaD8ucGxhY2Vob2xkZXIgfHwgZmlsdGVyLnNlbGVjdGVkVmFsdWVzPy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3B0aW9uU2VhcmNoSW5wdXRzLmZpbmQoKF9pdGVtLCBpKSA9PiBpID09PSBpbmRleCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuXHJcbiAgICBpZiAoZmlsdGVyLm1heFBhbmVsV2lkdGggPT09ICcnICYmIGZpbHRlci5zZWFyY2gucGxhY2Vob2xkZXIpIHtcclxuICAgICAgdGhpcy5zZXRQYW5lbFdpZHRoKGZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhck9wdGlvblNlYXJjaElucHV0KGZpbHRlcjogRmlsdGVyQmFyRmlsdGVyLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoIWZpbHRlci5zZWFyY2g/LnBsYWNlaG9sZGVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMub3B0aW9uU2VhcmNoSW5wdXRzLmZpbmQoKF9pdGVtLCBpKSA9PiBpID09PSBpbmRleCk/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xyXG4gICAgZmlsdGVyLnNlYXJjaC5zZWFyY2hDcml0ZXJpYSA9ICcnO1xyXG4gICAgdGhpcy5maWx0ZXJPcHRpb25zKG51bGwsIGZpbHRlcik7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJPcHRpb25zKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgbnVsbCwgZmlsdGVyOiBGaWx0ZXJCYXJGaWx0ZXIpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50Py50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGZpbHRlci5zZWFyY2ghLnNlYXJjaENyaXRlcmlhID0gdGFyZ2V0Py52YWx1ZSA/PyAnJztcclxuICAgIHRoaXMuc2V0dGluZ3MuZmlsdGVycz8uZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5maWVsZE5hbWUgPT09IGZpbHRlci5maWVsZE5hbWUgJiYgaXRlbS5zZWFyY2gpIHtcclxuICAgICAgICBpdGVtLnNlYXJjaC5maWx0ZXJlZFZhbHVlcyA9IGZpbHRlci52YWx1ZXMuZmlsdGVyKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWVLZXkgPSBpdGVtLnRyYW5zbGF0ZWQgPyB2YWx1ZS5rZXkgOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHZhbHVlLmtleSk7XHJcbiAgICAgICAgICBjb25zdCBtYXRjaGVzU2VhcmNoID0gdmFsdWVLZXkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0YXJnZXQ/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID8/ICcnKTtcclxuICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBmaWx0ZXIuc2VsZWN0ZWRWYWx1ZXM/LnNvbWUoKHNlbGVjdGVkVmFsdWUpID0+IHNlbGVjdGVkVmFsdWUua2V5ID09PSB2YWx1ZS5rZXkpO1xyXG4gICAgICAgICAgdmFsdWUuaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQgPz8gZmFsc2U7XHJcbiAgICAgICAgICB2YWx1ZS5tYXRjaGVzU2VhcmNoQ3JpdGVyaWEgPSBtYXRjaGVzU2VhcmNoID8/IGZhbHNlO1xyXG4gICAgICAgICAgcmV0dXJuIG1hdGNoZXNTZWFyY2ggfHwgaXNTZWxlY3RlZDtcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEV2ZW50KGV2ZW50OiBhbnksIGZpbHRlcjogRmlsdGVyQmFyRmlsdGVyKSB7XHJcbiAgICBjb25zdCBzZXR0aW5nRmlsdGVyID0gdGhpcy5zZXR0aW5ncy5maWx0ZXJzPy5maW5kKChpdGVtKSA9PiBpdGVtLmZpZWxkTmFtZSA9PT0gZmlsdGVyLmZpZWxkTmFtZSkgYXMgRmlsdGVyQmFyRmlsdGVyO1xyXG4gICAgc2V0dGluZ0ZpbHRlci5zZWxlY3RlZFZhbHVlcyA9IGV2ZW50LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgc2V0UGFuZWxXaWR0aChmaWx0ZXI6IEZpbHRlckJhckZpbHRlcik6IHZvaWQge1xyXG4gICAgLy8gV2UgbXVzdCBzYXZlIHBhbmVsIHdpZHRoLCBzbyBmaWx0ZXJpbmcgZG9lcyBub3QgYWZmZWN0IGl0YHMgc2l6ZS5cclxuICAgIGNvbnN0IHNlbGVjdFBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmNkay1vdmVybGF5LXBhbmUnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IHNlbGVjdFBhbmVsV2lkdGggPSBzZWxlY3RQYW5lbC5jbGllbnRXaWR0aCBhcyBudW1iZXI7XHJcbiAgICBjb25zdCBmaWx0ZXJPYmogPSB0aGlzLnNldHRpbmdzLmZpbHRlcnM/LmZpbmQoKGl0ZW0pID0+IGl0ZW0uZmllbGROYW1lID09PSBmaWx0ZXIuZmllbGROYW1lKSBhcyBGaWx0ZXJCYXJGaWx0ZXI7XHJcbiAgICBmaWx0ZXJPYmoubWF4UGFuZWxXaWR0aCA9IHNlbGVjdFBhbmVsV2lkdGg7XHJcbiAgICBzZWxlY3RQYW5lbC5zdHlsZS5taW5XaWR0aCA9IGAke3NlbGVjdFBhbmVsV2lkdGh9cHhgO1xyXG4gIH1cclxuXHJcbiAgZW1pdEZpbHRlcnMoKSB7XHJcbiAgICB0aGlzLmZpbHRlckJhckNoYW5nZS5uZXh0KHRoaXMuZmlsdGVycyk7XHJcbiAgfVxyXG5cclxuICBzd2l0Y2hSaWdodCgpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzPy5zcGxpdHRlZEZpbHRlcnM/Lmxlbmd0aCA9PT0gdGhpcy5hY3RpdmVGaWx0ZXJJbmRleCArIDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVGaWx0ZXJJbmRleCArPSAxO1xyXG4gIH1cclxuXHJcbiAgc3dpdGNoTGVmdCgpIHtcclxuICAgIGlmICh0aGlzLmFjdGl2ZUZpbHRlckluZGV4ID09PSB0aGlzLnNlYXJjaEluZGV4KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlRmlsdGVySW5kZXggLT0gMTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZpbHRlcihrZXk6IHN0cmluZywgaXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgY29udHJvbCA9IHRoaXMuZmlsdGVyRm9ybUdyb3VwLmdldChrZXkpO1xyXG5cclxuICAgIGlmICghY29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbmV3QXJyYXkgPSBjb250cm9sLnZhbHVlIGFzIFtdO1xyXG4gICAgbmV3QXJyYXkuc3BsaWNlKGl4LCAxKTtcclxuICAgIGNvbnRyb2wuc2V0VmFsdWUobmV3QXJyYXkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja092ZXJmbG93KCkge1xyXG4gICAgaWYgKHRoaXMuZmlsdGVyV3JhcHBlcj8ubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICBjb25zdCBtaW5GaWx0ZXJXaWR0aCA9IDEwMDtcclxuICBcclxuICAgICAgaWYgKHRoaXMuc2V0dGluZ3M/LmZpbHRlcnM/Lmxlbmd0aCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lcldpZHRoID0gdGhpcy5maWx0ZXJXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB0b3RhbCB3aWR0aCBuZWVkZWQgZm9yIGFsbCBmaWx0ZXJzXHJcbiAgICAgICAgY29uc3QgdG90YWxXaWR0aE5lZWRlZCA9IHRoaXMuc2V0dGluZ3MuZmlsdGVycy5sZW5ndGggKiBtaW5GaWx0ZXJXaWR0aCArICh0aGlzLnNob3dTZWFyY2ggPyAxMDAgOiAwKTtcclxuICBcclxuICAgICAgICAvLyBJZiBhbGwgZmlsdGVycyBjYW4gZml0IHdpdGhpbiB0aGUgY29udGFpbmVyLCBubyBuZWVkIHRvIHNwbGl0XHJcbiAgICAgICAgaWYgKHRvdGFsV2lkdGhOZWVkZWQgPD0gY29udGFpbmVyV2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMuc2V0dGluZ3Muc3BsaXR0ZWRGaWx0ZXJzID0gW107XHJcbiAgICAgICAgICB0aGlzLmZpbHRlck92ZXJmbG93ID0gZmFsc2U7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gIFxyXG4gICAgICAgIC8vIENhbGN1bGF0ZSBob3cgbWFueSBmaWx0ZXJzIGNhbiBmaXQgcGVyIHJvdyBiYXNlZCBvbiB0aGUgY29udGFpbmVyIHdpZHRoXHJcbiAgICAgICAgY29uc3QgZmlsdGVyc1BlclJvdyA9IE1hdGguZmxvb3IoY29udGFpbmVyV2lkdGggLyBtaW5GaWx0ZXJXaWR0aCk7XHJcbiAgXHJcbiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtYW55IGdyb3VwcyBhcmUgbmVlZGVkXHJcbiAgICAgICAgY29uc3QgZ3JvdXBDb3VudCA9IE1hdGguY2VpbCh0aGlzLnNldHRpbmdzLmZpbHRlcnMubGVuZ3RoIC8gZmlsdGVyc1BlclJvdyk7XHJcbiAgXHJcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGdyb3VwIHNpemUgYmFzZWQgb24gdGhlIG51bWJlciBvZiBncm91cHNcclxuICAgICAgICBjb25zdCBncm91cFNpemUgPSBNYXRoLmNlaWwodGhpcy5zZXR0aW5ncy5maWx0ZXJzLmxlbmd0aCAvIGdyb3VwQ291bnQpO1xyXG4gIFxyXG4gICAgICAgIC8vIFNwbGl0IGZpbHRlcnMgaW50byB0aGUgY2FsY3VsYXRlZCBudW1iZXIgb2YgZ3JvdXBzXHJcbiAgICAgICAgY29uc3QgbmV3U3BsaXR0ZWRGaWx0ZXJzOiBGaWx0ZXJCYXJGaWx0ZXJbXVtdID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNldHRpbmdzLmZpbHRlcnMubGVuZ3RoOyBpICs9IGdyb3VwU2l6ZSkge1xyXG4gICAgICAgICAgbmV3U3BsaXR0ZWRGaWx0ZXJzLnB1c2godGhpcy5zZXR0aW5ncy5maWx0ZXJzLnNsaWNlKGksIGkgKyBncm91cFNpemUpKTtcclxuICAgICAgICB9XHJcbiAgXHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5zcGxpdHRlZEZpbHRlcnMgPSBuZXdTcGxpdHRlZEZpbHRlcnM7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJPdmVyZmxvdyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBzdWJzY3JpYmVUb0Zvcm1WYWx1ZUNoYW5nZXMoKSB7XHJcbiAgICB0aGlzLmZvcm1DaGFuZ2VzU3Vic2NyaXB0aW9uID0gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlcnMgPSB7XHJcbiAgICAgICAgaW5wdXQ6IHRoaXMuZm9ybS52YWx1ZS5pbnB1dCA/PyBcIlwiLFxyXG4gICAgICAgIGZpbHRlcnM6IHt9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGZpbHRlcktleSBpbiB0aGlzLmZvcm0udmFsdWUuZmlsdGVycykge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgICAgICAgY29uc3QgZmlsdGVyOiBGaWx0ZXJCYXJGaWx0ZXJJdGVtW10gPSAodGhpcy5mb3JtLnZhbHVlLmZpbHRlcnMgYXMgYW55KVtmaWx0ZXJLZXldIGFzIEZpbHRlckJhckZpbHRlckl0ZW1bXTtcclxuICAgICAgICB0aGlzLmZpbHRlcnMuZmlsdGVyc1tmaWx0ZXJLZXldID0gZmlsdGVyLm1hcCgoaXRlbSkgPT4gdGhpcy5vdXRwdXRGaWx0ZXJLZXlBbmRWYWx1ZSA/IGl0ZW0gOiBpdGVtLnZhbHVlKVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuZW1pdEZpbHRlcnMoKTtcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmaWx0ZXItcm93XCIgKm5nSWY9XCJmaWx0ZXJSb3dWaXNpYmxlXCI+XHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiIGNsYXNzPVwiZmlsdGVyLXdyYXBwZXJcIiAjZmlsdGVyV3JhcHBlciBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXggKm5nSWY9XCJzaG93U2VhcmNoICYmICFmaWx0ZXJPdmVyZmxvdyB8fCBhY3RpdmVGaWx0ZXJJbmRleCA9PT0gc2VhcmNoSW5kZXhcIiBjbGFzcz1cImZpbHRlci1iYXItc2VhcmNoLWlucHV0XCI+XHJcbiAgICAgIDxzcGFuIG1hdFByZWZpeCBjbGFzcz1cIm1hdGVyaWFsLWljb25zLW91dGxpbmVkXCI+XHJcbiAgICAgICAge3twcmVmaXhJY29ufX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8c3BhbiBtYXRTdWZmaXggY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiICpuZ0lmPVwic2hvd1N1ZmZpeEljb25cIiBbbWF0VG9vbHRpcF09XCJzZWFyY2hUb29sdGlwIHwgdHJhbnNsYXRlXCI+XHJcbiAgICAgICAge3tzdWZmaXhJY29ufX1cclxuICAgICAgPC9zcGFuPlxyXG4gICAgICA8aW5wdXQgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwic2VhcmNoVGl0bGUgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaW5wdXRGb3JtQ29udHJvbE5hbWVcIj5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICA8bmctY29udGFpbmVyIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybUdyb3VwXCI+XHJcblxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBjdXJyZW50RmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxtYXQtbGFiZWw+e3tmaWx0ZXIudGl0bGUgfCB0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFxyXG4gICAgICAgICAgbXVsdGlwbGUgXHJcbiAgICAgICAgICBbcGFuZWxXaWR0aF09XCJmaWx0ZXI/Lm1heFBhbmVsV2lkdGggPz8gJ2F1dG8nXCIgXHJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5maWVsZE5hbWVcIiBcclxuICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwiJGV2ZW50ID09PSB0cnVlID8gZm9jdXNPcHRpb25TZWFyY2hJbnB1dChmaWx0ZXIsIGkpIDogY2xlYXJPcHRpb25TZWFyY2hJbnB1dChmaWx0ZXIsIGkpXCJcclxuICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0RXZlbnQoJGV2ZW50LCBmaWx0ZXIpXCIgXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcj8uc2VhcmNoPy5wbGFjZWhvbGRlclwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgI29wdGlvblNlYXJjaElucHV0IGNsYXNzPVwib3B0aW9uLXNlYXJjaC1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cImZpbHRlci5zZWFyY2g/LnBsYWNlaG9sZGVyID8/ICcnIHwgdHJhbnNsYXRlXCIgKGtleXVwKT1cImZpbHRlck9wdGlvbnMoJGV2ZW50LCBmaWx0ZXIpXCIgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyLnZhbHVlcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlci50cmFuc2xhdGVkOyBlbHNlIHNvcnRlZFZhbHVlc0J5UHJvcGVydHlcIj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWx1ZSBvZiAoZmlsdGVyLnNlYXJjaD8uZmlsdGVyZWRWYWx1ZXMgPz8gZmlsdGVyLnZhbHVlcykgfCBzb3J0QWxwaGFiZXRpY2FsbHk6J2tleSdcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFtjbGFzcy5oaWRkZW5dPVwiZmlsdGVyLnNlYXJjaD8uc2VhcmNoQ3JpdGVyaWEgJiYgdmFsdWUuaXNTZWxlY3RlZCAmJiAhdmFsdWUubWF0Y2hlc1NlYXJjaENyaXRlcmlhXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uXCIgW2Rpc2FibGVkXT1cImZpbHRlci5zaW5nbGVTZWxlY3Rpb24/LnNlbGVjdGVkICYmIGZpbHRlci5zaW5nbGVTZWxlY3Rpb24/LnZhbHVlICE9PSB2YWx1ZS52YWx1ZVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBmaWx0ZXIuZGlzYWJsZVRpdGxlQ2FzZSA/IHZhbHVlLmtleSA6ICh2YWx1ZS5rZXkgfCB0aXRsZWNhc2UpIH19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNzb3J0ZWRWYWx1ZXNCeVByb3BlcnR5PlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZhbHVlIG9mIChmaWx0ZXIuc2VhcmNoPy5maWx0ZXJlZFZhbHVlcyA/PyBmaWx0ZXIudmFsdWVzKSB8IHNvcnRUcmFuc2xhdGlvbnNCeVByb3BlcnR5OidrZXknOid2YWx1ZSdcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFtjbGFzcy5oaWRkZW5dPVwiZmlsdGVyLnNlYXJjaD8uc2VhcmNoQ3JpdGVyaWEgJiYgdmFsdWUuaXNTZWxlY3RlZCAmJiAhdmFsdWUubWF0Y2hlc1NlYXJjaENyaXRlcmlhXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uXCIgW2Rpc2FibGVkXT1cImZpbHRlci5zaW5nbGVTZWxlY3Rpb24/LnNlbGVjdGVkICYmIGZpbHRlci5zaW5nbGVTZWxlY3Rpb24/LnZhbHVlICE9PSB2YWx1ZS52YWx1ZVwiIFt2YWx1ZV09XCJ2YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZpbHRlci5kaXNhYmxlVGl0bGVDYXNlOyBlbHNlIGRlZmF1bHRDYXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICB7eyB2YWx1ZS5rZXkgfCB0cmFuc2xhdGUgOiB7IGRlZmF1bHQ6IHZhbHVlLnZhbHVlIHwgdGl0bGVjYXNlIH0gfX1cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgXHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENhc2U+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgdmFsdWUua2V5IHwgdHJhbnNsYXRlIDogeyBkZWZhdWx0OiB2YWx1ZS52YWx1ZSB9IH19IFxyXG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlck92ZXJmbG93XCI+XHJcbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic3dpdGNoTGVmdCgpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5cclxuICAgICAgICBhcnJvd19iYWNrX2lvc1xyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzd2l0Y2hSaWdodCgpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5cclxuICAgICAgICBhcnJvd19mb3J3YXJkX2lvc1xyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjxtYXQtY2hpcC1saXN0Ym94PlxyXG4gIDxkaXYgKm5nRm9yPVwibGV0IGZpbHRlciBvZiBzZXR0aW5ncz8uZmlsdGVyc1wiPlxyXG4gICAgPG1hdC1jaGlwLW9wdGlvbiAqbmdGb3I9XCJsZXQgZmlsdGVyVmFsdWUgb2YgZmlsdGVyRm9ybUdyb3VwVmFsdWVbZmlsdGVyLmZpZWxkTmFtZV07IGxldCBpeD1pbmRleFwiXHJcbiAgICAgIChyZW1vdmVkKT1cInJlbW92ZUZpbHRlcihmaWx0ZXIuZmllbGROYW1lLCBpeClcIiBjbGFzcz1cInRleHQtc1wiPlxyXG4gICAgICA8YnV0dG9uIG1hdENoaXBSZW1vdmU+XHJcbiAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcC1maWx0ZXItdGl0bGVcIj57e2ZpbHRlci50aXRsZSB8IHRyYW5zbGF0ZX19Ojwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLXZhbHVlIHNlbWktYm9sZFwiPiB7eyhmaWx0ZXIudHJhbnNsYXRlZCA/IGZpbHRlclZhbHVlLmtleSA6IGZpbHRlclZhbHVlLmtleSB8IHRyYW5zbGF0ZSA6IHtkZWZhdWx0OiBmaWx0ZXJWYWx1ZS52YWx1ZX0pIHwgdGl0bGVjYXNlXHJcbiAgICAgICAgfX08L3NwYW4+XHJcbiAgICA8L21hdC1jaGlwLW9wdGlvbj5cclxuICA8L2Rpdj5cclxuPC9tYXQtY2hpcC1saXN0Ym94PlxyXG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWJhci1zZXR0aW5ncy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9maWx0ZXItYmFyL21vZGVscy9maWx0ZXItYmFyLXNldHRpbmdzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJCYXJGaWx0ZXIgfSBmcm9tIFwiLi9maWx0ZXItYmFyLWZpbHRlci5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJCYXJTZXR0aW5ncyB7XHJcbiAgLyoqIFNob3cvaGlkZSBzZWFyY2ggaW5wdXQuIEVuYWJsZWQgYnkgZGVmYXVsdC4gKi9cclxuICBoaWRlU2VhcmNoPzogYm9vbGVhbjtcclxuICAvKiogVG9nZ2xlIG91dHB1dCBmaWx0ZXIgaXRlbSBiZXR3ZWVuIHZhbHVlLCBhbmQgb2JqZWN0IHdpdGgga2V5IGFuZCB2YWx1ZSBmaWVsZHMuIFZhbHVlIGJ5IGRlZmF1bHQuICovXHJcbiAgb3V0cHV0RmlsdGVyS2V5QW5kVmFsdWU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRpdGxlIGZvciBzZWFyY2ggaW5wdXQgZmllbGQuIERlZmF1bHQgdmFsdWU6IEZJTFRFUl9CQVIuU0VBUkNIXHJcbiAgKi9cclxuICBzZWFyY2hUaXRsZT86IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZWFyY2ggdG9vbHRpcCwgc2hvd24gYWZ0ZXIgaW5wdXQgZmllbGQgZm9yIGljb25cclxuICAgKi9cclxuICBzZWFyY2hUb29sdGlwPzogc3RyaW5nO1xyXG4gIC8qKiBQcmVmaXggaWNvbiBmcm9tIG1hdGVyaWFsIGljb25zLiAqL1xyXG4gIHByZWZpeEljb24/OiBzdHJpbmc7XHJcbiAgLyoqIFN1ZmZpeCBpY29uIGZyb20gbWF0ZXJpYWwgaWNvbnMuICovXHJcbiAgc3VmZml4SWNvbj86IHN0cmluZztcclxuICBzaG93U3VmZml4SWNvbj86IGJvb2xlYW47XHJcbiAgXHJcbiAgZmlsdGVycz86IEZpbHRlckJhckZpbHRlcltdO1xyXG59XHJcbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWJhci1zZXR0aW5ncy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9maWx0ZXItYmFyL21vZGVscy9maWx0ZXItYmFyLXNldHRpbmdzLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGaWx0ZXJCYXJGaWx0ZXIgfSBmcm9tIFwiLi9maWx0ZXItYmFyLWZpbHRlci5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJCYXJTZXR0aW5ncyB7XHJcbiAgLyoqIFNob3cvaGlkZSBzZWFyY2ggaW5wdXQuIEVuYWJsZWQgYnkgZGVmYXVsdC4gKi9cclxuICBoaWRlU2VhcmNoPzogYm9vbGVhbjtcclxuICAvKiogVG9nZ2xlIG91dHB1dCBmaWx0ZXIgaXRlbSBiZXR3ZWVuIHZhbHVlLCBhbmQgb2JqZWN0IHdpdGgga2V5IGFuZCB2YWx1ZSBmaWVsZHMuIFZhbHVlIGJ5IGRlZmF1bHQuICovXHJcbiAgb3V0cHV0RmlsdGVyS2V5QW5kVmFsdWU/OiBib29sZWFuO1xyXG4gIC8qKlxyXG4gICAqIFRpdGxlIGZvciBzZWFyY2ggaW5wdXQgZmllbGQuIERlZmF1bHQgdmFsdWU6IEZJTFRFUl9CQVIuU0VBUkNIXHJcbiAgKi9cclxuICBzZWFyY2hUaXRsZT86IHN0cmluZztcclxuICAvKipcclxuICAgKiBTZWFyY2ggdG9vbHRpcCwgc2hvd24gYWZ0ZXIgaW5wdXQgZmllbGQgZm9yIGljb25cclxuICAgKi9cclxuICBzZWFyY2hUb29sdGlwPzogc3RyaW5nO1xyXG4gIC8qKiBQcmVmaXggaWNvbiBmcm9tIG1hdGVyaWFsIGljb25zLiAqL1xyXG4gIHByZWZpeEljb24/OiBzdHJpbmc7XHJcbiAgLyoqIFN1ZmZpeCBpY29uIGZyb20gbWF0ZXJpYWwgaWNvbnMuICovXHJcbiAgc3VmZml4SWNvbj86IHN0cmluZztcclxuICBzaG93U3VmZml4SWNvbj86IGJvb2xlYW47XHJcbiAgXHJcbiAgZmlsdGVycz86IEZpbHRlckJhckZpbHRlcltdO1xyXG4gIHNwbGl0dGVkRmlsdGVycz86IEZpbHRlckJhckZpbHRlcltdW107XHJcbn1cclxuIl19
@@ -155,19 +155,7 @@ export class MultiFunctionalTableComponent {
155
155
  }
156
156
  }
157
157
  onMouseMove(event) {
158
- // when data is available we should check once for table overflow
159
- // when there wasnt overflow, but width of the table became bigger, then we are reseting tableOverflow variable
160
- // same for when there was overflow, but size of the table is same as container, so overflow is gone and we reseting tableOverflow variable again
161
- if ((this.config.dataSource.data.length && this.tableOverflow === undefined) ||
162
- (!this.tableOverflow && this.tableContainer.nativeElement.clientWidth < this.tableElementRef.nativeElement.clientWidth) ||
163
- (this.tableOverflow && this.tableContainer.nativeElement.clientWidth === this.tableElementRef.nativeElement.clientWidth)) {
164
- if (this.tableContainer.nativeElement.clientWidth < this.tableElementRef.nativeElement.clientWidth) {
165
- this.tableOverflow = true;
166
- }
167
- else {
168
- this.tableOverflow = false;
169
- }
170
- }
158
+ this.checkTableOverflow();
171
159
  if (!this.isDragging) {
172
160
  return;
173
161
  }
@@ -198,6 +186,21 @@ export class MultiFunctionalTableComponent {
198
186
  }
199
187
  }
200
188
  //#endregion
189
+ checkTableOverflow() {
190
+ // when data is available we should check once for table overflow
191
+ // when there wasnt overflow, but width of the table became bigger, then we are reseting tableOverflow variable
192
+ // same for when there was overflow, but size of the table is same as container, so overflow is gone and we reseting tableOverflow variable again
193
+ if ((this.config.dataSource.data.length && this.tableOverflow === undefined) ||
194
+ (!this.tableOverflow && this.tableContainer.nativeElement.clientWidth < this.tableElementRef.nativeElement.clientWidth) ||
195
+ (this.tableOverflow && this.tableContainer.nativeElement.clientWidth === this.tableElementRef.nativeElement.clientWidth)) {
196
+ if (this.tableContainer.nativeElement.clientWidth < this.tableElementRef.nativeElement.clientWidth) {
197
+ this.tableOverflow = true;
198
+ }
199
+ else {
200
+ this.tableOverflow = false;
201
+ }
202
+ }
203
+ }
201
204
  exportToFile() {
202
205
  if (!this.config.export?.fileOptions?.saveToFile) {
203
206
  return;
@@ -299,4 +302,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
299
302
  type: ViewChild,
300
303
  args: [MatTable, { read: ElementRef }]
301
304
  }] } });
302
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXhDLE1BQU0sT0FBTyw2QkFBNkI7SUFLeEMsSUFBYSxTQUFTLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMs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QUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZWxlY3Rpb25Nb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XHJcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdENvbHVtbkRlZiwgTWF0SGVhZGVyUm93RGVmLCBNYXROb0RhdGFSb3csIE1hdFJvd0RlZiwgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlLCB0YWtlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEZpbHRlckJhckNoYW5nZUV2ZW50IH0gZnJvbSAnLi4vZmlsdGVyLWJhci9tb2RlbHMvZmlsdGVyLWJhci1jaGFuZ2UtZXZlbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBIdG1sRWxlbWVudFBhcnNlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycyc7XHJcbmltcG9ydCB7IFNhdmVGaWxlSGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9zYXZlLWZpbGUuaGVscGVyJztcclxuaW1wb3J0IHsgRE9NU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfSBmcm9tICcuL2NvbnN0YW50cy9kaXNhYmxlLWV4cG9ydC1hdHRyaWJ1dGUtbmFtZS5jb25zdCc7XHJcbmltcG9ydCB7IEV4cG9ydEZvcm1hdCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgQ29sdW1uQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvbXVsdGktZnVuY3Rpb25hbC10YWJsZS1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL3NlbGVjdGVkLWNvbHVtbi1sb2NhbC1zdG9yYWdlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFN0YXR1c0Rpc3BsYXlDb25maWcgfSBmcm9tICcuLi9zdGF0dXMtZGlzcGxheS9tb2RlbHMvc3RhdHVzLWRpc3BsYXktY29uZmlnLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICd0bGQtbXVsdGktZnVuY3Rpb25hbC10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlGdW5jdGlvbmFsVGFibGVDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIHJlYWRvbmx5IG1hdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxUPih0cnVlLCBbXSk7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IE11bHRpRnVuY3Rpb25hbFRhYmxlQ29uZmlnPFQ+O1xyXG4gIEBJbnB1dCgpIGhpZ2hsaWdodGVkRWxlbWVudHMhOiBUW107XHJcbiAgQElucHV0KCkgc2V0IHNlbGVjdGlvbih2YWx1ZTogVFtdKSB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi5zZXRTZWxlY3Rpb24oLi4uKHZhbHVlID8/IFtdKSk7XHJcbiAgfVxyXG5cclxuICAvLyBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNwbGF5IGNoZWNrYm94ZXMgb25seSBvbiByb3cgaG92ZXIuXHJcbiAgQElucHV0KCkgaXNSb3dDaGVja2JveEFsd2F5c1Zpc2libGUgPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBkaXNhYmxlUHJlc2VsZWN0ZWRJdGVtcyA9IGZhbHNlO1xyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0IHByb3BlcnRpZXNcclxuICBAT3V0cHV0KCkgZmlsdGVyQmFyQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RmlsdGVyQmFyQ2hhbmdlRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWx0ZXJCYXJDaGFuZ2VFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgZXhwb3J0ZWQ6IEV2ZW50RW1pdHRlcjxUW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxUW10+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGlvbkNoYW5nZTogT2JzZXJ2YWJsZTxUW10+ID0gdGhpcy5tYXRTZWxlY3Rpb24uY2hhbmdlZC5hc09ic2VydmFibGUoKS5waXBlKG1hcCgoKSA9PiB7IHJldHVybiB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZDsgfSkpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIFByb3BlcnRpZXMgZm9yIG1hdCB0YWJsZSB3cmFwcGVyXHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRIZWFkZXJSb3dEZWYpIGhlYWRlclJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0SGVhZGVyUm93RGVmPjtcclxuICBAQ29udGVudENoaWxkcmVuKE1hdFJvd0RlZiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KSByb3dEZWZzITogUXVlcnlMaXN0PE1hdFJvd0RlZjxUPj47XHJcbiAgQENvbnRlbnRDaGlsZHJlbihNYXRDb2x1bW5EZWYpIGNvbHVtbkRlZnMhOiBRdWVyeUxpc3Q8TWF0Q29sdW1uRGVmPjtcclxuICBAQ29udGVudENoaWxkKE1hdE5vRGF0YVJvdykgbm9EYXRhUm93ITogTWF0Tm9EYXRhUm93O1xyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZSE6IE1hdFRhYmxlPFQ+O1xyXG4gIEBWaWV3Q2hpbGQoTWF0U29ydCkgc29ydCE6IE1hdFNvcnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlQ29udGFpbmVyJykgdGFibGVDb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgQFZpZXdDaGlsZChNYXRUYWJsZSwgeyByZWFkOiBFbGVtZW50UmVmIH0pIHRhYmxlRWxlbWVudFJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICBwcmVzZWxlY3RlZEl0ZW1zITogVFtdO1xyXG5cclxuICBnZXQgaWdub3JlQXR0cmlidXRlTmFtZSgpIHsgcmV0dXJuIERJU0FCTEVfRVhQT1JUX0FUVFJJQlVURV9OQU1FIH1cclxuICBkaXNwbGF5Q29sdW1ucyE6IHN0cmluZ1tdO1xyXG5cclxuICBjb2x1bW5TZWxlY3RBY3RpdmUhOiBib29sZWFuO1xyXG4gIGV4cG9ydEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgbm9EYXRhUm93QWN0aXZlITogYm9vbGVhbjtcclxuXHJcbiAgZmlsdGVyQmFyVmlzaWJsZSE6IGJvb2xlYW47XHJcblxyXG4gIG5vRGF0YVJvd0NvbmZpZyE6IFN0YXR1c0Rpc3BsYXlDb25maWc7XHJcbiAgbm9EYXRhUm93SWNvbiA9IFwibWFuYWdlX3NlYXJjaFwiO1xyXG5cclxuICBjb25maWd1cmFibGVDb2x1bW5zITogQ29sdW1uQ29uZmlnW107XHJcbiAgYmF0Y2hTZWxlY3RlZEVuYWJsZWQhOiBib29sZWFuO1xyXG5cclxuICAvLyBpcyB1c2VkIGluIGh0bWwgdG8gZGlzcGxheSBiYXRjaCBjaGVja2JveCBvbiBob3ZlcmVkIHJvd1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XHJcbiAgaG92ZXJlZFJvdzogYW55O1xyXG5cclxuICAvLyBwcm9wZXJ0aWVzIGZvciBvdmVyZmxvdyBzY3JvbGxpbmcgd2l0aCBtb3VzZSBjbGlja1xyXG4gIHNjcm9sbE1vdmVtZW50ITogbnVtYmVyIHwgbnVsbDtcclxuICB0YWJsZU92ZXJmbG93ITogYm9vbGVhbjtcclxuICBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgc3RhcnRYID0gMDtcclxuICBzdGFydFkgPSAwO1xyXG4gIHNjcm9sbExlZnQgPSAwO1xyXG4gIHNjcm9sbFRvcCA9IDA7XHJcblxyXG4gIGdldCBmaWx0ZXJBY3RpdmUoKSB7IHJldHVybiB0aGlzLmNvbmZpZy5maWx0ZXI/LmVuYWJsZWQ7IH1cclxuICBnZXQgc2hvd0ZpbHRlclRvZ2dsZSgpIHsgcmV0dXJuICF0aGlzLmNvbmZpZy5maWx0ZXI/LmhpZGVGaWx0ZXJUb2dnbGU7IH1cclxuXHJcbiAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VWYWx1ZSE6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnO1xyXG4gIHJlYWRvbmx5IGJhdGNoQ29sdW1uTmFtZSA9IFwiYmF0Y2hcIjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkb21TZXJ2aWNlOiBET01TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7IH1cclxuXHJcbiAgLy8jcmVnaW9uIEFuZ3VsYXIgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnJlYWRGcm9tTG9jYWxTdG9yYWdlKCk7XHJcbiAgICB0aGlzLnNldEZpbHRlclZpc2liaWxpdHkoKTtcclxuICAgIHRoaXMuc2V0Q29sdW1uU2VsZWN0UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5zZXRFeHBvcnRQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKTtcclxuICAgIHRoaXMucHJlc2VsZWN0ZWRJdGVtcyA9IHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5jb2x1bW5EZWZzLmZvckVhY2goY29sdW1uRGVmID0+IHRoaXMudGFibGUuYWRkQ29sdW1uRGVmKGNvbHVtbkRlZikpO1xyXG4gICAgdGhpcy5yb3dEZWZzLmZvckVhY2gocm93RGVmID0+IHRoaXMudGFibGUuYWRkUm93RGVmKHJvd0RlZikpO1xyXG4gICAgdGhpcy5oZWFkZXJSb3dEZWZzLmZvckVhY2goaGVhZGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikpO1xyXG4gICAgdGhpcy5oZWFkZXJSb3dEZWZzLmZvckVhY2goaGVhZGVyUm93RGVmID0+IHRoaXMudGFibGUuYWRkSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikpO1xyXG4gICAgdGhpcy50YWJsZS5zZXROb0RhdGFSb3codGhpcy5ub0RhdGFSb3cpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVNvdXJjZS5zb3J0ID0gdGhpcy5zb3J0O1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgdXBkYXRlRGlzcGxheUNvbHVtbnMoaW5pdGlhbCA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLmJhdGNoU2VsZWN0ZWRFbmFibGVkID0gdGhpcy5jb25maWcuYmF0Y2hDb25maWc/LmVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICBjb25zdCBhbGxDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uU2VsZWN0Py5jb2x1bW5zID8/IFtdO1xyXG4gICAgdGhpcy5kaXNwbGF5Q29sdW1ucyA9IFtdO1xyXG4gICAgdGhpcy5jb25maWd1cmFibGVDb2x1bW5zID0gYWxsQ29sdW1ucy5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4ubm90Q29uZmlndXJhYmxlKTtcclxuXHJcbiAgICBpZiAodGhpcy5iYXRjaFNlbGVjdGVkRW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmRpc3BsYXlDb2x1bW5zLnB1c2godGhpcy5iYXRjaENvbHVtbk5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghYWxsQ29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGxvY2FsU3RvcmFnZVZhbHVlID0gdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA/PyB7fTtcclxuICAgIGlmICghbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucykge1xyXG4gICAgICBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgYWxsQ29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgaWYgKGluaXRpYWwpIHtcclxuICAgICAgICBjb2x1bW4uc2VsZWN0ZWQgPSBsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zPy5bY29sdW1uLm5hbWVdID8/IGNvbHVtbi5zZWxlY3RlZDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgIGxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMhW2NvbHVtbi5uYW1lXSA9IGNvbHVtbi5zZWxlY3RlZDtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY29sdW1uLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgdGhpcy5kaXNwbGF5Q29sdW1ucy5wdXNoKGNvbHVtbi5uYW1lKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmICghaW5pdGlhbCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUxvY2FsU3RvcmFnZShsb2NhbFN0b3JhZ2VWYWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVGaWx0ZXJCYXIoKSB7XHJcbiAgICBjb25zdCBsb2NhbHN0b3JhZ2VPYmplY3QgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID8/IHt9O1xyXG4gICAgaWYgKCFsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyKSB7XHJcbiAgICAgIGxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSAhdGhpcy5maWx0ZXJCYXJWaXNpYmxlO1xyXG4gICAgbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlci52aXNpYmxlID0gdGhpcy5maWx0ZXJCYXJWaXNpYmxlO1xyXG4gICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UobG9jYWxzdG9yYWdlT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIGZpbHRlcnNDaGFuZ2VkKGZpbHRlcnM6IEZpbHRlckJhckNoYW5nZUV2ZW50KSB7XHJcbiAgICB0aGlzLmZpbHRlckJhckNoYW5nZS5lbWl0KGZpbHRlcnMpO1xyXG4gIH1cclxuXHJcbiAgZXhwb3J0KCkge1xyXG4gICAgdGhpcy5jb25maWcuZGF0YVNvdXJjZS5jb25uZWN0KCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5leHBvcnRlZC5lbWl0KGRhdGEpO1xyXG4gICAgfSlcclxuXHJcbiAgICBpZiAodGhpcy5jb25maWcuZXhwb3J0Py5maWxlT3B0aW9ucykge1xyXG4gICAgICB0aGlzLmV4cG9ydFRvRmlsZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQ6IFQpIHtcclxuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkRWxlbWVudHM/LmluY2x1ZGVzKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIE1ldGhvZHMgZm9yIGJhdGNoIHNlbGVjdGlvblxyXG4gIGlzQWxsU2VsZWN0ZWQoKSB7XHJcbiAgICBjb25zdCBudW1TZWxlY3RlZCA9IHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdGVkLmxlbmd0aDtcclxuICAgIGNvbnN0IG51bVJvd3MgPSB0aGlzLmNvbmZpZy5kYXRhU291cmNlLmRhdGEubGVuZ3RoO1xyXG4gICAgcmV0dXJuIG51bVNlbGVjdGVkID09PSBudW1Sb3dzO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlQWxsUm93U2VsZWN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaXNBbGxTZWxlY3RlZCgpKSB7XHJcbiAgICAgIGlmICh0aGlzLmRpc2FibGVQcmVzZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAgICAgLy8gZGVzZWxlY3Qgb25seSB0aG9zZSBpdGVtcyB3aGljaCB3ZXJlIG5vdCBhbHJlYWR5IHByZXNlbGVjdGVkXHJcbiAgICAgICAgdGhpcy5tYXRTZWxlY3Rpb24uZGVzZWxlY3QoXHJcbiAgICAgICAgICAuLi50aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3RlZC5maWx0ZXIoZWxtID0+ICF0aGlzLnByZXNlbGVjdGVkSXRlbXMubWFwKGVsbSA9PiBlbG0pLmluY2x1ZGVzKGVsbSkpXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tYXRTZWxlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi5zZWxlY3QoLi4udGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhKTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUVsZW1lbnRTZWxlY3Rpb24oZWxlbWVudDogVCkge1xyXG4gICAgdGhpcy5tYXRTZWxlY3Rpb24udG9nZ2xlKGVsZW1lbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcbiAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnBhZ2VYIC0gdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQ7XHJcbiAgICB0aGlzLnN0YXJ0WSA9IGV2ZW50LnBhZ2VZIC0gdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcDtcclxuICAgIHRoaXMuc2Nyb2xsTGVmdCA9IHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0O1xyXG4gICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wO1xyXG5cclxuICAgIC8vIGNhbmNlbGluZyBhbnkgcHJldmlvdXMgYW5pbWF0aW9uIGZyYW1lXHJcbiAgICBpZiAodGhpcy5zY3JvbGxNb3ZlbWVudCAhPT0gbnVsbCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbE1vdmVtZW50KTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIC8vIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUgd2Ugc2hvdWxkIGNoZWNrIG9uY2UgZm9yIHRhYmxlIG92ZXJmbG93XHJcbiAgICAvLyB3aGVuIHRoZXJlIHdhc250IG92ZXJmbG93LCBidXQgd2lkdGggb2YgdGhlIHRhYmxlIGJlY2FtZSBiaWdnZXIsIHRoZW4gd2UgYXJlIHJlc2V0aW5nIHRhYmxlT3ZlcmZsb3cgdmFyaWFibGVcclxuICAgIC8vIHNhbWUgZm9yIHdoZW4gdGhlcmUgd2FzIG92ZXJmbG93LCBidXQgc2l6ZSBvZiB0aGUgdGFibGUgaXMgc2FtZSBhcyBjb250YWluZXIsIHNvIG92ZXJmbG93IGlzIGdvbmUgYW5kIHdlIHJlc2V0aW5nIHRhYmxlT3ZlcmZsb3cgdmFyaWFibGUgYWdhaW5cclxuICAgIGlmICgodGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCAmJiAgdGhpcy50YWJsZU92ZXJmbG93ID09PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICghdGhpcy50YWJsZU92ZXJmbG93ICYmIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA8ICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoKSB8fFxyXG4gICAgICAodGhpcy50YWJsZU92ZXJmbG93ICYmIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA9PT0gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCkpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA8IHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVPdmVyZmxvdyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudGFibGVPdmVyZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgIC8vIHVzaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZSBmb3Igc21vb3RoZXIgdXBkYXRlc1xyXG4gICAgIGlmICh0aGlzLnNjcm9sbE1vdmVtZW50ID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsTW92ZW1lbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy50YWJsZU92ZXJmbG93KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgIGNvbnN0IHkgPSBldmVudC5wYWdlWSAtIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlcyBpbiBtb3ZlbWVudFxyXG4gICAgICAgIGNvbnN0IHdhbGtYID0gKHggLSB0aGlzLnN0YXJ0WCkgKiAyO1xyXG4gICAgICAgIGNvbnN0IHdhbGtZID0gKHkgLSB0aGlzLnN0YXJ0WSkgKiAyO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGluZyBzY3JvbGwgcG9zaXRpb25zXHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrWDtcclxuICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3AgLSB3YWxrWTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxNb3ZlbWVudCA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBvbk1vdXNlVXAoKSB7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBjYW5jZWxpbmcgYW55IHBlbmRpbmcgYW5pbWF0aW9uXHJcbiAgICBpZiAodGhpcy5zY3JvbGxNb3ZlbWVudCAhPT0gbnVsbCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbE1vdmVtZW50KTtcclxuICAgICAgdGhpcy5zY3JvbGxNb3ZlbWVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGV4cG9ydFRvRmlsZSgpIHtcclxuICAgIGlmICghdGhpcy5jb25maWcuZXhwb3J0Py5maWxlT3B0aW9ucz8uc2F2ZVRvRmlsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGZpbGVTdHJpbmcgPSBcIlwiO1xyXG4gICAgbGV0IGV4dGVuc2lvbiE6IEV4cG9ydEZvcm1hdDtcclxuICAgIHN3aXRjaCAodGhpcy5jb25maWcuZXhwb3J0LmZpbGVPcHRpb25zLmZvcm1hdCkge1xyXG4gICAgICBjYXNlIEV4cG9ydEZvcm1hdC5DU1Y6XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZXh0ZW5zaW9uID0gRXhwb3J0Rm9ybWF0LkNTVjtcclxuICAgICAgICBmaWxlU3RyaW5nID0gSHRtbEVsZW1lbnRQYXJzZUhlbHBlci50YWJsZUFzQ3N2KHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMuaWdub3JlQXR0cmlidXRlTmFtZSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0cmFuc2xhdGVkRmlsZU5hbWUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZmlsZU5hbWUpO1xyXG4gICAgU2F2ZUZpbGVIZWxwZXIuc2F2ZUZpbGUoZmlsZVN0cmluZywgYCR7dHJhbnNsYXRlZEZpbGVOYW1lfS4ke2V4dGVuc2lvbn1gKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTG9jYWxTdG9yYWdlKG5ld1ZhbHVlOiBTZWxlY3RlZENvbHVtbkxvY2FsU3RvcmFnZUNvbmZpZykge1xyXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IG5ld1ZhbHVlO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSAmJiBuZXdWYWx1ZSkge1xyXG4gICAgICB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5zZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpKTtcclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSByZWFkRnJvbUxvY2FsU3RvcmFnZSgpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5sb2NhbFN0b3JhZ2VLZXkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBsb2NhbFN0b3JhZ2VTdHJpbmcgPSB0aGlzLmRvbVNlcnZpY2UubG9jYWxTdG9yYWdlPy5nZXRJdGVtKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSk7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZVN0cmluZykge1xyXG4gICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlU3RyaW5nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XHJcbiAgICAgIGNhdGNoIHtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRDb2x1bW5TZWxlY3RQcm9wZXJ0aWVzKCkge1xyXG4gICAgdGhpcy5jb2x1bW5TZWxlY3RBY3RpdmUgPSB0aGlzLmNvbmZpZy5jb2x1bW5TZWxlY3Q/LmVuYWJsZWQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlDb2x1bW5zKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRGaWx0ZXJWaXNpYmlsaXR5KCkge1xyXG4gICAgdGhpcy5maWx0ZXJCYXJWaXNpYmxlID0gdGhpcy5sb2NhbFN0b3JhZ2VWYWx1ZT8uZmlsdGVyPy52aXNpYmxlID8/IHRoaXMuY29uZmlnPy5maWx0ZXI/LnZpc2libGUgPz8gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE5vRGF0YVJvd1Byb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcubm9EYXRhUm93KSB7XHJcbiAgICAgIHRoaXMubm9EYXRhUm93QWN0aXZlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcgPSB0aGlzLmNvbmZpZy5ub0RhdGFSb3c7XHJcbiAgICAgIHRoaXMubm9EYXRhUm93Q29uZmlnLmljb24gPSB0aGlzLmNvbmZpZy5ub0RhdGFSb3c/Lmljb24gPz8gdGhpcy5ub0RhdGFSb3dJY29uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRFeHBvcnRQcm9wZXJ0aWVzKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmV4cG9ydD8uZW5hYmxlZCkge1xyXG4gICAgICB0aGlzLmV4cG9ydEFjdGl2ZSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuXHJcbiAgPGRpdiBmeExheW91dD1cInJvd1wiPlxyXG4gICAgPGRpdiBmeEZsZXggZnhMYXlvdXRHYXA9XCIxcmVtXCI+XHJcbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiY29sdW1uTWVudVwiICpuZ0lmPVwiY29sdW1uU2VsZWN0QWN0aXZlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBjb2x1bW4tc2VsZWN0LWljb25cIj5tZW51PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuQ09MVU1OX1NFTEVDVCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiZmlsdGVyQWN0aXZlICYmIHNob3dGaWx0ZXJUb2dnbGVcIiAoY2xpY2spPVwidG9nZ2xlRmlsdGVyQmFyKClcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+ZmlsdGVyX2xpc3Q8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5GSUxURVJfVE9HR0xFJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJleHBvcnQtZGF0YVwiIG1hdC1zdHJva2VkLWJ1dHRvbiAqbmdJZj1cImV4cG9ydEFjdGl2ZVwiIChjbGljayk9XCJleHBvcnQoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtb3V0bGluZWRcIj5jbG91ZF9kb3dubG9hZDwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj57eydNVUxUSV9GVU5DVElPTkFMX1RBQkxFLkVYUE9SVCcgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYWRkaXRpb25hbEFjdGlvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LW1lbnUgI2NvbHVtbk1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLXNlbGVjdC13cmFwcGVyXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29uZmlndXJhYmxlQ29sdW1uc1wiPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJjb2x1bW4uc2VsZWN0ZWRcIiAoY2hhbmdlKT1cInVwZGF0ZURpc3BsYXlDb2x1bW5zKClcIj5cclxuICAgICAgICAgIHt7Y29sdW1uLmRpc3BsYXlOYW1lIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L21hdC1tZW51PlxyXG5cclxuICA8dGxkLWZpbHRlci1iYXIgKm5nSWY9XCJjb25maWcuZmlsdGVyICYmIGNvbmZpZy5maWx0ZXIuZW5hYmxlZFwiIFtmaWx0ZXJSb3dWaXNpYmxlXT1cIiFmaWx0ZXJCYXJWaXNpYmxlXCIgW3NldHRpbmdzXT1cImNvbmZpZy5maWx0ZXIuc2V0dGluZ3NcIiBcclxuICAgIChmaWx0ZXJCYXJDaGFuZ2UpPVwiZmlsdGVyc0NoYW5nZWQoJGV2ZW50KVwiPlxyXG4gIDwvdGxkLWZpbHRlci1iYXI+XHJcblxyXG4gIDxkaXYgXHJcbiAgICAjdGFibGVDb250YWluZXJcclxuICAgIFtjbGFzcy50YWJsZS1zdGlja3ktaGVhZGVyXT1cImNvbmZpZz8uc3RpY2t5SGVhZGVyXCJcclxuICAgIFtjbGFzcy50YWJsZS1kcmFnYWJsZV09XCJ0YWJsZU92ZXJmbG93XCJcclxuICAgIGNsYXNzPVwidGFibGUtb3ZlcmZsb3dcIlxyXG4gICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgIChtb3VzZXVwKT1cIm9uTW91c2VVcCgpXCJcclxuICAgIChtb3VzZWxlYXZlKT1cIm9uTW91c2VVcCgpXCJcclxuICAgIChtb3VzZW1vdmUpPVwib25Nb3VzZU1vdmUoJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgW2RhdGFTb3VyY2VdPVwiY29uZmlnLmRhdGFTb3VyY2VcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwiYmF0Y2hDb2x1bW5OYW1lXCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwicm93LXNlbGVjdFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBkaXNhYmxlLWV4cG9ydD5cclxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggW21hdFRvb2x0aXBdPVwiJ01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuU0VMRUNUX0FMTCcgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWRcIiAoY2hhbmdlKT1cInRvZ2dsZUFsbFJvd1NlbGVjdGlvbigpXCJcclxuICAgICAgICAgICAgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcclxuICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwibWF0U2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJyb3ctc2VsZWN0XCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiIGRpc2FibGUtZXhwb3J0PlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBcclxuICAgICAgICAgICAgW21hdFRvb2x0aXBdPVwiJ01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuU0VMRUNUJyB8IHRyYW5zbGF0ZVwiICpuZ0lmPVwiaXNSb3dDaGVja2JveEFsd2F5c1Zpc2libGUgfHwgaG92ZXJlZFJvdyA9PT0gZWxlbWVudCB8fCBtYXRTZWxlY3Rpb24uaXNTZWxlY3RlZChlbGVtZW50KVwiIFxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29uZmlnLmJhdGNoQ29uZmlnIS5jaGVja0JveGVzRGlzYWJsZWQgfHwgKHByZXNlbGVjdGVkSXRlbXMuaW5jbHVkZXMoZWxlbWVudCkgJiYgZGlzYWJsZVByZXNlbGVjdGVkSXRlbXMpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwidG9nZ2xlRWxlbWVudFNlbGVjdGlvbihlbGVtZW50KVwiIFtjaGVja2VkXT1cIm1hdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGVsZW1lbnQpXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5Q29sdW1uczsgc3RpY2t5OiBjb25maWc/LnN0aWNreUhlYWRlciA/PyBmYWxzZVwiPjwvdHI+XHJcbiAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5Q29sdW1uc1wiIChtb3VzZW92ZXIpPVwiaG92ZXJlZFJvdyA9IHJvd1wiIChtb3VzZWxlYXZlKT1cImhvdmVyZWRSb3cgPSBudWxsXCIgW2NsYXNzLmhpZ2hsaWdodF09XCJoaWdobGlnaHRFbGVtZW50KHJvdylcIj48L3RyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vRGF0YVJvd0FjdGl2ZVwiPlxyXG4gICAgICAgIDx0ciAqbWF0Tm9EYXRhUm93PlxyXG4gICAgICAgICAgPCEtLSBhZGQgcmFuZG9tIG51bWJlciB0byBtYWtlIHN1cmUgaXQgdGFrZXMgZnVsbCB3aWR0aCAtLT5cclxuICAgICAgICAgIDx0ZCBjb2xzcGFuPVwiOTlcIj5cclxuICAgICAgICAgICAgPGxpYi1zdGF0dXMtZGlzcGxheSBbY29uZmlnXT1cIm5vRGF0YVJvd0NvbmZpZ1wiPjwvbGliLXN0YXR1cy1kaXNwbGF5PlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvdGFibGU+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tbW9uL3NyYy9saWIvbXVsdGktZnVuY3Rpb25hbC10YWJsZS9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1jb21tb24vc3JjL2xpYi9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlL211bHRpLWZ1bmN0aW9uYWwtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBbUMsU0FBUyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRyxPQUFPLEVBQUUsR0FBRyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXhDLE1BQU0sT0FBTyw2QkFBNkI7SUFLeEMsSUFBYSxTQUFTLENBQUMsS0FBVTtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQTZCRCxJQUFJLG1CQUFtQixLQUFLLE9BQU8sNkJBQTZCLENBQUEsQ0FBQyxDQUFDO0lBNEJsRSxJQUFJLFlBQVksS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUQsSUFBSSxnQkFBZ0IsS0FBSyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO0lBS3hFLFlBQTZCLFVBQXNCLEVBQ2hDLGdCQUFrQztRQUR4QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ2hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUF0RTVDLGlCQUFZLEdBQUcsSUFBSSxjQUFjLENBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBUXhELHlFQUF5RTtRQUNoRSwrQkFBMEIsR0FBRyxJQUFJLENBQUM7UUFFbEMsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBRXpDLDJCQUEyQjtRQUNqQixvQkFBZSxHQUF1QyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUMvRixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEQsb0JBQWUsR0FBb0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQTZCOUksa0JBQWEsR0FBRyxlQUFlLENBQUM7UUFZeEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBTWIsb0JBQWUsR0FBRyxPQUFPLENBQUM7SUFHc0IsQ0FBQztJQUUxRCxpQ0FBaUM7SUFDakMsUUFBUTtRQUNOLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNyRCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNyRixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBQ0QsWUFBWTtJQUVaLG9CQUFvQixDQUFDLE9BQU8sR0FBRyxLQUFLO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzVFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVoRixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDaEQ7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUN0QixPQUFPO1NBQ1I7UUFFRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRTtZQUM5QixpQkFBaUIsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1NBQ2hDO1FBRUQsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzVCLElBQUksT0FBTyxFQUFFO2dCQUNYLE1BQU0sQ0FBQyxRQUFRLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDL0U7aUJBQ0k7Z0JBQ0gsb0VBQW9FO2dCQUNwRSxpQkFBaUIsQ0FBQyxPQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7YUFDM0Q7WUFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN2QztRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUM7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtZQUM5QixrQkFBa0IsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9DLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBNkI7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDaEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRTtZQUNuQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7U0FDcEI7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsT0FBVTtRQUN6QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxhQUFhO1FBQ1gsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDbkQsT0FBTyxXQUFXLEtBQUssT0FBTyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUU7Z0JBQ2hDLCtEQUErRDtnQkFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQ3hCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ2xHLENBQUM7Z0JBQ0YsT0FBTzthQUNSO2lCQUNJO2dCQUNILElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzFCLE9BQU87YUFDUjtTQUNGO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsT0FBVTtRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7UUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUN4RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztRQUU3RCx5Q0FBeUM7UUFDekMsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtZQUNoQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDM0M7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWlCO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU87U0FDUjtRQUVBLG1EQUFtRDtRQUNuRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtvQkFDdkIsT0FBTztpQkFDUjtnQkFFRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztnQkFDckUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7Z0JBRXBFLDBDQUEwQztnQkFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFcEMsNEJBQTRCO2dCQUM1QixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFFckUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFeEIsa0NBQWtDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7WUFDaEMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUNELFlBQVk7SUFFSixrQkFBa0I7UUFDeEIsaUVBQWlFO1FBQ2pFLCtHQUErRztRQUMvRyxpSkFBaUo7UUFDakosSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUssSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUM7WUFDM0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQztZQUN4SCxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBRXhILElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRTtnQkFDbEcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7YUFDM0I7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7YUFDNUI7U0FDSjtJQUNILENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFO1lBQ2hELE9BQU87U0FDUjtRQUVELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLFNBQXdCLENBQUM7UUFDN0IsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQzdDLEtBQUssWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUN0QjtnQkFDRSxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztnQkFDN0IsVUFBVSxHQUFHLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztnQkFDN0csTUFBTTtTQUNUO1FBQ0QsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRyxjQUFjLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLGtCQUFrQixJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQTBDO1FBQ25FLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxRQUFRLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUM5RjtJQUNILENBQUM7SUFDTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRTtZQUMvQixJQUFJO2dCQUNGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzlGLElBQUksa0JBQWtCLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7aUJBQ3pEO2FBQ0Y7WUFDRCxvQ0FBb0M7WUFDcEMsTUFBTTthQUNMO1NBQ0Y7SUFDSCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzNFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO0lBQzNHLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQzdDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQy9FO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztTQUMxQjtJQUNILENBQUM7K0dBL1RVLDZCQUE2QjttR0FBN0IsNkJBQTZCLG9hQXdCMUIsWUFBWSxtRUFIVCxlQUFlLDBDQUNmLFNBQVMsZ0VBQ1QsWUFBWSxvRUFHbEIsUUFBUSxxRkFDUixPQUFPLHFMQUtQLFFBQVEsMkJBQVUsVUFBVSw2QkN2RHpDLGcySEE4RUE7OzRGRHZEYSw2QkFBNkI7a0JBTnpDLFNBQVM7K0JBRUUsNEJBQTRCO2dJQU83QixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS0csMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFHSSxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFJMkIsYUFBYTtzQkFBOUMsZUFBZTt1QkFBQyxlQUFlO2dCQUNtQixPQUFPO3NCQUF6RCxlQUFlO3VCQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBQ2xCLFVBQVU7c0JBQXhDLGVBQWU7dUJBQUMsWUFBWTtnQkFDRCxTQUFTO3NCQUFwQyxZQUFZO3VCQUFDLFlBQVk7Z0JBRWEsS0FBSztzQkFBM0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNqQixJQUFJO3NCQUF2QixTQUFTO3VCQUFDLE9BQU87Z0JBRVcsY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBR2dCLGVBQWU7c0JBQXpELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvbGxlY3Rpb25zJztcclxuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdFNvcnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0Q29sdW1uRGVmLCBNYXRIZWFkZXJSb3dEZWYsIE1hdE5vRGF0YVJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUsIHRha2UgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRmlsdGVyQmFyQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi9maWx0ZXItYmFyL21vZGVscy9maWx0ZXItYmFyLWNoYW5nZS1ldmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEh0bWxFbGVtZW50UGFyc2VIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgU2F2ZUZpbGVIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL3NhdmUtZmlsZS5oZWxwZXInO1xyXG5pbXBvcnQgeyBET01TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMnO1xyXG5pbXBvcnQgeyBESVNBQkxFX0VYUE9SVF9BVFRSSUJVVEVfTkFNRSB9IGZyb20gJy4vY29uc3RhbnRzL2Rpc2FibGUtZXhwb3J0LWF0dHJpYnV0ZS1uYW1lLmNvbnN0JztcclxuaW1wb3J0IHsgRXhwb3J0Rm9ybWF0IH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBDb2x1bW5Db25maWcgfSBmcm9tICcuL21vZGVscy9jb2x1bW4tY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgTXVsdGlGdW5jdGlvbmFsVGFibGVDb25maWcgfSBmcm9tICcuL21vZGVscy9tdWx0aS1mdW5jdGlvbmFsLXRhYmxlLWNvbmZpZy5tb2RlbCc7XHJcbmltcG9ydCB7IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvc2VsZWN0ZWQtY29sdW1uLWxvY2FsLXN0b3JhZ2UtY29uZmlnLm1vZGVsJztcclxuaW1wb3J0IHsgU3RhdHVzRGlzcGxheUNvbmZpZyB9IGZyb20gJy4uL3N0YXR1cy1kaXNwbGF5L21vZGVscy9zdGF0dXMtZGlzcGxheS1jb25maWcubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ3RsZC1tdWx0aS1mdW5jdGlvbmFsLXRhYmxlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbXVsdGktZnVuY3Rpb25hbC10YWJsZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNdWx0aUZ1bmN0aW9uYWxUYWJsZUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgcmVhZG9ubHkgbWF0U2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPFQ+KHRydWUsIFtdKTtcclxuXHJcbiAgQElucHV0KCkgY29uZmlnITogTXVsdGlGdW5jdGlvbmFsVGFibGVDb25maWc8VD47XHJcbiAgQElucHV0KCkgaGlnaGxpZ2h0ZWRFbGVtZW50cyE6IFRbXTtcclxuICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHZhbHVlOiBUW10pIHtcclxuICAgIHRoaXMubWF0U2VsZWN0aW9uLnNldFNlbGVjdGlvbiguLi4odmFsdWUgPz8gW10pKTtcclxuICB9XHJcblxyXG4gIC8vIFNldCB0aGlzIHRvIGZhbHNlIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgY2hlY2tib3hlcyBvbmx5IG9uIHJvdyBob3Zlci5cclxuICBASW5wdXQoKSBpc1Jvd0NoZWNrYm94QWx3YXlzVmlzaWJsZSA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVQcmVzZWxlY3RlZEl0ZW1zID0gZmFsc2U7XHJcblxyXG4gIC8vI3JlZ2lvbiBPdXRwdXQgcHJvcGVydGllc1xyXG4gIEBPdXRwdXQoKSBmaWx0ZXJCYXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxGaWx0ZXJCYXJDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckJhckNoYW5nZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBleHBvcnRlZDogRXZlbnRFbWl0dGVyPFRbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPFRbXT4oKTtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlOiBPYnNlcnZhYmxlPFRbXT4gPSB0aGlzLm1hdFNlbGVjdGlvbi5jaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpLnBpcGUobWFwKCgpID0+IHsgcmV0dXJuIHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdGVkOyB9KSk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gUHJvcGVydGllcyBmb3IgbWF0IHRhYmxlIHdyYXBwZXJcclxuICBAQ29udGVudENoaWxkcmVuKE1hdEhlYWRlclJvd0RlZikgaGVhZGVyUm93RGVmcyE6IFF1ZXJ5TGlzdDxNYXRIZWFkZXJSb3dEZWY+O1xyXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0Um93RGVmLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHJvd0RlZnMhOiBRdWVyeUxpc3Q8TWF0Um93RGVmPFQ+PjtcclxuICBAQ29udGVudENoaWxkcmVuKE1hdENvbHVtbkRlZikgY29sdW1uRGVmcyE6IFF1ZXJ5TGlzdDxNYXRDb2x1bW5EZWY+O1xyXG4gIEBDb250ZW50Q2hpbGQoTWF0Tm9EYXRhUm93KSBub0RhdGFSb3chOiBNYXROb0RhdGFSb3c7XHJcblxyXG4gIEBWaWV3Q2hpbGQoTWF0VGFibGUsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlITogTWF0VGFibGU8VD47XHJcbiAgQFZpZXdDaGlsZChNYXRTb3J0KSBzb3J0ITogTWF0U29ydDtcclxuXHJcbiAgQFZpZXdDaGlsZCgndGFibGVDb250YWluZXInKSB0YWJsZUNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKE1hdFRhYmxlLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgdGFibGVFbGVtZW50UmVmITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gIHByZXNlbGVjdGVkSXRlbXMhOiBUW107XHJcblxyXG4gIGdldCBpZ25vcmVBdHRyaWJ1dGVOYW1lKCkgeyByZXR1cm4gRElTQUJMRV9FWFBPUlRfQVRUUklCVVRFX05BTUUgfVxyXG4gIGRpc3BsYXlDb2x1bW5zITogc3RyaW5nW107XHJcblxyXG4gIGNvbHVtblNlbGVjdEFjdGl2ZSE6IGJvb2xlYW47XHJcbiAgZXhwb3J0QWN0aXZlITogYm9vbGVhbjtcclxuICBub0RhdGFSb3dBY3RpdmUhOiBib29sZWFuO1xyXG5cclxuICBmaWx0ZXJCYXJWaXNpYmxlITogYm9vbGVhbjtcclxuXHJcbiAgbm9EYXRhUm93Q29uZmlnITogU3RhdHVzRGlzcGxheUNvbmZpZztcclxuICBub0RhdGFSb3dJY29uID0gXCJtYW5hZ2Vfc2VhcmNoXCI7XHJcblxyXG4gIGNvbmZpZ3VyYWJsZUNvbHVtbnMhOiBDb2x1bW5Db25maWdbXTtcclxuICBiYXRjaFNlbGVjdGVkRW5hYmxlZCE6IGJvb2xlYW47XHJcblxyXG4gIC8vIGlzIHVzZWQgaW4gaHRtbCB0byBkaXNwbGF5IGJhdGNoIGNoZWNrYm94IG9uIGhvdmVyZWQgcm93XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcclxuICBob3ZlcmVkUm93OiBhbnk7XHJcblxyXG4gIC8vIHByb3BlcnRpZXMgZm9yIG92ZXJmbG93IHNjcm9sbGluZyB3aXRoIG1vdXNlIGNsaWNrXHJcbiAgdGFibGVPdmVyZmxvdyE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBzY3JvbGxNb3ZlbWVudCE6IG51bWJlciB8IG51bGw7XHJcbiAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBzdGFydFggPSAwO1xyXG4gIHByaXZhdGUgc3RhcnRZID0gMDtcclxuICBwcml2YXRlIHNjcm9sbExlZnQgPSAwO1xyXG4gIHByaXZhdGUgc2Nyb2xsVG9wID0gMDtcclxuXHJcbiAgZ2V0IGZpbHRlckFjdGl2ZSgpIHsgcmV0dXJuIHRoaXMuY29uZmlnLmZpbHRlcj8uZW5hYmxlZDsgfVxyXG4gIGdldCBzaG93RmlsdGVyVG9nZ2xlKCkgeyByZXR1cm4gIXRoaXMuY29uZmlnLmZpbHRlcj8uaGlkZUZpbHRlclRvZ2dsZTsgfVxyXG5cclxuICBwcml2YXRlIGxvY2FsU3RvcmFnZVZhbHVlITogU2VsZWN0ZWRDb2x1bW5Mb2NhbFN0b3JhZ2VDb25maWc7XHJcbiAgcmVhZG9ubHkgYmF0Y2hDb2x1bW5OYW1lID0gXCJiYXRjaFwiO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRvbVNlcnZpY2U6IERPTVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UpIHsgfVxyXG5cclxuICAvLyNyZWdpb24gQW5ndWxhciBsaWZlY3ljbGUgaG9va3NcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucmVhZEZyb21Mb2NhbFN0b3JhZ2UoKTtcclxuICAgIHRoaXMuc2V0RmlsdGVyVmlzaWJpbGl0eSgpO1xyXG4gICAgdGhpcy5zZXRDb2x1bW5TZWxlY3RQcm9wZXJ0aWVzKCk7XHJcbiAgICB0aGlzLnNldEV4cG9ydFByb3BlcnRpZXMoKTtcclxuICAgIHRoaXMuc2V0Tm9EYXRhUm93UHJvcGVydGllcygpO1xyXG4gICAgdGhpcy5wcmVzZWxlY3RlZEl0ZW1zID0gdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLmNvbHVtbkRlZnMuZm9yRWFjaChjb2x1bW5EZWYgPT4gdGhpcy50YWJsZS5hZGRDb2x1bW5EZWYoY29sdW1uRGVmKSk7XHJcbiAgICB0aGlzLnJvd0RlZnMuZm9yRWFjaChyb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRSb3dEZWYocm93RGVmKSk7XHJcbiAgICB0aGlzLmhlYWRlclJvd0RlZnMuZm9yRWFjaChoZWFkZXJSb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSk7XHJcbiAgICB0aGlzLmhlYWRlclJvd0RlZnMuZm9yRWFjaChoZWFkZXJSb3dEZWYgPT4gdGhpcy50YWJsZS5hZGRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSk7XHJcbiAgICB0aGlzLnRhYmxlLnNldE5vRGF0YVJvdyh0aGlzLm5vRGF0YVJvdyk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhU291cmNlLnNvcnQgPSB0aGlzLnNvcnQ7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICB1cGRhdGVEaXNwbGF5Q29sdW1ucyhpbml0aWFsID0gZmFsc2UpIHtcclxuICAgIHRoaXMuYmF0Y2hTZWxlY3RlZEVuYWJsZWQgPSB0aGlzLmNvbmZpZy5iYXRjaENvbmZpZz8uZW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcclxuICAgIGNvbnN0IGFsbENvbHVtbnMgPSB0aGlzLmNvbmZpZy5jb2x1bW5TZWxlY3Q/LmNvbHVtbnMgPz8gW107XHJcbiAgICB0aGlzLmRpc3BsYXlDb2x1bW5zID0gW107XHJcbiAgICB0aGlzLmNvbmZpZ3VyYWJsZUNvbHVtbnMgPSBhbGxDb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gIWNvbHVtbi5ub3RDb25maWd1cmFibGUpO1xyXG5cclxuICAgIGlmICh0aGlzLmJhdGNoU2VsZWN0ZWRFbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuZGlzcGxheUNvbHVtbnMucHVzaCh0aGlzLmJhdGNoQ29sdW1uTmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFhbGxDb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbG9jYWxTdG9yYWdlVmFsdWUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID8/IHt9O1xyXG4gICAgaWYgKCFsb2NhbFN0b3JhZ2VWYWx1ZS5jb2x1bW5zKSB7XHJcbiAgICAgIGxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnMgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBhbGxDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBpZiAoaW5pdGlhbCkge1xyXG4gICAgICAgIGNvbHVtbi5zZWxlY3RlZCA9IGxvY2FsU3RvcmFnZVZhbHVlLmNvbHVtbnM/Lltjb2x1bW4ubmFtZV0gPz8gY29sdW1uLnNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgbG9jYWxTdG9yYWdlVmFsdWUuY29sdW1ucyFbY29sdW1uLm5hbWVdID0gY29sdW1uLnNlbGVjdGVkO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjb2x1bW4uc2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLmRpc3BsYXlDb2x1bW5zLnB1c2goY29sdW1uLm5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKCFpbml0aWFsKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlTG9jYWxTdG9yYWdlKGxvY2FsU3RvcmFnZVZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZUZpbHRlckJhcigpIHtcclxuICAgIGNvbnN0IGxvY2Fsc3RvcmFnZU9iamVjdCA9IHRoaXMubG9jYWxTdG9yYWdlVmFsdWUgPz8ge307XHJcbiAgICBpZiAoIWxvY2Fsc3RvcmFnZU9iamVjdC5maWx0ZXIpIHtcclxuICAgICAgbG9jYWxzdG9yYWdlT2JqZWN0LmZpbHRlciA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZmlsdGVyQmFyVmlzaWJsZSA9ICF0aGlzLmZpbHRlckJhclZpc2libGU7XHJcbiAgICBsb2NhbHN0b3JhZ2VPYmplY3QuZmlsdGVyLnZpc2libGUgPSB0aGlzLmZpbHRlckJhclZpc2libGU7XHJcbiAgICB0aGlzLnVwZGF0ZUxvY2FsU3RvcmFnZShsb2NhbHN0b3JhZ2VPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyc0NoYW5nZWQoZmlsdGVyczogRmlsdGVyQmFyQ2hhbmdlRXZlbnQpIHtcclxuICAgIHRoaXMuZmlsdGVyQmFyQ2hhbmdlLmVtaXQoZmlsdGVycyk7XHJcbiAgfVxyXG5cclxuICBleHBvcnQoKSB7XHJcbiAgICB0aGlzLmNvbmZpZy5kYXRhU291cmNlLmNvbm5lY3QoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmV4cG9ydGVkLmVtaXQoZGF0YSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5leHBvcnQ/LmZpbGVPcHRpb25zKSB7XHJcbiAgICAgIHRoaXMuZXhwb3J0VG9GaWxlKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudDogVCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRFbGVtZW50cz8uaW5jbHVkZXMoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gTWV0aG9kcyBmb3IgYmF0Y2ggc2VsZWN0aW9uXHJcbiAgaXNBbGxTZWxlY3RlZCgpIHtcclxuICAgIGNvbnN0IG51bVNlbGVjdGVkID0gdGhpcy5tYXRTZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xyXG4gICAgY29uc3QgbnVtUm93cyA9IHRoaXMuY29uZmlnLmRhdGFTb3VyY2UuZGF0YS5sZW5ndGg7XHJcbiAgICByZXR1cm4gbnVtU2VsZWN0ZWQgPT09IG51bVJvd3M7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVBbGxSb3dTZWxlY3Rpb24oKSB7XHJcbiAgICBpZiAodGhpcy5pc0FsbFNlbGVjdGVkKCkpIHtcclxuICAgICAgaWYgKHRoaXMuZGlzYWJsZVByZXNlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAvLyBkZXNlbGVjdCBvbmx5IHRob3NlIGl0ZW1zIHdoaWNoIHdlcmUgbm90IGFscmVhZHkgcHJlc2VsZWN0ZWRcclxuICAgICAgICB0aGlzLm1hdFNlbGVjdGlvbi5kZXNlbGVjdChcclxuICAgICAgICAgIC4uLnRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdGVkLmZpbHRlcihlbG0gPT4gIXRoaXMucHJlc2VsZWN0ZWRJdGVtcy5tYXAoZWxtID0+IGVsbSkuaW5jbHVkZXMoZWxtKSlcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1hdFNlbGVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWF0U2VsZWN0aW9uLnNlbGVjdCguLi50aGlzLmNvbmZpZy5kYXRhU291cmNlLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRWxlbWVudFNlbGVjdGlvbihlbGVtZW50OiBUKSB7XHJcbiAgICB0aGlzLm1hdFNlbGVjdGlvbi50b2dnbGUoZWxlbWVudCk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhcnRYID0gZXZlbnQucGFnZVggLSB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdDtcclxuICAgIHRoaXMuc3RhcnRZID0gZXZlbnQucGFnZVkgLSB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XHJcbiAgICB0aGlzLnNjcm9sbFRvcCA9IHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3A7XHJcblxyXG4gICAgLy8gY2FuY2VsaW5nIGFueSBwcmV2aW91cyBhbmltYXRpb24gZnJhbWVcclxuICAgIGlmICh0aGlzLnNjcm9sbE1vdmVtZW50ICE9PSBudWxsKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuc2Nyb2xsTW92ZW1lbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5jaGVja1RhYmxlT3ZlcmZsb3coKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgIC8vIHVzaW5nIHJlcXVlc3RBbmltYXRpb25GcmFtZSBmb3Igc21vb3RoZXIgdXBkYXRlc1xyXG4gICAgIGlmICh0aGlzLnNjcm9sbE1vdmVtZW50ID09PSBudWxsKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsTW92ZW1lbnQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy50YWJsZU92ZXJmbG93KSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRMZWZ0O1xyXG4gICAgICAgIGNvbnN0IHkgPSBldmVudC5wYWdlWSAtIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRUb3A7XHJcblxyXG4gICAgICAgIC8vIGNhbGN1bGF0aW5nIHRoZSBkaWZmZXJlbmNlcyBpbiBtb3ZlbWVudFxyXG4gICAgICAgIGNvbnN0IHdhbGtYID0gKHggLSB0aGlzLnN0YXJ0WCkgKiAyO1xyXG4gICAgICAgIGNvbnN0IHdhbGtZID0gKHkgLSB0aGlzLnN0YXJ0WSkgKiAyO1xyXG5cclxuICAgICAgICAvLyB1cGRhdGluZyBzY3JvbGwgcG9zaXRpb25zXHJcbiAgICAgICAgdGhpcy50YWJsZUNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrWDtcclxuICAgICAgICB0aGlzLnRhYmxlQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3AgLSB3YWxrWTtcclxuXHJcbiAgICAgICAgdGhpcy5zY3JvbGxNb3ZlbWVudCA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBvbk1vdXNlVXAoKSB7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBjYW5jZWxpbmcgYW55IHBlbmRpbmcgYW5pbWF0aW9uXHJcbiAgICBpZiAodGhpcy5zY3JvbGxNb3ZlbWVudCAhPT0gbnVsbCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjcm9sbE1vdmVtZW50KTtcclxuICAgICAgdGhpcy5zY3JvbGxNb3ZlbWVudCA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBwcml2YXRlIGNoZWNrVGFibGVPdmVyZmxvdygpOiB2b2lkIHtcclxuICAgIC8vIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUgd2Ugc2hvdWxkIGNoZWNrIG9uY2UgZm9yIHRhYmxlIG92ZXJmbG93XHJcbiAgICAvLyB3aGVuIHRoZXJlIHdhc250IG92ZXJmbG93LCBidXQgd2lkdGggb2YgdGhlIHRhYmxlIGJlY2FtZSBiaWdnZXIsIHRoZW4gd2UgYXJlIHJlc2V0aW5nIHRhYmxlT3ZlcmZsb3cgdmFyaWFibGVcclxuICAgIC8vIHNhbWUgZm9yIHdoZW4gdGhlcmUgd2FzIG92ZXJmbG93LCBidXQgc2l6ZSBvZiB0aGUgdGFibGUgaXMgc2FtZSBhcyBjb250YWluZXIsIHNvIG92ZXJmbG93IGlzIGdvbmUgYW5kIHdlIHJlc2V0aW5nIHRhYmxlT3ZlcmZsb3cgdmFyaWFibGUgYWdhaW5cclxuICAgIGlmICgodGhpcy5jb25maWcuZGF0YVNvdXJjZS5kYXRhLmxlbmd0aCAmJiAgdGhpcy50YWJsZU92ZXJmbG93ID09PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICghdGhpcy50YWJsZU92ZXJmbG93ICYmIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA8ICB0aGlzLnRhYmxlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoKSB8fFxyXG4gICAgICAodGhpcy50YWJsZU92ZXJmbG93ICYmIHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA9PT0gdGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCkpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudGFibGVDb250YWluZXIubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCA8IHRoaXMudGFibGVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGgpIHtcclxuICAgICAgICAgIHRoaXMudGFibGVPdmVyZmxvdyA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMudGFibGVPdmVyZmxvdyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXhwb3J0VG9GaWxlKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5leHBvcnQ/LmZpbGVPcHRpb25zPy5zYXZlVG9GaWxlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZmlsZVN0cmluZyA9IFwiXCI7XHJcbiAgICBsZXQgZXh0ZW5zaW9uITogRXhwb3J0Rm9ybWF0O1xyXG4gICAgc3dpdGNoICh0aGlzLmNvbmZpZy5leHBvcnQuZmlsZU9wdGlvbnMuZm9ybWF0KSB7XHJcbiAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0LkNTVjpcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBleHRlbnNpb24gPSBFeHBvcnRGb3JtYXQuQ1NWO1xyXG4gICAgICAgIGZpbGVTdHJpbmcgPSBIdG1sRWxlbWVudFBhcnNlSGVscGVyLnRhYmxlQXNDc3YodGhpcy50YWJsZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5pZ25vcmVBdHRyaWJ1dGVOYW1lKTtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICAgIGNvbnN0IHRyYW5zbGF0ZWRGaWxlTmFtZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLmV4cG9ydC5maWxlT3B0aW9ucy5maWxlTmFtZSk7XHJcbiAgICBTYXZlRmlsZUhlbHBlci5zYXZlRmlsZShmaWxlU3RyaW5nLCBgJHt0cmFuc2xhdGVkRmlsZU5hbWV9LiR7ZXh0ZW5zaW9ufWApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVMb2NhbFN0b3JhZ2UobmV3VmFsdWU6IFNlbGVjdGVkQ29sdW1uTG9jYWxTdG9yYWdlQ29uZmlnKSB7XHJcbiAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICBpZiAodGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5ICYmIG5ld1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LnNldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIHJlYWRGcm9tTG9jYWxTdG9yYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnLmxvY2FsU3RvcmFnZUtleSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGxvY2FsU3RvcmFnZVN0cmluZyA9IHRoaXMuZG9tU2VydmljZS5sb2NhbFN0b3JhZ2U/LmdldEl0ZW0odGhpcy5jb25maWcubG9jYWxTdG9yYWdlS2V5KTtcclxuICAgICAgICBpZiAobG9jYWxTdG9yYWdlU3RyaW5nKSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2VTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcclxuICAgICAgY2F0Y2gge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldENvbHVtblNlbGVjdFByb3BlcnRpZXMoKSB7XHJcbiAgICB0aGlzLmNvbHVtblNlbGVjdEFjdGl2ZSA9IHRoaXMuY29uZmlnLmNvbHVtblNlbGVjdD8uZW5hYmxlZCA/IHRydWUgOiBmYWxzZTtcclxuICAgIHRoaXMudXBkYXRlRGlzcGxheUNvbHVtbnModHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclZpc2liaWxpdHkoKSB7XHJcbiAgICB0aGlzLmZpbHRlckJhclZpc2libGUgPSB0aGlzLmxvY2FsU3RvcmFnZVZhbHVlPy5maWx0ZXI/LnZpc2libGUgPz8gdGhpcy5jb25maWc/LmZpbHRlcj8udmlzaWJsZSA/PyBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Tm9EYXRhUm93UHJvcGVydGllcygpIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZy5ub0RhdGFSb3cpIHtcclxuICAgICAgdGhpcy5ub0RhdGFSb3dBY3RpdmUgPSB0cnVlO1xyXG4gICAgICB0aGlzLm5vRGF0YVJvd0NvbmZpZyA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdztcclxuICAgICAgdGhpcy5ub0RhdGFSb3dDb25maWcuaWNvbiA9IHRoaXMuY29uZmlnLm5vRGF0YVJvdz8uaWNvbiA/PyB0aGlzLm5vRGF0YVJvd0ljb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEV4cG9ydFByb3BlcnRpZXMoKSB7XHJcbiAgICBpZiAodGhpcy5jb25maWcuZXhwb3J0Py5lbmFibGVkKSB7XHJcbiAgICAgIHRoaXMuZXhwb3J0QWN0aXZlID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBmeExheW91dD1cImNvbHVtblwiIGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxyXG5cclxuICA8ZGl2IGZ4TGF5b3V0PVwicm93XCI+XHJcbiAgICA8ZGl2IGZ4RmxleCBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJjb2x1bW5NZW51XCIgKm5nSWY9XCJjb2x1bW5TZWxlY3RBY3RpdmVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGNvbHVtbi1zZWxlY3QtaWNvblwiPm1lbnU8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4+e3snTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5DT0xVTU5fU0VMRUNUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKm5nSWY9XCJmaWx0ZXJBY3RpdmUgJiYgc2hvd0ZpbHRlclRvZ2dsZVwiIChjbGljayk9XCJ0b2dnbGVGaWx0ZXJCYXIoKVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5maWx0ZXJfbGlzdDwvc3Bhbj5cclxuICAgICAgICA8c3Bhbj57eydNVUxUSV9GVU5DVElPTkFMX1RBQkxFLkZJTFRFUl9UT0dHTEUnIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImV4cG9ydC1kYXRhXCIgbWF0LXN0cm9rZWQtYnV0dG9uICpuZ0lmPVwiZXhwb3J0QWN0aXZlXCIgKGNsaWNrKT1cImV4cG9ydCgpXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1vdXRsaW5lZFwiPmNsb3VkX2Rvd25sb2FkPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7J01VTFRJX0ZVTkNUSU9OQUxfVEFCTEUuRVhQT1JUJyB8IHRyYW5zbGF0ZX19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlthZGRpdGlvbmFsQWN0aW9uc11cIj48L25nLWNvbnRlbnQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtbWVudSAjY29sdW1uTWVudT1cIm1hdE1lbnVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tc2VsZWN0LXdyYXBwZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb25maWd1cmFibGVDb2x1bW5zXCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cImNvbHVtbi5zZWxlY3RlZFwiIChjaGFuZ2UpPVwidXBkYXRlRGlzcGxheUNvbHVtbnMoKVwiPlxyXG4gICAgICAgICAge3tjb2x1bW4uZGlzcGxheU5hbWUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbWF0LW1lbnU+XHJcblxyXG4gIDx0bGQtZmlsdGVyLWJhciAqbmdJZj1cImNvbmZpZy5maWx0ZXIgJiYgY29uZmlnLmZpbHRlci5lbmFibGVkXCIgW2ZpbHRlclJvd1Zpc2libGVdPVwiIWZpbHRlckJhclZpc2libGVcIiBbc2V0dGluZ3NdPVwiY29uZmlnLmZpbHRlci5zZXR0aW5nc1wiIFxyXG4gICAgKGZpbHRlckJhckNoYW5nZSk9XCJmaWx0ZXJzQ2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgPC90bGQtZmlsdGVyLWJhcj5cclxuXHJcbiAgPGRpdiBcclxuICAgICN0YWJsZUNvbnRhaW5lclxyXG4gICAgW2NsYXNzLnRhYmxlLXN0aWNreS1oZWFkZXJdPVwiY29uZmlnPy5zdGlja3lIZWFkZXJcIlxyXG4gICAgW2NsYXNzLnRhYmxlLWRyYWdhYmxlXT1cInRhYmxlT3ZlcmZsb3dcIlxyXG4gICAgY2xhc3M9XCJ0YWJsZS1vdmVyZmxvd1wiXHJcbiAgICAobW91c2Vkb3duKT1cIm9uTW91c2VEb3duKCRldmVudClcIlxyXG4gICAgKG1vdXNldXApPVwib25Nb3VzZVVwKClcIlxyXG4gICAgKG1vdXNlbGVhdmUpPVwib25Nb3VzZVVwKClcIlxyXG4gICAgKG1vdXNlbW92ZSk9XCJvbk1vdXNlTW92ZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8dGFibGUgI3RhYmxlIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJjb25maWcuZGF0YVNvdXJjZVwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJiYXRjaENvbHVtbk5hbWVcIj5cclxuICAgICAgICA8dGggY2xhc3M9XCJyb3ctc2VsZWN0XCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGRpc2FibGUtZXhwb3J0PlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbbWF0VG9vbHRpcF09XCInTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5TRUxFQ1RfQUxMJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJjb25maWcuYmF0Y2hDb25maWchLmNoZWNrQm94ZXNEaXNhYmxlZFwiIChjaGFuZ2UpPVwidG9nZ2xlQWxsUm93U2VsZWN0aW9uKClcIlxyXG4gICAgICAgICAgICBbY2hlY2tlZF09XCJtYXRTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxyXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJtYXRTZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInJvdy1zZWxlY3RcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCIgZGlzYWJsZS1leHBvcnQ+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFxyXG4gICAgICAgICAgICBbbWF0VG9vbHRpcF09XCInTVVMVElfRlVOQ1RJT05BTF9UQUJMRS5TRUxFQ1QnIHwgdHJhbnNsYXRlXCIgKm5nSWY9XCJpc1Jvd0NoZWNrYm94QWx3YXlzVmlzaWJsZSB8fCBob3ZlcmVkUm93ID09PSBlbGVtZW50IHx8IG1hdFNlbGVjdGlvbi5pc1NlbGVjdGVkKGVsZW1lbnQpXCIgXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb25maWcuYmF0Y2hDb25maWchLmNoZWNrQm94ZXNEaXNhYmxlZCB8fCAocHJlc2VsZWN0ZWRJdGVtcy5pbmNsdWRlcyhlbGVtZW50KSAmJiBkaXNhYmxlUHJlc2VsZWN0ZWRJdGVtcylcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0b2dnbGVFbGVtZW50U2VsZWN0aW9uKGVsZW1lbnQpXCIgW2NoZWNrZWRdPVwibWF0U2VsZWN0aW9uLmlzU2VsZWN0ZWQoZWxlbWVudClcIj5cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXlDb2x1bW5zOyBzdGlja3k6IGNvbmZpZz8uc3RpY2t5SGVhZGVyID8/IGZhbHNlXCI+PC90cj5cclxuICAgICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IGRpc3BsYXlDb2x1bW5zXCIgKG1vdXNlb3Zlcik9XCJob3ZlcmVkUm93ID0gcm93XCIgKG1vdXNlbGVhdmUpPVwiaG92ZXJlZFJvdyA9IG51bGxcIiBbY2xhc3MuaGlnaGxpZ2h0XT1cImhpZ2hsaWdodEVsZW1lbnQocm93KVwiPjwvdHI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm9EYXRhUm93QWN0aXZlXCI+XHJcbiAgICAgICAgPHRyICptYXROb0RhdGFSb3c+XHJcbiAgICAgICAgICA8IS0tIGFkZCByYW5kb20gbnVtYmVyIHRvIG1ha2Ugc3VyZSBpdCB0YWtlcyBmdWxsIHdpZHRoIC0tPlxyXG4gICAgICAgICAgPHRkIGNvbHNwYW49XCI5OVwiPlxyXG4gICAgICAgICAgICA8bGliLXN0YXR1cy1kaXNwbGF5IFtjb25maWddPVwibm9EYXRhUm93Q29uZmlnXCI+PC9saWItc3RhdHVzLWRpc3BsYXk+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC90YWJsZT5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==