@churchillliving/se-ui-toolkit 6.54.293 → 6.54.295
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.
- package/esm2022/lib/components/shared/global-filters/global-filters.component.mjs +17 -19
- package/esm2022/lib/services/grid.service.mjs +2 -5
- package/fesm2022/churchillliving-se-ui-toolkit.mjs +17 -22
- package/fesm2022/churchillliving-se-ui-toolkit.mjs.map +1 -1
- package/lib/components/shared/global-filters/global-filters.component.d.ts +0 -1
- package/lib/services/grid.service.d.ts +1 -1
- package/package.json +1 -1
|
@@ -266,27 +266,25 @@ export class SeGlobalFilterComponent {
|
|
|
266
266
|
this.matchSameFields(globalFilter.toField, null, 'lte');
|
|
267
267
|
}
|
|
268
268
|
}
|
|
269
|
-
|
|
269
|
+
onFocusOutEvent(globalFilter) {
|
|
270
270
|
if (globalFilter && globalFilter.onClick) {
|
|
271
271
|
globalFilter.onClick(globalFilter);
|
|
272
272
|
}
|
|
273
|
-
|
|
274
|
-
onFocusOutEvent(globalFilter) {
|
|
275
|
-
if (globalFilter && globalFilter.onFocusOut) {
|
|
273
|
+
else if (globalFilter && globalFilter.onFocusOut) {
|
|
276
274
|
globalFilter.onFocusOut(globalFilter);
|
|
275
|
+
this.ngZone.onStable
|
|
276
|
+
.pipe(take(1))
|
|
277
|
+
.subscribe(() => {
|
|
278
|
+
const globalFilters = this.globalFilters.filter((x) => x.field);
|
|
279
|
+
const index = globalFilters.findIndex((filter) => filter.field && filter.type === GridFilterControlType.DATE_RANGE);
|
|
280
|
+
if (index > -1) {
|
|
281
|
+
globalFilters.splice(index, 1);
|
|
282
|
+
}
|
|
283
|
+
localStorage.setItem('applyFilter', JSON.stringify(false));
|
|
284
|
+
this.gridService.applyFilterEvent = false;
|
|
285
|
+
this.filtersApplied.emit(globalFilters);
|
|
286
|
+
});
|
|
277
287
|
}
|
|
278
|
-
this.ngZone.onStable
|
|
279
|
-
.pipe(take(1)) // Emit only once when the zone becomes stable
|
|
280
|
-
.subscribe(() => {
|
|
281
|
-
const globalFilters = this.globalFilters.filter((x) => x.field);
|
|
282
|
-
const index = globalFilters.findIndex((filter) => filter.field && filter.type === GridFilterControlType.DATE_RANGE);
|
|
283
|
-
if (index > -1) {
|
|
284
|
-
globalFilters.splice(index, 1);
|
|
285
|
-
}
|
|
286
|
-
localStorage.setItem('applyFilter', JSON.stringify(false));
|
|
287
|
-
this.gridService.applyFilterEvent = false;
|
|
288
|
-
this.filtersApplied.emit(globalFilters);
|
|
289
|
-
});
|
|
290
288
|
}
|
|
291
289
|
updateValues(globalFilter) {
|
|
292
290
|
localStorage.setItem('applyFilter', JSON.stringify(false));
|
|
@@ -570,11 +568,11 @@ export class SeGlobalFilterComponent {
|
|
|
570
568
|
}
|
|
571
569
|
}
|
|
572
570
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SeGlobalFilterComponent, deps: [{ token: i1.DatePipe }, { token: i2.DynamicDialogRef, optional: true }, { token: i2.DynamicDialogConfig, optional: true }, { token: i3.GridService }, { token: i2.DialogService }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
573
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", gridUpdate: "gridUpdate", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onClickEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n \n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i7.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]" }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i13.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }] }); }
|
|
571
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: SeGlobalFilterComponent, selector: "se-global-filters", inputs: { globalFilters: "globalFilters", searchGlobalFilterBtn: "searchGlobalFilterBtn", clearGlobalFilterBtn: "clearGlobalFilterBtn", gridUpdate: "gridUpdate", activeTestMode: "activeTestMode" }, outputs: { filtersApplied: "filtersApplied", updateValue: "updateValue" }, viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["rangeCalendar"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n \n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "label", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "overlayDirection", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i7.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i9.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "trueValue", "falseValue"], outputs: ["onChange"] }, { kind: "directive", type: i10.InputText, selector: "[pInputText]" }, { kind: "component", type: i11.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "tabindex", "multiple", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey"], outputs: ["onOptionClick", "onChange"] }, { kind: "component", type: i12.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: i13.AppFilterMenuComponent, selector: "se-filter-menu", inputs: ["globalFilter"] }] }); }
|
|
574
572
|
}
|
|
575
573
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: SeGlobalFilterComponent, decorators: [{
|
|
576
574
|
type: Component,
|
|
577
|
-
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (click)=\"onClickEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n \n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
575
|
+
args: [{ selector: 'se-global-filters', template: "<div class=\"global-filters-component-wrapper-div\">\n <div\n [class]=\"globalFilter.hidden ? 'globalFilterHidden' : globalFilter.column ? 'col-' + globalFilter.column : 'col-3'\"\n *ngFor=\"let globalFilter of globalFilters\"\n >\n <div [ngSwitch]=\"globalFilter.type\">\n <!-- Calendar control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CALENDAR\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-calendar\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText: 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [placeholder]=\"'Select-Date'\"\n [(ngModel)]=\"globalFilter.value\"\n (keyup.enter)=\"applyFilters()\"\n (onSelect)=\"selectDate(globalFilter, true)\"\n [inputId]=\"globalFilter.field\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n appendTo=\"body\"\n [showButtonBar]=\"true\"\n [disabled]=\"globalFilter.disabled\"\n (keyup)=\"calendarFocusEvent(globalFilter)\"\n >\n </p-calendar>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Calendar Range -->\n <!-- <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.CALENDAR_RANGE\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center\">\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" \n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n <label class=\"global-filters-label\"\n >\n <span [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"></span>\n <span *ngIf=\"globalFilter.prefix===true || globalFilter.prefix===undefined\">\n {{ globalFilter.labelText ? globalFilter.labelText : '' }}\n </span> -->\n <!-- {{\n startDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }}\n to\n {{\n endDate\n | date\n : (globalFilter.format ? globalFilter.format : 'MM/dd/yyyy')\n }} -->\n <!-- <span *ngIf=\"globalFilter.prefix===false\">\n {{ globalFilter.labelText ? globalFilter.labelText : ''}}\n </span></label\n >\n <button\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"custom-btn\"\n (click)=\"showNext(globalFilter)\"\n label=\"Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\"\n > -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n <!-- </button>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span> -->\n\n <!-- Checkbox Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.CHECKBOX\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-checkbox\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty': 'flex align-items-center'\"\n [binary]=\"true\"\n (keyup.enter)=\"applyFilters()\"\n [(ngModel)]=\"globalFilter.value\"\n [disabled]=\"globalFilter.disabled\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n ></p-checkbox>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Spacer Control -->\n <span *ngIf=\"!globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SPACER\"\n >\n <span\n [class]=\"\n globalFilter.column\n ? 'col-' + globalFilter.column\n : ''\n \"\n ></span>\n </div>\n </span>\n\n <!-- Dropdown Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DROPDOWN\">\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <p-dropdown\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [name]=\"globalFilter.displayText\"\n [showClear]=\"true\"\n [styleClass]=\"globalFilter.field\"\n (keyup.Tab)=\"tabFocusEvent(globalFilter)\"\n [placeholder]=\"globalFilter.displayText\"\n [options]=\"globalFilter.data || []\"\n [optionLabel]=\"globalFilter.optionLabel\"\n [optionValue]=\"globalFilter.optionValue\"\n [filter]=\"globalFilter.allowSearch\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n (keyup.enter)=\"applyFilters()\"\n [disabled]=\"globalFilter.disabled\"\n ></p-dropdown>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Input control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.INPUT\">\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <input\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\" \n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\">\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n <!-- NumericInput control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERICINPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex flex-nowrap align-items-center possible-bulk-update-input-wrapper-div\">\n <input\n type=\"number\"\n pInputText\n [(ngModel)]=\"globalFilter.value\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n (keyup.enter)=\"applyFilters()\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n class=\"form-control\"\n />\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n \n <!-- Date Range Control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div class=\"global-filters-filter-div\" *ngSwitchCase=\"fiterTypes.DATE_RANGE\">\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex align-items-center range-calendar gap-1\">\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-previous\"\n (click)=\"showPrevious(globalFilter)\"\n label=\"<<\"\n >\n <!-- \"Previous {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} <<\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <p-calendar \n #rangeCalendar\n [showButtonBar]=\"true\"\n\n [inputId]=\"globalFilter.displayText\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty ' + globalFilter.displayText : 'flex-grow-1 grow-1 ' + globalFilter.displayText\"\n [(ngModel)]=\"globalFilter.value\" \n selectionMode=\"range\" \n [selectOtherMonths]=\"true\"\n appendTo=\"body\"\n (onSelect)=\"selectDate(globalFilter, true, rangeCalendar)\"\n [dateFormat]=\"calendarFormat\"\n (onClose)=\"onFocusOutEvent(globalFilter)\"\n (onClickOutside)=\"setDateRangeFilterValue(globalFilter)\"\n (onBlur)=\"setDateRangeFilterValue(globalFilter)\"\n (keyup)=\"calendarFocusEvent(globalFilter, $event)\"\n (onClearClick)=\"clearDateRangeValue(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.enter)=\"applyFilters(true, globalFilter)\"\n \n ></p-calendar>\n <button *ngIf=\"globalFilter.dayRange\"\n pButton\n type=\"button\"\n [disabled]=\"globalFilter.disabled\" \n class=\"calendar-range-btn calendar-next\"\n (click)=\"showNext(globalFilter)\"\n label=\">>\"\n >\n <!-- Next {{\n globalFilter.dayRange ? globalFilter.dayRange : 'Week'\n }} >>\" -->\n <!-- [ngStyle]=\"{ background: globalFilter.color ? globalFilter.color : ''}\" -->\n </button>\n <!-- todayButtonStyleClass=\"hidden\"\n clearButtonStyleClass=\"ml-auto\" -->\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- Numeric Range control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.NUMERIC_RANGE\"\n >\n <label for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"flex\">\n <div class=\"flex flex-nowrap align-items-center mr-2\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.value\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n (onBlur)=\"setNumericRangeValueFrom(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueFrom(globalFilter,true)\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 grow-1 input-number'\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n <span class=\"to-numeric mr-2\">To</span>\n <div class=\"flex flex-nowrap align-items-center\">\n <p-inputNumber\n [showButtons]=\"false\"\n [(ngModel)]=\"globalFilter.valueTwo\"\n [minFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [maxFractionDigits]=\"globalFilter?.format?.type === 'decimal' ? globalFilter.format?.formatParams?.digitsInfo ? globalFilter.format?.formatParams?.digitsInfo : '2' : '0'\"\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : 'flex-grow-1 mr-2 grow-1 input-number'\"\n (onBlur)=\"setNumericRangeValueTwo(globalFilter)\"\n (keyup.enter)=\"setNumericRangeValueTwo(globalFilter,true)\"\n [disabled]=\"globalFilter.disabled\"\n >\n </p-inputNumber>\n <span *ngIf=\"globalFilter.filtering\">\n <se-filter-menu [globalFilter]=\"globalFilter\"></se-filter-menu>\n </span>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n <!-- MultiSelect control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.MULTISELECT\"\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-multiSelect\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (keyup.enter)=\"applyFilters()\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [appendTo]=\"'body'\"\n [disabled]=\"globalFilter.disabled\"\n ></p-multiSelect>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n <!-- Select Button control -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.SELECTBUTTON\"\n\n >\n <label class=\"\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <p-selectButton\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [(ngModel)]=\"globalFilter.value\"\n [options]=\"globalFilter.data\"\n optionLabel=\"label\"\n (onChange)=\"onFocusOutEvent(globalFilter)\"\n optionValue=\"value\"\n [multiple]=\"globalFilter.displayStyle\"\n [disabled]=\"globalFilter.disabled\" \n >\n <!-- <ng-template let-item pTemplate>\n <i [class]=\"item.icon\"></i>\n </ng-template> -->\n </p-selectButton>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n\n\n\n <!-- Lookup Control Field -->\n <span [hidden]=\"globalFilter.hidden\">\n <div\n class=\"global-filters-filter-div\"\n *ngSwitchCase=\"fiterTypes.LOOKUP_INPUT\"\n >\n <label class=\"global-filters-label\" for=\"basic\">{{ globalFilter.displayText }}\n <span *ngIf=\"globalFilter.requiredField\" [class]=\"'required-star ' + (globalFilter.errorMessage ? ' invalid ' : '')\">*</span>\n </label>\n <div class=\"possible-bulk-update-input-wrapper-div\">\n <div class=\"close-icon-wrapper lookup-filter-wrapper globalFilters\"> \n <input\n [class]=\"globalFilter.errorMessage ? 'ng-invalid ng-dirty' : ''\"\n [id]=\"globalFilter.field\"\n type=\"text\"\n pInputText\n [(ngModel)]=\"globalFilter?.valueTwo?.text ? globalFilter.valueTwo.text : globalFilter.value\"\n (blur)=\"onFocusOutEvent(globalFilter)\"\n [name]=\"globalFilter.field\"\n (keyup.enter)=\"applyFilters()\"\n (click)=\"selectLookupField(globalFilter)\"\n [disabled]=\"globalFilter.disabled\"\n (keyup.Tab)=\"selectLookupField(globalFilter)\"\n (keyup.backspace)=\"removeNullLookup($event, globalFilter)\"\n class=\"form-control lookup-input\"\n />\n <span class=\"p-input-icon-right global-filter\">\n <i class=\"pi pi-chevron-right lookup-input-icon global-filter\"></i>\n </span>\n <div class=\"direct-wrapper-close-icon-lookup\">\n <button tabindex=\"-1\"\n *ngIf=\"globalFilter.value\"\n (click)=\"lookupClearValue(globalFilter);onFocusOutEvent(globalFilter)\"\n icon=\"pi pi-times\"\n pButton\n type=\"button\" \n ></button>\n </div>\n \n </div>\n <div *ngIf=\"globalFilter.interfaceType=='bulkUpdate'\" class=\"p-input-icon-right global-filter bulk-update\" >\n <button tabindex=\"-1\"\n (click)=\"updateValues(globalFilter)\"\n icon=\"fa-regular fa-arrow-down-to-dotted-line\"\n pButton\n type=\"button\" \n ></button>\n </div>\n </div>\n <span *ngIf=\"globalFilter.errorMessage && globalFilter.errorMessage.length > 0\" class=\"error\">{{\n globalFilter.errorMessage\n }}</span>\n </div>\n </span>\n </div>\n </div>\n</div>\n<!-- <span>\n <i icon=\"pi pi-times\"></i>\n</span> -->\n\n<!-- Apply button -->\n\n<button\npButton\n*ngIf=\"!gridUpdate\"\ntype=\"button\"\nicon=\"pi pi-search\"\n[id]=\"searchbtnId\"\n(click)=\"applyFilters()\"\nclass=\"global-search align-globalFilter-btn global-btn hide-filter-button\"\n></button>\n\n<!-- Close button -->\n<button\npButton\n*ngIf=\"!gridUpdate\"\nid=\"clearGlobalFilterBtn\"\ntype=\"button\"\nicon=\"pi pi-replay\"\n(click)=\"clearFilters()\"\nclass=\"hide-filter-button\"\n></button>\n", styles: [":host ::ng-deep .input-number .p-inputnumber-button-group{visibility:hidden}:host ::ng-deep .input-number:hover .p-inputnumber-button-group{visibility:visible}.error{color:red}.hide-filter-button{display:none}\n"] }]
|
|
578
576
|
}], ctorParameters: function () { return [{ type: i1.DatePipe }, { type: i2.DynamicDialogRef, decorators: [{
|
|
579
577
|
type: Optional
|
|
580
578
|
}] }, { type: i2.DynamicDialogConfig, decorators: [{
|
|
@@ -597,4 +595,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImpor
|
|
|
597
595
|
}], activeTestMode: [{
|
|
598
596
|
type: Input
|
|
599
597
|
}] } });
|
|
600
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWtCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFPakUsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQyxJQUFhLGNBQWMsQ0FBRSxHQUFPLElBQUksSUFBRyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQUUsUUFBUSxDQUFBO0tBQUUsQ0FBQSxDQUFDO0lBYXRFLFlBQ1MsUUFBa0IsRUFDTixHQUFxQixFQUNyQixNQUEyQixFQUN0QyxXQUF3QixFQUN6QixhQUE0QixFQUMzQixFQUFjLEVBQ2QsTUFBYztRQU5mLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDTixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FB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QixVQUFVO3NCQUFyQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ2pCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDTSxjQUFjO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7XG4gIElHbG9iYWxGaWx0ZXIsXG4gIEdyaWRGaWx0ZXJDb250cm9sVHlwZSxcbiAgRUdyaWRDb2x1bW5UeXBlLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG59IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLm1vZGVsJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjdXJyZW50VXJsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1nbG9iYWwtZmlsdGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFNlR2xvYmFsRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgncmFuZ2VDYWxlbmRhcicpIGRhdGVQaWNrZXI6IGFueTtcbiAgQElucHV0KCkgZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcltdID0gW107XG4gIEBJbnB1dCgpIHNlYXJjaEdsb2JhbEZpbHRlckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGVhckdsb2JhbEZpbHRlckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncmlkVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBmaWx0ZXJzQXBwbGllZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHNldCBhY3RpdmVUZXN0TW9kZSAodmFsOmFueSkgeyBpZih2YWwgPT09IHRydWUpIHsgZGVidWdnZXIgfX1cbiAgcHVibGljIGZpdGVyVHlwZXMgPSBHcmlkRmlsdGVyQ29udHJvbFR5cGU7XG4gIHB1YmxpYyBjb2x1bW5UeXBlID0gRUdyaWRDb2x1bW5UeXBlO1xuICBwdWJsaWMgc2hvd0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRlUmFuZ2VWYWx1ZSA6IGFueTtcbiAgcHVibGljIHN0YXJ0RGF0ZTogRGF0ZTtcbiAgcHVibGljIGVuZERhdGU6IERhdGU7XG5cbiAgc2hvd0lucHV0OiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlcjogYW55ID0gJyc7XG4gIGhpZGVDbGVhckZpbHRlckJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIGNhbGVuZGFyRm9ybWF0OnN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkYXRlcGlwZTogRGF0ZVBpcGUsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZixcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnLFxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7IH1cblxuICAvKipcbiAgICogQXNzaWdubWVudCBvZiBzZWxlY3RlZCBjb2x1bW5zIG9uIHBhZ2UgbG9hZFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZGF0YSl7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSB0aGlzLmNvbmZpZy5kYXRhLm9wZW5EaWFsb2c7XG4gICAgICBpZih0aGlzLmNvbmZpZy5kYXRhLmdsb2JhbEZpbHRlcnMpe1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMgPSB0aGlzLmNvbmZpZz8uZGF0YS5nbG9iYWxGaWx0ZXJzIGFzIElHbG9iYWxGaWx0ZXJbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuZ2V0TnVtYmVyT2ZDYWxscygpID09PSAxKSB7XG4gICAgICB0aGlzLnNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoYnRuSWQgPSBgRmlsdGVyXyR7Y3VycmVudFVybCgpfV8ke3RoaXMuZ3JpZFNlcnZpY2UuZ2V0TnVtYmVyT2ZDYWxscygpfWBcbiAgICB9XG4gIH1cblxuICBzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2Upe1xuICAgIGlmKGRhdGVSYW5nZT8udmFsdWU/Lmxlbmd0aCA+IDEpe1xuICAgICAgZGF0ZVJhbmdlLnZhbHVlWzBdID0gbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlWzBdKTtcbiAgICAgIGRhdGVSYW5nZS52YWx1ZVsxXSA9ZGF0ZVJhbmdlLnZhbHVlWzFdPT1udWxsPyBuZXcgRGF0ZSgpOiBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMV0pO1xuICAgICAvLyBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMV0pO1xuICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpO1xuICAgIH1lbHNlIHtcbiAgICAgIGlmKHRoaXMuZGF0ZVJhbmdlVmFsdWUpe1xuICAgICAgICBsZXQgZGF0ZVJhbmdlVmFsdWUgPSB0aGlzLmRhdGVSYW5nZVZhbHVlPy5pbmNsdWRlcygnLScpID8gdGhpcy5kYXRlUmFuZ2VWYWx1ZT8uc3BsaXQoJy0nKSA6ICcnO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgKGRhdGVSYW5nZVZhbHVlWzBdLnRyaW0oKSA9PSBkYXRlUmFuZ2VWYWx1ZVsxXS50cmltKCkpKXtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbXVxuICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZVswXSA9IG5ldyBEYXRlKGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpOyAgICAgXG4gICAgICAgIH0gICAgXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICBcbiAgY29udGFpbnNXaGl0ZXNwYWNlKHN0cikge1xuICAgIHJldHVybiBzdHIuaW5jbHVkZXMoJyAnKTtcbiAgfVxuXG4gIGFkZFNwYWNlc2F0Zmlyc3QoeCkge1xuICAgIHJldHVybiBcIiBcIiArIHg7XG4gIH1cblxuICBhZGRTcGFjZXNhdGxhc3QoeCkge1xuICAgIHJldHVybiB4ICsgXCIgXCJcbiAgfVxuXG4gIC8vIGNoYW5nZSBjYWxlbmRhciBmb3JtYXQgb24gcnVuIHRpbWUgaWYgdXNlciB0eXBlIGRhdGUgb24gdGhlIGNhbGVuZGFyIGZpZWxkLlxuICBjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyOklHbG9iYWxGaWx0ZXIsIGV2ZW50PzogYW55KXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dClbMF0/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGE6IGFueSkgPT4ge1xuICAgICAgbGV0IHllYXIgPSBhPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpPy5zcGxpdCgnLycpWzJdO1xuICAgICAgeWVhciA9IHllYXI/LnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgdGhpcy5kYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWVcbiAgICAgIGxldCBkYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCctJykgPyBhPy50YXJnZXQ/LnZhbHVlPy5zcGxpdCgnLScpIDogJyc7XG4gICAgICAvLyBhZGRpbmcgc3BhY2UgYmV0d2VlbiBmcm9tIGFuZCB0byBkYXRlIGluIGRhdGUgcmFuZ2UgZmlsdGVyXG4gICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgZGF0ZVJhbmdlVmFsdWVbMV0uc3BsaXQoJy8nKS5sZW5ndGggPT0gMyAmJiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSB8fCAhdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSkge1xuICAgICAgICAgIGxldCBmcm9tRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRsYXN0KGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVswXSA9IGZyb21EYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSB7XG4gICAgICAgICAgbGV0IHRvRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRmaXJzdChkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgZGF0ZVJhbmdlVmFsdWVbMV0gPSB0b0RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsdWUgPSBkYXRlUmFuZ2VWYWx1ZVswXSArICctJyArIGRhdGVSYW5nZVZhbHVlWzFdXG4gICAgICAgIGEudGFyZ2V0LnZhbHVlID0gYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmKHllYXI/Lmxlbmd0aCA9PT0gNCl7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkNBTEVOREFSKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShhLnRhcmdldC52YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih5ZWFyPy5sZW5ndGgpe1xuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB5ZWFyVmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZT8udG9TdHJpbmcoKT8uc3BsaXQoJy8nKVs0XTtcbiAgICBpZigoIWdsb2JhbEZpbHRlci52YWx1ZSB8fCB5ZWFyVmFsdWUgPT0gdW5kZWZpbmVkIHx8IHllYXJWYWx1ZT8udG9TdHJpbmcoKT8ubGVuZ3RoID09PSAxKSAmJiBnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuICBjaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyOklHbG9iYWxGaWx0ZXIpe1xuICAgIGlmKGZpbHRlci52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWx0ZXIucmVxdWlyZWRGaWVsZD10cnVlO1xuICAgIH0gICAgXG4gIH1cbiAgY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHJlbW92ZUVycm9yOmJvb2xlYW4gPSBmYWxzZSk6Ym9vbGVhbntcbiAgICBsZXQgdmFsaWQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGlmKHRoaXMuZ2xvYmFsRmlsdGVycyAmJiB0aGlzLmdsb2JhbEZpbHRlcnMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgICBpZihmaWx0ZXIudmFsaWRhdGlvbnMgJiYgZmlsdGVyLnZhbGlkYXRpb25zLmxlbmd0aCA+IDAgJiYgZmlsdGVyLnZhbGlkYXRpb25zWzBdLnR5cGUgPT09IEVGaWx0ZXJWYWxpZGF0b3IuUkVRVUlSRUQgJiYgIWZpbHRlci52YWx1ZSAmJiAhcmVtb3ZlRXJyb3Ipe1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBmaWx0ZXIuZXJyb3JNZXNzYWdlID0gZmlsdGVyLmRpc3BsYXlUZXh0K1wiIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpe1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrSWZGaWx0ZXJSZXF1aXJlZChmaWx0ZXIpO1xuICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiAoZmlsdGVyLmhpZGRlbiA9PT0gZmFsc2UgfHwgZmlsdGVyLmhpZGRlbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBzZXQgQnkgRGVmYXVsdCBDYWxlbmRhciBSYW5nZVxuICAgIC8vdGhpcy5zZXREZWZhdWx0Q2FsZW5kYXJSYW5nZShmYWxzZSk7XG4gICAgY29uc3QgZ2lyZENsZWFyRmlsdGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJ1xuICAgICk7XG4gICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bikge1xuICAgICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbicpKSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBzcGxpdGluZyBkYXRlIHJhbmdlIHZhbHVlIGFuZCBhc3NpZ24gdG8gdmFsdWUgYW5kIHZhbHVlVHdvIGluIERhdGVfUmFuZ2UgQ29udHJvbFxuICAgIGNvbnN0IGRhdGVSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKTtcbiAgICBkYXRlUmFuZ2VGaWx0ZXI/LmZvckVhY2goKGRhdGVSYW5nZSkgPT4ge1xuICAgICAgaWYgKGRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZGF0ZVJhbmdlLnZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBkYXRlUmFuZ2UudmFsdWUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoZGF0ZVJhbmdlLnZhbHVlVHdvKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVUd28gPSBkYXRlUmFuZ2UudmFsdWVUd28udG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0ZVJhbmdlLnZhbHVlID0gKGRhdGVSYW5nZS52YWx1ZSArIFwiLVwiICsgZGF0ZVJhbmdlLnZhbHVlVHdvKT8udG9TdHJpbmcoKT8uc3BsaXQoJy0nKTtcbiAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRlUmFuZ2UudmFsdWUgJiYgIWRhdGVSYW5nZS52YWx1ZVR3bykge1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLCBkYXRlUmFuZ2UudmFsdWUsICdndGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZGF0ZVJhbmdlLmZyb21GaWVsZCwgZGF0ZVJhbmdlLnZhbHVlVHdvLCAnZ3RlJyk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBGaWx0cmluZyBOdW1lcmljIFJhbmdlIGNvbnRyb2xzIG9uIGdsb2JhbCBmaWx0ZXIgXG4gICAgY29uc3QgbnVtZXJSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5OVU1FUklDX1JBTkdFKTtcbiAgICBudW1lclJhbmdlRmlsdGVyLmZvckVhY2goKG51bWVyaWNSYW5nZSkgPT4ge1xuICAgICAgaWYgKG51bWVyaWNSYW5nZSkge1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShudW1lcmljUmFuZ2UpO1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlVHdvKG51bWVyaWNSYW5nZSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudG9GaWVsZCl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLCdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIG1hdGNoU2FtZUZpZWxkcyhmaWVsZDogc3RyaW5nLHZhbHVlOmFueSwgb3BlcmF0b3I6c3RyaW5nLCBudW1lclJhbmdlRmlsdGVyOiBhbnkgPSB7fSl7XG4gICAgICBpZihmaWVsZCl7XG4gICAgICAgIGlmKG51bWVyUmFuZ2VGaWx0ZXIgJiYgbnVtZXJSYW5nZUZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgJiYgdmFsdWUpe1xuICAgICAgICAgIGNvbnN0IGRpZ2l0SW5mbyA9IG51bWVyUmFuZ2VGaWx0ZXI/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIGlmKGRpZ2l0SW5mbyl7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKGRpZ2l0SW5mbyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzW2luZGV4XSA9IHtmaWVsZDogZmllbGQsIG1hdGNoTW9kZTonYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWV9OyAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7ZmllbGQ6IGZpZWxkLCBtYXRjaE1vZGU6J2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OmJvb2xlYW4gPSBmYWxzZSkge1xuICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCl7IFxuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCxnbG9iYWxGaWx0ZXIudmFsdWUsJ2d0ZScsIGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9XG4gICAgIH1cbiAgXG4gIH1cbiAgcmVtb3ZlTnVsbExvb2t1cChldmVudDogYW55LCBnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYoIWV2ZW50LnRhcmdldC52YWx1ZSl7XG4gICAgICB0aGlzLmxvb2t1cENsZWFyVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICB9XG4gIH1cbiAgbG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYgKGdsb2JhbEZpbHRlcikge1xuXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPyBnbG9iYWxGaWx0ZXIudmFsdWU9Jyc6JydcbiAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVR3bz9nbG9iYWxGaWx0ZXIudmFsdWVUd289Jyc6JydcbiAgICAgLy8gZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0P2dsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD0nJzonJ1xuICAgICAgLy8gY29sdW1uLmRpc3BsYXlGaWVsZD9yb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0gPSAnJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy50ZXh0PyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udGV4dD0nJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZF0gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAvLyBjb2x1bW4uZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIC8vdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4pO1xuICAgIH1cbiAgIC8vIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XG4gICAvLyBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgLy8gIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xuICAgLy8gfVxuICB9XG5cbiAgc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyOiBhbnksIGNsZWFyVmFsdWU6IGJvb2xlYW4gPWZhbHNlKSB7XG4gICAgaWYoZ2xvYmFsRmlsdGVyLnZhbHVlPy5sZW5ndGggPiAwKXtcbiAgICAgIGNvbnN0IGZyb21EYXRlVmFsdWUgPSB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybShcbiAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlWzBdLFxuICAgICAgICBnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvRGF0ZVZhbHVlID0gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVsxXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbURhdGVWYWx1ZSAmJiB0b0RhdGVWYWx1ZSAmJiBnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkICYmIGdsb2JhbEZpbHRlci50b0ZpZWxkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsZnJvbURhdGVWYWx1ZSwnZ3RlJyk7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLHRvRGF0ZVZhbHVlLCdsdGUnKTtcbiAgICAgIH1cbiAgICB9ZWxzZSBpZihjbGVhclZhbHVlKXtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsIG51bGwsICdndGUnKTtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLCBudWxsLCAnbHRlJyk7XG4gICAgfVxuICB9XG4gIG9uQ2xpY2tFdmVudChnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIpe1xuICAgIGlmKGdsb2JhbEZpbHRlciAmJiBnbG9iYWxGaWx0ZXIub25DbGljayl7XG4gICAgICBnbG9iYWxGaWx0ZXIub25DbGljayhnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIpe1xuICAgIGlmIChnbG9iYWxGaWx0ZXIgJiYgZ2xvYmFsRmlsdGVyLm9uRm9jdXNPdXQpIHtcbiAgICAgIGdsb2JhbEZpbHRlci5vbkZvY3VzT3V0KGdsb2JhbEZpbHRlcik7XG4gICAgfVxuICAgIFxuICAgICAgdGhpcy5uZ1pvbmUub25TdGFibGVcbiAgICAgIC5waXBlKHRha2UoMSkpIC8vIEVtaXQgb25seSBvbmNlIHdoZW4gdGhlIHpvbmUgYmVjb21lcyBzdGFibGVcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWx0ZXIuZmllbGQgJiYgZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFIClcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAgICB9KTtcbiAgfVxuICB1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyOiBJR2xvYmFsRmlsdGVyKXtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUuZW1pdChnbG9iYWxGaWx0ZXIpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzRXZlbnQoKXtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgICAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEFwcGx5IHNlbGVjdGVkIGZpbHRlcnNcbiAgICovXG4gIGFwcGx5RmlsdGVycyhmaWx0ZXJFdmVudDogYm9vbGVhbj0gdHJ1ZSwgZ2xvYmFsRmlsdGVyOmFueSA9IHt9KSB7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPXRydWU7XG4gICAgIGlmKGdsb2JhbEZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcik7XG4gICAgfSBcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmaWx0ZXJFdmVudDtcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgIGlmKGluZGV4ID4gLTEpe1xuICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XG4gICAgaWYgKHRoaXMuc2hvd0RpYWxvZykge1xuICAgICAgdGhpcy5yZWYuY2xvc2UoZ2xvYmFsRmlsdGVycyk7XG4gICAgfSBlbHNlIFxuICAgIGlmKCF0aGlzLmNoZWNrRmlsdGVyVmFsaWRhdGlvbigpKXtcbiAgICAgIHRoaXMuY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHRydWUpO1xuICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBCeSBEZWZhdWx0IENhbGVuZGFyIFJhbmdlIFxuICBzZXREZWZhdWx0Q2FsZW5kYXJSYW5nZShjaGVjazogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJzICYmIHRoaXMuZ2xvYmFsRmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgJiYgZmlsdGVyLmRheVJhbmdlICYmIGZpbHRlci52YWx1ZSAmJiBmaWx0ZXIudmFsdWVUd28pIHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd05leHQoZmlsdGVyLCBjaGVjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvd05leHQoZmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBjaGVjazogYm9vbGVhbiA9IHRydWUpOiBEYXRlW10ge1xuICAgIC8vIGxldCBuZXh0VmFsdWU6IHN0cmluZztcbiAgICBsZXQgbmV4dFZhbHVlOiBEYXRlW11cbiAgICBsZXQgZGF5UmFuZ2U6IEVEYXlSYW5nZSA9IGZpbHRlci5kYXlSYW5nZVxuICAgICAgPyBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgIDogRURheVJhbmdlLldFRUs7XG4gICAgc3dpdGNoIChkYXlSYW5nZSkge1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuREFZOlxuICAgICAgIC8vIG5leHRWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgICAvLyAgbmV4dFZhbHVlID0gdGhpcy5zZXRNb250aEZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLllFQVI6XG4gICAgICAvLyAgbmV4dFZhbHVlID0gdGhpcy5zZXRZZWFyRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gd2Vla1xuICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXRXZWVrRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGZpbHRlci52YWx1ZT0gbmV4dFZhbHVlXG4gICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKVxuICAgICAgICAvL2ZpbHRlci52YWx1ZVR3bz1uZXh0VmFsdWVbMV1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBjaGVjaztcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgIGlmKGluZGV4ID4gLTEpe1xuICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAvLyBsZXQgdGVzdD1uZXh0VmFsdWVcbiAgICAvL2ZpbHRlci52YWx1ZT1uZXh0VmFsdWVcbiAgIFxuICAgIHJldHVybiBuZXh0VmFsdWU7XG4gIH1cblxuICBzaG93UHJldmlvdXMoZmlsdGVyOiBJR2xvYmFsRmlsdGVyKTogRGF0ZVtdIHtcbiAgICBsZXQgcHJldmlvdXNWYWx1ZTogRGF0ZVtdO1xuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgLy8gcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLk1PTlRIOlxuICAgICAvLyAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldE1vbnRoRmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLllFQVI6XG4gICAgICAvLyAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0WWVhckZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB3ZWVrXG4gICAgICAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldFdlZWtGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmaWx0ZXIudmFsdWU9cHJldmlvdXNWYWx1ZVxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKVxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IHRydWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSApXG4gICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdChnbG9iYWxGaWx0ZXJzKTtcbiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAgfVxuXG4gIHNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXI6IElHbG9iYWxGaWx0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAoZmlsdGVyLnZhbHVlID1cbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkgK1xuICAgICAgJ3wnICtcbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLmVuZERhdGUsXG4gICAgICAgIGZpbHRlci5mb3JtYXQgPyBmaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApKTtcbiAgfVxuXG4gIHNldERhdGVWYWx1ZShmaWx0ZXI6IGFueSkge1xuICAgIGxldCB2YWx1ZTogRGF0ZTtcbiAgICBpZiAoZmlsdGVyLnZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKGZpbHRlci52YWx1ZS5zcGxpdCgnfCcpWzBdKTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5zZXRNb250aCh2YWx1ZS5nZXRNb250aCgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERheUZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RGF0ZSgpICsgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50RGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnREYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0WWVhckZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcbiAgICB2YXIgZmlyc3REYXRlT2ZZZWFyID0gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDYWxlbmRhclJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKTtcbiAgfVxuXG4gIHNldE1vbnRoRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIHZhciBmaXJzdERhdGVPZk1vbnRoID0gbmV3IERhdGUoXG4gICAgICBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIDFcbiAgICApO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBmaXJzdERhdGVPZk1vbnRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSAtIDEsXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0V2Vla0ZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IERhdGVbXXtcbiAgICBsZXQgZmlsdGVyVmFsdWU6RGF0ZT0gQXJyYXkuaXNBcnJheShmaWx0ZXIudmFsdWUpPyBmaWx0ZXIudmFsdWVbMF06ZmlsdGVyLnZhbHVlXG4gICAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoZmlsdGVyVmFsdWU/IGZpbHRlclZhbHVlOm5ldyBEYXRlKCkpLy90aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIGxldCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLnNldERhdGUoZmlsdGVyVmFsdWUgPyBjdXJyZW50RGF0ZS5nZXREYXRlKCkgOiBjdXJyZW50RGF0ZS5nZXREYXRlKCkgLSBjdXJyZW50RGF0ZS5nZXREYXkoKSArIDEpKTtcbiAgICBsZXQgd2Vla1NlY29uZHMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBsZXQgdmFsdWU6RGF0ZVxuICAgICAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB2YWx1ZSA9IGZpbHRlclZhbHVlXG4gICAgICAgZmlsdGVyLnZhbHVlXG4gICAgICAgID8gIHZhbHVlLnNldERhdGUoZmlsdGVyVmFsdWUuZ2V0RGF0ZSgpKzcpICAgLy9uZXcgRGF0ZShuZXcgRGF0ZShmaWx0ZXJWYWx1ZSkuZ2V0VGltZSgpICsgd2Vla1NlY29uZHMpXG4gICAgICAgIDogdmFsdWU9IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBmaWx0ZXIudmFsdWVcbiAgICAgICAgP25ldyBEYXRlKGZpbHRlclZhbHVlLmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKVxuICAgICAgICA6IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKVxuICAgIH1cbiAgICAvL3RoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldFRpbWUoKSArIDYgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICAvLyBsZXQgdmFsdWU6RGF0ZT1maWx0ZXJWYWx1ZT9cbiAgICAvLyAgIGlzTmV4dD9uZXcgRGF0ZShmaWx0ZXJWYWx1ZS5nZXRUaW1lKCkgKyB3ZWVrU2Vjb25kcyk6bmV3IERhdGUoZmlsdGVyVmFsdWUuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpOlxuICAgIC8vICAgaXNOZXh0P25ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSk6bmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG5cbiAgICBsZXQgdmFsdWVUd286RGF0ZT1uZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7IFxuICAgLy8gY29uc29sZS5sb2coJ3Rlc3QnLHZhbHVlLCd0ZXN0MicsdmFsdWVUd28pXG4gICAgcmV0dXJuIFt2YWx1ZSwgdmFsdWVUd29dXG4gICAvL3JldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgICAgc2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcikgeyAgIFxuXG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldExvb2tVcEZpbHRlcihnbG9iYWxGaWx0ZXJzLCB0aGlzLmRpYWxvZ1NlcnZpY2UsIHRydWUpO1xuICAgIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoaXRlbSk9PntcbiAgICAgIGlmKGl0ZW0udHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkxPT0tVUF9JTlBVVCAmJiBpdGVtPy52YWx1ZVR3bz8udGV4dCl7XG4gICAgICAgIGl0ZW0udmFsdWVUd28gPSBudWxsO1xuICAgICAgfVxuICAgICAgaXRlbS52YWx1ZSA9IG51bGw7XG4gICAgfSlcbiAgICBjb25zdCBjbGVhckdyaWRGaWx0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJylcbiAgICBpZihjbGVhckdyaWRGaWx0ZXIpe1xuICAgICAgY2xlYXJHcmlkRmlsdGVyLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgKiBDbGVhciB2YWx1ZXMgb2YgRGF0ZSBSYW5nZSBGaWx0ZXJcbiAgICovXG4gICAgY2xlYXJEYXRlUmFuZ2VWYWx1ZShmaWx0ZXI6IGFueSl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlKGZpbHRlciwgdHJ1ZSlcbiAgICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGRpYWxvZyB3aXRob3V0IGFwcGx5aW5nIGZpbHRlcnNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gIH1cbiAgcmFuZ2VEYXRlY2xvc2UoZWxlbWVudCkgeyAgXG4gICAgdGhpcy5kYXRlUGlja2VyLmhpZGVPdmVybGF5KCk7XG4gICAgdGhpcy5kYXRlUGlja2VyLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kYXRlUGlja2VyLmRhdGVwaWNrZXJDbGljayA9IHRydWU7XG4gICAgLy8gY29uc3QgaWQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCk7XG4gICAgLy8gY29uc29sZS5sb2coaWQsICBlbGVtZW50LmVsLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkKS8vZWxlbWVudCwgaWQgLFxuICAgIC8vIGlkLmZvY3VzKCk7XG4gICAgZWxlbWVudC5lbC5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5mb2N1cygpO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5kYXRlcGlja2VyQ2xpY2sgPSB0cnVlO1xuXG4gIH1cblxuICBmaWx0ZXJJbnB1dCgpIHtcbiAgICB0aGlzLnNob3dJbnB1dCA9ICF0aGlzLnNob3dJbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VkIHRoZSBjYWxlbmRhciBpbnB1dFxuICAgKi9cbiAgc2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXI6IGFueSwgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlLCBldmVudD86YW55KXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudmFsdWU/Lmxlbmd0aCA+IDEgJiYgZ2xvYmFsRmlsdGVyLnZhbHVlWzFdICE9PSBudWxsKXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICAgIGlmKGZvY3VzZWQgPT10cnVlKXtcbiAgICAgIHRoaXMucmFuZ2VEYXRlY2xvc2UoZXZlbnQpOyBcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZm9jdXNlZCl7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZmllbGQpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuICB0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcjogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicrZ2xvYmFsRmlsdGVyLmZpZWxkXG4gICAgKTtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUuY2xpY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1jb21wb25lbnQtd3JhcHBlci1kaXZcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuaGlkZGVuID8gJ2dsb2JhbEZpbHRlckhpZGRlbicgOiBnbG9iYWxGaWx0ZXIuY29sdW1uID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtbiA6ICdjb2wtMydcIlxuICAgICpuZ0Zvcj1cImxldCBnbG9iYWxGaWx0ZXIgb2YgZ2xvYmFsRmlsdGVyc1wiXG4gID5cbiAgICA8ZGl2IFtuZ1N3aXRjaF09XCJnbG9iYWxGaWx0ZXIudHlwZVwiPlxuICAgICAgPCEtLSBDYWxlbmRhciBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0OiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0LURhdGUnXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCIgPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIENhbGVuZGFyIFJhbmdlIC0tPlxuICAgICAgPCEtLSA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJfUkFOR0VcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93UHJldmlvdXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICAgICAgfX0gPDxcIiBcbiAgICAgICAgICAgID4gLS0+XG4gICAgICAgICAgICA8IS0tIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogZ2xvYmFsRmlsdGVyLmNvbG9yID8gZ2xvYmFsRmlsdGVyLmNvbG9yIDogJyd9XCIgLS0+XG4gICAgICAgICAgPCEtLSA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT10cnVlIHx8IGdsb2JhbEZpbHRlci5wcmVmaXg9PT11bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICB7eyAgZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA/IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgOiAnJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICA8IS0tIHt7XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiAoZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eScpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHRvXG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZVxuICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgIDogKGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknKVxuICAgICAgICAgICAgICB9fSAtLT5cbiAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT1mYWxzZVwiPlxuICAgICAgICAgICAgICAgIHt7IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgPyBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0IDogJyd9fVxuICAgICAgICAgICAgICA8L3NwYW4+PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd05leHQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTmV4dCB7e1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5kYXlSYW5nZSA/IGdsb2JhbEZpbHRlci5kYXlSYW5nZSA6ICdXZWVrJ1xuICAgICAgICAgICAgICB9fSA+PlwiXG4gICAgICAgICAgICA+IC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwhLS0gPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgIDwhLS0gQ2hlY2tib3ggQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNIRUNLQk9YXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSc6ICdmbGV4IGFsaWduLWl0ZW1zLWNlbnRlcidcIlxuICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25DbGlja0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5TUEFDRVJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIERyb3Bkb3duIENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIiAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5EUk9QRE9XTlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAoa2V5dXAuVGFiKT1cInRhYkZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YSB8fCBbXVwiXG4gICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnbG9iYWxGaWx0ZXIub3B0aW9uTGFiZWxcIlxuICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdPVwiZ2xvYmFsRmlsdGVyLm9wdGlvblZhbHVlXCJcbiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJnbG9iYWxGaWx0ZXIuYWxsb3dTZWFyY2hcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiA+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gSW5wdXQgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLklOUFVUXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZmlsdGVyaW5nXCI+XG4gICAgICAgICAgICAgIDxzZS1maWx0ZXItbWVudSBbZ2xvYmFsRmlsdGVyXT1cImdsb2JhbEZpbHRlclwiPjwvc2UtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDwhLS0gTnVtZXJpY0lucHV0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTlVNRVJJQ0lOUFVUXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyIHBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIERhdGUgUmFuZ2UgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHJhbmdlLWNhbGVuZGFyIGdhcC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmRheVJhbmdlXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1yYW5nZS1idG4gIGNhbGVuZGFyLXByZXZpb3VzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dQcmV2aW91cyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCI8PFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIFwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICB9fSA8PFwiIC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXIgXG4gICAgICAgICAgICAjcmFuZ2VDYWxlbmRhclxuICAgICAgICAgICAgW3Nob3dCdXR0b25CYXJdPVwidHJ1ZVwiXG5cbiAgICAgICAgICAgIFtpbnB1dElkXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgOiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIiBcbiAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU9XCJyYW5nZVwiIFxuICAgICAgICAgICAgW3NlbGVjdE90aGVyTW9udGhzXT1cInRydWVcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3REYXRlKGdsb2JhbEZpbHRlciwgdHJ1ZSwgcmFuZ2VDYWxlbmRhcilcIlxuICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgKG9uQ2xvc2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQ2xpY2tPdXRzaWRlKT1cInNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQmx1cik9XCJzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsZWFyQ2xpY2spPVwiY2xlYXJEYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycyh0cnVlLCBnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZGF5UmFuZ2VcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1yYW5nZS1idG4gY2FsZW5kYXItbmV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd05leHQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBsYWJlbD1cIj4+XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPCEtLSBOZXh0IHt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICB9fSA+PlwiIC0tPlxuICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8IS0tIHRvZGF5QnV0dG9uU3R5bGVDbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICBjbGVhckJ1dHRvblN0eWxlQ2xhc3M9XCJtbC1hdXRvXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWMgUmFuZ2UgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5OVU1FUklDX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgIGdyb3ctMSBpbnB1dC1udW1iZXInXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG8tbnVtZXJpYyBtci0yXCI+VG88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVUd29cIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXIsdHJ1ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTVVMVElTRUxFQ1RcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuU0VMRUNUQlVUVE9OXCJcblxuICAgICAgICA+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YVwiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlTdHlsZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICBcbiAgICAgICAgPlxuICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cbiAgICAgIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG5cblxuICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5MT09LVVBfSU5QVVRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgbG9va3VwLWZpbHRlci13cmFwcGVyIGdsb2JhbEZpbHRlcnNcIj4gXG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXI/LnZhbHVlVHdvPy50ZXh0ID8gZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLnRleHQgOiBnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5UYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmJhY2tzcGFjZSk9XCJyZW1vdmVOdWxsTG9va3VwKCRldmVudCwgZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hldnJvbi1yaWdodCBsb29rdXAtaW5wdXQtaWNvbiBnbG9iYWwtZmlsdGVyXCI+PC9pPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXJlY3Qtd3JhcHBlci1jbG9zZS1pY29uLWxvb2t1cFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJsb29rdXBDbGVhclZhbHVlKGdsb2JhbEZpbHRlcik7b25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCIgPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8c3Bhbj5cbiAgPGkgIGljb249XCJwaSBwaS10aW1lc1wiPjwvaT5cbjwvc3Bhbj4gLS0+XG5cbjwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuXG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXNlYXJjaFwiXG5baWRdPVwic2VhcmNoYnRuSWRcIlxuKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCJcbmNsYXNzPVwiZ2xvYmFsLXNlYXJjaCBhbGlnbi1nbG9iYWxGaWx0ZXItYnRuIGdsb2JhbC1idG4gaGlkZS1maWx0ZXItYnV0dG9uXCJcbj48L2J1dHRvbj5cblxuPCEtLSBDbG9zZSBidXR0b24gLS0+XG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbmlkPVwiY2xlYXJHbG9iYWxGaWx0ZXJCdG5cIlxudHlwZT1cImJ1dHRvblwiXG5pY29uPVwicGkgcGktcmVwbGF5XCJcbihjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG5jbGFzcz1cImhpZGUtZmlsdGVyLWJ1dHRvblwiXG4+PC9idXR0b24+XG4iXX0=
|
|
598
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLWZpbHRlcnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2UtdWktdG9vbGtpdC9zcmMvbGliL2NvbXBvbmVudHMvc2hhcmVkL2dsb2JhbC1maWx0ZXJzL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NlLXVpLXRvb2xraXQvc3JjL2xpYi9jb21wb25lbnRzL3NoYXJlZC9nbG9iYWwtZmlsdGVycy9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWtCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsZUFBZSxFQUNmLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFPakUsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQyxJQUFhLGNBQWMsQ0FBRSxHQUFPLElBQUksSUFBRyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQUUsUUFBUSxDQUFBO0tBQUUsQ0FBQSxDQUFDO0lBYXRFLFlBQ1MsUUFBa0IsRUFDTixHQUFxQixFQUNyQixNQUEyQixFQUN0QyxXQUF3QixFQUN6QixhQUE0QixFQUMzQixFQUFjLEVBQ2QsTUFBYztRQU5mLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDTixRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUN0QyxnQkFBVyxHQUFYLFdBQVcsQ0FB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LGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDTSxjQUFjO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmLCBEeW5hbWljRGlhbG9nQ29uZmlnLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcbmltcG9ydCB7XG4gIElHbG9iYWxGaWx0ZXIsXG4gIEdyaWRGaWx0ZXJDb250cm9sVHlwZSxcbiAgRUdyaWRDb2x1bW5UeXBlLFxuICBFRGF5UmFuZ2UsXG4gIEVGaWx0ZXJWYWxpZGF0b3IsXG59IGZyb20gJy4uLy4uLy4uL21vZGVscy9ncmlkLm1vZGVsJztcbmltcG9ydCB7IEdyaWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZ3JpZC5zZXJ2aWNlJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBjdXJyZW50VXJsIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzZS1nbG9iYWwtZmlsdGVycycsXG4gIHRlbXBsYXRlVXJsOiAnLi9nbG9iYWwtZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dsb2JhbC1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFNlR2xvYmFsRmlsdGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZCgncmFuZ2VDYWxlbmRhcicpIGRhdGVQaWNrZXI6IGFueTtcbiAgQElucHV0KCkgZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcltdID0gW107XG4gIEBJbnB1dCgpIHNlYXJjaEdsb2JhbEZpbHRlckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjbGVhckdsb2JhbEZpbHRlckJ0bjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBncmlkVXBkYXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBmaWx0ZXJzQXBwbGllZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSB1cGRhdGVWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBJbnB1dCgpIHNldCBhY3RpdmVUZXN0TW9kZSAodmFsOmFueSkgeyBpZih2YWwgPT09IHRydWUpIHsgZGVidWdnZXIgfX1cbiAgcHVibGljIGZpdGVyVHlwZXMgPSBHcmlkRmlsdGVyQ29udHJvbFR5cGU7XG4gIHB1YmxpYyBjb2x1bW5UeXBlID0gRUdyaWRDb2x1bW5UeXBlO1xuICBwdWJsaWMgc2hvd0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xuICBkYXRlUmFuZ2VWYWx1ZSA6IGFueTtcbiAgcHVibGljIHN0YXJ0RGF0ZTogRGF0ZTtcbiAgcHVibGljIGVuZERhdGU6IERhdGU7XG5cbiAgc2hvd0lucHV0OiBib29sZWFuID0gZmFsc2U7XG4gIGZpbHRlcjogYW55ID0gJyc7XG4gIGhpZGVDbGVhckZpbHRlckJ0bjogYm9vbGVhbiA9IHRydWU7XG4gIGNhbGVuZGFyRm9ybWF0OnN0cmluZyA9ICdtbS9kZC95eSc7XG4gIHNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBkYXRlcGlwZTogRGF0ZVBpcGUsXG4gICAgQE9wdGlvbmFsKCkgcHVibGljIHJlZjogRHluYW1pY0RpYWxvZ1JlZixcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgY29uZmlnOiBEeW5hbWljRGlhbG9nQ29uZmlnLFxuICAgIHByaXZhdGUgZ3JpZFNlcnZpY2U6IEdyaWRTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIHByaXZhdGUgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgKSB7IH1cblxuICAvKipcbiAgICogQXNzaWdubWVudCBvZiBzZWxlY3RlZCBjb2x1bW5zIG9uIHBhZ2UgbG9hZFxuICAgKi9cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuZGF0YSl7XG4gICAgICB0aGlzLnNob3dEaWFsb2cgPSB0aGlzLmNvbmZpZy5kYXRhLm9wZW5EaWFsb2c7XG4gICAgICBpZih0aGlzLmNvbmZpZy5kYXRhLmdsb2JhbEZpbHRlcnMpe1xuICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMgPSB0aGlzLmNvbmZpZz8uZGF0YS5nbG9iYWxGaWx0ZXJzIGFzIElHbG9iYWxGaWx0ZXJbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZFNlcnZpY2UuZ2V0TnVtYmVyT2ZDYWxscygpID09PSAxKSB7XG4gICAgICB0aGlzLnNlYXJjaGJ0bklkID0gJ3NlYXJjaEdsb2JhbEZpbHRlckJ0bic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoYnRuSWQgPSBgRmlsdGVyXyR7Y3VycmVudFVybCgpfV8ke3RoaXMuZ3JpZFNlcnZpY2UuZ2V0TnVtYmVyT2ZDYWxscygpfWBcbiAgICB9XG4gIH1cblxuICBzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2Upe1xuICAgIGlmKGRhdGVSYW5nZT8udmFsdWU/Lmxlbmd0aCA+IDEpe1xuICAgICAgZGF0ZVJhbmdlLnZhbHVlWzBdID0gbmV3IERhdGUoZGF0ZVJhbmdlLnZhbHVlWzBdKTtcbiAgICAgIGRhdGVSYW5nZS52YWx1ZVsxXSA9ZGF0ZVJhbmdlLnZhbHVlWzFdPT1udWxsPyBuZXcgRGF0ZSgpOiBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMV0pO1xuICAgICAvLyBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2UudmFsdWVbMV0pO1xuICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpO1xuICAgIH1lbHNlIHtcbiAgICAgIGlmKHRoaXMuZGF0ZVJhbmdlVmFsdWUpe1xuICAgICAgICBsZXQgZGF0ZVJhbmdlVmFsdWUgPSB0aGlzLmRhdGVSYW5nZVZhbHVlPy5pbmNsdWRlcygnLScpID8gdGhpcy5kYXRlUmFuZ2VWYWx1ZT8uc3BsaXQoJy0nKSA6ICcnO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgKGRhdGVSYW5nZVZhbHVlWzBdLnRyaW0oKSA9PSBkYXRlUmFuZ2VWYWx1ZVsxXS50cmltKCkpKXtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBbXVxuICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZVswXSA9IG5ldyBEYXRlKGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVbMV0gPSBuZXcgRGF0ZShkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgdGhpcy5zZWxlY3REYXRlKGRhdGVSYW5nZSwgZmFsc2UpOyAgICAgXG4gICAgICAgIH0gICAgXG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICBcbiAgY29udGFpbnNXaGl0ZXNwYWNlKHN0cikge1xuICAgIHJldHVybiBzdHIuaW5jbHVkZXMoJyAnKTtcbiAgfVxuXG4gIGFkZFNwYWNlc2F0Zmlyc3QoeCkge1xuICAgIHJldHVybiBcIiBcIiArIHg7XG4gIH1cblxuICBhZGRTcGFjZXNhdGxhc3QoeCkge1xuICAgIHJldHVybiB4ICsgXCIgXCJcbiAgfVxuXG4gIC8vIGNoYW5nZSBjYWxlbmRhciBmb3JtYXQgb24gcnVuIHRpbWUgaWYgdXNlciB0eXBlIGRhdGUgb24gdGhlIGNhbGVuZGFyIGZpZWxkLlxuICBjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyOklHbG9iYWxGaWx0ZXIsIGV2ZW50PzogYW55KXtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dClbMF0/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGE6IGFueSkgPT4ge1xuICAgICAgbGV0IHllYXIgPSBhPy50YXJnZXQ/LnZhbHVlPy50b1N0cmluZygpPy5zcGxpdCgnLycpWzJdO1xuICAgICAgeWVhciA9IHllYXI/LnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgdGhpcy5kYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWVcbiAgICAgIGxldCBkYXRlUmFuZ2VWYWx1ZSA9IGE/LnRhcmdldD8udmFsdWU/LmluY2x1ZGVzKCctJykgPyBhPy50YXJnZXQ/LnZhbHVlPy5zcGxpdCgnLScpIDogJyc7XG4gICAgICAvLyBhZGRpbmcgc3BhY2UgYmV0d2VlbiBmcm9tIGFuZCB0byBkYXRlIGluIGRhdGUgcmFuZ2UgZmlsdGVyXG4gICAgICBpZiAoZGF0ZVJhbmdlVmFsdWUubGVuZ3RoID09IDIgJiYgZGF0ZVJhbmdlVmFsdWVbMV0uc3BsaXQoJy8nKS5sZW5ndGggPT0gMyAmJiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSB8fCAhdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGFpbnNXaGl0ZXNwYWNlKGRhdGVSYW5nZVZhbHVlWzBdKSkge1xuICAgICAgICAgIGxldCBmcm9tRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRsYXN0KGRhdGVSYW5nZVZhbHVlWzBdKTtcbiAgICAgICAgICBkYXRlUmFuZ2VWYWx1ZVswXSA9IGZyb21EYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5jb250YWluc1doaXRlc3BhY2UoZGF0ZVJhbmdlVmFsdWVbMV0pKSB7XG4gICAgICAgICAgbGV0IHRvRGF0ZSA9IHRoaXMuYWRkU3BhY2VzYXRmaXJzdChkYXRlUmFuZ2VWYWx1ZVsxXSk7XG4gICAgICAgICAgZGF0ZVJhbmdlVmFsdWVbMV0gPSB0b0RhdGU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFsdWUgPSBkYXRlUmFuZ2VWYWx1ZVswXSArICctJyArIGRhdGVSYW5nZVZhbHVlWzFdXG4gICAgICAgIGEudGFyZ2V0LnZhbHVlID0gYWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmKHllYXI/Lmxlbmd0aCA9PT0gNCl7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGb3JtYXQgPSAnbW0vZGQveXknO1xuICAgICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkNBTEVOREFSKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPSBuZXcgRGF0ZShhLnRhcmdldC52YWx1ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKFwiZW4tVVNcIik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZih5ZWFyPy5sZW5ndGgpe1xuICAgICAgICB0aGlzLmNhbGVuZGFyRm9ybWF0ID0gJ21tL2RkL3knO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGxldCB5ZWFyVmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZT8udG9TdHJpbmcoKT8uc3BsaXQoJy8nKVs0XTtcbiAgICBpZigoIWdsb2JhbEZpbHRlci52YWx1ZSB8fCB5ZWFyVmFsdWUgPT0gdW5kZWZpbmVkIHx8IHllYXJWYWx1ZT8udG9TdHJpbmcoKT8ubGVuZ3RoID09PSAxKSAmJiBnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0Upe1xuICAgICAgdGhpcy5zZXREYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIsIHRydWUpO1xuICAgIH1cbiAgfVxuICBjaGVja0lmRmlsdGVyUmVxdWlyZWQoZmlsdGVyOklHbG9iYWxGaWx0ZXIpe1xuICAgIGlmKGZpbHRlci52YWxpZGF0aW9ucz8uZmluZCh2YWxpZGF0aW9uPT52YWxpZGF0aW9uLnR5cGU9PT1FRmlsdGVyVmFsaWRhdG9yLlJFUVVJUkVEKSl7XG4gICAgICBmaWx0ZXIucmVxdWlyZWRGaWVsZD10cnVlO1xuICAgIH0gICAgXG4gIH1cbiAgY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHJlbW92ZUVycm9yOmJvb2xlYW4gPSBmYWxzZSk6Ym9vbGVhbntcbiAgICBsZXQgdmFsaWQ6Ym9vbGVhbiA9IGZhbHNlO1xuICAgIGlmKHRoaXMuZ2xvYmFsRmlsdGVycyAmJiB0aGlzLmdsb2JhbEZpbHRlcnMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKT0+e1xuICAgICAgICBpZihmaWx0ZXIudmFsaWRhdGlvbnMgJiYgZmlsdGVyLnZhbGlkYXRpb25zLmxlbmd0aCA+IDAgJiYgZmlsdGVyLnZhbGlkYXRpb25zWzBdLnR5cGUgPT09IEVGaWx0ZXJWYWxpZGF0b3IuUkVRVUlSRUQgJiYgIWZpbHRlci52YWx1ZSAmJiAhcmVtb3ZlRXJyb3Ipe1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICBmaWx0ZXIuZXJyb3JNZXNzYWdlID0gZmlsdGVyLmRpc3BsYXlUZXh0K1wiIGlzIHJlcXVpcmVkXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsdGVyLmVycm9yTWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQ7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpe1xuICAgIHRoaXMuZ2xvYmFsRmlsdGVycz8uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrSWZGaWx0ZXJSZXF1aXJlZChmaWx0ZXIpO1xuICAgICAgaWYgKGZpbHRlci52YWx1ZSAmJiAoZmlsdGVyLmhpZGRlbiA9PT0gZmFsc2UgfHwgZmlsdGVyLmhpZGRlbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICB0aGlzLmFwcGx5RmlsdGVyc0V2ZW50KCk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBzZXQgQnkgRGVmYXVsdCBDYWxlbmRhciBSYW5nZVxuICAgIC8vdGhpcy5zZXREZWZhdWx0Q2FsZW5kYXJSYW5nZShmYWxzZSk7XG4gICAgY29uc3QgZ2lyZENsZWFyRmlsdGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXG4gICAgICAnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJ1xuICAgICk7XG4gICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bikge1xuICAgICAgaWYgKGdpcmRDbGVhckZpbHRlckJ0bi5jbGFzc0xpc3QuY29udGFpbnMoJ2hpZGUtY2xlYXItZmlsdGVyLWJ1dHRvbicpKSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGlkZUNsZWFyRmlsdGVyQnRuID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBzcGxpdGluZyBkYXRlIHJhbmdlIHZhbHVlIGFuZCBhc3NpZ24gdG8gdmFsdWUgYW5kIHZhbHVlVHdvIGluIERhdGVfUmFuZ2UgQ29udHJvbFxuICAgIGNvbnN0IGRhdGVSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5EQVRFX1JBTkdFKTtcbiAgICBkYXRlUmFuZ2VGaWx0ZXI/LmZvckVhY2goKGRhdGVSYW5nZSkgPT4ge1xuICAgICAgaWYgKGRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgaWYgKHR5cGVvZiAoZGF0ZVJhbmdlLnZhbHVlKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWUgPSBkYXRlUmFuZ2UudmFsdWUudG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiAoZGF0ZVJhbmdlLnZhbHVlVHdvKSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBkYXRlUmFuZ2UudmFsdWVUd28gPSBkYXRlUmFuZ2UudmFsdWVUd28udG9Mb2NhbGVEYXRlU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0ZVJhbmdlLnZhbHVlID0gKGRhdGVSYW5nZS52YWx1ZSArIFwiLVwiICsgZGF0ZVJhbmdlLnZhbHVlVHdvKT8udG9TdHJpbmcoKT8uc3BsaXQoJy0nKTtcbiAgICAgICAgdGhpcy5zZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShkYXRlUmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmIChkYXRlUmFuZ2UudmFsdWUgJiYgIWRhdGVSYW5nZS52YWx1ZVR3bykge1xuICAgICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhkYXRlUmFuZ2UuZnJvbUZpZWxkLCBkYXRlUmFuZ2UudmFsdWUsICdndGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZS52YWx1ZSAmJiBkYXRlUmFuZ2UudmFsdWVUd28pIHtcbiAgICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZGF0ZVJhbmdlLmZyb21GaWVsZCwgZGF0ZVJhbmdlLnZhbHVlVHdvLCAnZ3RlJyk7XG4gICAgICB9XG4gICAgfSlcbiAgICAvLyBGaWx0cmluZyBOdW1lcmljIFJhbmdlIGNvbnRyb2xzIG9uIGdsb2JhbCBmaWx0ZXIgXG4gICAgY29uc3QgbnVtZXJSYW5nZUZpbHRlciA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maWx0ZXIoKGZpbHRlcikgPT4gZmlsdGVyLnR5cGUgPT09IEdyaWRGaWx0ZXJDb250cm9sVHlwZS5OVU1FUklDX1JBTkdFKTtcbiAgICBudW1lclJhbmdlRmlsdGVyLmZvckVhY2goKG51bWVyaWNSYW5nZSkgPT4ge1xuICAgICAgaWYgKG51bWVyaWNSYW5nZSkge1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShudW1lcmljUmFuZ2UpO1xuICAgICAgICB0aGlzLnNldE51bWVyaWNSYW5nZVZhbHVlVHdvKG51bWVyaWNSYW5nZSk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlVHdvKGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlciwgc2VuZFJlcXVlc3Q6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudG9GaWVsZCl7XG4gICAgICB0aGlzLm1hdGNoU2FtZUZpZWxkcyhnbG9iYWxGaWx0ZXIudG9GaWVsZCwgZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLCdsdGUnLCBnbG9iYWxGaWx0ZXIpO1xuICAgIH1cbiAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICB0aGlzLmFwcGx5RmlsdGVycygpO1xuICAgIH1cbiAgfVxuXG4gIG1hdGNoU2FtZUZpZWxkcyhmaWVsZDogc3RyaW5nLHZhbHVlOmFueSwgb3BlcmF0b3I6c3RyaW5nLCBudW1lclJhbmdlRmlsdGVyOiBhbnkgPSB7fSl7XG4gICAgICBpZihmaWVsZCl7XG4gICAgICAgIGlmKG51bWVyUmFuZ2VGaWx0ZXIgJiYgbnVtZXJSYW5nZUZpbHRlcj8uZm9ybWF0Py50eXBlID09PSAnZGVjaW1hbCcgJiYgdmFsdWUpe1xuICAgICAgICAgIGNvbnN0IGRpZ2l0SW5mbyA9IG51bWVyUmFuZ2VGaWx0ZXI/LmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvO1xuICAgICAgICAgIGlmKGRpZ2l0SW5mbyl7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKGRpZ2l0SW5mbyk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpPy50b0ZpeGVkKDIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZ2xvYmFsRmlsdGVycy5maW5kSW5kZXgoKGZpbHRlcik9PiBmaWVsZCA9PT0gZmlsdGVyLmZpZWxkKTtcbiAgICAgICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICAgICAgdGhpcy5nbG9iYWxGaWx0ZXJzW2luZGV4XSA9IHtmaWVsZDogZmllbGQsIG1hdGNoTW9kZTonYW5kJywgb3BlcmF0b3I6IG9wZXJhdG9yLCB2YWx1ZTogdmFsdWV9OyAgICAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdsb2JhbEZpbHRlcnMucHVzaCh7ZmllbGQ6IGZpZWxkLCBtYXRjaE1vZGU6J2FuZCcsIG9wZXJhdG9yOiBvcGVyYXRvciwgdmFsdWU6IHZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIHNldE51bWVyaWNSYW5nZVZhbHVlRnJvbShnbG9iYWxGaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIHNlbmRSZXF1ZXN0OmJvb2xlYW4gPSBmYWxzZSkge1xuICAgICBpZihnbG9iYWxGaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLk5VTUVSSUNfUkFOR0UgJiYgZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCl7IFxuICAgICAgdGhpcy5tYXRjaFNhbWVGaWVsZHMoZ2xvYmFsRmlsdGVyLmZyb21GaWVsZCxnbG9iYWxGaWx0ZXIudmFsdWUsJ2d0ZScsIGdsb2JhbEZpbHRlcik7XG4gICAgICBpZihzZW5kUmVxdWVzdCl7XG4gICAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgICB9XG4gICAgIH1cbiAgXG4gIH1cbiAgcmVtb3ZlTnVsbExvb2t1cChldmVudDogYW55LCBnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYoIWV2ZW50LnRhcmdldC52YWx1ZSl7XG4gICAgICB0aGlzLmxvb2t1cENsZWFyVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICB9XG4gIH1cbiAgbG9va3VwQ2xlYXJWYWx1ZShnbG9iYWxGaWx0ZXI6IGFueSl7XG4gICAgaWYgKGdsb2JhbEZpbHRlcikge1xuXG4gICAgICBnbG9iYWxGaWx0ZXIudmFsdWUgPyBnbG9iYWxGaWx0ZXIudmFsdWU9Jyc6JydcbiAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVR3bz9nbG9iYWxGaWx0ZXIudmFsdWVUd289Jyc6JydcbiAgICAgLy8gZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0P2dsb2JhbEZpbHRlci5kaXNwbGF5VGV4dD0nJzonJ1xuICAgICAgLy8gY29sdW1uLmRpc3BsYXlGaWVsZD9yb3dbY29sdW1uLmRpc3BsYXlGaWVsZF0gPSAnJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZCsnX29iaiddPy50ZXh0PyByb3dbY29sdW1uLmZpZWxkKydfb2JqJ10udGV4dD0nJzonJ1xuICAgICAgLy8gcm93W2NvbHVtbi5maWVsZF0gPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAvLyBjb2x1bW4uZmlsdGVyVmFsdWUgPSAnJztcbiAgICAgIC8vdGhpcy5zZXRGaWx0ZXJGb2N1c091dChjb2x1bW4pO1xuICAgIH1cbiAgIC8vIHRoaXMuYnJvd3NlckNsb3NlRXZlbnQodHJ1ZSk7XG4gICAvLyBpZiAoY29sdW1uLm9uQ2hhbmdlKSB7XG4gICAgLy8gIGNvbHVtbi5vbkNoYW5nZShyb3cpO1xuICAgLy8gfVxuICB9XG5cbiAgc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyOiBhbnksIGNsZWFyVmFsdWU6IGJvb2xlYW4gPWZhbHNlKSB7XG4gICAgaWYoZ2xvYmFsRmlsdGVyLnZhbHVlPy5sZW5ndGggPiAwKXtcbiAgICAgIGNvbnN0IGZyb21EYXRlVmFsdWUgPSB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybShcbiAgICAgICAgZ2xvYmFsRmlsdGVyLnZhbHVlWzBdLFxuICAgICAgICBnbG9iYWxGaWx0ZXIuZm9ybWF0ID8gZ2xvYmFsRmlsdGVyLmZvcm1hdCA6ICdNTS9kZC95eXl5J1xuICAgICAgKTtcbiAgICAgIGNvbnN0IHRvRGF0ZVZhbHVlID0gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0oXG4gICAgICAgIGdsb2JhbEZpbHRlci52YWx1ZVsxXSxcbiAgICAgICAgZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICk7XG4gICAgICBpZiAoZnJvbURhdGVWYWx1ZSAmJiB0b0RhdGVWYWx1ZSAmJiBnbG9iYWxGaWx0ZXIuZnJvbUZpZWxkICYmIGdsb2JhbEZpbHRlci50b0ZpZWxkKSB7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsZnJvbURhdGVWYWx1ZSwnZ3RlJyk7XG4gICAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLHRvRGF0ZVZhbHVlLCdsdGUnKTtcbiAgICAgIH1cbiAgICB9ZWxzZSBpZihjbGVhclZhbHVlKXtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci5mcm9tRmllbGQsIG51bGwsICdndGUnKTtcbiAgICAgIHRoaXMubWF0Y2hTYW1lRmllbGRzKGdsb2JhbEZpbHRlci50b0ZpZWxkLCBudWxsLCAnbHRlJyk7XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcjogSUdsb2JhbEZpbHRlcikge1xuICAgIGlmIChnbG9iYWxGaWx0ZXIgJiYgZ2xvYmFsRmlsdGVyLm9uQ2xpY2spIHtcbiAgICAgIGdsb2JhbEZpbHRlci5vbkNsaWNrKGdsb2JhbEZpbHRlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdsb2JhbEZpbHRlciAmJiBnbG9iYWxGaWx0ZXIub25Gb2N1c091dCkge1xuICAgICAgZ2xvYmFsRmlsdGVyLm9uRm9jdXNPdXQoZ2xvYmFsRmlsdGVyKTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpID0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UpXG4gICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkoZmFsc2UpKTtcbiAgICAgICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuICB1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyOiBJR2xvYmFsRmlsdGVyKXtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlVmFsdWUuZW1pdChnbG9iYWxGaWx0ZXIpO1xuICB9XG5cbiAgYXBwbHlGaWx0ZXJzRXZlbnQoKXtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KGZhbHNlKSk7XG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmYWxzZTtcbiAgICAgIHRoaXMubmdab25lLm9uU3RhYmxlXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgICAgICBpZihpbmRleCA+IC0xKXtcbiAgICAgICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEFwcGx5IHNlbGVjdGVkIGZpbHRlcnNcbiAgICovXG4gIGFwcGx5RmlsdGVycyhmaWx0ZXJFdmVudDogYm9vbGVhbj0gdHJ1ZSwgZ2xvYmFsRmlsdGVyOmFueSA9IHt9KSB7XG4gICAgIHRoaXMuZ3JpZFNlcnZpY2UudXNlclNlYXJjaGVkPXRydWU7XG4gICAgIGlmKGdsb2JhbEZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcik7XG4gICAgfSBcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBmaWx0ZXJFdmVudDtcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgIGlmKGluZGV4ID4gLTEpe1xuICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwbHlGaWx0ZXInLCBKU09OLnN0cmluZ2lmeSh0cnVlKSk7XG4gICAgaWYgKHRoaXMuc2hvd0RpYWxvZykge1xuICAgICAgdGhpcy5yZWYuY2xvc2UoZ2xvYmFsRmlsdGVycyk7XG4gICAgfSBlbHNlIFxuICAgIGlmKCF0aGlzLmNoZWNrRmlsdGVyVmFsaWRhdGlvbigpKXtcbiAgICAgIHRoaXMuY2hlY2tGaWx0ZXJWYWxpZGF0aW9uKHRydWUpO1xuICAgICAgdGhpcy5maWx0ZXJzQXBwbGllZC5lbWl0KGdsb2JhbEZpbHRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBCeSBEZWZhdWx0IENhbGVuZGFyIFJhbmdlIFxuICBzZXREZWZhdWx0Q2FsZW5kYXJSYW5nZShjaGVjazogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJzICYmIHRoaXMuZ2xvYmFsRmlsdGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgJiYgZmlsdGVyLmRheVJhbmdlICYmIGZpbHRlci52YWx1ZSAmJiBmaWx0ZXIudmFsdWVUd28pIHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSkgLy8gRW1pdCBvbmx5IG9uY2Ugd2hlbiB0aGUgem9uZSBiZWNvbWVzIHN0YWJsZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuc2hvd05leHQoZmlsdGVyLCBjaGVjayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2hvd05leHQoZmlsdGVyOiBJR2xvYmFsRmlsdGVyLCBjaGVjazogYm9vbGVhbiA9IHRydWUpOiBEYXRlW10ge1xuICAgIC8vIGxldCBuZXh0VmFsdWU6IHN0cmluZztcbiAgICBsZXQgbmV4dFZhbHVlOiBEYXRlW11cbiAgICBsZXQgZGF5UmFuZ2U6IEVEYXlSYW5nZSA9IGZpbHRlci5kYXlSYW5nZVxuICAgICAgPyBmaWx0ZXIuZGF5UmFuZ2VcbiAgICAgIDogRURheVJhbmdlLldFRUs7XG4gICAgc3dpdGNoIChkYXlSYW5nZSkge1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuREFZOlxuICAgICAgIC8vIG5leHRWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFRGF5UmFuZ2UuTU9OVEg6XG4gICAgICAvLyAgbmV4dFZhbHVlID0gdGhpcy5zZXRNb250aEZpbHRlcihmaWx0ZXIsIHRydWUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLllFQVI6XG4gICAgICAvLyAgbmV4dFZhbHVlID0gdGhpcy5zZXRZZWFyRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gd2Vla1xuICAgICAgbmV4dFZhbHVlID0gdGhpcy5zZXRXZWVrRmlsdGVyKGZpbHRlciwgdHJ1ZSk7XG4gICAgICAgIGZpbHRlci52YWx1ZT0gbmV4dFZhbHVlXG4gICAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKVxuICAgICAgICAvL2ZpbHRlci52YWx1ZVR3bz1uZXh0VmFsdWVbMV1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBseUZpbHRlcicsIEpTT04uc3RyaW5naWZ5KHRydWUpKTtcbiAgICB0aGlzLmdyaWRTZXJ2aWNlLmFwcGx5RmlsdGVyRXZlbnQgPSBjaGVjaztcbiAgICBjb25zdCBnbG9iYWxGaWx0ZXJzID0gdGhpcy5nbG9iYWxGaWx0ZXJzLmZpbHRlcigoeCkgPT4geC5maWVsZCk7XG4gICAgY29uc3QgaW5kZXggPSBnbG9iYWxGaWx0ZXJzLmZpbmRJbmRleCgoZmlsdGVyKT0+IGZpbHRlci5maWVsZCAmJiBmaWx0ZXIudHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkRBVEVfUkFOR0UgKVxuICAgIGlmKGluZGV4ID4gLTEpe1xuICAgICAgZ2xvYmFsRmlsdGVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNBcHBsaWVkLmVtaXQoZ2xvYmFsRmlsdGVycyk7XG4gICAvLyBsZXQgdGVzdD1uZXh0VmFsdWVcbiAgICAvL2ZpbHRlci52YWx1ZT1uZXh0VmFsdWVcbiAgIFxuICAgIHJldHVybiBuZXh0VmFsdWU7XG4gIH1cblxuICBzaG93UHJldmlvdXMoZmlsdGVyOiBJR2xvYmFsRmlsdGVyKTogRGF0ZVtdIHtcbiAgICBsZXQgcHJldmlvdXNWYWx1ZTogRGF0ZVtdO1xuICAgIGxldCBkYXlSYW5nZTogRURheVJhbmdlID0gZmlsdGVyLmRheVJhbmdlXG4gICAgICA/IGZpbHRlci5kYXlSYW5nZVxuICAgICAgOiBFRGF5UmFuZ2UuV0VFSztcbiAgICBzd2l0Y2ggKGRheVJhbmdlKSB7XG4gICAgICBjYXNlIEVEYXlSYW5nZS5EQVk6XG4gICAgICAgLy8gcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0RGF5RmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLk1PTlRIOlxuICAgICAvLyAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldE1vbnRoRmlsdGVyKGZpbHRlciwgZmFsc2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRURheVJhbmdlLllFQVI6XG4gICAgICAvLyAgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc2V0WWVhckZpbHRlcihmaWx0ZXIsIGZhbHNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyB3ZWVrXG4gICAgICAgIHByZXZpb3VzVmFsdWUgPSB0aGlzLnNldFdlZWtGaWx0ZXIoZmlsdGVyLCBmYWxzZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmaWx0ZXIudmFsdWU9cHJldmlvdXNWYWx1ZVxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKVxuICAgIHRoaXMuZ3JpZFNlcnZpY2UuYXBwbHlGaWx0ZXJFdmVudCA9IHRydWU7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2FwcGx5RmlsdGVyJywgSlNPTi5zdHJpbmdpZnkodHJ1ZSkpO1xuICAgIGNvbnN0IGdsb2JhbEZpbHRlcnMgPSB0aGlzLmdsb2JhbEZpbHRlcnMuZmlsdGVyKCh4KSA9PiB4LmZpZWxkKTtcbiAgICBjb25zdCBpbmRleCA9IGdsb2JhbEZpbHRlcnMuZmluZEluZGV4KChmaWx0ZXIpPT4gZmlsdGVyLmZpZWxkICYmIGZpbHRlci50eXBlID09PSBHcmlkRmlsdGVyQ29udHJvbFR5cGUuREFURV9SQU5HRSApXG4gICAgaWYoaW5kZXggPiAtMSl7XG4gICAgICBnbG9iYWxGaWx0ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICAgIHRoaXMuZmlsdGVyc0FwcGxpZWQuZW1pdChnbG9iYWxGaWx0ZXJzKTtcbiAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTtcbiAgfVxuXG4gIHNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXI6IElHbG9iYWxGaWx0ZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAoZmlsdGVyLnZhbHVlID1cbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSxcbiAgICAgICAgZmlsdGVyLmZvcm1hdCA/IGZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eSdcbiAgICAgICkgK1xuICAgICAgJ3wnICtcbiAgICAgIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKFxuICAgICAgICB0aGlzLmVuZERhdGUsXG4gICAgICAgIGZpbHRlci5mb3JtYXQgPyBmaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknXG4gICAgICApKTtcbiAgfVxuXG4gIHNldERhdGVWYWx1ZShmaWx0ZXI6IGFueSkge1xuICAgIGxldCB2YWx1ZTogRGF0ZTtcbiAgICBpZiAoZmlsdGVyLnZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKGZpbHRlci52YWx1ZS5zcGxpdCgnfCcpWzBdKTtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZS5zZXRNb250aCh2YWx1ZS5nZXRNb250aCgpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNldERheUZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcblxuICAgIGlmIChpc05leHQpIHtcbiAgICAgIHRoaXMuc3RhcnREYXRlID0gdGhpcy5zdGFydERhdGVcbiAgICAgICAgPyBuZXcgRGF0ZShcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRNb250aCgpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RGF0ZSgpICsgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBjdXJyZW50RGF0ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgLSAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGN1cnJlbnREYXRlO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCksXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXREYXRlKCkgKyAxXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0WWVhckZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIGN1cnJlbnREYXRlID0gdGhpcy5zZXREYXRlVmFsdWUoZmlsdGVyKTtcbiAgICB2YXIgZmlyc3REYXRlT2ZZZWFyID0gbmV3IERhdGUoY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG5cbiAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSArIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUodGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSAtIDEsIDAsIDEpXG4gICAgICAgIDogZmlyc3REYXRlT2ZZZWFyO1xuICAgIH1cblxuICAgIHRoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldEZ1bGxZZWFyKCksIDExLCAzMSk7XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDYWxlbmRhclJhbmdlRmlsdGVyVmFsdWUoZmlsdGVyKTtcbiAgfVxuXG4gIHNldE1vbnRoRmlsdGVyKGZpbHRlcjogSUdsb2JhbEZpbHRlciwgaXNOZXh0OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVudERhdGUgPSB0aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIHZhciBmaXJzdERhdGVPZk1vbnRoID0gbmV3IERhdGUoXG4gICAgICBjdXJyZW50RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgY3VycmVudERhdGUuZ2V0TW9udGgoKSxcbiAgICAgIDFcbiAgICApO1xuXG4gICAgaWYgKGlzTmV4dCkge1xuICAgICAgdGhpcy5zdGFydERhdGUgPSB0aGlzLnN0YXJ0RGF0ZVxuICAgICAgICA/IG5ldyBEYXRlKFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlLmdldE1vbnRoKCkgKyAxLFxuICAgICAgICAgICAgMVxuICAgICAgICAgIClcbiAgICAgICAgOiBmaXJzdERhdGVPZk1vbnRoO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlXG4gICAgICAgID8gbmV3IERhdGUoXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSAtIDEsXG4gICAgICAgICAgICAxXG4gICAgICAgICAgKVxuICAgICAgICA6IGZpcnN0RGF0ZU9mTW9udGg7XG4gICAgfVxuXG4gICAgdGhpcy5lbmREYXRlID0gbmV3IERhdGUoXG4gICAgICB0aGlzLnN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgdGhpcy5zdGFydERhdGUuZ2V0TW9udGgoKSArIDEsXG4gICAgICAwXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgc2V0V2Vla0ZpbHRlcihmaWx0ZXI6IElHbG9iYWxGaWx0ZXIsIGlzTmV4dDogYm9vbGVhbik6IERhdGVbXXtcbiAgICBsZXQgZmlsdGVyVmFsdWU6RGF0ZT0gQXJyYXkuaXNBcnJheShmaWx0ZXIudmFsdWUpPyBmaWx0ZXIudmFsdWVbMF06ZmlsdGVyLnZhbHVlXG4gICAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoZmlsdGVyVmFsdWU/IGZpbHRlclZhbHVlOm5ldyBEYXRlKCkpLy90aGlzLnNldERhdGVWYWx1ZShmaWx0ZXIpO1xuICAgIGxldCBmaXJzdERheSA9IG5ldyBEYXRlKGN1cnJlbnREYXRlLnNldERhdGUoZmlsdGVyVmFsdWUgPyBjdXJyZW50RGF0ZS5nZXREYXRlKCkgOiBjdXJyZW50RGF0ZS5nZXREYXRlKCkgLSBjdXJyZW50RGF0ZS5nZXREYXkoKSArIDEpKTtcbiAgICBsZXQgd2Vla1NlY29uZHMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICBsZXQgdmFsdWU6RGF0ZVxuICAgICAgICBpZiAoaXNOZXh0KSB7XG4gICAgICB2YWx1ZSA9IGZpbHRlclZhbHVlXG4gICAgICAgZmlsdGVyLnZhbHVlXG4gICAgICAgID8gIHZhbHVlLnNldERhdGUoZmlsdGVyVmFsdWUuZ2V0RGF0ZSgpKzcpICAgLy9uZXcgRGF0ZShuZXcgRGF0ZShmaWx0ZXJWYWx1ZSkuZ2V0VGltZSgpICsgd2Vla1NlY29uZHMpXG4gICAgICAgIDogdmFsdWU9IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgPSBmaWx0ZXIudmFsdWVcbiAgICAgICAgP25ldyBEYXRlKGZpbHRlclZhbHVlLmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKVxuICAgICAgICA6IG5ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSAtIHdlZWtTZWNvbmRzKVxuICAgIH1cbiAgICAvL3RoaXMuZW5kRGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlLmdldFRpbWUoKSArIDYgKiAyNCAqIDYwICogNjAgKiAxMDAwKTtcbiAgICAvLyBsZXQgdmFsdWU6RGF0ZT1maWx0ZXJWYWx1ZT9cbiAgICAvLyAgIGlzTmV4dD9uZXcgRGF0ZShmaWx0ZXJWYWx1ZS5nZXRUaW1lKCkgKyB3ZWVrU2Vjb25kcyk6bmV3IERhdGUoZmlsdGVyVmFsdWUuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpOlxuICAgIC8vICAgaXNOZXh0P25ldyBEYXRlKGZpcnN0RGF5LmdldFRpbWUoKSk6bmV3IERhdGUoZmlyc3REYXkuZ2V0VGltZSgpIC0gd2Vla1NlY29uZHMpXG5cbiAgICBsZXQgdmFsdWVUd286RGF0ZT1uZXcgRGF0ZSh2YWx1ZS5nZXRUaW1lKCkgKyA2ICogMjQgKiA2MCAqIDYwICogMTAwMCk7IFxuICAgLy8gY29uc29sZS5sb2coJ3Rlc3QnLHZhbHVlLCd0ZXN0MicsdmFsdWVUd28pXG4gICAgcmV0dXJuIFt2YWx1ZSwgdmFsdWVUd29dXG4gICAvL3JldHVybiB0aGlzLnNldENhbGVuZGFyUmFuZ2VGaWx0ZXJWYWx1ZShmaWx0ZXIpO1xuICB9XG5cbiAgICAvKipcbiAgICogb3BlbiBkaWFsb2cgb24gbG9va3VwQ29udHJvbCBmaWVsZFxuICAgKi9cbiAgICAgc2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyczogSUdsb2JhbEZpbHRlcikgeyAgIFxuXG4gICAgICB0aGlzLmdyaWRTZXJ2aWNlLnNldExvb2tVcEZpbHRlcihnbG9iYWxGaWx0ZXJzLCB0aGlzLmRpYWxvZ1NlcnZpY2UsIHRydWUpO1xuICAgIH1cblxuICAvKipcbiAgICogQ2xlYXIgYWxsIGZpbHRlciB2YWx1ZXNcbiAgICovXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICB0aGlzLmdsb2JhbEZpbHRlcnMuZm9yRWFjaCgoaXRlbSk9PntcbiAgICAgIGlmKGl0ZW0udHlwZSA9PT0gR3JpZEZpbHRlckNvbnRyb2xUeXBlLkxPT0tVUF9JTlBVVCAmJiBpdGVtPy52YWx1ZVR3bz8udGV4dCl7XG4gICAgICAgIGl0ZW0udmFsdWVUd28gPSBudWxsO1xuICAgICAgfVxuICAgICAgaXRlbS52YWx1ZSA9IG51bGw7XG4gICAgfSlcbiAgICBjb25zdCBjbGVhckdyaWRGaWx0ZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xlYXJHcmlkRmlsdGVyVmFsdWVzQnV0dG9uJylcbiAgICBpZihjbGVhckdyaWRGaWx0ZXIpe1xuICAgICAgY2xlYXJHcmlkRmlsdGVyLmNsaWNrKCk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgKiBDbGVhciB2YWx1ZXMgb2YgRGF0ZSBSYW5nZSBGaWx0ZXJcbiAgICovXG4gICAgY2xlYXJEYXRlUmFuZ2VWYWx1ZShmaWx0ZXI6IGFueSl7XG4gICAgICB0aGlzLnNldERhdGVSYW5nZVZhbHVlKGZpbHRlciwgdHJ1ZSlcbiAgICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGRpYWxvZyB3aXRob3V0IGFwcGx5aW5nIGZpbHRlcnNcbiAgICovXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmNsZWFyRmlsdGVycygpO1xuICAgIHRoaXMucmVmLmNsb3NlKCk7XG4gIH1cbiAgcmFuZ2VEYXRlY2xvc2UoZWxlbWVudCkgeyAgXG4gICAgdGhpcy5kYXRlUGlja2VyLmhpZGVPdmVybGF5KCk7XG4gICAgdGhpcy5kYXRlUGlja2VyLm92ZXJsYXlWaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5kYXRlUGlja2VyLmRhdGVwaWNrZXJDbGljayA9IHRydWU7XG4gICAgLy8gY29uc3QgaWQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCk7XG4gICAgLy8gY29uc29sZS5sb2coaWQsICBlbGVtZW50LmVsLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZC5maXJzdENoaWxkKS8vZWxlbWVudCwgaWQgLFxuICAgIC8vIGlkLmZvY3VzKCk7XG4gICAgZWxlbWVudC5lbC5uYXRpdmVFbGVtZW50LmZpcnN0Q2hpbGQuZmlyc3RDaGlsZC5mb2N1cygpO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5vdmVybGF5VmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuZGF0ZVBpY2tlci5kYXRlcGlja2VyQ2xpY2sgPSB0cnVlO1xuXG4gIH1cblxuICBmaWx0ZXJJbnB1dCgpIHtcbiAgICB0aGlzLnNob3dJbnB1dCA9ICF0aGlzLnNob3dJbnB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb2N1c2VkIHRoZSBjYWxlbmRhciBpbnB1dFxuICAgKi9cbiAgc2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXI6IGFueSwgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlLCBldmVudD86YW55KXtcbiAgICBpZihnbG9iYWxGaWx0ZXIudmFsdWU/Lmxlbmd0aCA+IDEgJiYgZ2xvYmFsRmlsdGVyLnZhbHVlWzFdICE9PSBudWxsKXtcbiAgICAgIHRoaXMuc2V0RGF0ZVJhbmdlVmFsdWUoZ2xvYmFsRmlsdGVyKTtcbiAgICAgIGlmKGZvY3VzZWQgPT10cnVlKXtcbiAgICAgIHRoaXMucmFuZ2VEYXRlY2xvc2UoZXZlbnQpOyBcbiAgICAgIH1cbiAgICB9XG4gICAgaWYoZm9jdXNlZCl7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnbG9iYWxGaWx0ZXIuZmllbGQpPy5mb2N1cygpO1xuICAgIH1cbiAgfVxuICB0YWJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcjogYW55KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLicrZ2xvYmFsRmlsdGVyLmZpZWxkXG4gICAgKTtcbiAgICBpZiAoY2xhc3NOYW1lKSB7XG4gICAgICBjbGFzc05hbWUuY2xpY2soKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1jb21wb25lbnQtd3JhcHBlci1kaXZcIj5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuaGlkZGVuID8gJ2dsb2JhbEZpbHRlckhpZGRlbicgOiBnbG9iYWxGaWx0ZXIuY29sdW1uID8gJ2NvbC0nICsgZ2xvYmFsRmlsdGVyLmNvbHVtbiA6ICdjb2wtMydcIlxuICAgICpuZ0Zvcj1cImxldCBnbG9iYWxGaWx0ZXIgb2YgZ2xvYmFsRmlsdGVyc1wiXG4gID5cbiAgICA8ZGl2IFtuZ1N3aXRjaF09XCJnbG9iYWxGaWx0ZXIudHlwZVwiPlxuICAgICAgPCEtLSBDYWxlbmRhciBjb250cm9sIC0tPlxuICAgICAgPHNwYW4gW2hpZGRlbl09XCJnbG9iYWxGaWx0ZXIuaGlkZGVuXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCIgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1sYWJlbFwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5yZXF1aXJlZEZpZWxkXCIgW2NsYXNzXT1cIidyZXF1aXJlZC1zdGFyICcgKyAoZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICcgaW52YWxpZCAnIDogJycpXCI+Kjwvc3Bhbj5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSAnICsgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0OiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0LURhdGUnXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0RGF0ZShnbG9iYWxGaWx0ZXIsIHRydWUpXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImNhbGVuZGFyRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAob25DbG9zZSk9XCJvbkZvY3VzT3V0RXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgICAgICBbc2hvd0J1dHRvbkJhcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAoa2V5dXApPVwiY2FsZW5kYXJGb2N1c0V2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCIgPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIENhbGVuZGFyIFJhbmdlIC0tPlxuICAgICAgPCEtLSA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuQ0FMRU5EQVJfUkFOR0VcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3VzdG9tLWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzaG93UHJldmlvdXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICAgICAgfX0gPDxcIiBcbiAgICAgICAgICAgID4gLS0+XG4gICAgICAgICAgICA8IS0tIFtuZ1N0eWxlXT1cInsgYmFja2dyb3VuZDogZ2xvYmFsRmlsdGVyLmNvbG9yID8gZ2xvYmFsRmlsdGVyLmNvbG9yIDogJyd9XCIgLS0+XG4gICAgICAgICAgPCEtLSA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT10cnVlIHx8IGdsb2JhbEZpbHRlci5wcmVmaXg9PT11bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgICB7eyAgZ2xvYmFsRmlsdGVyLmxhYmVsVGV4dCA/IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgOiAnJyB9fVxuICAgICAgICAgICAgICA8L3NwYW4+IC0tPlxuICAgICAgICAgICAgICA8IS0tIHt7XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlXG4gICAgICAgICAgICAgICAgICB8IGRhdGVcbiAgICAgICAgICAgICAgICAgICAgOiAoZ2xvYmFsRmlsdGVyLmZvcm1hdCA/IGdsb2JhbEZpbHRlci5mb3JtYXQgOiAnTU0vZGQveXl5eScpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIHRvXG4gICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgZW5kRGF0ZVxuICAgICAgICAgICAgICAgICAgfCBkYXRlXG4gICAgICAgICAgICAgICAgICAgIDogKGdsb2JhbEZpbHRlci5mb3JtYXQgPyBnbG9iYWxGaWx0ZXIuZm9ybWF0IDogJ01NL2RkL3l5eXknKVxuICAgICAgICAgICAgICB9fSAtLT5cbiAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5wcmVmaXg9PT1mYWxzZVwiPlxuICAgICAgICAgICAgICAgIHt7IGdsb2JhbEZpbHRlci5sYWJlbFRleHQgPyBnbG9iYWxGaWx0ZXIubGFiZWxUZXh0IDogJyd9fVxuICAgICAgICAgICAgICA8L3NwYW4+PC9sYWJlbFxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBjbGFzcz1cImN1c3RvbS1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd05leHQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTmV4dCB7e1xuICAgICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5kYXlSYW5nZSA/IGdsb2JhbEZpbHRlci5kYXlSYW5nZSA6ICdXZWVrJ1xuICAgICAgICAgICAgICB9fSA+PlwiXG4gICAgICAgICAgICA+IC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwhLS0gPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj4gLS0+XG5cbiAgICAgIDwhLS0gQ2hlY2tib3ggQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkNIRUNLQk9YXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8cC1jaGVja2JveFxuICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eSc6ICdmbGV4IGFsaWduLWl0ZW1zLWNlbnRlcidcIlxuICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdsb2JhbEZpbHRlci52YWx1ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIFNwYWNlciBDb250cm9sIC0tPlxuICAgICAgPHNwYW4gKm5nSWY9XCIhZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5TUEFDRVJcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIFtjbGFzc109XCJcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA/ICdjb2wtJyArIGdsb2JhbEZpbHRlci5jb2x1bW5cbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIERyb3Bkb3duIENvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWZpbHRlci1kaXZcIiAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5EUk9QRE9XTlwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICBbc2hvd0NsZWFyXT1cInRydWVcIlxuICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAoa2V5dXAuVGFiKT1cInRhYkZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YSB8fCBbXVwiXG4gICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJnbG9iYWxGaWx0ZXIub3B0aW9uTGFiZWxcIlxuICAgICAgICAgICAgICBbb3B0aW9uVmFsdWVdPVwiZ2xvYmFsRmlsdGVyLm9wdGlvblZhbHVlXCJcbiAgICAgICAgICAgICAgW2ZpbHRlcl09XCJnbG9iYWxGaWx0ZXIuYWxsb3dTZWFyY2hcIlxuICAgICAgICAgICAgICAob25DaGFuZ2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmludGVyZmFjZVR5cGU9PSdidWxrVXBkYXRlJ1wiIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0IGdsb2JhbC1maWx0ZXIgYnVsay11cGRhdGVcIiA+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cbiAgICAgIDwhLS0gSW5wdXQgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLklOUFVUXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVWYWx1ZXMoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIGljb249XCJmYS1yZWd1bGFyIGZhLWFycm93LWRvd24tdG8tZG90dGVkLWxpbmVcIlxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZmlsdGVyaW5nXCI+XG4gICAgICAgICAgICAgIDxzZS1maWx0ZXItbWVudSBbZ2xvYmFsRmlsdGVyXT1cImdsb2JhbEZpbHRlclwiPjwvc2UtZmlsdGVyLW1lbnU+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDwhLS0gTnVtZXJpY0lucHV0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTlVNRVJJQ0lOUFVUXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImdsb2JhbC1maWx0ZXJzLWxhYmVsXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyIHBvc3NpYmxlLWJ1bGstdXBkYXRlLWlucHV0LXdyYXBwZXItZGl2XCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5JyA6ICcnXCJcbiAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycygpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnbG9iYWxGaWx0ZXIuaW50ZXJmYWNlVHlwZT09J2J1bGtVcGRhdGUnXCIgY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlciBidWxrLXVwZGF0ZVwiID5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZVZhbHVlcyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgaWNvbj1cImZhLXJlZ3VsYXIgZmEtYXJyb3ctZG93bi10by1kb3R0ZWQtbGluZVwiXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiICBcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgICAgXG4gICAgICA8IS0tIERhdGUgUmFuZ2UgQ29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiICpuZ1N3aXRjaENhc2U9XCJmaXRlclR5cGVzLkRBVEVfUkFOR0VcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIHJhbmdlLWNhbGVuZGFyIGdhcC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmRheVJhbmdlXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1yYW5nZS1idG4gIGNhbGVuZGFyLXByZXZpb3VzXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dQcmV2aW91cyhnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCI8PFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8IS0tIFwiUHJldmlvdXMge3tcbiAgICAgICAgICAgICAgZ2xvYmFsRmlsdGVyLmRheVJhbmdlID8gZ2xvYmFsRmlsdGVyLmRheVJhbmdlIDogJ1dlZWsnXG4gICAgICAgICAgICB9fSA8PFwiIC0tPlxuICAgICAgICAgICAgPCEtLSBbbmdTdHlsZV09XCJ7IGJhY2tncm91bmQ6IGdsb2JhbEZpbHRlci5jb2xvciA/IGdsb2JhbEZpbHRlci5jb2xvciA6ICcnfVwiIC0tPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXIgXG4gICAgICAgICAgICAjcmFuZ2VDYWxlbmRhclxuICAgICAgICAgICAgW3Nob3dCdXR0b25CYXJdPVwidHJ1ZVwiXG5cbiAgICAgICAgICAgIFtpbnB1dElkXT1cImdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dFwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSA/ICduZy1pbnZhbGlkIG5nLWRpcnR5ICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgOiAnZmxleC1ncm93LTEgZ3Jvdy0xICcgKyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHRcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIiBcbiAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU9XCJyYW5nZVwiIFxuICAgICAgICAgICAgW3NlbGVjdE90aGVyTW9udGhzXT1cInRydWVcIlxuICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3REYXRlKGdsb2JhbEZpbHRlciwgdHJ1ZSwgcmFuZ2VDYWxlbmRhcilcIlxuICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY2FsZW5kYXJGb3JtYXRcIlxuICAgICAgICAgICAgKG9uQ2xvc2UpPVwib25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQ2xpY2tPdXRzaWRlKT1cInNldERhdGVSYW5nZUZpbHRlclZhbHVlKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgKG9uQmx1cik9XCJzZXREYXRlUmFuZ2VGaWx0ZXJWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIChrZXl1cCk9XCJjYWxlbmRhckZvY3VzRXZlbnQoZ2xvYmFsRmlsdGVyLCAkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbkNsZWFyQ2xpY2spPVwiY2xlYXJEYXRlUmFuZ2VWYWx1ZShnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImFwcGx5RmlsdGVycyh0cnVlLCBnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZGF5UmFuZ2VcIlxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCIgICAgICAgICAgICAgIFxuICAgICAgICAgICAgY2xhc3M9XCJjYWxlbmRhci1yYW5nZS1idG4gY2FsZW5kYXItbmV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2hvd05leHQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICBsYWJlbD1cIj4+XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPCEtLSBOZXh0IHt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgPyBnbG9iYWxGaWx0ZXIuZGF5UmFuZ2UgOiAnV2VlaydcbiAgICAgICAgICB9fSA+PlwiIC0tPlxuICAgICAgICAgIDwhLS0gW25nU3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBnbG9iYWxGaWx0ZXIuY29sb3IgPyBnbG9iYWxGaWx0ZXIuY29sb3IgOiAnJ31cIiAtLT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8IS0tIHRvZGF5QnV0dG9uU3R5bGVDbGFzcz1cImhpZGRlblwiXG4gICAgICAgICAgICBjbGVhckJ1dHRvblN0eWxlQ2xhc3M9XCJtbC1hdXRvXCIgLS0+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5maWx0ZXJpbmdcIj5cbiAgICAgICAgICAgICAgPHNlLWZpbHRlci1tZW51IFtnbG9iYWxGaWx0ZXJdPVwiZ2xvYmFsRmlsdGVyXCI+PC9zZS1maWx0ZXItbWVudT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE51bWVyaWMgUmFuZ2UgY29udHJvbCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5OVU1FUklDX1JBTkdFXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbm93cmFwIGFsaWduLWl0ZW1zLWNlbnRlciBtci0yXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgKG9uQmx1cik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZUZyb20oZ2xvYmFsRmlsdGVyLHRydWUpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgIGdyb3ctMSBpbnB1dC1udW1iZXInXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG8tbnVtZXJpYyBtci0yXCI+VG88L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1ub3dyYXAgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVUd29cIlxuICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwiZ2xvYmFsRmlsdGVyPy5mb3JtYXQ/LnR5cGUgPT09ICdkZWNpbWFsJyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA/IGdsb2JhbEZpbHRlci5mb3JtYXQ/LmZvcm1hdFBhcmFtcz8uZGlnaXRzSW5mbyA6ICcyJyA6ICcwJ1wiXG4gICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJnbG9iYWxGaWx0ZXI/LmZvcm1hdD8udHlwZSA9PT0gJ2RlY2ltYWwnID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvID8gZ2xvYmFsRmlsdGVyLmZvcm1hdD8uZm9ybWF0UGFyYW1zPy5kaWdpdHNJbmZvIDogJzInIDogJzAnXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnbmctaW52YWxpZCBuZy1kaXJ0eScgOiAnZmxleC1ncm93LTEgbXItMiBncm93LTEgaW5wdXQtbnVtYmVyJ1wiXG4gICAgICAgICAgICAgIChvbkJsdXIpPVwic2V0TnVtZXJpY1JhbmdlVmFsdWVUd28oZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzZXROdW1lcmljUmFuZ2VWYWx1ZVR3byhnbG9iYWxGaWx0ZXIsdHJ1ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmZpbHRlcmluZ1wiPlxuICAgICAgICAgICAgICA8c2UtZmlsdGVyLW1lbnUgW2dsb2JhbEZpbHRlcl09XCJnbG9iYWxGaWx0ZXJcIj48L3NlLWZpbHRlci1tZW51PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG4gICAgICA8IS0tIE11bHRpU2VsZWN0IGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuTVVMVElTRUxFQ1RcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiXCIgZm9yPVwiYmFzaWNcIj57eyBnbG9iYWxGaWx0ZXIuZGlzcGxheVRleHQgfX1cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLnJlcXVpcmVkRmllbGRcIiBbY2xhc3NdPVwiJ3JlcXVpcmVkLXN0YXIgJyArIChnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJyBpbnZhbGlkICcgOiAnJylcIj4qPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgW29wdGlvbnNdPVwiZ2xvYmFsRmlsdGVyLmRhdGFcIlxuICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXJzKClcIlxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ2xvYmFsRmlsdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICA+PC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZSAmJiBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVycm9yXCI+e3tcbiAgICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L3NwYW4+XG5cblxuICAgICAgICAgPCEtLSBTZWxlY3QgQnV0dG9uIGNvbnRyb2wgLS0+XG4gICAgICA8c3BhbiBbaGlkZGVuXT1cImdsb2JhbEZpbHRlci5oaWRkZW5cIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtZmlsdGVyLWRpdlwiXG4gICAgICAgICAgKm5nU3dpdGNoQ2FzZT1cImZpdGVyVHlwZXMuU0VMRUNUQlVUVE9OXCJcblxuICAgICAgICA+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cIlwiIGZvcj1cImJhc2ljXCI+e3sgZ2xvYmFsRmlsdGVyLmRpc3BsYXlUZXh0IH19XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsRmlsdGVyLnZhbHVlXCJcbiAgICAgICAgICBbb3B0aW9uc109XCJnbG9iYWxGaWx0ZXIuZGF0YVwiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICBbbXVsdGlwbGVdPVwiZ2xvYmFsRmlsdGVyLmRpc3BsYXlTdHlsZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImdsb2JhbEZpbHRlci5kaXNhYmxlZFwiICBcbiAgICAgICAgPlxuICAgICAgICA8IS0tIDxuZy10ZW1wbGF0ZSBsZXQtaXRlbSBwVGVtcGxhdGU+XG4gICAgICAgICAgPGkgW2NsYXNzXT1cIml0ZW0uaWNvblwiPjwvaT5cbiAgICAgIDwvbmctdGVtcGxhdGU+IC0tPlxuICAgICAgPC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlICYmIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMFwiIGNsYXNzPVwiZXJyb3JcIj57e1xuICAgICAgICAgIGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2VcbiAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuXG5cblxuICAgICAgPCEtLSBMb29rdXAgQ29udHJvbCBGaWVsZCAtLT5cbiAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZ2xvYmFsRmlsdGVyLmhpZGRlblwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJnbG9iYWwtZmlsdGVycy1maWx0ZXItZGl2XCJcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiZml0ZXJUeXBlcy5MT09LVVBfSU5QVVRcIlxuICAgICAgICA+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZ2xvYmFsLWZpbHRlcnMtbGFiZWxcIiBmb3I9XCJiYXNpY1wiPnt7IGdsb2JhbEZpbHRlci5kaXNwbGF5VGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnbG9iYWxGaWx0ZXIucmVxdWlyZWRGaWVsZFwiIFtjbGFzc109XCIncmVxdWlyZWQtc3RhciAnICsgKGdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgPyAnIGludmFsaWQgJyA6ICcnKVwiPio8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9zc2libGUtYnVsay11cGRhdGUtaW5wdXQtd3JhcHBlci1kaXZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZS1pY29uLXdyYXBwZXIgbG9va3VwLWZpbHRlci13cmFwcGVyIGdsb2JhbEZpbHRlcnNcIj4gXG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlID8gJ25nLWludmFsaWQgbmctZGlydHknIDogJydcIlxuICAgICAgICAgICAgICAgIFtpZF09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJnbG9iYWxGaWx0ZXI/LnZhbHVlVHdvPy50ZXh0ID8gZ2xvYmFsRmlsdGVyLnZhbHVlVHdvLnRleHQgOiBnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAgIChibHVyKT1cIm9uRm9jdXNPdXRFdmVudChnbG9iYWxGaWx0ZXIpXCJcbiAgICAgICAgICAgICAgICBbbmFtZV09XCJnbG9iYWxGaWx0ZXIuZmllbGRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcnMoKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExvb2t1cEZpZWxkKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJnbG9iYWxGaWx0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIChrZXl1cC5UYWIpPVwic2VsZWN0TG9va3VwRmllbGQoZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgKGtleXVwLmJhY2tzcGFjZSk9XCJyZW1vdmVOdWxsTG9va3VwKCRldmVudCwgZ2xvYmFsRmlsdGVyKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbG9va3VwLWlucHV0XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwLWlucHV0LWljb24tcmlnaHQgZ2xvYmFsLWZpbHRlclwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktY2hldnJvbi1yaWdodCBsb29rdXAtaW5wdXQtaWNvbiBnbG9iYWwtZmlsdGVyXCI+PC9pPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXJlY3Qtd3JhcHBlci1jbG9zZS1pY29uLWxvb2t1cFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJnbG9iYWxGaWx0ZXIudmFsdWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJsb29rdXBDbGVhclZhbHVlKGdsb2JhbEZpbHRlcik7b25Gb2N1c091dEV2ZW50KGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdsb2JhbEZpbHRlci5pbnRlcmZhY2VUeXBlPT0nYnVsa1VwZGF0ZSdcIiBjbGFzcz1cInAtaW5wdXQtaWNvbi1yaWdodCBnbG9iYWwtZmlsdGVyIGJ1bGstdXBkYXRlXCIgPlxuICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlVmFsdWVzKGdsb2JhbEZpbHRlcilcIlxuICAgICAgICAgICAgICBpY29uPVwiZmEtcmVndWxhciBmYS1hcnJvdy1kb3duLXRvLWRvdHRlZC1saW5lXCJcbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgIFxuICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cImdsb2JhbEZpbHRlci5lcnJvck1lc3NhZ2UgJiYgZ2xvYmFsRmlsdGVyLmVycm9yTWVzc2FnZS5sZW5ndGggPiAwXCIgY2xhc3M9XCJlcnJvclwiPnt7XG4gICAgICAgICAgICBnbG9iYWxGaWx0ZXIuZXJyb3JNZXNzYWdlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuPCEtLSA8c3Bhbj5cbiAgPGkgIGljb249XCJwaSBwaS10aW1lc1wiPjwvaT5cbjwvc3Bhbj4gLS0+XG5cbjwhLS0gQXBwbHkgYnV0dG9uIC0tPlxuXG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbnR5cGU9XCJidXR0b25cIlxuaWNvbj1cInBpIHBpLXNlYXJjaFwiXG5baWRdPVwic2VhcmNoYnRuSWRcIlxuKGNsaWNrKT1cImFwcGx5RmlsdGVycygpXCJcbmNsYXNzPVwiZ2xvYmFsLXNlYXJjaCBhbGlnbi1nbG9iYWxGaWx0ZXItYnRuIGdsb2JhbC1idG4gaGlkZS1maWx0ZXItYnV0dG9uXCJcbj48L2J1dHRvbj5cblxuPCEtLSBDbG9zZSBidXR0b24gLS0+XG48YnV0dG9uXG5wQnV0dG9uXG4qbmdJZj1cIiFncmlkVXBkYXRlXCJcbmlkPVwiY2xlYXJHbG9iYWxGaWx0ZXJCdG5cIlxudHlwZT1cImJ1dHRvblwiXG5pY29uPVwicGkgcGktcmVwbGF5XCJcbihjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG5jbGFzcz1cImhpZGUtZmlsdGVyLWJ1dHRvblwiXG4+PC9idXR0b24+XG4iXX0=
|