ets-fe-ng-sdk 18.0.94 → 18.0.97

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.
@@ -18,8 +18,12 @@ import { Config } from '../../../configs/index.config';
18
18
  import { ActivatedRoute, Router, RouterLink } from '@angular/router';
19
19
  import { BaseFormGenerator, } from '../../../Shared/components/form-generator/form-generator.base.component';
20
20
  import { toObservable, toSignal } from '@angular/core/rxjs-interop';
21
+ import { MatMenuModule } from '@angular/material/menu';
22
+ import { MatIconModule } from '@angular/material/icon';
21
23
  import * as i0 from "@angular/core";
22
24
  import * as i1 from "@angular/forms";
25
+ import * as i2 from "@angular/material/menu";
26
+ import * as i3 from "@angular/material/icon";
23
27
  export class FindItemComponent extends BaseFormGenerator {
24
28
  constructor() {
25
29
  super(...arguments);
@@ -29,7 +33,6 @@ export class FindItemComponent extends BaseFormGenerator {
29
33
  this.autoFormatSchema = input(true);
30
34
  this.autoOrder = input(true);
31
35
  this.centerCells = input();
32
- this.debug = input();
33
36
  this._displayedColumns = input([], { alias: 'displayedColumns' });
34
37
  this.displayedColumns = computed(() => this.useCustomLabels()
35
38
  ? this.tableService.globalColumnsFormatter(this._displayedColumns())
@@ -52,6 +55,7 @@ export class FindItemComponent extends BaseFormGenerator {
52
55
  this.searchFunction = input();
53
56
  this.showData = input(true);
54
57
  this.searchIfNoQuery = input(true);
58
+ this.isCompact = input();
55
59
  this.showExport = input(true);
56
60
  this.showFilter = input(false);
57
61
  this.showRefreshBtn = input();
@@ -115,15 +119,19 @@ export class FindItemComponent extends BaseFormGenerator {
115
119
  this.delimiterField = '~~~';
116
120
  this.delimiterWord = '~~';
117
121
  this.searchTrigger = new Subject();
122
+ this.showCompactFieldsMap = signal({});
118
123
  this.computedFormSchema = computed(() => {
119
- const formSchema = this.formSchema() || [], standaloneForm = this.standaloneForm(), searchForm = this.searchForm();
120
- return formSchema
121
- .filter((x) => !x.hidden)
122
- .map((scheme) => {
124
+ const formSchema = this.formSchema() || [], standaloneForm = this.standaloneForm(), isCompact = this.isCompact(), showCompactFieldsMap = this.showCompactFieldsMap(), searchForm = this.searchForm();
125
+ return (isCompact
126
+ ? formSchema.filter((x) => !x.hidden && (x.nonCompact || showCompactFieldsMap[x.field]))
127
+ : formSchema.filter((x) => !x.hidden)).map((scheme) => {
123
128
  scheme.form = scheme.standalone ? standaloneForm : searchForm;
124
129
  return scheme;
125
130
  });
126
131
  }, { equal: isEqual });
132
+ this.compactedFields = computed(() => {
133
+ return this.formSchema()?.filter((x) => !x.nonCompact);
134
+ });
127
135
  this.hasColumns = computed(() => !!this.displayedColumns()?.length);
128
136
  this.hideTable = computed(() => !this.showData() || (!this.data() && !this.isTablePaginated()));
129
137
  this.uaS = inject(UserActivityService);
@@ -177,6 +185,11 @@ export class FindItemComponent extends BaseFormGenerator {
177
185
  this.subs2?.clear();
178
186
  return super.onDestroy();
179
187
  }
188
+ toggleCompactField(field) {
189
+ this.showCompactFieldsMap.update((map) => {
190
+ return { ...map, [field.field]: !map[field.field] };
191
+ });
192
+ }
180
193
  fetchSavedQuery() {
181
194
  try {
182
195
  const prevQueryString = this.route.snapshot.queryParamMap.get('q');
@@ -361,7 +374,7 @@ export class FindItemComponent extends BaseFormGenerator {
361
374
  this._loading.set(false);
362
375
  }
363
376
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: FindItemComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
364
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: FindItemComponent, isStandalone: true, selector: "app-find-item,find-item", inputs: { autoFormatSchema: { classPropertyName: "autoFormatSchema", publicName: "autoFormatSchema", isSignal: true, isRequired: false, transformFunction: null }, autoOrder: { classPropertyName: "autoOrder", publicName: "autoOrder", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, debug: { classPropertyName: "debug", publicName: "debug", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, gridClass: { classPropertyName: "gridClass", publicName: "gridClass", isSignal: true, isRequired: false, transformFunction: null }, hideForm: { classPropertyName: "hideForm", publicName: "hideForm", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, showData: { classPropertyName: "showData", publicName: "showData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSearchBtn: { classPropertyName: "showSearchBtn", publicName: "showSearchBtn", isSignal: true, isRequired: false, transformFunction: null }, showClearBtn: { classPropertyName: "showClearBtn", publicName: "showClearBtn", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsg: { classPropertyName: "showValidationMsg", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, createBtnRoute: { classPropertyName: "createBtnRoute", publicName: "createBtnRoute", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, createButton: { classPropertyName: "createButton", publicName: "createButton", isSignal: true, isRequired: false, transformFunction: null }, _formSchema: { classPropertyName: "_formSchema", publicName: "formSchema", isSignal: false, isRequired: false, transformFunction: null }, searchObservableFunc: { classPropertyName: "searchObservableFunc", publicName: "searchObservableFunc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { _rowClick: "rowClick", clickedCreate: "clickedCreate" }, viewQueries: [{ propertyName: "tableHTTPSREF", first: true, predicate: (TableHttpsComponent), descendants: true, isSignal: true }, { propertyName: "tablePlainRef", first: true, predicate: (TablePlainComponent), descendants: true, isSignal: true }, { propertyName: "tableHTTPSREFSignal", first: true, predicate: TableHttpsComponent, descendants: true, isSignal: true }, { propertyName: "tablePlainRefSignal", first: true, predicate: TablePlainComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<loader [loading]=\"_loading()\">\n @if (!hideForm() && searchForm()) {\n <form (ngSubmit)=\"search()\">\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <div class=\"{{ gridClass() }} \">\n <div class=\"row align-items-end\">\n <ng-template #defaultInpTempl>\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </ng-template>\n\n @switch (true) {\n @case (scheme.type == 'tel') {\n <div class=\"col\">\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.type == 'autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [hint]=\"scheme.hint\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.standalone || scheme.action) {\n <div class=\"col\">\n <form (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"gx-2 row align-items-end\">\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n <div class=\"col-auto\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </div>\n </div>\n </form>\n </div>\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"formField\" />\n }\n }\n @default {\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n }\n }\n </div>\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n <span class=\"mx-1\"></span>\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n text=\"Search\"\n actionType=\"submit\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (createButton()) {\n <span class=\"mx-1\"></span>\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n </form>\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [label]=\"label()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n noItemTxt=\"No results found\" />\n } @else {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n [data]=\"data()\" />\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [""], dependencies: [{ kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "ratioHW"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PhoneNumberComponent, selector: "app-phone-number", inputs: ["showLabel", "countryCode3", "config"], outputs: ["onCountrySelect"] }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["maxLength", "minLength", "control", "customMessage", "debug", "ignoreDirtiness", "input", "label", "hideOverflow"], outputs: ["labelChange"] }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "options"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["mSelectedOptionLabel"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "component", type: TableHttpsComponent, selector: "table-https", inputs: ["observableFunc", "pageNumber", "queryData", "searchIfNoQuery", "showRefreshBtn"], outputs: ["queryDataChange", "dataFetched"] }, { kind: "component", type: TablePlainComponent, selector: "table-plain", inputs: ["customSelectClass", "idField", "obsDataSource", "showFilter", "showPager", "disableSelectionByField", "data", "filterFields", "filterFieldsMap", "selectionPerPage"], outputs: ["view", "dataChanged", "filterChange", "listMutated"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }] }); }
377
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.0", type: FindItemComponent, isStandalone: true, selector: "app-find-item,find-item", inputs: { autoFormatSchema: { classPropertyName: "autoFormatSchema", publicName: "autoFormatSchema", isSignal: true, isRequired: false, transformFunction: null }, autoOrder: { classPropertyName: "autoOrder", publicName: "autoOrder", isSignal: true, isRequired: false, transformFunction: null }, centerCells: { classPropertyName: "centerCells", publicName: "centerCells", isSignal: true, isRequired: false, transformFunction: null }, _displayedColumns: { classPropertyName: "_displayedColumns", publicName: "displayedColumns", isSignal: true, isRequired: false, transformFunction: null }, gridClass: { classPropertyName: "gridClass", publicName: "gridClass", isSignal: true, isRequired: false, transformFunction: null }, hideForm: { classPropertyName: "hideForm", publicName: "hideForm", isSignal: true, isRequired: false, transformFunction: null }, expandedRowTemplate: { classPropertyName: "expandedRowTemplate", publicName: "expandedRowTemplate", isSignal: true, isRequired: false, transformFunction: null }, rowOptionsMap: { classPropertyName: "rowOptionsMap", publicName: "rowOptionsMap", isSignal: true, isRequired: false, transformFunction: null }, isExpandable: { classPropertyName: "isExpandable", publicName: "isExpandable", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, nowrap: { classPropertyName: "nowrap", publicName: "nowrap", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "rowOptions", isSignal: true, isRequired: false, transformFunction: null }, orderDirection: { classPropertyName: "orderDirection", publicName: "orderDirection", isSignal: true, isRequired: false, transformFunction: null }, orderField: { classPropertyName: "orderField", publicName: "orderField", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchFunction: { classPropertyName: "searchFunction", publicName: "searchFunction", isSignal: true, isRequired: false, transformFunction: null }, showData: { classPropertyName: "showData", publicName: "showData", isSignal: true, isRequired: false, transformFunction: null }, searchIfNoQuery: { classPropertyName: "searchIfNoQuery", publicName: "searchIfNoQuery", isSignal: true, isRequired: false, transformFunction: null }, isCompact: { classPropertyName: "isCompact", publicName: "isCompact", isSignal: true, isRequired: false, transformFunction: null }, showExport: { classPropertyName: "showExport", publicName: "showExport", isSignal: true, isRequired: false, transformFunction: null }, showFilter: { classPropertyName: "showFilter", publicName: "showFilter", isSignal: true, isRequired: false, transformFunction: null }, showRefreshBtn: { classPropertyName: "showRefreshBtn", publicName: "showRefreshBtn", isSignal: true, isRequired: false, transformFunction: null }, startSectionTemplate: { classPropertyName: "startSectionTemplate", publicName: "startSectionTemplate", isSignal: true, isRequired: false, transformFunction: null }, showSearchBtn: { classPropertyName: "showSearchBtn", publicName: "showSearchBtn", isSignal: true, isRequired: false, transformFunction: null }, showClearBtn: { classPropertyName: "showClearBtn", publicName: "showClearBtn", isSignal: true, isRequired: false, transformFunction: null }, showValidationMsg: { classPropertyName: "showValidationMsg", publicName: "showValidationMsg", isSignal: true, isRequired: false, transformFunction: null }, createBtnRoute: { classPropertyName: "createBtnRoute", publicName: "createBtnRoute", isSignal: true, isRequired: false, transformFunction: null }, showAdditionalColumns: { classPropertyName: "showAdditionalColumns", publicName: "showAdditionalColumns", isSignal: true, isRequired: false, transformFunction: null }, smallerFonts: { classPropertyName: "smallerFonts", publicName: "smallerFonts", isSignal: true, isRequired: false, transformFunction: null }, useSelection: { classPropertyName: "useSelection", publicName: "useSelection", isSignal: true, isRequired: false, transformFunction: null }, createButton: { classPropertyName: "createButton", publicName: "createButton", isSignal: true, isRequired: false, transformFunction: null }, _formSchema: { classPropertyName: "_formSchema", publicName: "formSchema", isSignal: false, isRequired: false, transformFunction: null }, searchObservableFunc: { classPropertyName: "searchObservableFunc", publicName: "searchObservableFunc", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { _rowClick: "rowClick", clickedCreate: "clickedCreate" }, viewQueries: [{ propertyName: "tableHTTPSREF", first: true, predicate: (TableHttpsComponent), descendants: true, isSignal: true }, { propertyName: "tablePlainRef", first: true, predicate: (TablePlainComponent), descendants: true, isSignal: true }, { propertyName: "tableHTTPSREFSignal", first: true, predicate: TableHttpsComponent, descendants: true, isSignal: true }, { propertyName: "tablePlainRefSignal", first: true, predicate: TablePlainComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<loader [loading]=\"_loading()\">\n @if (!hideForm() && searchForm()) {\n <form (ngSubmit)=\"search()\">\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <div class=\"{{ gridClass() }} \">\n <div class=\"row align-items-end\">\n <ng-template #defaultInpTempl>\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </ng-template>\n\n @switch (true) {\n @case (scheme.type == 'tel') {\n <div class=\"col\">\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.type == 'autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [hint]=\"scheme.hint\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.standalone || scheme.action) {\n <div class=\"col\">\n <form (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"gx-2 row align-items-end\">\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n <div class=\"col-auto\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </div>\n </div>\n </form>\n </div>\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"formField\" />\n }\n }\n @default {\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n }\n }\n </div>\n </div>\n }\n <div class=\"col-md justify-content-end align-items-center d-flex\">\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n <span class=\"mx-1\"></span>\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n text=\"Search\"\n actionType=\"submit\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n mclass=\"ms-1\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n [matMenuTriggerFor]=\"extraFieldsMenu\" />\n <mat-menu #extraFieldsMenu=\"matMenu\" class=\"\">\n @for (field of compactedFields(); track field.label) {\n <button mat-menu-item (click)=\"toggleCompactField(field)\">\n {{ field.label }}\n @if (showCompactFieldsMap()[field.field]) {\n <mat-icon>checked</mat-icon>\n }\n </button>\n }\n </mat-menu>\n }\n @if (createButton()) {\n <span class=\"mx-1\"></span>\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n </form>\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [label]=\"label()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n noItemTxt=\"No results found\" />\n } @else {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n [data]=\"data()\" />\n }\n </ng-container>\n </div>\n }\n</loader>\n", styles: [""], dependencies: [{ kind: "component", type: LoaderComponent, selector: "loader", inputs: ["class", "text", "loading", "height", "width", "ratioHW"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: PhoneNumberComponent, selector: "app-phone-number", inputs: ["showLabel", "countryCode3", "config"], outputs: ["onCountrySelect"] }, { kind: "component", type: ValidationMessageComponent, selector: "app-validation-message", inputs: ["maxLength", "minLength", "control", "customMessage", "debug", "ignoreDirtiness", "input", "label", "hideOverflow"], outputs: ["labelChange"] }, { kind: "component", type: AutocompleteComponent, selector: "app-autocomplete,autocomplete", inputs: ["showRequiredTag", "validate", "options"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: InputBasicComponent, selector: "app-input-basic,app-input", inputs: ["accept", "autocomplete", "input", "contextData", "decimalPoints", "files", "hide", "clearOnDisable", "labelLink", "loading", "multiple", "optionsFunc", "vms", "setCurrentDate", "options"], outputs: ["mSelectedOptionLabel"] }, { kind: "component", type: BtnComponent, selector: "app-btn", inputs: ["formSchema", "debug", "centerBtn", "danger", "warning", "verbose", "translatorOptions", "loading", "icon", "rightIcon", "leftIcon", "type", "group", "actionType", "animate", "excludeLogging", "loggingValue", "badge", "class", "customIcon", "form", "forms", "help", "helpShowDelay", "iconBtn", "mclass", "showHelpIcon", "rightCustomIcon", "leftCustomIcon", "text", "valid", "mini", "onFormInvalid", "disabled"], outputs: ["loadingChange", "leftCustomIconChange", "mclick", "disabledChange"] }, { kind: "component", type: TableHttpsComponent, selector: "table-https", inputs: ["observableFunc", "pageNumber", "queryData", "searchIfNoQuery", "showRefreshBtn"], outputs: ["queryDataChange", "dataFetched"] }, { kind: "component", type: TablePlainComponent, selector: "table-plain", inputs: ["customSelectClass", "idField", "obsDataSource", "showFilter", "showPager", "disableSelectionByField", "data", "filterFields", "filterFieldsMap", "selectionPerPage"], outputs: ["view", "dataChanged", "filterChange", "listMutated"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: FunctionCaller2, name: "functionCaller2" }, { kind: "pipe", type: ToAnyPipe, name: "toAny" }] }); }
365
378
  }
366
379
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImport: i0, type: FindItemComponent, decorators: [{
367
380
  type: Component,
@@ -375,19 +388,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.0", ngImpor
375
388
  PhoneNumberComponent,
376
389
  ValidationMessageComponent,
377
390
  AutocompleteComponent,
391
+ MatMenuModule,
378
392
  RouterLink,
379
393
  NgSwitchDefault,
380
394
  InputBasicComponent,
381
395
  BtnComponent,
382
396
  TableHttpsComponent,
383
397
  TablePlainComponent,
398
+ MatIconModule,
384
399
  AsyncPipe,
385
400
  ReactiveFormsModule,
386
401
  FunctionCaller2,
387
402
  ToAnyPipe,
388
- ], template: "<loader [loading]=\"_loading()\">\n @if (!hideForm() && searchForm()) {\n <form (ngSubmit)=\"search()\">\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <div class=\"{{ gridClass() }} \">\n <div class=\"row align-items-end\">\n <ng-template #defaultInpTempl>\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </ng-template>\n\n @switch (true) {\n @case (scheme.type == 'tel') {\n <div class=\"col\">\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.type == 'autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [hint]=\"scheme.hint\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.standalone || scheme.action) {\n <div class=\"col\">\n <form (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"gx-2 row align-items-end\">\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n <div class=\"col-auto\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </div>\n </div>\n </form>\n </div>\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"formField\" />\n }\n }\n @default {\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n }\n }\n </div>\n </div>\n }\n <div class=\"col-md justify-content-end d-flex\">\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n <span class=\"mx-1\"></span>\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n text=\"Search\"\n actionType=\"submit\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (createButton()) {\n <span class=\"mx-1\"></span>\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n </form>\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [label]=\"label()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n noItemTxt=\"No results found\" />\n } @else {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n [data]=\"data()\" />\n }\n </ng-container>\n </div>\n }\n</loader>\n" }]
403
+ ], template: "<loader [loading]=\"_loading()\">\n @if (!hideForm() && searchForm()) {\n <form (ngSubmit)=\"search()\">\n <div class=\"row align-items-center\">\n @for (scheme of computedFormSchema(); track scheme.field) {\n <div class=\"{{ gridClass() }} \">\n <div class=\"row align-items-end\">\n <ng-template #defaultInpTempl>\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </ng-template>\n\n @switch (true) {\n @case (scheme.type == 'tel') {\n <div class=\"col\">\n <app-phone-number\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [name]=\"scheme.field\"\n [showLabel]=\"false\"\n [showValidation]=\"scheme.showValidation\"\n [showValidationIcon]=\"scheme.showValidationIcon\"\n [countryCode3]=\"scheme.countryCode3\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue() : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.type == 'autocomplete') {\n <div class=\"col\">\n <app-autocomplete\n [form]=\"scheme.form\"\n [label]=\"scheme.label\"\n [labelField]=\"scheme.labelField\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [optionsFunc]=\"scheme.optionsFunc\"\n [name]=\"scheme.field\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [valueField]=\"scheme.valueField\"\n [options]=\"scheme.options\"\n [hint]=\"scheme.hint\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \"\n #inputTag />\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"inputTag\" />\n }\n </div>\n }\n @case (scheme.standalone || scheme.action) {\n <div class=\"col\">\n <form (ngSubmit)=\"fieldAction(scheme)\">\n <div class=\"gx-2 row align-items-end\">\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n <div class=\"col-auto\">\n <app-btn\n [icon]=\"scheme.icon || 'show'\"\n [group]=\"scheme.standalone && scheme.action ? 'show' : null\"\n actionType=\"submit\"\n [disabled]=\"!formField?.validSignal()\" />\n </div>\n </div>\n </form>\n </div>\n @if (showValidationMsg()) {\n <app-validation-message [input]=\"formField\" />\n }\n }\n @default {\n <div class=\"col\">\n <app-input-basic\n #formField\n [name]=\"scheme.field\"\n [form]=\"scheme.form\"\n [type]=\"scheme.type\"\n [autoPickValueField]=\"scheme.autoPickValueField\"\n [valueField]=\"scheme.valueField\"\n [labelType]=\"scheme.labelType | toAny\"\n [checkedSignal]=\"scheme.checked\"\n [showValidation]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [showValidationIcon]=\"formField.hasValue() && !!scheme.asyncValidators\"\n [noFormat]=\"true\"\n [labelField]=\"scheme.labelField\"\n [optionFormatter]=\"scheme.optionFormatter\"\n [options]=\"scheme.options\"\n [decimalPoints]=\"scheme.decimalPoints\"\n [hint]=\"scheme.hint\"\n [showValidationMsg]=\"showValidationMsg()\"\n [max]=\"scheme.max\"\n [min]=\"scheme.min\"\n [placeholder]=\"scheme.placeholder\"\n [label]=\"scheme.label\"\n [disabled]=\"\n scheme.disabledIf\n | functionCaller2: searchFormValue : (scheme.field | toAny)\n \" />\n </div>\n }\n }\n </div>\n </div>\n }\n <div class=\"col-md justify-content-end align-items-center d-flex\">\n @if (showClearBtn()) {\n <app-btn type=\"danger-outline\" text=\"Clear\" icon=\"delete\" (mclick)=\"clearFilters()\" />\n }\n <span class=\"mx-1\"></span>\n @if (showSearchBtn()) {\n <app-btn\n [group]=\"'search'\"\n [iconBtn]=\"true\"\n text=\"Search\"\n actionType=\"submit\"\n [excludeLogging]=\"true\"\n [disabled]=\"!searchFunction() && !isTablePaginated()\" />\n }\n @if (isCompact()) {\n <app-btn\n [showHelpIcon]=\"false\"\n mclass=\"ms-1\"\n [excludeLogging]=\"true\"\n help=\"Search Fields\"\n customIcon=\"fa fa-ellipsis-v\"\n [matMenuTriggerFor]=\"extraFieldsMenu\" />\n <mat-menu #extraFieldsMenu=\"matMenu\" class=\"\">\n @for (field of compactedFields(); track field.label) {\n <button mat-menu-item (click)=\"toggleCompactField(field)\">\n {{ field.label }}\n @if (showCompactFieldsMap()[field.field]) {\n <mat-icon>checked</mat-icon>\n }\n </button>\n }\n </mat-menu>\n }\n @if (createButton()) {\n <span class=\"mx-1\"></span>\n @if (createBtnRoute()) {\n <app-btn\n type=\"outline\"\n text=\"Create\"\n icon=\"add\"\n (mclick)=\"clickedCreate.emit()\"\n routerLink=\"{{ createBtnRoute() }}\" />\n } @else {\n <app-btn type=\"outline\" text=\"Create\" icon=\"add\" (mclick)=\"clickedCreate.emit()\" />\n }\n }\n </div>\n </div>\n </form>\n }\n\n <ng-content select=\"[tablePanel]\"></ng-content>\n\n @if (hasColumns()) {\n <div class=\"mt-3\" [hidden]=\"hideTable()\">\n <ng-container>\n @if (isTablePaginated()) {\n <table-https\n #tableHTTPS\n [searchIfNoQuery]=\"searchIfNoQuery()\"\n [displayedColumns]=\"displayedColumns()\"\n [observableFunc]=\"searchObservableFunc()\"\n (rowClick)=\"rowClick($event)\"\n [centerCells]=\"centerCells()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [isExpandable]=\"isExpandable()\"\n [label]=\"label()\"\n [nowrap]=\"nowrap()\"\n [orderDirection]=\"orderDirection()\"\n [orderField]=\"orderField()\"\n [pageSize]=\"pageSize()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [showExport]=\"showExport()\"\n [showRefreshBtn]=\"showRefreshBtn()\"\n [smallerFonts]=\"smallerFonts()\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [useSelection]=\"useSelection()\"\n noItemTxt=\"No results found\" />\n } @else {\n <table-plain\n [distinct]=\"true\"\n [showPager]=\"true\"\n [pageSize]=\"pageSize()\"\n [centerCells]=\"false\"\n [startSectionTemplate]=\"startSectionTemplate()\"\n [smallerFonts]=\"smallerFonts()\"\n [nowrap]=\"nowrap()\"\n [showFilter]=\"showFilter()\"\n [showExport]=\"showExport()\"\n [isExpandable]=\"isExpandable()\"\n [expandedRowTemplate]=\"expandedRowTemplate()\"\n [label]=\"label()\"\n noItemTxt=\"No results found\"\n (rowClick)=\"rowClick($event)\"\n [orderField]=\"orderField()\"\n [rowOptions]=\"options()\"\n [debug]=\"debug()\"\n [rowOptionsMap]=\"rowOptionsMap()\"\n [showAdditionalColumns]=\"showAdditionalColumns()\"\n [orderDirection]=\"orderDirection()\"\n [displayedColumns]=\"displayedColumns()\"\n [data]=\"data()\" />\n }\n </ng-container>\n </div>\n }\n</loader>\n" }]
389
404
  }], propDecorators: { _formSchema: [{
390
405
  type: Input,
391
406
  args: ['formSchema']
392
407
  }] } });
393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9SZXVzYWJsZXMvcmV1c2FibGUtY29tcHMvZmluZC1pdGVtL2ZpbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ldHMtZmUtbmctc2RrL3NyYy9saWIvUmV1c2FibGVzL3JldXNhYmxlLWNvbXBzL2ZpbmQtaXRlbS9maW5kLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBS0wsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsV0FBVyxFQUNYLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEVBQ2IsR0FBRyxFQUNILFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpRkFBaUYsQ0FBQztBQUN0SCxPQUFPLEVBRUwsbUJBQW1CLEdBQ3BCLE1BQU0sb0VBQW9FLENBQUM7QUFRNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDekcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxt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QVM7cUJBQ1Y7OEJBa0h3QixXQUFXO3NCQUFuQyxLQUFLO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgaW5qZWN0LFxuICB2aWV3Q2hpbGQsXG4gIG91dHB1dCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtR3JvdXAsXG4gIEZvcm1zTW9kdWxlLFxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBkZWJvdW5jZVRpbWUsXG4gIGZpbHRlcixcbiAgbGFzdFZhbHVlRnJvbSxcbiAgbWFwLFxuICBzd2l0Y2hNYXAsXG4gIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVc2VyQWN0aXZpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vUmV1c2FibGVzL3JldXNhYmxlLXBhZ2VzL3VzZXItYWN0aXZpdHkvdWEtZXh0cmFzL3VzZXItYWN0aXZpdHkuc2VydmljZSc7XG5pbXBvcnQge1xuICBJVGFibGVTZWFyY2hSZXNwLFxuICBUYWJsZUh0dHBzQ29tcG9uZW50LFxufSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy90YWJsZS90YWJsZS1odHRwcy90YWJsZS1odHRwcy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgSU9iamVjdExpdGVyYWwsXG4gIElSb3dPcHRpb24sXG4gIElTdHJpY3RGb3JtR3JvdXAsXG4gIFNvcnRUeXBlLFxuICBUYWJsZUNvbCxcbn0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL21vZGVscy9pbmRleC5tb2RlbCc7XG5pbXBvcnQgeyBFVUEgfSBmcm9tICcuLi8uLi9yZXVzYWJsZS1wYWdlcy91c2VyLWFjdGl2aXR5L3VhLWV4dHJhcy91c2VyLWFjdGl2aXR5Lm1vZGVsJztcbmltcG9ydCB7IEZ1bmN0aW9uQ2FsbGVyMiwgVG9BbnlQaXBlIH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL3BpcGVzL3V0aWxpdHkucGlwZSc7XG5pbXBvcnQgeyBUYWJsZVBsYWluQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL2NvbXBvbmVudHMvdGFibGUvdGFibGUtcGxhaW4vdGFibGUtcGxhaW4uY29tcG9uZW50JztcbmltcG9ydCB7IEJ0bkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL2J0bi9idG4uY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0QmFzaWNDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy9pbnB1dC9pbnB1dC1iYXNpYy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQXV0b2NvbXBsZXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL2NvbXBvbmVudHMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy9pbnB1dC92YWxpZGF0aW9uLW1lc3NhZ2UvdmFsaWRhdGlvbi1tZXNzYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQaG9uZU51bWJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL3Bob25lLW51bWJlci9waG9uZS1udW1iZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBOZ1N3aXRjaERlZmF1bHQsIEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBMb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy9sb2FkZXIvbG9hZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBjbG9uZURlZXAsIGlzRXF1YWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnLi4vLi4vLi4vY29uZmlncy9pbmRleC5jb25maWcnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciwgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBCYXNlRm9ybUdlbmVyYXRvcixcbiAgSUJhc2VGb3JtU2NoZW1hLFxufSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy9mb3JtLWdlbmVyYXRvci9mb3JtLWdlbmVyYXRvci5iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmluZC1pdGVtLGZpbmQtaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9maW5kLWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maW5kLWl0ZW0uY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIExvYWRlckNvbXBvbmVudCxcbiAgICBOZ0lmLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIE5nRm9yLFxuICAgIE5nU3dpdGNoLFxuICAgIE5nU3dpdGNoQ2FzZSxcbiAgICBQaG9uZU51bWJlckNvbXBvbmVudCxcbiAgICBWYWxpZGF0aW9uTWVzc2FnZUNvbXBvbmVudCxcbiAgICBBdXRvY29tcGxldGVDb21wb25lbnQsXG4gICAgUm91dGVyTGluayxcbiAgICBOZ1N3aXRjaERlZmF1bHQsXG4gICAgSW5wdXRCYXNpY0NvbXBvbmVudCxcbiAgICBCdG5Db21wb25lbnQsXG4gICAgVGFibGVIdHRwc0NvbXBvbmVudCxcbiAgICBUYWJsZVBsYWluQ29tcG9uZW50LFxuICAgIEFzeW5jUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZ1bmN0aW9uQ2FsbGVyMixcbiAgICBUb0FueVBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbmRJdGVtQ29tcG9uZW50PFxuICAgIFRRdWVyeSBleHRlbmRzIElPYmplY3RMaXRlcmFsID0gYW55LFxuICAgIFRSb3cgZXh0ZW5kcyBJT2JqZWN0TGl0ZXJhbCA9IGFueSxcbiAgPlxuICBleHRlbmRzIEJhc2VGb3JtR2VuZXJhdG9yPFRRdWVyeSwgSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93Pj5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc29ydCBzY2hlbWFcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9Gb3JtYXRTY2hlbWEgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgYXV0b09yZGVyID0gaW5wdXQodHJ1ZSk7XG4gIHJlYWRvbmx5IGNlbnRlckNlbGxzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZGVidWcgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBfZGlzcGxheWVkQ29sdW1ucyA9IGlucHV0PFRhYmxlQ29sPFRSb3c+W10+KFtdLCB7IGFsaWFzOiAnZGlzcGxheWVkQ29sdW1ucycgfSk7XG4gIHJlYWRvbmx5IGRpc3BsYXllZENvbHVtbnMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMudXNlQ3VzdG9tTGFiZWxzKClcbiAgICAgID8gdGhpcy50YWJsZVNlcnZpY2UuZ2xvYmFsQ29sdW1uc0Zvcm1hdHRlcih0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zKCkpXG4gICAgICA6IHRoaXMuX2Rpc3BsYXllZENvbHVtbnMoKSxcbiAgKTtcbiAgLyoqXG4gICAqIFJvdyBncmlkIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGdyaWRDbGFzcyA9IGlucHV0KCdjb2wtbWQtNCBjb2wteHhsLTMnKTtcbiAgcmVhZG9ubHkgaGlkZUZvcm0gPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IGV4cGFuZGVkUm93VGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuICByZWFkb25seSBpc1RhYmxlUGFnaW5hdGVkID0gY29tcHV0ZWQoKCkgPT4gISF0aGlzLnNlYXJjaE9ic2VydmFibGVGdW5jKCkpO1xuICByZWFkb25seSByb3dPcHRpb25zTWFwID0gaW5wdXQ8KHJvdzogVFJvdykgPT4gKElSb3dPcHRpb248VFJvdz4gfCBudWxsKVtdPigpO1xuICByZWFkb25seSBpc0V4cGFuZGFibGUgPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBub3dyYXAgPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5IG9wdGlvbnMgPSBpbnB1dDxJUm93T3B0aW9uPFRSb3c+W10+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3Jvd09wdGlvbnMnIH0pO1xuICByZWFkb25seSBvcmRlckRpcmVjdGlvbiA9IGlucHV0PFNvcnRUeXBlPignYXNjJyk7XG4gIHJlYWRvbmx5IG9yZGVyRmllbGQgPSBpbnB1dDxrZXlvZiBUUm93PigpO1xuICByZWFkb25seSBwYWdlU2l6ZSA9IGlucHV0KDEwKTtcbiAgcmVhZG9ubHkgc2VhcmNoRnVuY3Rpb24gPSBpbnB1dDwoZGF0YTogYW55KSA9PiBPYnNlcnZhYmxlPFRSb3dbXSB8IHsgY29udGVudDogVFJvd1tdIH0+PigpO1xuICByZWFkb25seSBzaG93RGF0YSA9IGlucHV0KHRydWUpO1xuICByZWFkb25seSBzZWFyY2hJZk5vUXVlcnkgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0V4cG9ydCA9IGlucHV0KHRydWUpO1xuICByZWFkb25seSBzaG93RmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBzaG93UmVmcmVzaEJ0biA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHN0YXJ0U2VjdGlvblRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8SFRNTEVsZW1lbnQ+PigpO1xuICBmb3JtOiBGb3JtR3JvdXA7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNwZWNpZnkgaWYgdGhlIHNlYXJjaCBidXR0b24gc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICByZWFkb25seSBzaG93U2VhcmNoQnRuID0gaW5wdXQodHJ1ZSk7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNwZWNpZnkgaWYgdGhlIGNsZWFyIGZvcm0gYnV0dG9uIHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd0NsZWFyQnRuID0gaW5wdXQodHJ1ZSk7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNwZWNpZnkgaWYgdmFsaWRhdGlvbiBtZXNzYWdlcyBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHJlYWRvbmx5IHNob3dWYWxpZGF0aW9uTXNnID0gaW5wdXQodHJ1ZSk7XG4gIHJlYWRvbmx5IGNyZWF0ZUJ0blJvdXRlID0gaW5wdXQoJy4uL2NyZWF0ZScpO1xuICAvKipcbiAgICogVXNlZCB0byBzcGVjaWZ5IGlmIHNob3cgYWRkaXRpb25hbCBjb2x1bW4gYnV0dG9uIHdpaWwgYmUgZGlzcGxheWVkIG9yIG5vdC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dBZGRpdGlvbmFsQ29sdW1ucyA9IGlucHV0KHRydWUpO1xuICByZWFkb25seSBzbWFsbGVyRm9udHMgPSBpbnB1dChmYWxzZSk7XG4gIC8qKiBVc2UgY2hlY2tib3hlcyAqL1xuICByZWFkb25seSB1c2VTZWxlY3Rpb24gPSBpbnB1dChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgX3Jvd0NsaWNrID0gb3V0cHV0KHsgYWxpYXM6ICdyb3dDbGljaycgfSk7XG4gIHJlYWRvbmx5IGNsaWNrZWRDcmVhdGUgPSBvdXRwdXQoKTtcbiAgcmVhZG9ubHkgdGFibGVIVFRQU1JFRiA9IHZpZXdDaGlsZChUYWJsZUh0dHBzQ29tcG9uZW50PFRSb3c+KTtcbiAgcmVhZG9ubHkgdGFibGVQbGFpblJlZiA9IHZpZXdDaGlsZChUYWJsZVBsYWluQ29tcG9uZW50PFRSb3c+KTtcbiAgcmVhZG9ubHkgdGFibGVIVFRQU1JFRlNpZ25hbCA9IHZpZXdDaGlsZDxUYWJsZUh0dHBzQ29tcG9uZW50PFRSb3c+PihUYWJsZUh0dHBzQ29tcG9uZW50KTtcbiAgcmVhZG9ubHkgdGFibGVQbGFpblJlZlNpZ25hbCA9IHZpZXdDaGlsZDxUYWJsZVBsYWluQ29tcG9uZW50PFRSb3c+PihUYWJsZVBsYWluQ29tcG9uZW50KTtcbiAgcmVhZG9ubHkgZGF0YSA9IHNpZ25hbDxUUm93W10+KFtdKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9sb2FkaW5nID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IGNvbXB1dGVkPGJvb2xlYW4+KFxuICAgICgpID0+IHRoaXMuX2xvYWRpbmcoKSB8fCB0aGlzLnRhYmxlSFRUUFNSRUZTaWduYWwoKT8uaXNMb2FkaW5nUmVzdWx0cygpLFxuICApO1xuICByZWFkb25seSBzZWFyY2hGb3JtID0gY29tcHV0ZWQ8Rm9ybUdyb3VwPigoKSA9PiB7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pLFxuICAgICAgc2NoZW1hID0gdGhpcy5mb3JtU2NoZW1hKCk7XG4gICAgc2NoZW1hXG4gICAgICAuZmlsdGVyKCh4KSA9PiAheC5zdGFuZGFsb25lKVxuICAgICAgLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgaWYgKHMub25DaGFuZ2VGdW5jKSB7XG4gICAgICAgICAgY29uc3Qgc3ViID0gZm9ybS5jb250cm9sc1tzLmZpZWxkLnRvU3RyaW5nKCldPy52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgwKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHIpID0+IHMub25DaGFuZ2VGdW5jKGZvcm0uZ2V0UmF3VmFsdWUoKSwgciwgdGhpcykpO1xuICAgICAgICAgIHRoaXMuc3Vic1tzLmZpZWxkIGFzIHN0cmluZ10gPSBzdWI7XG4gICAgICAgIH1cbiAgICAgICAgZm9ybS5yZWdpc3RlckNvbnRyb2woXG4gICAgICAgICAgcy5maWVsZC50b1N0cmluZygpLFxuICAgICAgICAgIG5ldyBGb3JtQ29udHJvbChzLnZhbHVlLCBzLnZhbGlkYXRvcnMsIHMuYXN5bmNWYWxpZGF0b3JzKSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmb3JtO1xuICB9KTtcbiAgcmVhZG9ubHkgc3RhbmRhbG9uZUZvcm0gPSBjb21wdXRlZDxGb3JtR3JvdXA+KCgpID0+IHtcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSksXG4gICAgICBzY2hlbWEgPSB0aGlzLmZvcm1TY2hlbWEoKTtcbiAgICBzY2hlbWFcbiAgICAgIC5maWx0ZXIoKHgpID0+ICEheC5zdGFuZGFsb25lKVxuICAgICAgLmZvckVhY2goKHMpID0+XG4gICAgICAgIGZvcm0ucmVnaXN0ZXJDb250cm9sKFxuICAgICAgICAgIHMuZmllbGQudG9TdHJpbmcoKSxcbiAgICAgICAgICBuZXcgRm9ybUNvbnRyb2wocy52YWx1ZSwgcy52YWxpZGF0b3JzLCBzLmFzeW5jVmFsaWRhdG9ycyksXG4gICAgICAgICksXG4gICAgICApO1xuICAgIHJldHVybiBmb3JtO1xuICB9KTtcbiAgLyoqXG4gICAqIFVzZWQgdG8gc3BlY2lmeSBpZiBzaG93IGNyZWF0ZSBidXR0b24gaXMgbmVlZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlQnV0dG9uID0gaW5wdXQoZmFsc2UpO1xuXG4gIEBJbnB1dCgnZm9ybVNjaGVtYScpIHNldCBfZm9ybVNjaGVtYSh2OiBJU2VhcmNoRm9ybVNjaGVtYTxUUXVlcnksIFRSb3c+W10pIHtcbiAgICB0aGlzLmluaXQoY2xvbmVEZWVwKHY/LmZpbHRlcigoeCkgPT4geCkpKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlYXJjaE9ic2VydmFibGVGdW5jID0gaW5wdXQ8KGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxJVGFibGVTZWFyY2hSZXNwPFRSb3c+Pj4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlbGltaXRlckZpZWxkID0gJ35+fic7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWxpbWl0ZXJXb3JkID0gJ35+JztcbiAgcmVhZG9ubHkgc2VhcmNoVHJpZ2dlciA9IG5ldyBTdWJqZWN0PElPYmplY3RMaXRlcmFsPigpO1xuXG4gIHJlYWRvbmx5IGNvbXB1dGVkRm9ybVNjaGVtYSA9IGNvbXB1dGVkPElTZWFyY2hGb3JtU2NoZW1hPFRRdWVyeSwgVFJvdz5bXT4oXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZm9ybVNjaGVtYSA9IHRoaXMuZm9ybVNjaGVtYSgpIHx8IFtdLFxuICAgICAgICBzdGFuZGFsb25lRm9ybSA9IHRoaXMuc3RhbmRhbG9uZUZvcm0oKSxcbiAgICAgICAgc2VhcmNoRm9ybSA9IHRoaXMuc2VhcmNoRm9ybSgpO1xuXG4gICAgICByZXR1cm4gZm9ybVNjaGVtYVxuICAgICAgICAuZmlsdGVyKCh4KSA9PiAheC5oaWRkZW4pXG4gICAgICAgIC5tYXAoKHNjaGVtZSkgPT4ge1xuICAgICAgICAgIHNjaGVtZS5mb3JtID0gc2NoZW1lLnN0YW5kYWxvbmUgPyBzdGFuZGFsb25lRm9ybSA6IHNlYXJjaEZvcm07XG4gICAgICAgICAgcmV0dXJuIHNjaGVtZTtcbiAgICAgICAgfSk7XG4gICAgfSxcbiAgICB7IGVxdWFsOiBpc0VxdWFsIH0sXG4gICk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhc0NvbHVtbnMgPSBjb21wdXRlZDxib29sZWFuPigoKSA9PiAhIXRoaXMuZGlzcGxheWVkQ29sdW1ucygpPy5sZW5ndGgpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoaWRlVGFibGUgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiAhdGhpcy5zaG93RGF0YSgpIHx8ICghdGhpcy5kYXRhKCkgJiYgIXRoaXMuaXNUYWJsZVBhZ2luYXRlZCgpKSxcbiAgKTtcblxuICBwdWJsaWMgdWFTID0gaW5qZWN0KFVzZXJBY3Rpdml0eVNlcnZpY2UpO1xuICBwdWJsaWMgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHB1YmxpYyByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN1YnMyID0gdGhpcy51dGlsaXR5U2VydmljZS5jcmVhdGVTdWJzY3JpcHRpb25NYW5hZ2VyKCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gIHRoaXMuZmV0Y2hTYXZlZFF1ZXJ5KClcbiAgICBsZXQgYWxsb3dJbW1lZGlhdGVTZWFyY2ggPSBmYWxzZTtcbiAgICB0aGlzLnN1YnMyLmNsZWFyKCk7XG4gICAgdGhpcy5zdWJzMi5wdXNoKFxuICAgICAgdGhpcy5zZWFyY2hUcmlnZ2VyXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kZWJ1ZygpKSBkZWJ1Z2dlcjtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIWFsbG93SW1tZWRpYXRlU2VhcmNoKSxcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgYWxsb3dJbW1lZGlhdGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgc3dpdGNoTWFwKChyKSA9PiB0aGlzLl9zZWFyY2goKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocikgPT4ge1xuICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICB9KSxcbiAgICAgIHRoaXMuc2VhcmNoVHJpZ2dlclxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcoKSkgZGVidWdnZXI7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgZmlsdGVyKCgpID0+IGFsbG93SW1tZWRpYXRlU2VhcmNoKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKHIpID0+IHRoaXMuX3NlYXJjaCgpKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChyKSA9PiB7XG4gICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBvbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzMj8uY2xlYXIoKTtcbiAgICByZXR1cm4gc3VwZXIub25EZXN0cm95KCk7XG4gIH1cblxuICBmZXRjaFNhdmVkUXVlcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZXZRdWVyeVN0cmluZyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3EnKTtcbiAgICAgIGlmIChwcmV2UXVlcnlTdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJldlF1ZXJ5OiB7IFtmOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBwcmV2UXVlcnlTdHJpbmcuc3BsaXQodGhpcy5kZWxpbWl0ZXJGaWVsZCk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZiA9IGZpZWxkLnNwbGl0KHRoaXMuZGVsaW1pdGVyV29yZCk7XG4gICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgaWYgKGZbMV0gPT0gbnVsbCB8fCBmWzFdID09ICdudWxsJykgY29udGludWU7XG4gICAgICAgICAgcHJldlF1ZXJ5W2ZbMF1dID0gZlsxXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0oKT8ucGF0Y2hWYWx1ZShwcmV2UXVlcnkpO1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhwcmV2UXVlcnkpLnNvbWUoKHgpID0+IHggIT0gbnVsbCkpIHRoaXMuc2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBpbml0KHNjaGVtYTogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PltdKSB7XG4gICAgaWYgKCFzY2hlbWE/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoc2NoZW1hKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZGVidWdnZXI7XG4gICAgdGhpcy5oYW5kbGVBbGxTY2hlbWEoc2NoZW1hKTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiB0aGlzLmZvcm1TY2hlbWEoKSkgdGhpcy5oYW5kbGVGb3JtU2NoZW1lKHNjaGVtZSk7XG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgdGhpcy5mb3JtU2NoZW1hKCkpXG4gICAgICBpZiAoc2NoZW1lLnRyaWdnZXJPbkNoYW5nZU9uSW5pdClcbiAgICAgICAgc2NoZW1lLm9uQ2hhbmdlRnVuYyh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSwgdGhpcy5mb3JtLmdldFJhd1ZhbHVlKClbc2NoZW1lLmZpZWxkXSwgdGhpcyk7XG4gIH1cblxuICBoYW5kbGVBbGxTY2hlbWEoc2NoZW1hOiBJU2VhcmNoRm9ybVNjaGVtYTxUUXVlcnksIFRSb3c+W10pIHtcbiAgICBzY2hlbWEuZm9yRWFjaCgoeCkgPT4gKHgudHlwZSA9IHgudHlwZSB8fCAndGV4dCcpKTtcbiAgICBpZiAodGhpcy5hdXRvRm9ybWF0U2NoZW1hKCkgfHwgdGhpcy5hdXRvT3JkZXIoKSkge1xuICAgICAgaWYgKHRoaXMuYXV0b0Zvcm1hdFNjaGVtYSgpKSB7XG4gICAgICAgIHNjaGVtYVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHgudHlwZSA9PSAnc2VsZWN0JylcbiAgICAgICAgICAuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHgub3B0aW9ucz8ubGVuZ3RoID4gNSB8fCAheC5vcHRpb25zKSB4LnR5cGUgPSAnYXV0b2NvbXBsZXRlJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgc2NoZW1hXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4geC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICAgICAgLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgICAgIHgudHlwZSA9ICdzZWxlY3QnO1xuICAgICAgICAgICAgeC5vcHRpb25zID0gQ29uZmlnLmJvb2xMaXN0O1xuICAgICAgICAgICAgeC5sYWJlbEZpZWxkID0gJ3RpdGxlJztcbiAgICAgICAgICAgIHgudmFsdWVGaWVsZCA9ICdjb2RlJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmF1dG9PcmRlcigpKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYS5zb3J0MignbGFiZWwnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoW1xuICAgICAgICAgIC4uLnNjaGVtYT8uZmlsdGVyKCh4KSA9PiB4LmFjdGlvbiAmJiB4LnR5cGUgIT0gJ2NoZWNrYm94JyksXG4gICAgICAgICAgLi4uc2NoZW1hPy5maWx0ZXIoKHgpID0+ICF4LmFjdGlvbiAmJiB4LnR5cGUgIT0gJ2NoZWNrYm94JyksXG4gICAgICAgICAgLi4uc2NoZW1hPy5maWx0ZXIoKHgpID0+IHgudHlwZSA9PSAnY2hlY2tib3gnKSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHRoaXMuX3NldEZvcm1TY2hlbWFzKHNjaGVtYSk7XG4gIH1cblxuICBoYW5kbGVGb3JtU2NoZW1lKHNjaGVtZTogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93Pikge1xuICAgIHNjaGVtZS5pZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2VuZXJhdGVVVUlEKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtU2NoZW1hKHNjaGVtZS5maWVsZCwgc2NoZW1lKTtcblxuICAgIGlmIChzY2hlbWUub3B0aW9uc0luaXRGdW5jKVxuICAgICAgc2NoZW1lLm9wdGlvbnNJbml0RnVuYy5zdWJzY3JpYmUoKHIpID0+IHtcbiAgICAgICAgc2NoZW1lLm9wdGlvbnMgPSByO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TY2hlbWEoc2NoZW1lLmZpZWxkLCB7IG9wdGlvbnM6IHIgfSk7XG4gICAgICAgIC8vIHRoaXMub3B0aW9uc01hcFtzY2hlbWUuZmllbGRdID0gcjtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHNjaGVtZS5vcHRpb25zSW5pdEZ1bmMyKVxuICAgICAgc2NoZW1lLm9wdGlvbnNJbml0RnVuYzIoKS5zdWJzY3JpYmUoKHIpID0+IHtcbiAgICAgICAgc2NoZW1lLm9wdGlvbnMgPSByO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TY2hlbWEoc2NoZW1lLmZpZWxkLCB7IG9wdGlvbnM6IHIgfSk7XG4gICAgICAgIC8vIHRoaXMub3B0aW9uc01hcFtzY2hlbWUuZmllbGRdID0gcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRm9ybVNjaGVtYShcbiAgICBmaWVsZE5hbWU6IGtleW9mIFRRdWVyeSxcbiAgICBzY2hlbWU6IFBhcnRpYWw8SVNlYXJjaEZvcm1TY2hlbWE8eyBbayBpbiBrZXlvZiBUUXVlcnldOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+IHwgYW55IH0+PixcbiAgKSB7XG4gICAgcmV0dXJuIHN1cGVyLl91cGRhdGVGb3JtU2NoZW1hKGZpZWxkTmFtZSBhcyBzdHJpbmcsIHNjaGVtZSk7XG4gIH1cblxuICB1cGRhdGVBbGxGb3JtU2NoZW1hKFxuICAgIG1hcDogKGZvcm1GaWVsZDogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PikgPT4gSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PixcbiAgKSB7XG4gICAgcmV0dXJuIHN1cGVyLl91cGRhdGVBbGxGb3JtU2NoZW1hKG1hcCk7XG4gIH1cblxuICBkZXRhY2hGb3JtU2NoZW1lKGZpZWxkTmFtZT86IGtleW9mIFRRdWVyeSkge1xuICAgIHRoaXMuc3Vic1tmaWVsZE5hbWUgYXMgc3RyaW5nXT8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlYXJjaEZvcm1WYWx1ZSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnNlYXJjaEZvcm0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGZvcm0pID0+XG4gICAgICAgIGZvcm0/LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmRlbGV0ZU51bGwodGhpcy5zZWFyY2hGb3JtKCk/LmdldFJhd1ZhbHVlKCkpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcbiAgcmVhZG9ubHkgc3RhbmRhbG9uZUZvcm1WYWx1ZSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnN0YW5kYWxvbmVGb3JtKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChmb3JtKSA9PlxuICAgICAgICBmb3JtPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy51dGlsaXR5U2VydmljZS5kZWxldGVOdWxsKHRoaXMuc3RhbmRhbG9uZUZvcm0oKT8uZ2V0UmF3VmFsdWUoKSkpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuICByZWFkb25seSBhbGxTZWFyY2hGb3JtVmFsdWUgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIC4uLnRoaXMuc2VhcmNoRm9ybVZhbHVlKCksXG4gICAgLi4udGhpcy5zdGFuZGFsb25lRm9ybVZhbHVlKCksXG4gIH0pKTtcblxuICB0cmFja0J5Um93SUQgPSAoaW5kZXgsIGl0ZW0pID0+IHtcbiAgICByZXR1cm4gaXRlbT8udmFsdWU/Ll9fcm93SUQ7XG4gIH07XG5cbiAgY2xlYXJGaWx0ZXJzKCkge1xuICAgIHRoaXMuc2VhcmNoRm9ybSgpPy5yZXNldCgpO1xuICAgIHRoaXMuc2VhcmNoKCk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNlYXJjaCgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZygpKSBkZWJ1Z2dlcjtcbiAgICB0aGlzLnNlYXJjaFRyaWdnZXIubmV4dCh0aGlzLnNlYXJjaEZvcm0oKS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIGZpZWxkQWN0aW9uKGZpZWxkOiBJU2VhcmNoRm9ybVNjaGVtYSkge1xuICAgIGxldCBmb3JtOiBGb3JtR3JvdXA7XG4gICAgaWYgKGZpZWxkLnN0YW5kYWxvbmUgJiYgZmllbGQuYWN0aW9uKSBmb3JtID0gdGhpcy5zdGFuZGFsb25lRm9ybSgpO1xuICAgIGVsc2UgaWYgKGZpZWxkLmFjdGlvbiAmJiAhZmllbGQuc3RhbmRhbG9uZSkgZm9ybSA9IHRoaXMuc2VhcmNoRm9ybSgpO1xuICAgIGVsc2UgcmV0dXJuO1xuICAgIGlmIChmb3JtLmNvbnRyb2xzW2ZpZWxkLmZpZWxkIGFzIGFueV0udmFsaWQpXG4gICAgICBmaWVsZC5hY3Rpb24odGhpcy5hbGxTZWFyY2hGb3JtVmFsdWUoKSwgdGhpcy5hbGxTZWFyY2hGb3JtVmFsdWUoKVtmaWVsZC5maWVsZF0sIGZvcm0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9zZWFyY2goKSB7XG4gICAgLy8gZGVidWdnZXI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKCkpIGRlYnVnZ2VyO1xuICAgICAgaWYgKCF0aGlzLnNlYXJjaEZvcm0oKSkgcmV0dXJuO1xuICAgICAgY29uc3QgcmVxID0gdGhpcy51dGlsaXR5U2VydmljZS5kZWxldGVOdWxsKGNsb25lRGVlcCh0aGlzLnNlYXJjaEZvcm0oKT8uZ2V0UmF3VmFsdWUoKSkpO1xuICAgICAgLy8gZGVidWdnZXI7XG4gICAgICBpZiAodGhpcy5pc1RhYmxlUGFnaW5hdGVkKCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEoKSkgdGhpcy5fbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoW10pO1xuICAgICAgICB0aGlzLnRhYmxlSFRUUFNSRUYoKT8uc2VhcmNoKHJlcSk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hGdW5jdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGdW5jdGlvbigpKHtcbiAgICAgICAgICAgICAgLi4ucmVxLFxuICAgICAgICAgICAgICBzb3J0Qnk6IHRoaXMub3JkZXJGaWVsZCgpIHx8ICdjcmVhdGVkT24nLFxuICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiB0aGlzLm9yZGVyRGlyZWN0aW9uKCk/LnRvVXBwZXJDYXNlKCkgfHwgJ0RFU0MnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGE/LlsnY29udGVudCddIHx8IGRhdGEpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudWFTLmFkZCh7XG4gICAgICAgIGNvZGU6IEVVQS5zZWFyY2hlZCxcbiAgICAgICAgYWN0aXZpdHlEZXNjcmlwdGlvbjogdGhpcy5sYWJlbCgpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkocmVxKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cblxuICBzYXZlUXVlcnkocXVlcnkgPSB0aGlzLnNlYXJjaEZvcm1WYWx1ZSgpKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIHE6IE9iamVjdC5rZXlzKHF1ZXJ5KVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHF1ZXJ5W3hdICE9IG51bGwpXG4gICAgICAgICAgLm1hcCgoaykgPT4gYCR7a30ke3RoaXMuZGVsaW1pdGVyV29yZH0ke3F1ZXJ5W2tdfWApXG4gICAgICAgICAgLmpvaW4odGhpcy5kZWxpbWl0ZXJGaWVsZCksXG4gICAgICB9LFxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgIH0pO1xuICB9XG4gIHJvd0NsaWNrKGUpIHtcbiAgICB0aGlzLl9yb3dDbGljay5lbWl0KGUpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUhUVFBTUkVGKCk/LnNlbGVjdGVkSXRlbXMgfHwgdGhpcy50YWJsZVBsYWluUmVmKCk/LnNlbGVjdGVkSXRlbXM7XG4gIH1cbiAgcmVhZG9ubHkgc2VsZWN0aW9uU2lnbmFsID0gY29tcHV0ZWQ8VFJvd1tdPigoKSA9PiB7XG4gICAgY29uc3QgdGggPSB0aGlzLnRhYmxlSFRUUFNSRUZTaWduYWwoKT8uc2VsZWN0ZWRJdGVtc1NpZ25hbCgpLFxuICAgICAgdHAgPSB0aGlzLnRhYmxlUGxhaW5SZWZTaWduYWwoKT8uc2VsZWN0ZWRJdGVtc1NpZ25hbCgpO1xuICAgIHJldHVybiB0aCB8fCB0cDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNBbnlTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0aCA9IHRoaXMudGFibGVIVFRQU1JFRlNpZ25hbCgpPy5pc0FueVNlbGVjdGVkKCksXG4gICAgICB0cCA9IHRoaXMudGFibGVQbGFpblJlZlNpZ25hbCgpPy5pc0FueVNlbGVjdGVkKCk7XG4gICAgcmV0dXJuIHRoIHx8IHRwO1xuICB9KTtcblxuICBzdGFydExvYWRlcigpIHtcbiAgICB0aGlzLl9sb2FkaW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIHN0b3BMb2FkZXIoKSB7XG4gICAgdGhpcy5fbG9hZGluZy5zZXQoZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaEZvcm1TY2hlbWE8XG4gIFRRdWVyeSBleHRlbmRzIElPYmplY3RMaXRlcmFsID0gYW55LFxuICBUUm93IGV4dGVuZHMgSU9iamVjdExpdGVyYWwgPSBhbnksXG4+IGV4dGVuZHMgSUJhc2VGb3JtU2NoZW1hPFxuICAgIFRRdWVyeSxcbiAgICBGaW5kSXRlbUNvbXBvbmVudDxUUXVlcnksIFRSb3c+LFxuICAgIHtcbiAgICAgIFtLIGluIGtleW9mIFRRdWVyeV06IEFic3RyYWN0Q29udHJvbDxhbnksIGFueT47XG4gICAgfVxuICA+IHtcbiAgc3RhbmRhbG9uZT86IGJvb2xlYW47XG4gIGFjdGlvbj86IChyb3c6IFRSb3csIGNlbGw6IGFueSwgZm9ybT86IEZvcm1Hcm91cDxJU3RyaWN0Rm9ybUdyb3VwPFRRdWVyeT4+KSA9PiBhbnk7XG59XG4iLCI8bG9hZGVyIFtsb2FkaW5nXT1cIl9sb2FkaW5nKClcIj5cbiAgQGlmICghaGlkZUZvcm0oKSAmJiBzZWFyY2hGb3JtKCkpIHtcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwic2VhcmNoKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIEBmb3IgKHNjaGVtZSBvZiBjb21wdXRlZEZvcm1TY2hlbWEoKTsgdHJhY2sgc2NoZW1lLmZpZWxkKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInt7IGdyaWRDbGFzcygpIH19IFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SW5wVGVtcGw+XG4gICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpY1xuICAgICAgICAgICAgICAgICAgI2Zvcm1GaWVsZFxuICAgICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInNjaGVtZS5mb3JtXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cInNjaGVtZS50eXBlXCJcbiAgICAgICAgICAgICAgICAgIFthdXRvUGlja1ZhbHVlRmllbGRdPVwic2NoZW1lLmF1dG9QaWNrVmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxUeXBlXT1cInNjaGVtZS5sYWJlbFR5cGUgfCB0b0FueVwiXG4gICAgICAgICAgICAgICAgICBbY2hlY2tlZFNpZ25hbF09XCJzY2hlbWUuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25dPVwiZm9ybUZpZWxkLmhhc1ZhbHVlKCkgJiYgISFzY2hlbWUuYXN5bmNWYWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93VmFsaWRhdGlvbkljb25dPVwiZm9ybUZpZWxkLmhhc1ZhbHVlKCkgJiYgISFzY2hlbWUuYXN5bmNWYWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAgIFtub0Zvcm1hdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgIFtvcHRpb25Gb3JtYXR0ZXJdPVwic2NoZW1lLm9wdGlvbkZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzY2hlbWUub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICBbZGVjaW1hbFBvaW50c109XCJzY2hlbWUuZGVjaW1hbFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICBbaGludF09XCJzY2hlbWUuaGludFwiXG4gICAgICAgICAgICAgICAgICBbbWF4XT1cInNjaGVtZS5tYXhcIlxuICAgICAgICAgICAgICAgICAgW21pbl09XCJzY2hlbWUubWluXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzY2hlbWUucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNjaGVtZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgIHNjaGVtZS5kaXNhYmxlZElmIHwgZnVuY3Rpb25DYWxsZXIyOiBzZWFyY2hGb3JtVmFsdWUgOiAoc2NoZW1lLmZpZWxkIHwgdG9BbnkpXG4gICAgICAgICAgICAgICAgICBcIiAvPlxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgIEBzd2l0Y2ggKHRydWUpIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoc2NoZW1lLnR5cGUgPT0gJ3RlbCcpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1waG9uZS1udW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJzY2hlbWUuZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNjaGVtZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25dPVwic2NoZW1lLnNob3dWYWxpZGF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cInNjaGVtZS5zaG93VmFsaWRhdGlvbkljb25cIlxuICAgICAgICAgICAgICAgICAgICAgIFtjb3VudHJ5Q29kZTNdPVwic2NoZW1lLmNvdW50cnlDb2RlM1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmRpc2FibGVkSWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbkNhbGxlcjI6IHNlYXJjaEZvcm1WYWx1ZSgpIDogKHNjaGVtZS5maWVsZCB8IHRvQW55KVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgI2lucHV0VGFnIC8+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1ZhbGlkYXRpb25Nc2coKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdmFsaWRhdGlvbi1tZXNzYWdlIFtpbnB1dF09XCJpbnB1dFRhZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoc2NoZW1lLnR5cGUgPT0gJ2F1dG9jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJzY2hlbWUuZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNjaGVtZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsRmllbGRdPVwic2NoZW1lLmxhYmVsRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGlja1ZhbHVlRmllbGRdPVwic2NoZW1lLmF1dG9QaWNrVmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zRnVuY109XCJzY2hlbWUub3B0aW9uc0Z1bmNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNjaGVtZS5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkZvcm1hdHRlcl09XCJzY2hlbWUub3B0aW9uRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwic2NoZW1lLm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoaW50XT1cInNjaGVtZS5oaW50XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZGlzYWJsZWRJZlxuICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uQ2FsbGVyMjogc2VhcmNoRm9ybVZhbHVlIDogKHNjaGVtZS5maWVsZCB8IHRvQW55KVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgI2lucHV0VGFnIC8+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1ZhbGlkYXRpb25Nc2coKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxhcHAtdmFsaWRhdGlvbi1tZXNzYWdlIFtpbnB1dF09XCJpbnB1dFRhZ1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoc2NoZW1lLnN0YW5kYWxvbmUgfHwgc2NoZW1lLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwiZmllbGRBY3Rpb24oc2NoZW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJneC0yIHJvdyBhbGlnbi1pdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmb3JtRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInNjaGVtZS5mb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJzY2hlbWUudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9QaWNrVmFsdWVGaWVsZF09XCJzY2hlbWUuYXV0b1BpY2tWYWx1ZUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkU2lnbmFsXT1cInNjaGVtZS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25dPVwiZm9ybUZpZWxkLmhhc1ZhbHVlKCkgJiYgISFzY2hlbWUuYXN5bmNWYWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25vRm9ybWF0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uRm9ybWF0dGVyXT1cInNjaGVtZS5vcHRpb25Gb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVtZS5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGVjaW1hbFBvaW50c109XCJzY2hlbWUuZGVjaW1hbFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hpbnRdPVwic2NoZW1lLmhpbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwic2NoZW1lLm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJzY2hlbWUubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2NoZW1lLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2NoZW1lLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZGlzYWJsZWRJZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uQ2FsbGVyMjogc2VhcmNoRm9ybVZhbHVlIDogKHNjaGVtZS5maWVsZCB8IHRvQW55KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWJ0blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInNjaGVtZS5pY29uIHx8ICdzaG93J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dyb3VwXT1cInNjaGVtZS5zdGFuZGFsb25lICYmIHNjaGVtZS5hY3Rpb24gPyAnc2hvdycgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25UeXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWZvcm1GaWVsZD8udmFsaWRTaWduYWwoKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dWYWxpZGF0aW9uTXNnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGFwcC12YWxpZGF0aW9uLW1lc3NhZ2UgW2lucHV0XT1cImZvcm1GaWVsZFwiIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGFwcC1pbnB1dC1iYXNpY1xuICAgICAgICAgICAgICAgICAgICAgICNmb3JtRmllbGRcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtmb3JtXT1cInNjaGVtZS5mb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJzY2hlbWUudHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F1dG9QaWNrVmFsdWVGaWVsZF09XCJzY2hlbWUuYXV0b1BpY2tWYWx1ZUZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVGaWVsZF09XCJzY2hlbWUudmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkU2lnbmFsXT1cInNjaGVtZS5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25dPVwiZm9ybUZpZWxkLmhhc1ZhbHVlKCkgJiYgISFzY2hlbWUuYXN5bmNWYWxpZGF0b3JzXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25vRm9ybWF0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uRm9ybWF0dGVyXT1cInNjaGVtZS5vcHRpb25Gb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVtZS5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVjaW1hbFBvaW50c109XCJzY2hlbWUuZGVjaW1hbFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2hpbnRdPVwic2NoZW1lLmhpbnRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93VmFsaWRhdGlvbk1zZ109XCJzaG93VmFsaWRhdGlvbk1zZygpXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cInNjaGVtZS5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwic2NoZW1lLm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNjaGVtZS5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNjaGVtZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmRpc2FibGVkSWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbkNhbGxlcjI6IHNlYXJjaEZvcm1WYWx1ZSA6IChzY2hlbWUuZmllbGQgfCB0b0FueSlcbiAgICAgICAgICAgICAgICAgICAgICBcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kIGp1c3RpZnktY29udGVudC1lbmQgZC1mbGV4XCI+XG4gICAgICAgICAgQGlmIChzaG93Q2xlYXJCdG4oKSkge1xuICAgICAgICAgICAgPGFwcC1idG4gdHlwZT1cImRhbmdlci1vdXRsaW5lXCIgdGV4dD1cIkNsZWFyXCIgaWNvbj1cImRlbGV0ZVwiIChtY2xpY2spPVwiY2xlYXJGaWx0ZXJzKClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTFcIj48L3NwYW4+XG4gICAgICAgICAgQGlmIChzaG93U2VhcmNoQnRuKCkpIHtcbiAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgIFtncm91cF09XCInc2VhcmNoJ1wiXG4gICAgICAgICAgICAgIFtpY29uQnRuXT1cInRydWVcIlxuICAgICAgICAgICAgICB0ZXh0PVwiU2VhcmNoXCJcbiAgICAgICAgICAgICAgYWN0aW9uVHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgIFtleGNsdWRlTG9nZ2luZ109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzZWFyY2hGdW5jdGlvbigpICYmICFpc1RhYmxlUGFnaW5hdGVkKClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKGNyZWF0ZUJ1dHRvbigpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTFcIj48L3NwYW4+XG4gICAgICAgICAgICBAaWYgKGNyZWF0ZUJ0blJvdXRlKCkpIHtcbiAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICB0eXBlPVwib3V0bGluZVwiXG4gICAgICAgICAgICAgICAgdGV4dD1cIkNyZWF0ZVwiXG4gICAgICAgICAgICAgICAgaWNvbj1cImFkZFwiXG4gICAgICAgICAgICAgICAgKG1jbGljayk9XCJjbGlja2VkQ3JlYXRlLmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgcm91dGVyTGluaz1cInt7IGNyZWF0ZUJ0blJvdXRlKCkgfX1cIiAvPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxhcHAtYnRuIHR5cGU9XCJvdXRsaW5lXCIgdGV4dD1cIkNyZWF0ZVwiIGljb249XCJhZGRcIiAobWNsaWNrKT1cImNsaWNrZWRDcmVhdGUuZW1pdCgpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICB9XG5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3RhYmxlUGFuZWxdXCI+PC9uZy1jb250ZW50PlxuXG4gIEBpZiAoaGFzQ29sdW1ucygpKSB7XG4gICAgPGRpdiBjbGFzcz1cIm10LTNcIiBbaGlkZGVuXT1cImhpZGVUYWJsZSgpXCI+XG4gICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICBAaWYgKGlzVGFibGVQYWdpbmF0ZWQoKSkge1xuICAgICAgICAgIDx0YWJsZS1odHRwc1xuICAgICAgICAgICAgI3RhYmxlSFRUUFNcbiAgICAgICAgICAgIFtzZWFyY2hJZk5vUXVlcnldPVwic2VhcmNoSWZOb1F1ZXJ5KClcIlxuICAgICAgICAgICAgW2Rpc3BsYXllZENvbHVtbnNdPVwiZGlzcGxheWVkQ29sdW1ucygpXCJcbiAgICAgICAgICAgIFtvYnNlcnZhYmxlRnVuY109XCJzZWFyY2hPYnNlcnZhYmxlRnVuYygpXCJcbiAgICAgICAgICAgIChyb3dDbGljayk9XCJyb3dDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgIFtjZW50ZXJDZWxsc109XCJjZW50ZXJDZWxscygpXCJcbiAgICAgICAgICAgIFtleHBhbmRlZFJvd1RlbXBsYXRlXT1cImV4cGFuZGVkUm93VGVtcGxhdGUoKVwiXG4gICAgICAgICAgICBbaXNFeHBhbmRhYmxlXT1cImlzRXhwYW5kYWJsZSgpXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbCgpXCJcbiAgICAgICAgICAgIFtub3dyYXBdPVwibm93cmFwKClcIlxuICAgICAgICAgICAgW29yZGVyRGlyZWN0aW9uXT1cIm9yZGVyRGlyZWN0aW9uKClcIlxuICAgICAgICAgICAgW29yZGVyRmllbGRdPVwib3JkZXJGaWVsZCgpXCJcbiAgICAgICAgICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZSgpXCJcbiAgICAgICAgICAgIFtyb3dPcHRpb25zXT1cIm9wdGlvbnMoKVwiXG4gICAgICAgICAgICBbZGVidWddPVwiZGVidWcoKVwiXG4gICAgICAgICAgICBbcm93T3B0aW9uc01hcF09XCJyb3dPcHRpb25zTWFwKClcIlxuICAgICAgICAgICAgW3Nob3dBZGRpdGlvbmFsQ29sdW1uc109XCJzaG93QWRkaXRpb25hbENvbHVtbnMoKVwiXG4gICAgICAgICAgICBbc2hvd0V4cG9ydF09XCJzaG93RXhwb3J0KClcIlxuICAgICAgICAgICAgW3Nob3dSZWZyZXNoQnRuXT1cInNob3dSZWZyZXNoQnRuKClcIlxuICAgICAgICAgICAgW3NtYWxsZXJGb250c109XCJzbWFsbGVyRm9udHMoKVwiXG4gICAgICAgICAgICBbc3RhcnRTZWN0aW9uVGVtcGxhdGVdPVwic3RhcnRTZWN0aW9uVGVtcGxhdGUoKVwiXG4gICAgICAgICAgICBbdXNlU2VsZWN0aW9uXT1cInVzZVNlbGVjdGlvbigpXCJcbiAgICAgICAgICAgIG5vSXRlbVR4dD1cIk5vIHJlc3VsdHMgZm91bmRcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8dGFibGUtcGxhaW5cbiAgICAgICAgICAgIFtkaXN0aW5jdF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzaG93UGFnZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemUoKVwiXG4gICAgICAgICAgICBbY2VudGVyQ2VsbHNdPVwiZmFsc2VcIlxuICAgICAgICAgICAgW3N0YXJ0U2VjdGlvblRlbXBsYXRlXT1cInN0YXJ0U2VjdGlvblRlbXBsYXRlKClcIlxuICAgICAgICAgICAgW3NtYWxsZXJGb250c109XCJzbWFsbGVyRm9udHMoKVwiXG4gICAgICAgICAgICBbbm93cmFwXT1cIm5vd3JhcCgpXCJcbiAgICAgICAgICAgIFtzaG93RmlsdGVyXT1cInNob3dGaWx0ZXIoKVwiXG4gICAgICAgICAgICBbc2hvd0V4cG9ydF09XCJzaG93RXhwb3J0KClcIlxuICAgICAgICAgICAgW2lzRXhwYW5kYWJsZV09XCJpc0V4cGFuZGFibGUoKVwiXG4gICAgICAgICAgICBbZXhwYW5kZWRSb3dUZW1wbGF0ZV09XCJleHBhbmRlZFJvd1RlbXBsYXRlKClcIlxuICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsKClcIlxuICAgICAgICAgICAgbm9JdGVtVHh0PVwiTm8gcmVzdWx0cyBmb3VuZFwiXG4gICAgICAgICAgICAocm93Q2xpY2spPVwicm93Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICBbb3JkZXJGaWVsZF09XCJvcmRlckZpZWxkKClcIlxuICAgICAgICAgICAgW3Jvd09wdGlvbnNdPVwib3B0aW9ucygpXCJcbiAgICAgICAgICAgIFtkZWJ1Z109XCJkZWJ1ZygpXCJcbiAgICAgICAgICAgIFtyb3dPcHRpb25zTWFwXT1cInJvd09wdGlvbnNNYXAoKVwiXG4gICAgICAgICAgICBbc2hvd0FkZGl0aW9uYWxDb2x1bW5zXT1cInNob3dBZGRpdGlvbmFsQ29sdW1ucygpXCJcbiAgICAgICAgICAgIFtvcmRlckRpcmVjdGlvbl09XCJvcmRlckRpcmVjdGlvbigpXCJcbiAgICAgICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cImRpc3BsYXllZENvbHVtbnMoKVwiXG4gICAgICAgICAgICBbZGF0YV09XCJkYXRhKClcIiAvPlxuICAgICAgICB9XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9sb2FkZXI+XG4iXX0=
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V0cy1mZS1uZy1zZGsvc3JjL2xpYi9SZXVzYWJsZXMvcmV1c2FibGUtY29tcHMvZmluZC1pdGVtL2ZpbmQtaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ldHMtZmUtbmctc2RrL3NyYy9saWIvUmV1c2FibGVzL3JldXNhYmxlLWNvbXBzL2ZpbmQtaXRlbS9maW5kLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBS0wsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsV0FBVyxFQUNYLG1CQUFtQixHQUNwQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFFTCxPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEVBQ2IsR0FBRyxFQUNILFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpRkFBaUYsQ0FBQztBQUN0SCxPQUFPLEVBRUwsbUJBQW1CLEdBQ3BCLE1BQU0sb0VBQW9FLENBQUM7QUFRNUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtFQUFrRSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sb0VBQW9FLENBQUM7QUFDekcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxt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biAgT25Jbml0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIFZpZXdDaGlsZCxcbiAgVGVtcGxhdGVSZWYsXG4gIHNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBpbmplY3QsXG4gIHZpZXdDaGlsZCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgRm9ybUNvbnRyb2wsXG4gIEZvcm1Hcm91cCxcbiAgRm9ybXNNb2R1bGUsXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE9ic2VydmFibGUsXG4gIFN1YmplY3QsXG4gIGRlYm91bmNlVGltZSxcbiAgZmlsdGVyLFxuICBsYXN0VmFsdWVGcm9tLFxuICBtYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFVzZXJBY3Rpdml0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9SZXVzYWJsZXMvcmV1c2FibGUtcGFnZXMvdXNlci1hY3Rpdml0eS91YS1leHRyYXMvdXNlci1hY3Rpdml0eS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIElUYWJsZVNlYXJjaFJlc3AsXG4gIFRhYmxlSHR0cHNDb21wb25lbnQsXG59IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL3RhYmxlL3RhYmxlLWh0dHBzL3RhYmxlLWh0dHBzLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBJT2JqZWN0TGl0ZXJhbCxcbiAgSVJvd09wdGlvbixcbiAgSVN0cmljdEZvcm1Hcm91cCxcbiAgU29ydFR5cGUsXG4gIFRhYmxlQ29sLFxufSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvbW9kZWxzL2luZGV4Lm1vZGVsJztcbmltcG9ydCB7IEVVQSB9IGZyb20gJy4uLy4uL3JldXNhYmxlLXBhZ2VzL3VzZXItYWN0aXZpdHkvdWEtZXh0cmFzL3VzZXItYWN0aXZpdHkubW9kZWwnO1xuaW1wb3J0IHsgRnVuY3Rpb25DYWxsZXIyLCBUb0FueVBpcGUgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvcGlwZXMvdXRpbGl0eS5waXBlJztcbmltcG9ydCB7IFRhYmxlUGxhaW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy90YWJsZS90YWJsZS1wbGFpbi90YWJsZS1wbGFpbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnRuQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL2NvbXBvbmVudHMvYnRuL2J0bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgSW5wdXRCYXNpY0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL2lucHV0L2lucHV0LWJhc2ljLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdXRvY29tcGxldGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9TaGFyZWQvY29tcG9uZW50cy9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uTWVzc2FnZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL2lucHV0L3ZhbGlkYXRpb24tbWVzc2FnZS92YWxpZGF0aW9uLW1lc3NhZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IFBob25lTnVtYmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vU2hhcmVkL2NvbXBvbmVudHMvcGhvbmUtbnVtYmVyL3Bob25lLW51bWJlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdJZiwgTmdGb3IsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIE5nU3dpdGNoRGVmYXVsdCwgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IExvYWRlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL2xvYWRlci9sb2FkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLi8uLi9jb25maWdzL2luZGV4LmNvbmZpZyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyLCBSb3V0ZXJMaW5rIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEJhc2VGb3JtR2VuZXJhdG9yLFxuICBJQmFzZUZvcm1TY2hlbWEsXG59IGZyb20gJy4uLy4uLy4uL1NoYXJlZC9jb21wb25lbnRzL2Zvcm0tZ2VuZXJhdG9yL2Zvcm0tZ2VuZXJhdG9yLmJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maW5kLWl0ZW0sZmluZC1pdGVtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbmQtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbmQtaXRlbS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTG9hZGVyQ29tcG9uZW50LFxuICAgIE5nSWYsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgTmdGb3IsXG4gICAgTmdTd2l0Y2gsXG4gICAgTmdTd2l0Y2hDYXNlLFxuICAgIFBob25lTnVtYmVyQ29tcG9uZW50LFxuICAgIFZhbGlkYXRpb25NZXNzYWdlQ29tcG9uZW50LFxuICAgIEF1dG9jb21wbGV0ZUNvbXBvbmVudCxcbiAgICBNYXRNZW51TW9kdWxlLFxuICAgIFJvdXRlckxpbmssXG4gICAgTmdTd2l0Y2hEZWZhdWx0LFxuICAgIElucHV0QmFzaWNDb21wb25lbnQsXG4gICAgQnRuQ29tcG9uZW50LFxuICAgIFRhYmxlSHR0cHNDb21wb25lbnQsXG4gICAgVGFibGVQbGFpbkNvbXBvbmVudCxcbiAgICBNYXRJY29uTW9kdWxlLFxuICAgIEFzeW5jUGlwZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZ1bmN0aW9uQ2FsbGVyMixcbiAgICBUb0FueVBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbmRJdGVtQ29tcG9uZW50PFxuICAgIFRRdWVyeSBleHRlbmRzIElPYmplY3RMaXRlcmFsID0gYW55LFxuICAgIFRSb3cgZXh0ZW5kcyBJT2JqZWN0TGl0ZXJhbCA9IGFueSxcbiAgPlxuICBleHRlbmRzIEJhc2VGb3JtR2VuZXJhdG9yPFRRdWVyeSwgSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93Pj5cbiAgaW1wbGVtZW50cyBPbkluaXRcbntcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc29ydCBzY2hlbWFcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9Gb3JtYXRTY2hlbWEgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgYXV0b09yZGVyID0gaW5wdXQodHJ1ZSk7XG4gIHJlYWRvbmx5IGNlbnRlckNlbGxzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgX2Rpc3BsYXllZENvbHVtbnMgPSBpbnB1dDxUYWJsZUNvbDxUUm93PltdPihbXSwgeyBhbGlhczogJ2Rpc3BsYXllZENvbHVtbnMnIH0pO1xuICByZWFkb25seSBkaXNwbGF5ZWRDb2x1bW5zID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLnVzZUN1c3RvbUxhYmVscygpXG4gICAgICA/IHRoaXMudGFibGVTZXJ2aWNlLmdsb2JhbENvbHVtbnNGb3JtYXR0ZXIodGhpcy5fZGlzcGxheWVkQ29sdW1ucygpKVxuICAgICAgOiB0aGlzLl9kaXNwbGF5ZWRDb2x1bW5zKCksXG4gICk7XG4gIC8qKlxuICAgKiBSb3cgZ3JpZCBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBncmlkQ2xhc3MgPSBpbnB1dCgnY29sLW1kLTQgY29sLXh4bC0zJyk7XG4gIHJlYWRvbmx5IGhpZGVGb3JtID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBleHBhbmRlZFJvd1RlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcbiAgcmVhZG9ubHkgaXNUYWJsZVBhZ2luYXRlZCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5zZWFyY2hPYnNlcnZhYmxlRnVuYygpKTtcbiAgcmVhZG9ubHkgcm93T3B0aW9uc01hcCA9IGlucHV0PChyb3c6IFRSb3cpID0+IChJUm93T3B0aW9uPFRSb3c+IHwgbnVsbClbXT4oKTtcbiAgcmVhZG9ubHkgaXNFeHBhbmRhYmxlID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBsYWJlbCA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgbm93cmFwID0gaW5wdXQoZmFsc2UpO1xuICByZWFkb25seSBvcHRpb25zID0gaW5wdXQ8SVJvd09wdGlvbjxUUm93PltdPih1bmRlZmluZWQsIHsgYWxpYXM6ICdyb3dPcHRpb25zJyB9KTtcbiAgcmVhZG9ubHkgb3JkZXJEaXJlY3Rpb24gPSBpbnB1dDxTb3J0VHlwZT4oJ2FzYycpO1xuICByZWFkb25seSBvcmRlckZpZWxkID0gaW5wdXQ8a2V5b2YgVFJvdz4oKTtcbiAgcmVhZG9ubHkgcGFnZVNpemUgPSBpbnB1dCgxMCk7XG4gIHJlYWRvbmx5IHNlYXJjaEZ1bmN0aW9uID0gaW5wdXQ8KGRhdGE6IGFueSkgPT4gT2JzZXJ2YWJsZTxUUm93W10gfCB7IGNvbnRlbnQ6IFRSb3dbXSB9Pj4oKTtcbiAgcmVhZG9ubHkgc2hvd0RhdGEgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgc2VhcmNoSWZOb1F1ZXJ5ID0gaW5wdXQodHJ1ZSk7XG4gIHJlYWRvbmx5IGlzQ29tcGFjdCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IHNob3dFeHBvcnQgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0ZpbHRlciA9IGlucHV0KGZhbHNlKTtcbiAgcmVhZG9ubHkgc2hvd1JlZnJlc2hCdG4gPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBzdGFydFNlY3Rpb25UZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPEhUTUxFbGVtZW50Pj4oKTtcbiAgZm9ybTogRm9ybUdyb3VwO1xuICAvKipcbiAgICogVXNlZCB0byBzcGVjaWZ5IGlmIHRoZSBzZWFyY2ggYnV0dG9uIHNob3VsZCBiZSBzaG93blxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1NlYXJjaEJ0biA9IGlucHV0KHRydWUpO1xuICAvKipcbiAgICogVXNlZCB0byBzcGVjaWZ5IGlmIHRoZSBjbGVhciBmb3JtIGJ1dHRvbiBzaG91bGQgYmUgc2hvd25cbiAgICovXG4gIHJlYWRvbmx5IHNob3dDbGVhckJ0biA9IGlucHV0KHRydWUpO1xuICAvKipcbiAgICogVXNlZCB0byBzcGVjaWZ5IGlmIHZhbGlkYXRpb24gbWVzc2FnZXMgc2hvdWxkIGJlIHNob3duXG4gICAqL1xuICByZWFkb25seSBzaG93VmFsaWRhdGlvbk1zZyA9IGlucHV0KHRydWUpO1xuICByZWFkb25seSBjcmVhdGVCdG5Sb3V0ZSA9IGlucHV0KCcuLi9jcmVhdGUnKTtcbiAgLyoqXG4gICAqIFVzZWQgdG8gc3BlY2lmeSBpZiBzaG93IGFkZGl0aW9uYWwgY29sdW1uIGJ1dHRvbiB3aWlsIGJlIGRpc3BsYXllZCBvciBub3QuXG4gICAqL1xuICByZWFkb25seSBzaG93QWRkaXRpb25hbENvbHVtbnMgPSBpbnB1dCh0cnVlKTtcbiAgcmVhZG9ubHkgc21hbGxlckZvbnRzID0gaW5wdXQoZmFsc2UpO1xuICAvKiogVXNlIGNoZWNrYm94ZXMgKi9cbiAgcmVhZG9ubHkgdXNlU2VsZWN0aW9uID0gaW5wdXQoZmFsc2UpO1xuXG4gIHJlYWRvbmx5IF9yb3dDbGljayA9IG91dHB1dCh7IGFsaWFzOiAncm93Q2xpY2snIH0pO1xuICByZWFkb25seSBjbGlja2VkQ3JlYXRlID0gb3V0cHV0KCk7XG4gIHJlYWRvbmx5IHRhYmxlSFRUUFNSRUYgPSB2aWV3Q2hpbGQoVGFibGVIdHRwc0NvbXBvbmVudDxUUm93Pik7XG4gIHJlYWRvbmx5IHRhYmxlUGxhaW5SZWYgPSB2aWV3Q2hpbGQoVGFibGVQbGFpbkNvbXBvbmVudDxUUm93Pik7XG4gIHJlYWRvbmx5IHRhYmxlSFRUUFNSRUZTaWduYWwgPSB2aWV3Q2hpbGQ8VGFibGVIdHRwc0NvbXBvbmVudDxUUm93Pj4oVGFibGVIdHRwc0NvbXBvbmVudCk7XG4gIHJlYWRvbmx5IHRhYmxlUGxhaW5SZWZTaWduYWwgPSB2aWV3Q2hpbGQ8VGFibGVQbGFpbkNvbXBvbmVudDxUUm93Pj4oVGFibGVQbGFpbkNvbXBvbmVudCk7XG4gIHJlYWRvbmx5IGRhdGEgPSBzaWduYWw8VFJvd1tdPihbXSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBfbG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRpbmcgPSBjb21wdXRlZDxib29sZWFuPihcbiAgICAoKSA9PiB0aGlzLl9sb2FkaW5nKCkgfHwgdGhpcy50YWJsZUhUVFBTUkVGU2lnbmFsKCk/LmlzTG9hZGluZ1Jlc3VsdHMoKSxcbiAgKTtcbiAgcmVhZG9ubHkgc2VhcmNoRm9ybSA9IGNvbXB1dGVkPEZvcm1Hcm91cD4oKCkgPT4ge1xuICAgIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KSxcbiAgICAgIHNjaGVtYSA9IHRoaXMuZm9ybVNjaGVtYSgpO1xuICAgIHNjaGVtYVxuICAgICAgLmZpbHRlcigoeCkgPT4gIXguc3RhbmRhbG9uZSlcbiAgICAgIC5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzLm9uQ2hhbmdlRnVuYykge1xuICAgICAgICAgIGNvbnN0IHN1YiA9IGZvcm0uY29udHJvbHNbcy5maWVsZC50b1N0cmluZygpXT8udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyKSA9PiBzLm9uQ2hhbmdlRnVuYyhmb3JtLmdldFJhd1ZhbHVlKCksIHIsIHRoaXMpKTtcbiAgICAgICAgICB0aGlzLnN1YnNbcy5maWVsZCBhcyBzdHJpbmddID0gc3ViO1xuICAgICAgICB9XG4gICAgICAgIGZvcm0ucmVnaXN0ZXJDb250cm9sKFxuICAgICAgICAgIHMuZmllbGQudG9TdHJpbmcoKSxcbiAgICAgICAgICBuZXcgRm9ybUNvbnRyb2wocy52YWx1ZSwgcy52YWxpZGF0b3JzLCBzLmFzeW5jVmFsaWRhdG9ycyksXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gZm9ybTtcbiAgfSk7XG4gIHJlYWRvbmx5IHN0YW5kYWxvbmVGb3JtID0gY29tcHV0ZWQ8Rm9ybUdyb3VwPigoKSA9PiB7XG4gICAgY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoe30pLFxuICAgICAgc2NoZW1hID0gdGhpcy5mb3JtU2NoZW1hKCk7XG4gICAgc2NoZW1hXG4gICAgICAuZmlsdGVyKCh4KSA9PiAhIXguc3RhbmRhbG9uZSlcbiAgICAgIC5mb3JFYWNoKChzKSA9PlxuICAgICAgICBmb3JtLnJlZ2lzdGVyQ29udHJvbChcbiAgICAgICAgICBzLmZpZWxkLnRvU3RyaW5nKCksXG4gICAgICAgICAgbmV3IEZvcm1Db250cm9sKHMudmFsdWUsIHMudmFsaWRhdG9ycywgcy5hc3luY1ZhbGlkYXRvcnMpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gZm9ybTtcbiAgfSk7XG4gIC8qKlxuICAgKiBVc2VkIHRvIHNwZWNpZnkgaWYgc2hvdyBjcmVhdGUgYnV0dG9uIGlzIG5lZWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUJ1dHRvbiA9IGlucHV0KGZhbHNlKTtcblxuICBASW5wdXQoJ2Zvcm1TY2hlbWEnKSBzZXQgX2Zvcm1TY2hlbWEodjogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PltdKSB7XG4gICAgdGhpcy5pbml0KGNsb25lRGVlcCh2Py5maWx0ZXIoKHgpID0+IHgpKSk7XG4gIH1cblxuICByZWFkb25seSBzZWFyY2hPYnNlcnZhYmxlRnVuYyA9IGlucHV0PChkYXRhOiBhbnkpID0+IE9ic2VydmFibGU8SVRhYmxlU2VhcmNoUmVzcDxUUm93Pj4+KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZWxpbWl0ZXJGaWVsZCA9ICd+fn4nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVsaW1pdGVyV29yZCA9ICd+fic7XG4gIHJlYWRvbmx5IHNlYXJjaFRyaWdnZXIgPSBuZXcgU3ViamVjdDxJT2JqZWN0TGl0ZXJhbD4oKTtcblxuICByZWFkb25seSBzaG93Q29tcGFjdEZpZWxkc01hcCA9IHNpZ25hbDx7IFtmaWVsZCBpbiBrZXlvZiBUUXVlcnldPzogYm9vbGVhbiB9Pih7fSk7XG5cbiAgcmVhZG9ubHkgY29tcHV0ZWRGb3JtU2NoZW1hID0gY29tcHV0ZWQ8SVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PltdPihcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBmb3JtU2NoZW1hID0gdGhpcy5mb3JtU2NoZW1hKCkgfHwgW10sXG4gICAgICAgIHN0YW5kYWxvbmVGb3JtID0gdGhpcy5zdGFuZGFsb25lRm9ybSgpLFxuICAgICAgICBpc0NvbXBhY3QgPSB0aGlzLmlzQ29tcGFjdCgpLFxuICAgICAgICBzaG93Q29tcGFjdEZpZWxkc01hcCA9IHRoaXMuc2hvd0NvbXBhY3RGaWVsZHNNYXAoKSxcbiAgICAgICAgc2VhcmNoRm9ybSA9IHRoaXMuc2VhcmNoRm9ybSgpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICBpc0NvbXBhY3RcbiAgICAgICAgICA/IGZvcm1TY2hlbWEuZmlsdGVyKCh4KSA9PiAheC5oaWRkZW4gJiYgKHgubm9uQ29tcGFjdCB8fCBzaG93Q29tcGFjdEZpZWxkc01hcFt4LmZpZWxkXSkpXG4gICAgICAgICAgOiBmb3JtU2NoZW1hLmZpbHRlcigoeCkgPT4gIXguaGlkZGVuKVxuICAgICAgKS5tYXAoKHNjaGVtZSkgPT4ge1xuICAgICAgICBzY2hlbWUuZm9ybSA9IHNjaGVtZS5zdGFuZGFsb25lID8gc3RhbmRhbG9uZUZvcm0gOiBzZWFyY2hGb3JtO1xuICAgICAgICByZXR1cm4gc2NoZW1lO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IGVxdWFsOiBpc0VxdWFsIH0sXG4gICk7XG4gIHJlYWRvbmx5IGNvbXBhY3RlZEZpZWxkcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtU2NoZW1hKCk/LmZpbHRlcigoeCkgPT4gIXgubm9uQ29tcGFjdCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNDb2x1bW5zID0gY29tcHV0ZWQ8Ym9vbGVhbj4oKCkgPT4gISF0aGlzLmRpc3BsYXllZENvbHVtbnMoKT8ubGVuZ3RoKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGlkZVRhYmxlID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT4gIXRoaXMuc2hvd0RhdGEoKSB8fCAoIXRoaXMuZGF0YSgpICYmICF0aGlzLmlzVGFibGVQYWdpbmF0ZWQoKSksXG4gICk7XG5cbiAgcHVibGljIHVhUyA9IGluamVjdChVc2VyQWN0aXZpdHlTZXJ2aWNlKTtcbiAgcHVibGljIHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuICBwdWJsaWMgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBzdWJzMiA9IHRoaXMudXRpbGl0eVNlcnZpY2UuY3JlYXRlU3Vic2NyaXB0aW9uTWFuYWdlcigpO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vICB0aGlzLmZldGNoU2F2ZWRRdWVyeSgpXG4gICAgbGV0IGFsbG93SW1tZWRpYXRlU2VhcmNoID0gZmFsc2U7XG4gICAgdGhpcy5zdWJzMi5jbGVhcigpO1xuICAgIHRoaXMuc3ViczIucHVzaChcbiAgICAgIHRoaXMuc2VhcmNoVHJpZ2dlclxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWcoKSkgZGVidWdnZXI7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgZmlsdGVyKCgpID0+ICFhbGxvd0ltbWVkaWF0ZVNlYXJjaCksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDIwMCksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGFsbG93SW1tZWRpYXRlU2VhcmNoID0gdHJ1ZTtcbiAgICAgICAgICB9KSxcblxuICAgICAgICAgIHN3aXRjaE1hcCgocikgPT4gdGhpcy5fc2VhcmNoKCkpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHIpID0+IHtcbiAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgfSksXG4gICAgICB0aGlzLnNlYXJjaFRyaWdnZXJcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnKCkpIGRlYnVnZ2VyO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiBhbGxvd0ltbWVkaWF0ZVNlYXJjaCksXG4gICAgICAgICAgc3dpdGNoTWFwKChyKSA9PiB0aGlzLl9zZWFyY2goKSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocikgPT4ge1xuICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgb25EZXN0cm95KCkge1xuICAgIHRoaXMuc3ViczI/LmNsZWFyKCk7XG4gICAgcmV0dXJuIHN1cGVyLm9uRGVzdHJveSgpO1xuICB9XG5cbiAgdG9nZ2xlQ29tcGFjdEZpZWxkKGZpZWxkOiBJU2VhcmNoRm9ybVNjaGVtYSkge1xuICAgIHRoaXMuc2hvd0NvbXBhY3RGaWVsZHNNYXAudXBkYXRlKChtYXApID0+IHtcbiAgICAgIHJldHVybiB7IC4uLm1hcCwgW2ZpZWxkLmZpZWxkXTogIW1hcFtmaWVsZC5maWVsZCBhcyBzdHJpbmddIH07XG4gICAgfSk7XG4gIH1cblxuICBmZXRjaFNhdmVkUXVlcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHByZXZRdWVyeVN0cmluZyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ3EnKTtcbiAgICAgIGlmIChwcmV2UXVlcnlTdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcHJldlF1ZXJ5OiB7IFtmOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBwcmV2UXVlcnlTdHJpbmcuc3BsaXQodGhpcy5kZWxpbWl0ZXJGaWVsZCk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgZiA9IGZpZWxkLnNwbGl0KHRoaXMuZGVsaW1pdGVyV29yZCk7XG4gICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgaWYgKGZbMV0gPT0gbnVsbCB8fCBmWzFdID09ICdudWxsJykgY29udGludWU7XG4gICAgICAgICAgcHJldlF1ZXJ5W2ZbMF1dID0gZlsxXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlYXJjaEZvcm0oKT8ucGF0Y2hWYWx1ZShwcmV2UXVlcnkpO1xuICAgICAgICBpZiAoT2JqZWN0LnZhbHVlcyhwcmV2UXVlcnkpLnNvbWUoKHgpID0+IHggIT0gbnVsbCkpIHRoaXMuc2VhcmNoKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBpbml0KHNjaGVtYTogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PltdKSB7XG4gICAgaWYgKCFzY2hlbWE/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoc2NoZW1hKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZGVidWdnZXI7XG4gICAgdGhpcy5oYW5kbGVBbGxTY2hlbWEoc2NoZW1hKTtcbiAgICBmb3IgKGNvbnN0IHNjaGVtZSBvZiB0aGlzLmZvcm1TY2hlbWEoKSkgdGhpcy5oYW5kbGVGb3JtU2NoZW1lKHNjaGVtZSk7XG4gICAgZm9yIChjb25zdCBzY2hlbWUgb2YgdGhpcy5mb3JtU2NoZW1hKCkpXG4gICAgICBpZiAoc2NoZW1lLnRyaWdnZXJPbkNoYW5nZU9uSW5pdClcbiAgICAgICAgc2NoZW1lLm9uQ2hhbmdlRnVuYyh0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSwgdGhpcy5mb3JtLmdldFJhd1ZhbHVlKClbc2NoZW1lLmZpZWxkXSwgdGhpcyk7XG4gIH1cblxuICBoYW5kbGVBbGxTY2hlbWEoc2NoZW1hOiBJU2VhcmNoRm9ybVNjaGVtYTxUUXVlcnksIFRSb3c+W10pIHtcbiAgICBzY2hlbWEuZm9yRWFjaCgoeCkgPT4gKHgudHlwZSA9IHgudHlwZSB8fCAndGV4dCcpKTtcbiAgICBpZiAodGhpcy5hdXRvRm9ybWF0U2NoZW1hKCkgfHwgdGhpcy5hdXRvT3JkZXIoKSkge1xuICAgICAgaWYgKHRoaXMuYXV0b0Zvcm1hdFNjaGVtYSgpKSB7XG4gICAgICAgIHNjaGVtYVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHgudHlwZSA9PSAnc2VsZWN0JylcbiAgICAgICAgICAuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgICAgICAgaWYgKHgub3B0aW9ucz8ubGVuZ3RoID4gNSB8fCAheC5vcHRpb25zKSB4LnR5cGUgPSAnYXV0b2NvbXBsZXRlJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgc2NoZW1hXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4geC50eXBlID09ICdjaGVja2JveCcpXG4gICAgICAgICAgLmZvckVhY2goKHgpID0+IHtcbiAgICAgICAgICAgIHgudHlwZSA9ICdzZWxlY3QnO1xuICAgICAgICAgICAgeC5vcHRpb25zID0gQ29uZmlnLmJvb2xMaXN0O1xuICAgICAgICAgICAgeC5sYWJlbEZpZWxkID0gJ3RpdGxlJztcbiAgICAgICAgICAgIHgudmFsdWVGaWVsZCA9ICdjb2RlJztcbiAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoc2NoZW1hKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmF1dG9PcmRlcigpKSB7XG4gICAgICAgIHNjaGVtYSA9IHNjaGVtYS5zb3J0MignbGFiZWwnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fc2V0Rm9ybVNjaGVtYXMoW1xuICAgICAgICAgIC4uLnNjaGVtYT8uZmlsdGVyKCh4KSA9PiB4LmFjdGlvbiAmJiB4LnR5cGUgIT0gJ2NoZWNrYm94JyksXG4gICAgICAgICAgLi4uc2NoZW1hPy5maWx0ZXIoKHgpID0+ICF4LmFjdGlvbiAmJiB4LnR5cGUgIT0gJ2NoZWNrYm94JyksXG4gICAgICAgICAgLi4uc2NoZW1hPy5maWx0ZXIoKHgpID0+IHgudHlwZSA9PSAnY2hlY2tib3gnKSxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHRoaXMuX3NldEZvcm1TY2hlbWFzKHNjaGVtYSk7XG4gIH1cblxuICBoYW5kbGVGb3JtU2NoZW1lKHNjaGVtZTogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93Pikge1xuICAgIHNjaGVtZS5pZCA9IHRoaXMudXRpbGl0eVNlcnZpY2UuZ2VuZXJhdGVVVUlEKCk7XG4gICAgdGhpcy51cGRhdGVGb3JtU2NoZW1hKHNjaGVtZS5maWVsZCwgc2NoZW1lKTtcblxuICAgIGlmIChzY2hlbWUub3B0aW9uc0luaXRGdW5jKVxuICAgICAgc2NoZW1lLm9wdGlvbnNJbml0RnVuYy5zdWJzY3JpYmUoKHIpID0+IHtcbiAgICAgICAgc2NoZW1lLm9wdGlvbnMgPSByO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TY2hlbWEoc2NoZW1lLmZpZWxkLCB7IG9wdGlvbnM6IHIgfSk7XG4gICAgICAgIC8vIHRoaXMub3B0aW9uc01hcFtzY2hlbWUuZmllbGRdID0gcjtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHNjaGVtZS5vcHRpb25zSW5pdEZ1bmMyKVxuICAgICAgc2NoZW1lLm9wdGlvbnNJbml0RnVuYzIoKS5zdWJzY3JpYmUoKHIpID0+IHtcbiAgICAgICAgc2NoZW1lLm9wdGlvbnMgPSByO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1TY2hlbWEoc2NoZW1lLmZpZWxkLCB7IG9wdGlvbnM6IHIgfSk7XG4gICAgICAgIC8vIHRoaXMub3B0aW9uc01hcFtzY2hlbWUuZmllbGRdID0gcjtcbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlRm9ybVNjaGVtYShcbiAgICBmaWVsZE5hbWU6IGtleW9mIFRRdWVyeSxcbiAgICBzY2hlbWU6IFBhcnRpYWw8SVNlYXJjaEZvcm1TY2hlbWE8eyBbayBpbiBrZXlvZiBUUXVlcnldOiBBYnN0cmFjdENvbnRyb2w8YW55LCBhbnk+IHwgYW55IH0+PixcbiAgKSB7XG4gICAgcmV0dXJuIHN1cGVyLl91cGRhdGVGb3JtU2NoZW1hKGZpZWxkTmFtZSBhcyBzdHJpbmcsIHNjaGVtZSk7XG4gIH1cblxuICB1cGRhdGVBbGxGb3JtU2NoZW1hKFxuICAgIG1hcDogKGZvcm1GaWVsZDogSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PikgPT4gSVNlYXJjaEZvcm1TY2hlbWE8VFF1ZXJ5LCBUUm93PixcbiAgKSB7XG4gICAgcmV0dXJuIHN1cGVyLl91cGRhdGVBbGxGb3JtU2NoZW1hKG1hcCk7XG4gIH1cblxuICBkZXRhY2hGb3JtU2NoZW1lKGZpZWxkTmFtZT86IGtleW9mIFRRdWVyeSkge1xuICAgIHRoaXMuc3Vic1tmaWVsZE5hbWUgYXMgc3RyaW5nXT8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHJlYWRvbmx5IHNlYXJjaEZvcm1WYWx1ZSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnNlYXJjaEZvcm0pLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGZvcm0pID0+XG4gICAgICAgIGZvcm0/LnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgIG1hcCgoKSA9PiB0aGlzLnV0aWxpdHlTZXJ2aWNlLmRlbGV0ZU51bGwodGhpcy5zZWFyY2hGb3JtKCk/LmdldFJhd1ZhbHVlKCkpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcbiAgcmVhZG9ubHkgc3RhbmRhbG9uZUZvcm1WYWx1ZSA9IHRvU2lnbmFsKFxuICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnN0YW5kYWxvbmVGb3JtKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChmb3JtKSA9PlxuICAgICAgICBmb3JtPy52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy51dGlsaXR5U2VydmljZS5kZWxldGVOdWxsKHRoaXMuc3RhbmRhbG9uZUZvcm0oKT8uZ2V0UmF3VmFsdWUoKSkpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApLFxuICApO1xuICByZWFkb25seSBhbGxTZWFyY2hGb3JtVmFsdWUgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIC4uLnRoaXMuc2VhcmNoRm9ybVZhbHVlKCksXG4gICAgLi4udGhpcy5zdGFuZGFsb25lRm9ybVZhbHVlKCksXG4gIH0pKTtcblxuICB0cmFja0J5Um93SUQgPSAoaW5kZXgsIGl0ZW0pID0+IHtcbiAgICByZXR1cm4gaXRlbT8udmFsdWU/Ll9fcm93SUQ7XG4gIH07XG5cbiAgY2xlYXJGaWx0ZXJzKCkge1xuICAgIHRoaXMuc2VhcmNoRm9ybSgpPy5yZXNldCgpO1xuICAgIHRoaXMuc2VhcmNoKCk7XG4gIH1cblxuICByZWZyZXNoKCkge1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnNlYXJjaCgpO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHNlYXJjaCgpIHtcbiAgICBpZiAodGhpcy5kZWJ1ZygpKSBkZWJ1Z2dlcjtcbiAgICB0aGlzLnNlYXJjaFRyaWdnZXIubmV4dCh0aGlzLnNlYXJjaEZvcm0oKS5nZXRSYXdWYWx1ZSgpKTtcbiAgfVxuXG4gIGZpZWxkQWN0aW9uKGZpZWxkOiBJU2VhcmNoRm9ybVNjaGVtYSkge1xuICAgIGxldCBmb3JtOiBGb3JtR3JvdXA7XG4gICAgaWYgKGZpZWxkLnN0YW5kYWxvbmUgJiYgZmllbGQuYWN0aW9uKSBmb3JtID0gdGhpcy5zdGFuZGFsb25lRm9ybSgpO1xuICAgIGVsc2UgaWYgKGZpZWxkLmFjdGlvbiAmJiAhZmllbGQuc3RhbmRhbG9uZSkgZm9ybSA9IHRoaXMuc2VhcmNoRm9ybSgpO1xuICAgIGVsc2UgcmV0dXJuO1xuICAgIGlmIChmb3JtLmNvbnRyb2xzW2ZpZWxkLmZpZWxkIGFzIGFueV0udmFsaWQpXG4gICAgICBmaWVsZC5hY3Rpb24odGhpcy5hbGxTZWFyY2hGb3JtVmFsdWUoKSwgdGhpcy5hbGxTZWFyY2hGb3JtVmFsdWUoKVtmaWVsZC5maWVsZF0sIGZvcm0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIF9zZWFyY2goKSB7XG4gICAgLy8gZGVidWdnZXI7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRlYnVnKCkpIGRlYnVnZ2VyO1xuICAgICAgaWYgKCF0aGlzLnNlYXJjaEZvcm0oKSkgcmV0dXJuO1xuICAgICAgY29uc3QgcmVxID0gdGhpcy51dGlsaXR5U2VydmljZS5kZWxldGVOdWxsKGNsb25lRGVlcCh0aGlzLnNlYXJjaEZvcm0oKT8uZ2V0UmF3VmFsdWUoKSkpO1xuICAgICAgLy8gZGVidWdnZXI7XG4gICAgICBpZiAodGhpcy5pc1RhYmxlUGFnaW5hdGVkKCkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGEoKSkgdGhpcy5fbG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGF0YS5zZXQoW10pO1xuICAgICAgICB0aGlzLnRhYmxlSFRUUFNSRUYoKT8uc2VhcmNoKHJlcSk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWFyY2hGdW5jdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBsYXN0VmFsdWVGcm9tKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hGdW5jdGlvbigpKHtcbiAgICAgICAgICAgICAgLi4ucmVxLFxuICAgICAgICAgICAgICBzb3J0Qnk6IHRoaXMub3JkZXJGaWVsZCgpIHx8ICdjcmVhdGVkT24nLFxuICAgICAgICAgICAgICBzb3J0RGlyZWN0aW9uOiB0aGlzLm9yZGVyRGlyZWN0aW9uKCk/LnRvVXBwZXJDYXNlKCkgfHwgJ0RFU0MnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmRhdGEuc2V0KGRhdGE/LlsnY29udGVudCddIHx8IGRhdGEpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMudWFTLmFkZCh7XG4gICAgICAgIGNvZGU6IEVVQS5zZWFyY2hlZCxcbiAgICAgICAgYWN0aXZpdHlEZXNjcmlwdGlvbjogdGhpcy5sYWJlbCgpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkocmVxKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkZWJ1Z2dlcjtcbiAgICB9XG4gIH1cblxuICBzYXZlUXVlcnkocXVlcnkgPSB0aGlzLnNlYXJjaEZvcm1WYWx1ZSgpKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIHE6IE9iamVjdC5rZXlzKHF1ZXJ5KVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IHF1ZXJ5W3hdICE9IG51bGwpXG4gICAgICAgICAgLm1hcCgoaykgPT4gYCR7a30ke3RoaXMuZGVsaW1pdGVyV29yZH0ke3F1ZXJ5W2tdfWApXG4gICAgICAgICAgLmpvaW4odGhpcy5kZWxpbWl0ZXJGaWVsZCksXG4gICAgICB9LFxuICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgIH0pO1xuICB9XG4gIHJvd0NsaWNrKGUpIHtcbiAgICB0aGlzLl9yb3dDbGljay5lbWl0KGUpO1xuICB9XG5cbiAgZ2V0IHNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZUhUVFBTUkVGKCk/LnNlbGVjdGVkSXRlbXMgfHwgdGhpcy50YWJsZVBsYWluUmVmKCk/LnNlbGVjdGVkSXRlbXM7XG4gIH1cbiAgcmVhZG9ubHkgc2VsZWN0aW9uU2lnbmFsID0gY29tcHV0ZWQ8VFJvd1tdPigoKSA9PiB7XG4gICAgY29uc3QgdGggPSB0aGlzLnRhYmxlSFRUUFNSRUZTaWduYWwoKT8uc2VsZWN0ZWRJdGVtc1NpZ25hbCgpLFxuICAgICAgdHAgPSB0aGlzLnRhYmxlUGxhaW5SZWZTaWduYWwoKT8uc2VsZWN0ZWRJdGVtc1NpZ25hbCgpO1xuICAgIHJldHVybiB0aCB8fCB0cDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaXNBbnlTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCB0aCA9IHRoaXMudGFibGVIVFRQU1JFRlNpZ25hbCgpPy5pc0FueVNlbGVjdGVkKCksXG4gICAgICB0cCA9IHRoaXMudGFibGVQbGFpblJlZlNpZ25hbCgpPy5pc0FueVNlbGVjdGVkKCk7XG4gICAgcmV0dXJuIHRoIHx8IHRwO1xuICB9KTtcblxuICBzdGFydExvYWRlcigpIHtcbiAgICB0aGlzLl9sb2FkaW5nLnNldCh0cnVlKTtcbiAgfVxuXG4gIHN0b3BMb2FkZXIoKSB7XG4gICAgdGhpcy5fbG9hZGluZy5zZXQoZmFsc2UpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlYXJjaEZvcm1TY2hlbWE8XG4gIFRRdWVyeSBleHRlbmRzIElPYmplY3RMaXRlcmFsID0gYW55LFxuICBUUm93IGV4dGVuZHMgSU9iamVjdExpdGVyYWwgPSBhbnksXG4+IGV4dGVuZHMgSUJhc2VGb3JtU2NoZW1hPFxuICAgIFRRdWVyeSxcbiAgICBGaW5kSXRlbUNvbXBvbmVudDxUUXVlcnksIFRSb3c+LFxuICAgIHtcbiAgICAgIFtLIGluIGtleW9mIFRRdWVyeV06IEFic3RyYWN0Q29udHJvbDxhbnksIGFueT47XG4gICAgfVxuICA+IHtcbiAgc3RhbmRhbG9uZT86IGJvb2xlYW47XG4gIG5vbkNvbXBhY3Q/OiBib29sZWFuO1xuICBhY3Rpb24/OiAocm93OiBUUm93LCBjZWxsOiBhbnksIGZvcm0/OiBGb3JtR3JvdXA8SVN0cmljdEZvcm1Hcm91cDxUUXVlcnk+PikgPT4gYW55O1xufVxuIiwiPGxvYWRlciBbbG9hZGluZ109XCJfbG9hZGluZygpXCI+XG4gIEBpZiAoIWhpZGVGb3JtKCkgJiYgc2VhcmNoRm9ybSgpKSB7XG4gICAgPGZvcm0gKG5nU3VibWl0KT1cInNlYXJjaCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICBAZm9yIChzY2hlbWUgb2YgY29tcHV0ZWRGb3JtU2NoZW1hKCk7IHRyYWNrIHNjaGVtZS5maWVsZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBncmlkQ2xhc3MoKSB9fSBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdElucFRlbXBsPlxuICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtYmFzaWNcbiAgICAgICAgICAgICAgICAgICNmb3JtRmllbGRcbiAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNjaGVtZS5maWVsZFwiXG4gICAgICAgICAgICAgICAgICBbZm9ybV09XCJzY2hlbWUuZm9ybVwiXG4gICAgICAgICAgICAgICAgICBbdHlwZV09XCJzY2hlbWUudHlwZVwiXG4gICAgICAgICAgICAgICAgICBbYXV0b1BpY2tWYWx1ZUZpZWxkXT1cInNjaGVtZS5hdXRvUGlja1ZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwic2NoZW1lLnZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsVHlwZV09XCJzY2hlbWUubGFiZWxUeXBlIHwgdG9BbnlcIlxuICAgICAgICAgICAgICAgICAgW2NoZWNrZWRTaWduYWxdPVwic2NoZW1lLmNoZWNrZWRcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25JY29uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICBbbm9Gb3JtYXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxGaWVsZF09XCJzY2hlbWUubGFiZWxGaWVsZFwiXG4gICAgICAgICAgICAgICAgICBbb3B0aW9uRm9ybWF0dGVyXT1cInNjaGVtZS5vcHRpb25Gb3JtYXR0ZXJcIlxuICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwic2NoZW1lLm9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQb2ludHNdPVwic2NoZW1lLmRlY2ltYWxQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgW2hpbnRdPVwic2NoZW1lLmhpbnRcIlxuICAgICAgICAgICAgICAgICAgW21heF09XCJzY2hlbWUubWF4XCJcbiAgICAgICAgICAgICAgICAgIFttaW5dPVwic2NoZW1lLm1pblwiXG4gICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwic2NoZW1lLnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzY2hlbWUubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICBzY2hlbWUuZGlzYWJsZWRJZiB8IGZ1bmN0aW9uQ2FsbGVyMjogc2VhcmNoRm9ybVZhbHVlIDogKHNjaGVtZS5maWVsZCB8IHRvQW55KVxuICAgICAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICBAc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKHNjaGVtZS50eXBlID09ICd0ZWwnKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtcGhvbmUtbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwic2NoZW1lLmZvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzY2hlbWUubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cInNjaGVtZS5maWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uXT1cInNjaGVtZS5zaG93VmFsaWRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uSWNvbl09XCJzY2hlbWUuc2hvd1ZhbGlkYXRpb25JY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY291bnRyeUNvZGUzXT1cInNjaGVtZS5jb3VudHJ5Q29kZTNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5kaXNhYmxlZElmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25DYWxsZXIyOiBzZWFyY2hGb3JtVmFsdWUoKSA6IChzY2hlbWUuZmllbGQgfCB0b0FueSlcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICNpbnB1dFRhZyAvPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dWYWxpZGF0aW9uTXNnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXBwLXZhbGlkYXRpb24tbWVzc2FnZSBbaW5wdXRdPVwiaW5wdXRUYWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKHNjaGVtZS50eXBlID09ICdhdXRvY29tcGxldGUnKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtYXV0b2NvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgICAgW2Zvcm1dPVwic2NoZW1lLmZvcm1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzY2hlbWUubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbEZpZWxkXT1cInNjaGVtZS5sYWJlbEZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXV0b1BpY2tWYWx1ZUZpZWxkXT1cInNjaGVtZS5hdXRvUGlja1ZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFR5cGVdPVwic2NoZW1lLmxhYmVsVHlwZSB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0Z1bmNdPVwic2NoZW1lLm9wdGlvbnNGdW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJzY2hlbWUuZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25Gb3JtYXR0ZXJdPVwic2NoZW1lLm9wdGlvbkZvcm1hdHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwic2NoZW1lLnZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNjaGVtZS5vcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICBbaGludF09XCJzY2hlbWUuaGludFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmRpc2FibGVkSWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbkNhbGxlcjI6IHNlYXJjaEZvcm1WYWx1ZSA6IChzY2hlbWUuZmllbGQgfCB0b0FueSlcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICNpbnB1dFRhZyAvPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKHNob3dWYWxpZGF0aW9uTXNnKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXBwLXZhbGlkYXRpb24tbWVzc2FnZSBbaW5wdXRdPVwiaW5wdXRUYWdcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKHNjaGVtZS5zdGFuZGFsb25lIHx8IHNjaGVtZS5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gKG5nU3VibWl0KT1cImZpZWxkQWN0aW9uKHNjaGVtZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3gtMiByb3cgYWxpZ24taXRlbXMtZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtYmFzaWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZm9ybUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJzY2hlbWUuZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwic2NoZW1lLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGlja1ZhbHVlRmllbGRdPVwic2NoZW1lLmF1dG9QaWNrVmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwic2NoZW1lLnZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFR5cGVdPVwic2NoZW1lLmxhYmVsVHlwZSB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZFNpZ25hbF09XCJzY2hlbWUuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uSWNvbl09XCJmb3JtRmllbGQuaGFzVmFsdWUoKSAmJiAhIXNjaGVtZS5hc3luY1ZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtub0Zvcm1hdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxGaWVsZF09XCJzY2hlbWUubGFiZWxGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkZvcm1hdHRlcl09XCJzY2hlbWUub3B0aW9uRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzY2hlbWUub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQb2ludHNdPVwic2NoZW1lLmRlY2ltYWxQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtoaW50XT1cInNjaGVtZS5oaW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cInNjaGVtZS5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwic2NoZW1lLm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNjaGVtZS5wbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInNjaGVtZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lLmRpc2FibGVkSWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbkNhbGxlcjI6IHNlYXJjaEZvcm1WYWx1ZSA6IChzY2hlbWUuZmllbGQgfCB0b0FueSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJzY2hlbWUuaWNvbiB8fCAnc2hvdydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtncm91cF09XCJzY2hlbWUuc3RhbmRhbG9uZSAmJiBzY2hlbWUuYWN0aW9uID8gJ3Nob3cnIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uVHlwZT1cInN1Ym1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFmb3JtRmllbGQ/LnZhbGlkU2lnbmFsKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93VmFsaWRhdGlvbk1zZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtdmFsaWRhdGlvbi1tZXNzYWdlIFtpbnB1dF09XCJmb3JtRmllbGRcIiAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtaW5wdXQtYmFzaWNcbiAgICAgICAgICAgICAgICAgICAgICAjZm9ybUZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwic2NoZW1lLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZm9ybV09XCJzY2hlbWUuZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwic2NoZW1lLnR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGlja1ZhbHVlRmllbGRdPVwic2NoZW1lLmF1dG9QaWNrVmFsdWVGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlRmllbGRdPVwic2NoZW1lLnZhbHVlRmllbGRcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbFR5cGVdPVwic2NoZW1lLmxhYmVsVHlwZSB8IHRvQW55XCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZFNpZ25hbF09XCJzY2hlbWUuY2hlY2tlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uXT1cImZvcm1GaWVsZC5oYXNWYWx1ZSgpICYmICEhc2NoZW1lLmFzeW5jVmFsaWRhdG9yc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dWYWxpZGF0aW9uSWNvbl09XCJmb3JtRmllbGQuaGFzVmFsdWUoKSAmJiAhIXNjaGVtZS5hc3luY1ZhbGlkYXRvcnNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtub0Zvcm1hdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxGaWVsZF09XCJzY2hlbWUubGFiZWxGaWVsZFwiXG4gICAgICAgICAgICAgICAgICAgICAgW29wdGlvbkZvcm1hdHRlcl09XCJzY2hlbWUub3B0aW9uRm9ybWF0dGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJzY2hlbWUub3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlY2ltYWxQb2ludHNdPVwic2NoZW1lLmRlY2ltYWxQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICAgIFtoaW50XT1cInNjaGVtZS5oaW50XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd1ZhbGlkYXRpb25Nc2ddPVwic2hvd1ZhbGlkYXRpb25Nc2coKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW21heF09XCJzY2hlbWUubWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInNjaGVtZS5taW5cIlxuICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzY2hlbWUucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzY2hlbWUubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5kaXNhYmxlZElmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25DYWxsZXIyOiBzZWFyY2hGb3JtVmFsdWUgOiAoc2NoZW1lLmZpZWxkIHwgdG9BbnkpXG4gICAgICAgICAgICAgICAgICAgICAgXCIgLz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLWNlbnRlciBkLWZsZXhcIj5cbiAgICAgICAgICBAaWYgKHNob3dDbGVhckJ0bigpKSB7XG4gICAgICAgICAgICA8YXBwLWJ0biB0eXBlPVwiZGFuZ2VyLW91dGxpbmVcIiB0ZXh0PVwiQ2xlYXJcIiBpY29uPVwiZGVsZXRlXCIgKG1jbGljayk9XCJjbGVhckZpbHRlcnMoKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMVwiPjwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHNob3dTZWFyY2hCdG4oKSkge1xuICAgICAgICAgICAgPGFwcC1idG5cbiAgICAgICAgICAgICAgW2dyb3VwXT1cIidzZWFyY2gnXCJcbiAgICAgICAgICAgICAgW2ljb25CdG5dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIHRleHQ9XCJTZWFyY2hcIlxuICAgICAgICAgICAgICBhY3Rpb25UeXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgW2V4Y2x1ZGVMb2dnaW5nXT1cInRydWVcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXNlYXJjaEZ1bmN0aW9uKCkgJiYgIWlzVGFibGVQYWdpbmF0ZWQoKVwiIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoaXNDb21wYWN0KCkpIHtcbiAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgIFtzaG93SGVscEljb25dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICBtY2xhc3M9XCJtcy0xXCJcbiAgICAgICAgICAgICAgW2V4Y2x1ZGVMb2dnaW5nXT1cInRydWVcIlxuICAgICAgICAgICAgICBoZWxwPVwiU2VhcmNoIEZpZWxkc1wiXG4gICAgICAgICAgICAgIGN1c3RvbUljb249XCJmYSBmYS1lbGxpcHNpcy12XCJcbiAgICAgICAgICAgICAgW21hdE1lbnVUcmlnZ2VyRm9yXT1cImV4dHJhRmllbGRzTWVudVwiIC8+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2V4dHJhRmllbGRzTWVudT1cIm1hdE1lbnVcIiBjbGFzcz1cIlwiPlxuICAgICAgICAgICAgICBAZm9yIChmaWVsZCBvZiBjb21wYWN0ZWRGaWVsZHMoKTsgdHJhY2sgZmllbGQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInRvZ2dsZUNvbXBhY3RGaWVsZChmaWVsZClcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICBAaWYgKHNob3dDb21wYWN0RmllbGRzTWFwKClbZmllbGQuZmllbGRdKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jaGVja2VkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChjcmVhdGVCdXR0b24oKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0xXCI+PC9zcGFuPlxuICAgICAgICAgICAgQGlmIChjcmVhdGVCdG5Sb3V0ZSgpKSB7XG4gICAgICAgICAgICAgIDxhcHAtYnRuXG4gICAgICAgICAgICAgICAgdHlwZT1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIHRleHQ9XCJDcmVhdGVcIlxuICAgICAgICAgICAgICAgIGljb249XCJhZGRcIlxuICAgICAgICAgICAgICAgIChtY2xpY2spPVwiY2xpY2tlZENyZWF0ZS5lbWl0KClcIlxuICAgICAgICAgICAgICAgIHJvdXRlckxpbms9XCJ7eyBjcmVhdGVCdG5Sb3V0ZSgpIH19XCIgLz5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICA8YXBwLWJ0biB0eXBlPVwib3V0bGluZVwiIHRleHQ9XCJDcmVhdGVcIiBpY29uPVwiYWRkXCIgKG1jbGljayk9XCJjbGlja2VkQ3JlYXRlLmVtaXQoKVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgfVxuXG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZVBhbmVsXVwiPjwvbmctY29udGVudD5cblxuICBAaWYgKGhhc0NvbHVtbnMoKSkge1xuICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgW2hpZGRlbl09XCJoaWRlVGFibGUoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgQGlmIChpc1RhYmxlUGFnaW5hdGVkKCkpIHtcbiAgICAgICAgICA8dGFibGUtaHR0cHNcbiAgICAgICAgICAgICN0YWJsZUhUVFBTXG4gICAgICAgICAgICBbc2VhcmNoSWZOb1F1ZXJ5XT1cInNlYXJjaElmTm9RdWVyeSgpXCJcbiAgICAgICAgICAgIFtkaXNwbGF5ZWRDb2x1bW5zXT1cImRpc3BsYXllZENvbHVtbnMoKVwiXG4gICAgICAgICAgICBbb2JzZXJ2YWJsZUZ1bmNdPVwic2VhcmNoT2JzZXJ2YWJsZUZ1bmMoKVwiXG4gICAgICAgICAgICAocm93Q2xpY2spPVwicm93Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICBbY2VudGVyQ2VsbHNdPVwiY2VudGVyQ2VsbHMoKVwiXG4gICAgICAgICAgICBbZXhwYW5kZWRSb3dUZW1wbGF0ZV09XCJleHBhbmRlZFJvd1RlbXBsYXRlKClcIlxuICAgICAgICAgICAgW2lzRXhwYW5kYWJsZV09XCJpc0V4cGFuZGFibGUoKVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwibGFiZWwoKVwiXG4gICAgICAgICAgICBbbm93cmFwXT1cIm5vd3JhcCgpXCJcbiAgICAgICAgICAgIFtvcmRlckRpcmVjdGlvbl09XCJvcmRlckRpcmVjdGlvbigpXCJcbiAgICAgICAgICAgIFtvcmRlckZpZWxkXT1cIm9yZGVyRmllbGQoKVwiXG4gICAgICAgICAgICBbcGFnZVNpemVdPVwicGFnZVNpemUoKVwiXG4gICAgICAgICAgICBbcm93T3B0aW9uc109XCJvcHRpb25zKClcIlxuICAgICAgICAgICAgW2RlYnVnXT1cImRlYnVnKClcIlxuICAgICAgICAgICAgW3Jvd09wdGlvbnNNYXBdPVwicm93T3B0aW9uc01hcCgpXCJcbiAgICAgICAgICAgIFtzaG93QWRkaXRpb25hbENvbHVtbnNdPVwic2hvd0FkZGl0aW9uYWxDb2x1bW5zKClcIlxuICAgICAgICAgICAgW3Nob3dFeHBvcnRdPVwic2hvd0V4cG9ydCgpXCJcbiAgICAgICAgICAgIFtzaG93UmVmcmVzaEJ0bl09XCJzaG93UmVmcmVzaEJ0bigpXCJcbiAgICAgICAgICAgIFtzbWFsbGVyRm9udHNdPVwic21hbGxlckZvbnRzKClcIlxuICAgICAgICAgICAgW3N0YXJ0U2VjdGlvblRlbXBsYXRlXT1cInN0YXJ0U2VjdGlvblRlbXBsYXRlKClcIlxuICAgICAgICAgICAgW3VzZVNlbGVjdGlvbl09XCJ1c2VTZWxlY3Rpb24oKVwiXG4gICAgICAgICAgICBub0l0ZW1UeHQ9XCJObyByZXN1bHRzIGZvdW5kXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHRhYmxlLXBsYWluXG4gICAgICAgICAgICBbZGlzdGluY3RdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbc2hvd1BhZ2VyXT1cInRydWVcIlxuICAgICAgICAgICAgW3BhZ2VTaXplXT1cInBhZ2VTaXplKClcIlxuICAgICAgICAgICAgW2NlbnRlckNlbGxzXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtzdGFydFNlY3Rpb25UZW1wbGF0ZV09XCJzdGFydFNlY3Rpb25UZW1wbGF0ZSgpXCJcbiAgICAgICAgICAgIFtzbWFsbGVyRm9udHNdPVwic21hbGxlckZvbnRzKClcIlxuICAgICAgICAgICAgW25vd3JhcF09XCJub3dyYXAoKVwiXG4gICAgICAgICAgICBbc2hvd0ZpbHRlcl09XCJzaG93RmlsdGVyKClcIlxuICAgICAgICAgICAgW3Nob3dFeHBvcnRdPVwic2hvd0V4cG9ydCgpXCJcbiAgICAgICAgICAgIFtpc0V4cGFuZGFibGVdPVwiaXNFeHBhbmRhYmxlKClcIlxuICAgICAgICAgICAgW2V4cGFuZGVkUm93VGVtcGxhdGVdPVwiZXhwYW5kZWRSb3dUZW1wbGF0ZSgpXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbCgpXCJcbiAgICAgICAgICAgIG5vSXRlbVR4dD1cIk5vIHJlc3VsdHMgZm91bmRcIlxuICAgICAgICAgICAgKHJvd0NsaWNrKT1cInJvd0NsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgW29yZGVyRmllbGRdPVwib3JkZXJGaWVsZCgpXCJcbiAgICAgICAgICAgIFtyb3dPcHRpb25zXT1cIm9wdGlvbnMoKVwiXG4gICAgICAgICAgICBbZGVidWddPVwiZGVidWcoKVwiXG4gICAgICAgICAgICBbcm93T3B0aW9uc01hcF09XCJyb3dPcHRpb25zTWFwKClcIlxuICAgICAgICAgICAgW3Nob3dBZGRpdGlvbmFsQ29sdW1uc109XCJzaG93QWRkaXRpb25hbENvbHVtbnMoKVwiXG4gICAgICAgICAgICBbb3JkZXJEaXJlY3Rpb25dPVwib3JkZXJEaXJlY3Rpb24oKVwiXG4gICAgICAgICAgICBbZGlzcGxheWVkQ29sdW1uc109XCJkaXNwbGF5ZWRDb2x1bW5zKClcIlxuICAgICAgICAgICAgW2RhdGFdPVwiZGF0YSgpXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIH1cbjwvbG9hZGVyPlxuIl19