@seniorsistemas/angular-components 19.0.1 → 19.0.3
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/dynamic-form/dynamic-form/components/grid/row/row.component.d.ts +1 -0
- package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +4 -1
- package/esm2022/dynamic-form/dynamic-form/components/grid/row/row.component.mjs +12 -3
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +26 -17
- package/esm2022/dynamic-form/dynamic-form/dynamic-form.mjs +5 -3
- package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +3 -8
- package/esm2022/select/lib/select/select.component.mjs +37 -2
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +40 -20
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +2 -7
- package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +36 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/package.json +7 -7
- package/select/lib/select/select.component.d.ts +8 -0
|
@@ -52,7 +52,12 @@ export class SelectComponent {
|
|
|
52
52
|
* Retorna o item atualmente focado na lista de opções filtradas.
|
|
53
53
|
* @returns O dado do item focado ou `null` caso nenhum item esteja focado.
|
|
54
54
|
*/
|
|
55
|
-
focusedItem = computed(() =>
|
|
55
|
+
focusedItem = computed(() => {
|
|
56
|
+
const index = this.focusedIndex();
|
|
57
|
+
if (index < 0)
|
|
58
|
+
return null;
|
|
59
|
+
return this.filteredOptions()[index]?.data ?? null;
|
|
60
|
+
});
|
|
56
61
|
/**
|
|
57
62
|
* Computa e retorna a lista interna de opções do dropdown.
|
|
58
63
|
* - Se as opções estiverem agrupadas (`group()` retorna verdadeiro),
|
|
@@ -232,6 +237,7 @@ export class SelectComponent {
|
|
|
232
237
|
* Alterna a exibição das opções do componente select.
|
|
233
238
|
* Se o componente estiver desabilitado, não realiza nenhuma ação.
|
|
234
239
|
* Caso contrário, inverte o estado de exibição das opções.
|
|
240
|
+
* Ao abrir, move o foco para o item atualmente selecionado.
|
|
235
241
|
*/
|
|
236
242
|
toggle() {
|
|
237
243
|
if (this.disabled()) {
|
|
@@ -239,6 +245,9 @@ export class SelectComponent {
|
|
|
239
245
|
}
|
|
240
246
|
const shouldOpen = !this.showOptions();
|
|
241
247
|
this.showOptions.set(shouldOpen);
|
|
248
|
+
if (shouldOpen) {
|
|
249
|
+
this._focusSelectedOption();
|
|
250
|
+
}
|
|
242
251
|
}
|
|
243
252
|
/**
|
|
244
253
|
* Seleciona um item no componente de seleção.
|
|
@@ -571,6 +580,32 @@ export class SelectComponent {
|
|
|
571
580
|
const el = document.getElementById(id);
|
|
572
581
|
el?.scrollIntoView({ block: 'nearest' });
|
|
573
582
|
}
|
|
583
|
+
/**
|
|
584
|
+
* Define o foco no item atualmente selecionado ao abrir o dropdown.
|
|
585
|
+
* No modo simples, foca o item selecionado. No modo múltiplo, foca o primeiro item selecionado.
|
|
586
|
+
* Após renderização do overlay, rola a lista até o item focado.
|
|
587
|
+
* @private
|
|
588
|
+
*/
|
|
589
|
+
_focusSelectedOption() {
|
|
590
|
+
const options = this.filteredOptions();
|
|
591
|
+
let selectedIndex = -1;
|
|
592
|
+
if (this.multiple()) {
|
|
593
|
+
const firstSelected = this.values()[0];
|
|
594
|
+
if (firstSelected) {
|
|
595
|
+
selectedIndex = options.findIndex((o) => o.id === firstSelected.id);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
else {
|
|
599
|
+
const selected = this.value();
|
|
600
|
+
if (selected) {
|
|
601
|
+
selectedIndex = options.findIndex((o) => o.id === selected.id);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
this.focusedIndex.set(selectedIndex);
|
|
605
|
+
if (selectedIndex >= 0) {
|
|
606
|
+
setTimeout(() => this._scrollToFocusedOption());
|
|
607
|
+
}
|
|
608
|
+
}
|
|
574
609
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
575
610
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SelectComponent, isStandalone: true, selector: "s-select", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, optionLabel: { classPropertyName: "optionLabel", publicName: "optionLabel", isSignal: true, isRequired: false, transformFunction: null }, optionValue: { classPropertyName: "optionValue", publicName: "optionValue", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, checkmark: { classPropertyName: "checkmark", publicName: "checkmark", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: false, transformFunction: null }, virtualScroll: { classPropertyName: "virtualScroll", publicName: "virtualScroll", isSignal: true, isRequired: false, transformFunction: null }, virtualScrollItemSize: { classPropertyName: "virtualScrollItemSize", publicName: "virtualScrollItemSize", isSignal: true, isRequired: false, transformFunction: null }, emptyMessage: { classPropertyName: "emptyMessage", publicName: "emptyMessage", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showOptions: { classPropertyName: "showOptions", publicName: "showOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { disabled: "disabledChange", showOptions: "showOptionsChange" }, host: { attributes: { "role": "combobox" }, listeners: { "window:resize": "onWindowResize($event)" }, properties: { "attr.aria-expanded": "showOptions()", "attr.aria-haspopup": "\"listbox\"", "attr.aria-owns": "showOptions() ? componentId + \"-listbox\" : null", "attr.aria-activedescendant": "focusedIndex() >= 0 ? filteredOptions()[focusedIndex()]?.id : null", "attr.aria-label": "placeholder() || \"Select option\"", "attr.aria-disabled": "disabled()" } }, providers: [
|
|
576
611
|
{
|
|
@@ -607,4 +642,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
607
642
|
},
|
|
608
643
|
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [ngClass]=\"{\n 'pointer-events-none border-grayscale-20 bg-grayscale-5': disabled(),\n 'pointer-events-auto border-grayscale-30 bg-grayscale-0': !disabled(),\n }\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-owns]=\"'dropdown-container-' + componentId\"\n [attr.aria-labelledby]=\"componentId + '-label'\"\n role=\"combobox\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [ngClass]=\"{\n 'text-grayscale-90': !disabled() && !isClean(),\n 'text-grayscale-60': !disabled() && isClean(),\n 'text-grayscale-30': disabled(),\n }\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n >\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [ngClass]=\"{ 'border-grayscale-20': disabled(), 'border-grayscale-30': !disabled() }\"\n >\n <i\n class=\"fas\"\n [ngClass]=\"{\n 'text-grayscale-30': disabled(),\n 'text-grayscale-90': !disabled(),\n 'fa-caret-down': !showOptions(),\n 'fa-caret-up': showOptions(),\n }\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"'dropdown-container-' + componentId\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n />\n </form>\n <i class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"></i>\n </div>\n <button (click)=\"clearFilter()\">\n <i class=\"fas fa-times flex items-center\"></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">{{\n emptyMessage() ?? 'platform.angular_components.no_records_found' | translate\n }}</span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
|
|
609
644
|
}], ctorParameters: () => [] });
|
|
610
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7QUFrRDNGLE1BQU0sT0FBTyxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRW5C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akIsZUFBZSwyRkFDZixhQUFhOzs0RkFnQ1IsZUFBZTtrQkEzQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3Qjt3QkFDM0Msc0JBQXNCLEVBQUUsZUFBZTt3QkFDdkMsc0JBQXNCLEVBQUUsV0FBVzt3QkFDbkMsa0JBQWtCLEVBQUUsaURBQWlEO3dCQUNyRSw4QkFBOEIsRUFBRSxvRUFBb0U7d0JBQ3BHLG1CQUFtQixFQUFFLGtDQUFrQzt3QkFDdkQsc0JBQXNCLEVBQUUsWUFBWTt3QkFDcEMsSUFBSSxFQUFFLFVBQVU7cUJBQ25CLGFBYVU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25Jbml0LFxuICAgIHNpZ25hbCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHtcbiAgICBkYXRhOiBUO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZ3JvdXBlcj86IGJvb2xlYW47XG59XG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtZXhwYW5kZWRdJzogJ3Nob3dPcHRpb25zKCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1oYXNwb3B1cF0nOiAnXCJsaXN0Ym94XCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1vd25zXSc6ICdzaG93T3B0aW9ucygpID8gY29tcG9uZW50SWQgKyBcIi1saXN0Ym94XCIgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF0nOiAnZm9jdXNlZEluZGV4KCkgPj0gMCA/IGZpbHRlcmVkT3B0aW9ucygpW2ZvY3VzZWRJbmRleCgpXT8uaWQgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmFyaWEtbGFiZWxdJzogJ3BsYWNlaG9sZGVyKCkgfHwgXCJTZWxlY3Qgb3B0aW9uXCInLFxuICAgICAgICAnW2F0dHIuYXJpYS1kaXNhYmxlZF0nOiAnZGlzYWJsZWQoKScsXG4gICAgICAgIHJvbGU6ICdjb21ib2JveCcsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCB7XG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAuc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgb3B0aW9ucyA9IGlucHV0LnJlcXVpcmVkPFRbXT4oKTtcbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIHNob3dDbGVhciA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGZpbHRlckJ5ID0gaW5wdXQ8a2V5b2YgVCB8IChrZXlvZiBUKVtdPigpO1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbCA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcbiAgICBwdWJsaWMgc2hvd09wdGlvbnMgPSBtb2RlbChmYWxzZSk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcblxuICAgIHB1YmxpYyBjb21wb25lbnRJZCA9IGBzZWxlY3Qke1NlbGVjdENvbXBvbmVudC5uZXh0SWQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcy5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgKGV4Y2x1aW5kbyBhZ3J1cGFkb3JlcykgZXN0aXZlcmVtIHByZXNlbnRlc1xuICAgICAqIG5hIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLCBlIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGxTZWxlY3RlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gdGhpcy52YWx1ZXMoKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmlkKTtcblxuICAgICAgICBjb25zdCByZXQgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhvcHRpb24uaWQpKTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZEl0ZW0gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmF0KHRoaXMuZm9jdXNlZEluZGV4KCkpPy5kYXRhID8/IG51bGwpO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYHBsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy50b3RhbF9yZWNvcmRzX3NlbGVjdGVkYCwge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogc2VsZWN0ZWQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKHNlbGVjdGVkWzBdLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWQgPyB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWQuZGF0YSkgOiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEluZGljYSBzZSBvIHNlbGV0b3IgZXN0w6EgXCJsaW1wb1wiLCBvdSBzZWphLCBzZW0gbmVuaHVtIHZhbG9yIHNlbGVjaW9uYWRvLlxuICAgICAqIC0gTm8gbW9kbyBtw7psdGlwbG8gKGBtdWx0aXBsZWApLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZXNgIGVzdMOhIHZhemlvKS5cbiAgICAgKiAtIE5vIG1vZG8gc2ltcGxlcywgcmV0b3JuYSBgdHJ1ZWAgc2UgbsOjbyBob3V2ZXIgdmFsb3Igc2VsZWNpb25hZG8gKGB2YWx1ZWAgw6kgZmFsc3kpLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBuw6NvIGhvdXZlciBzZWxlw6fDo28sIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc0NsZWFuID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSgpID8gIXRoaXMudmFsdWVzKCkubGVuZ3RoIDogIXRoaXMudmFsdWUoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgbyBlc3RhZG8gZGUgc2VsZcOnw6NvIFwiU2VsZWNpb25hciBUb2Rvc1wiIGVzdMOhIGluZGV0ZXJtaW5hZG8uXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgcXVhbmRvIG5lbSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgZXN0w6NvIHNlbGVjaW9uYWRvcyBlIG5lbSB0b2RvcyBlc3TDo28gZGVzbWFyY2Fkb3MsXG4gICAgICogb3Ugc2VqYSwgcXVhbmRvIGjDoSB1bWEgc2VsZcOnw6NvIHBhcmNpYWwgZG9zIGl0ZW5zIGRpc3BvbsOtdmVpcy5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIGEgc2VsZcOnw6NvIGZvciBwYXJjaWFsLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0QWxsSXNJbmRldGVybWluYXRlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlcygpLnNvbWUoKG8pID0+IG8uaWQgPT09IG9wdGlvbi5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3QgYWxsID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWQuaW5jbHVkZXMob3B0aW9uKSk7XG4gICAgICAgIGNvbnN0IG5vbmUgPSBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+ICFzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcblxuICAgICAgICByZXR1cm4gIWFsbCAmJiAhbm9uZTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcyBjb20gYmFzZSBubyB2YWxvciBkZSBidXNjYSAoYGZpbHRlclZhbHVlYCkgZSBub3MgY3JpdMOpcmlvcyBkZWZpbmlkb3MuXG4gICAgICogLSBTZSBvIGZpbHRybyBlc3RpdmVyIGRlc2FiaWxpdGFkbyBvdSBvIHZhbG9yIGRlIGJ1c2NhIGVzdGl2ZXIgdmF6aW8sIHJldG9ybmEgdG9kYXMgYXMgb3DDp8O1ZXMuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIGZpbHRyYSBhcyBvcMOnw7VlcyB1dGlsaXphbmRvIG8ocykgY2FtcG8ocykgZXNwZWNpZmljYWRvKHMpIGVtIGBmaWx0ZXJCeWAuXG4gICAgICogLSBJZ25vcmEgb3DDp8O1ZXMgcXVlIHBvc3N1ZW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcmAgZGVmaW5pZGEuXG4gICAgICogQHJldHVybnMgQXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbmZvcm1lIG8gdmFsb3IgZGUgYnVzY2EgZSBjcml0w6lyaW9zIGRlIGZpbHRyby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyZWRPcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBhbGxPcHRpb25zID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5maWx0ZXJWYWx1ZSgpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5maWx0ZXIoKSB8fCAhc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm4gYWxsT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlckJ5ID0gdGhpcy5maWx0ZXJCeSgpO1xuICAgICAgICByZXR1cm4gYWxsT3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbGFiZWwgPSAnJztcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG5cbiAgICAgICAgICAgIGlmICghZmlsdGVyQnkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IG9wdGlvbkxhYmVsID8gU3RyaW5nKG9wdGlvbi5kYXRhW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uLmRhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlckJ5KSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gZmlsdGVyQnkubWFwKChieSkgPT4gU3RyaW5nKG9wdGlvbi5kYXRhW2J5XSA/PyAnJykpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBTdHJpbmcob3B0aW9uLmRhdGFbZmlsdGVyQnldID8/ICcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmlsdGVyRm9ybSA9IG5ldyBGb3JtR3JvdXA8eyBmaWx0ZXI6IEZvcm1Db250cm9sPHN0cmluZz4gfT4oe1xuICAgICAgICBmaWx0ZXI6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmc+KCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgcHJpdmF0ZSBfY29udGFpbmVyRGl2ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyRGl2Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF90cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gdmFsb3Igc2VsZWNpb25hZG8gZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogQHBhcmFtIHZhbHVlIE8gdmFsb3IgYSBzZXIgZGVmaW5pZG8uIFBvZGUgc2VyIHVtIG9iamV0byBkbyB0aXBvIGBUYCwgdW0gYXJyYXkgZGUgYFRgIChxdWFuZG8gbcO6bHRpcGxhIHNlbGXDp8OjbyBlc3TDoSBoYWJpbGl0YWRhKSwgb3UgYG51bGxgLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBvIHZhbG9yIG7Do28gZm9yIHVtIGFycmF5LCBsYW7Dp2EgdW0gZXJyby5cbiAgICAgKiBAdGhyb3dzIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBkZXNhdGl2YWRvIGUgbyB2YWxvciBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyBtYXBlaWEgbyhzKSB2YWxvcihlcykgZm9ybmVjaWRvKHMpIHBhcmEgYXMgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gY29tcG9uZW50ZSxcbiAgICAgKiBnYXJhbnRpbmRvIHF1ZSBhcGVuYXMgb3DDp8O1ZXMgdsOhbGlkYXMgc2VqYW0gc2VsZWNpb25hZGFzIGNvbmZvcm1lIG8gbW9kbyBkZSBzZWxlw6fDo28gKMO6bmljbyBvdSBtw7psdGlwbG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2YWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbmQoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvcHRpb24uZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKTogb3B0aW9uIGlzIEludGVybmFsRHJvcGRvd25PcHRpb248VD4gPT4gISFvcHRpb24pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBiZSBhbiBhcnJheSB3aGVuIFwibXVsdGlwbGVcIiBpcyB0cnVlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWUgbXVzdCBub3QgYmUgYW4gYXJyYXkgd2hlbiBcIm11bHRpcGxlXCIgaXMgZmFsc2UuJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmluZCgob3B0aW9uKSA9PiBvcHRpb24uZGF0YVtvcHRpb25WYWx1ZV0gPT09IHZhbHVlW29wdGlvblZhbHVlXSkgPz8gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSA/P1xuICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnZhbHVlLnNldChtYXBwZWQgPz8gbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgc2VtcHJlIHF1ZSBvIHZhbG9yIGRvIGNvbXBvbmVudGUgbXVkYXIuXG4gICAgICogQHBhcmFtIG9uQ2hhbmdlIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIHF1ZSByZWNlYmUgbyBub3ZvIHZhbG9yIHNlbGVjaW9uYWRvIG91IG51bGwuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6ICh2YWx1ZTogVCB8IFRbXSB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RyYSB1bWEgZnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHNlcsOhIGNoYW1hZGEgcXVhbmRvIG8gY29tcG9uZW50ZSBmb3IgdG9jYWRvIChwZXJkZXIgbyBmb2NvKS5cbiAgICAgKiBAcGFyYW0gb25Ub3VjaGVkIEZ1bsOnw6NvIGRlIGNhbGxiYWNrIGEgc2VyIGV4ZWN1dGFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciBtYXJjYWRvIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyBlc3RhZG8gZGUgZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUuXG4gICAgICogQHBhcmFtIGRpc2FibGVkIEluZGljYSBzZSBvIGNvbXBvbmVudGUgZGV2ZSBzZXIgZGVzYWJpbGl0YWRvIChgdHJ1ZWApIG91IGhhYmlsaXRhZG8gKGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQuc2V0KGRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbHRlcm5hIGEgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMgZG8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIHJlYWxpemEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogQ2FzbyBjb250csOhcmlvLCBpbnZlcnRlIG8gZXN0YWRvIGRlIGV4aWJpw6fDo28gZGFzIG9ww6fDtWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNob3VsZE9wZW4gPSAhdGhpcy5zaG93T3B0aW9ucygpO1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChzaG91bGRPcGVuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gZGlyZXRpdmFzICpuZ0ZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIFBhcmEgY2FkYSBpdGVtIG5vIGFycmF5IGRlIG9ww6fDtWVzLCBnZXJhIHVtIG9iamV0byBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbmAgY29udGVuZG8gbyBkYWRvIG9yaWdpbmFsXG4gICAgICogZSB1bSBjYW1wbyBgaWRgIMO6bmljbyBiYXNlYWRvIG5vIHRpbWVzdGFtcCBhdHVhbCBlIG5vIMOtbmRpY2UgZG8gaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwb1xuICAgICAqIChkZXRlY3RhZG8gcGVsYSBwcmVzZW7Dp2EgZGUgdW0gYXJyYXkgYGl0ZW1zYCksIGFkaWNpb25hIHRhbWLDqW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBvcMOnw7VlcyBkbyB0aXBvIGBUYCBhIHNlcmVtIHByb2Nlc3NhZGFzLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvT3B0aW9ucyhvcHRpb25zOiBUW10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAoKSAmJiBBcnJheS5pc0FycmF5KChvcHRpb24gYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgICAgICAgICBncm91cGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCkge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICAjY29udGFpbmVyRGl2XG4gICAgY2RrT3ZlcmxheU9yaWdpblxuICAgICN0cmlnZ2VyPVwiY2RrT3ZlcmxheU9yaWdpblwiXG4gICAgY2xhc3M9XCJzZWxlY3QtY29udGFpbmVyIGdyb3VwIGZsZXggaC1bMzVweF0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLVszcHhdIGJvcmRlciBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5IGZvY3VzOm91dGxpbmVcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3BvaW50ZXItZXZlbnRzLW5vbmUgYm9yZGVyLWdyYXlzY2FsZS0yMCBiZy1ncmF5c2NhbGUtNSc6IGRpc2FibGVkKCksXG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1hdXRvIGJvcmRlci1ncmF5c2NhbGUtMzAgYmctZ3JheXNjYWxlLTAnOiAhZGlzYWJsZWQoKSxcbiAgICB9XCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtb3duc109XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImNvbXBvbmVudElkICsgJy1sYWJlbCdcIlxuICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgKGNsaWNrKT1cIm9uQ29udGFpbmVyRGl2Q2xpY2soKVwiXG4gICAgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIlxuICAgIHRhYmluZGV4PVwiMFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC0zIHB5LVs3cHhdXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCkgJiYgIWlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS02MCc6ICFkaXNhYmxlZCgpICYmIGlzQ2xlYW4oKSxcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgIH1cIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyIGZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1sIHB4LTMgZ3JvdXAtaG92ZXI6YmctZ3JheXNjYWxlLTEwIGdyb3VwLWZvY3VzOmJvcmRlci1wcmltYXJ5XCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnYm9yZGVyLWdyYXlzY2FsZS0yMCc6IGRpc2FibGVkKCksICdib3JkZXItZ3JheXNjYWxlLTMwJzogIWRpc2FibGVkKCkgfVwiXG4gICAgPlxuICAgICAgICA8aVxuICAgICAgICAgICAgY2xhc3M9XCJmYXNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS0zMCc6IGRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ3RleHQtZ3JheXNjYWxlLTkwJzogIWRpc2FibGVkKCksXG4gICAgICAgICAgICAgICAgJ2ZhLWNhcmV0LWRvd24nOiAhc2hvd09wdGlvbnMoKSxcbiAgICAgICAgICAgICAgICAnZmEtY2FyZXQtdXAnOiBzaG93T3B0aW9ucygpLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgID48L2k+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICAgI2Ryb3Bkb3duVGVtcGxhdGVcbiAgICBjZGtDb25uZWN0ZWRPdmVybGF5XG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW5dPVwidHJpZ2dlclwiXG4gICAgW2Nka0Nvbm5lY3RlZE92ZXJsYXlPcGVuXT1cInNob3dPcHRpb25zKClcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3BdPVwidHJ1ZVwiXG4gICAgKGJhY2tkcm9wQ2xpY2spPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3M9XCJjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFwiXG4gICAgKGRldGFjaCk9XCJzaG93T3B0aW9ucy5zZXQoZmFsc2UpXCJcbj5cbiAgICA8ZGl2XG4gICAgICAgIFtpZF09XCInZHJvcGRvd24tY29udGFpbmVyLScgKyBjb21wb25lbnRJZFwiXG4gICAgICAgIGNsYXNzPVwiZHJvcGRvd24tYm9keS1jbGFzcyB6LVsxMDAwXSByb3VuZGVkLVszcHhdIGJnLWdyYXlzY2FsZS0wIHB5LTEgc2hhZG93LW1kXCJcbiAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb250YWluZXJEaXYub2Zmc2V0V2lkdGhcIlxuICAgID5cbiAgICAgICAgQGlmIChmaWx0ZXIoKSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGl0ZW1zLWNlbnRlciBnYXAtMyBweC0zIHB5LTEuNVwiPlxuICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICA8cy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgI3NlbGVjdEFsbENoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJhbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdEFsbElzSW5kZXRlcm1pbmF0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGVja2VkQ2hhbmdlKT1cInRvZ2dsZVNlbGVjdEFsbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLVszNXB4XSBncm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ3Jvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZpbHRlckZvcm1cIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbCBncm93IHJvdW5kZWQtWzNweF0gYm9yZGVyIGJvcmRlci1ncmF5c2NhbGUtMzAgcGwtMi41IHByLTcgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBhYnNvbHV0ZSByaWdodC0yLjUgdG9wLTIuNSB0ZXh0LWdyYXlzY2FsZS05MFwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjbGVhckZpbHRlcigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzIGZsZXggaXRlbXMtY2VudGVyXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIFZpcnR1YWwgc2Nyb2xsIC0tPlxuICAgICAgICBAaWYgKHZpcnR1YWxTY3JvbGwoKSAmJiBmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPiAxMCkge1xuICAgICAgICAgICAgPGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFxuICAgICAgICAgICAgICAgIFtpdGVtU2l6ZV09XCJ2aXJ0dWFsU2Nyb2xsSXRlbVNpemUoKVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJoLTUyIG92ZXJmbG93LWF1dG9cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIE5vcm1hbCBsaXN0IC0tPlxuICAgICAgICBAaWYgKCF2aXJ0dWFsU2Nyb2xsKCkgfHwgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoIDw9IDEwKSB7XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtYXgtaC01MiBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9ucygpOyB0cmFjayBvcHRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtc2VsZWN0LW9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW2lkXT1cIm9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZ2V0T3B0aW9uTGFiZWwob3B0aW9uLmRhdGEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja21hcmtdPVwiY2hlY2ttYXJrKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzU2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJzZWxlY3RJdGVtKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzR3JvdXBlcl09XCJvcHRpb24uZ3JvdXBlciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNGb2N1c2VkXT1cIm9wdGlvbi5kYXRhID09PSBmb2N1c2VkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvcy1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLTMgdGV4dC1ncmF5c2NhbGUtNjBcIj57e1xuICAgICAgICAgICAgICAgIGVtcHR5TWVzc2FnZSgpID8/ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMubm9fcmVjb3Jkc19mb3VuZCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|
|
645
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDSCxTQUFTLEVBQ1QsUUFBUSxFQUVSLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7Ozs7Ozs7QUFrRDNGLE1BQU0sT0FBTyxlQUFlO0lBQ2hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRW5C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QixlQUFlLDJGQUNmLGFBQWE7OzRGQWdDUixlQUFlO2tCQTNDM0IsU0FBUzsrQkFDSSxVQUFVLGNBRVIsSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLHFCQUFxQjt3QkFDckIsaUJBQWlCO3dCQUNqQixlQUFlO3dCQUNmLGFBQWE7cUJBQ2hCLFFBQ0s7d0JBQ0YsaUJBQWlCLEVBQUUsd0JBQXdCO3dCQUMzQyxzQkFBc0IsRUFBRSxlQUFlO3dCQUN2QyxzQkFBc0IsRUFBRSxXQUFXO3dCQUNuQyxrQkFBa0IsRUFBRSxpREFBaUQ7d0JBQ3JFLDhCQUE4QixFQUFFLG9FQUFvRTt3QkFDcEcsbUJBQW1CLEVBQUUsa0NBQWtDO3dCQUN2RCxzQkFBc0IsRUFBRSxZQUFZO3dCQUNwQyxJQUFJLEVBQUUsVUFBVTtxQkFDbkIsYUFhVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPdmVybGF5TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkluaXQsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3Qtb3B0aW9uL3NlbGVjdC1vcHRpb24uY29tcG9uZW50JztcblxuaW50ZXJmYWNlIEludGVybmFsRHJvcGRvd25PcHRpb248VD4ge1xuICAgIGRhdGE6IFQ7XG4gICAgaWQ6IHN0cmluZztcbiAgICBncm91cGVyPzogYm9vbGVhbjtcbn1cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1zZWxlY3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBDb21tb25Nb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICAgICAgU2VsZWN0T3B0aW9uQ29tcG9uZW50LFxuICAgICAgICBDaGVja2JveENvbXBvbmVudCxcbiAgICAgICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgICAgICBPdmVybGF5TW9kdWxlLFxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnKHdpbmRvdzpyZXNpemUpJzogJ29uV2luZG93UmVzaXplKCRldmVudCknLFxuICAgICAgICAnW2F0dHIuYXJpYS1leHBhbmRlZF0nOiAnc2hvd09wdGlvbnMoKScsXG4gICAgICAgICdbYXR0ci5hcmlhLWhhc3BvcHVwXSc6ICdcImxpc3Rib3hcIicsXG4gICAgICAgICdbYXR0ci5hcmlhLW93bnNdJzogJ3Nob3dPcHRpb25zKCkgPyBjb21wb25lbnRJZCArIFwiLWxpc3Rib3hcIiA6IG51bGwnLFxuICAgICAgICAnW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XSc6ICdmb2N1c2VkSW5kZXgoKSA+PSAwID8gZmlsdGVyZWRPcHRpb25zKClbZm9jdXNlZEluZGV4KCldPy5pZCA6IG51bGwnLFxuICAgICAgICAnW2F0dHIuYXJpYS1sYWJlbF0nOiAncGxhY2Vob2xkZXIoKSB8fCBcIlNlbGVjdCBvcHRpb25cIicsXG4gICAgICAgICdbYXR0ci5hcmlhLWRpc2FibGVkXSc6ICdkaXNhYmxlZCgpJyxcbiAgICAgICAgcm9sZTogJ2NvbWJvYm94JyxcbiAgICB9LFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIHtcbiAgICAgICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIC5zZWxlY3QtY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQge1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgnJyk7XG4gICAgcHVibGljIG11bHRpcGxlID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuICAgIHB1YmxpYyBvcHRpb25MYWJlbCA9IGlucHV0PGtleW9mIFQ+KCk7XG4gICAgcHVibGljIG9wdGlvblZhbHVlID0gaW5wdXQ8a2V5b2YgVD4oKTtcbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dChmYWxzZSk7XG4gICAgcHVibGljIGNoZWNrbWFyayA9IGlucHV0KGZhbHNlKTtcbiAgICBwdWJsaWMgZmlsdGVyQnkgPSBpbnB1dDxrZXlvZiBUIHwgKGtleW9mIFQpW10+KCk7XG4gICAgcHVibGljIGdyb3VwID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsSXRlbVNpemUgPSBpbnB1dCgzNyk7XG4gICAgcHVibGljIGVtcHR5TWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgcHVibGljIGRpc2FibGVkID0gbW9kZWwoZmFsc2UpO1xuICAgIHB1YmxpYyBzaG93T3B0aW9ucyA9IG1vZGVsKGZhbHNlKTtcblxuICAgIHB1YmxpYyB2YWx1ZSA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHZhbHVlcyA9IHNpZ25hbDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KFtdKTtcbiAgICBwdWJsaWMgZmlsdGVyVmFsdWUgPSBzaWduYWwoJycpO1xuICAgIHB1YmxpYyBmb2N1c2VkSW5kZXggPSBzaWduYWwoLTEpO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYHNlbGVjdCR7U2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyAoZXhjbHVpbmRvIGFncnVwYWRvcmVzKSBlc3RpdmVyZW0gcHJlc2VudGVzXG4gICAgICogbmEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MsIGUgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGFsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnZhbHVlcygpLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IHJldCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKG9wdGlvbi5pZCkpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5kYXRhID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcbiAgICBwcml2YXRlIF9vbkNoYW5nZTogKHZhbHVlOiBhbnkgfCBhbnlbXSB8IG51bGwpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBwcml2YXRlIF9vblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3RyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtXG4gICAgICAgICAgICAuZ2V0KCdmaWx0ZXInKSFcbiAgICAgICAgICAgIC52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWUuc2V0KHZhbHVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGVJbnB1dHMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBzZWxlY2lvbmFkbyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgTyB2YWxvciBhIHNlciBkZWZpbmlkby4gUG9kZSBzZXIgdW0gb2JqZXRvIGRvIHRpcG8gYFRgLCB1bSBhcnJheSBkZSBgVGAgKHF1YW5kbyBtw7psdGlwbGEgc2VsZcOnw6NvIGVzdMOhIGhhYmlsaXRhZGEpLCBvdSBgbnVsbGAuXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG8gdmFsb3IgbsOjbyBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGRlc2F0aXZhZG8gZSBvIHZhbG9yIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIG1hcGVpYSBvKHMpIHZhbG9yKGVzKSBmb3JuZWNpZG8ocykgcGFyYSBhcyBvcMOnw7VlcyBpbnRlcm5hcyBkbyBjb21wb25lbnRlLFxuICAgICAqIGdhcmFudGluZG8gcXVlIGFwZW5hcyBvcMOnw7VlcyB2w6FsaWRhcyBzZWphbSBzZWxlY2lvbmFkYXMgY29uZm9ybWUgbyBtb2RvIGRlIHNlbGXDp8OjbyAow7puaWNvIG91IG3Dumx0aXBsbykuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHZhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxPcHRpb25zKCkuZmluZCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kYXRhKSA9PT0gSlNPTi5zdHJpbmdpZnkodmFsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHRpb24pOiBvcHRpb24gaXMgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiA9PiAhIW9wdGlvbik7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQobWFwcGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IGJlIGFuIGFycmF5IHdoZW4gXCJtdWx0aXBsZVwiIGlzIHRydWUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcbiAgICAgICAgICAgIGxldCBtYXBwZWQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSBtdXN0IG5vdCBiZSBhbiBhcnJheSB3aGVuIFwibXVsdGlwbGVcIiBpcyBmYWxzZS4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlICYmIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWFwcGVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maW5kKChvcHRpb24pID0+IG9wdGlvbi5kYXRhW29wdGlvblZhbHVlXSA9PT0gdmFsdWVbb3B0aW9uVmFsdWVdKSA/PyBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybmFsT3B0aW9ucygpLmZpbmQoKG9wdGlvbikgPT4gSlNPTi5zdHJpbmdpZnkob3B0aW9uLmRhdGEpID09PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpID8/XG4gICAgICAgICAgICAgICAgICAgIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG1hcHBlZCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHJlY2ViZSBvIG5vdm8gdmFsb3Igc2VsZWNpb25hZG8gb3UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgZXhlY3V0YWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIG1hcmNhZG8gY29tbyBcInRvY2Fkb1wiLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGVzdGFkbyBkZSBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWQgSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBkZXZlIHNlciBkZXNhYmlsaXRhZG8gKGB0cnVlYCkgb3UgaGFiaWxpdGFkbyAoYGZhbHNlYCkuXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRhcyBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gcmVhbGl6YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGludmVydGUgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMuXG4gICAgICogQW8gYWJyaXIsIG1vdmUgbyBmb2NvIHBhcmEgbyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkT3BlbiA9ICF0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KHNob3VsZE9wZW4pO1xuXG4gICAgICAgIGlmIChzaG91bGRPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpbXBhIG8gdmFsb3Igc2VsZWNpb25hZG8gbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogU2UgbyBjb21wb25lbnRlIGVzdGl2ZXIgZGVzYWJpbGl0YWRvLCBuw6NvIGV4ZWN1dGEgbmVuaHVtYSBhw6fDo28uXG4gICAgICogUGFyYSBzZWxlw6fDo28gbcO6bHRpcGxhLCByZW1vdmUgdG9kb3Mgb3MgdmFsb3JlcyBzZWxlY2lvbmFkb3MgZSBub3RpZmljYSBhIGFsdGVyYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIMO6bmljYSwgZGVmaW5lIG8gdmFsb3IgY29tbyBudWxvIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gXCJ0b2NhZG9cIi5cbiAgICAgKiBJbXBlZGUgYSBwcm9wYWdhw6fDo28gZG8gZXZlbnRvIGRvIG1vdXNlLlxuICAgICAqIEBwYXJhbSBldmVudCBFdmVudG8gZG8gbW91c2UgcXVlIGFjaW9ub3UgYSBsaW1wZXphIGRhIHNlbGXDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXIoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuXG4gICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIGZpbHRybyBkbyBmb3JtdWzDoXJpbywgcmVzZXRhbmRvIG8gY2FtcG8gJ2ZpbHRlcicgZG8gZm9ybXVsw6FyaW8gZGUgZmlsdHJvLlxuICAgICAqIEVzdGUgbcOpdG9kbyByZWRlZmluZSBvIHZhbG9yIGRvIGNhbXBvICdmaWx0ZXInIHBhcmEgc2V1IGVzdGFkbyBpbmljaWFsLFxuICAgICAqIHJlbW92ZW5kbyBxdWFscXVlciB0ZXh0byBvdSB2YWxvciBwcmV2aWFtZW50ZSBpbnNlcmlkbyBwZWxvIHVzdcOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckZpbHRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtLmdldCgnZmlsdGVyJyk/LnJlc2V0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgcmVkaW1lbnNpb25hbWVudG8gZGEgamFuZWxhLlxuICAgICAqIEZlY2hhIG8gZHJvcGRvd24gZGUgb3DDp8O1ZXMgY2FzbyBlbGUgZXN0ZWphIHZpc8OtdmVsIGFvIHJlZGltZW5zaW9uYXIgYSBqYW5lbGEuXG4gICAgICogQHBhcmFtIF8gRXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbldpbmRvd1Jlc2l6ZShfOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYW5pcHVsYSBvIGV2ZW50byBkZSBjbGlxdWUgbm8gZWxlbWVudG8gY29udGFpbmVyIGRhIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gYWx0ZXJuYSBvIGVzdGFkbyBkZSBleGliacOnw6NvIGRvIGNvbXBvbmVudGUgc2VsZWN0IGUsXG4gICAgICogZW0gc2VndWlkYSwgZGVmaW5lIG8gZm9jbyBubyBlbGVtZW50byBjb250YWluZXIgY29ycmVzcG9uZGVudGUuXG4gICAgICovXG4gICAgcHVibGljIG9uQ29udGFpbmVyRGl2Q2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgX3NlbGVjdE9wdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgYXNzb2NpYWRvIGEgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gZG8gdGlwbyBUIHBhcmEgYSBxdWFsIG8gcsOzdHVsbyBkZXZlIHNlciBvYnRpZG8uXG4gICAgICogQHJldHVybnMgTyByw7N0dWxvIGRhIG9ww6fDo28gY29tbyB1bWEgc3RyaW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRPcHRpb25MYWJlbChvcHRpb246IFQpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuw6fDo28gZGUgdHJhY2tCeSB1dGlsaXphZGEgZW0gZGlyZXRpdmFzICpuZ0ZvciBwYXJhIG90aW1pemFyIGEgcmVuZGVyaXphw6fDo28gZGUgbGlzdGFzLlxuICAgICAqIFJldG9ybmEgbyBpZGVudGlmaWNhZG9yIMO6bmljbyAoYGlkYCkgZGUgY2FkYSBpdGVtIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEBwYXJhbSBfIC0gw41uZGljZSBkbyBpdGVtIG5hIGxpc3RhIChuw6NvIHV0aWxpemFkbykuXG4gICAgICogQHBhcmFtIGl0ZW0gLSBPIGl0ZW0gYXR1YWwgZGEgbGlzdGEgZG8gdGlwbyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAuXG4gICAgICogQHJldHVybnMgTyBpZGVudGlmaWNhZG9yIMO6bmljbyBkbyBpdGVtIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhY2tCeUlkKF86IG51bWJlciwgaXRlbTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZlcmlmaWNhIHNlIGEgb3DDp8OjbyBmb3JuZWNpZGEgZXN0w6Egc2VsZWNpb25hZGEuXG4gICAgICogQHBhcmFtIG9wdGlvbiAtIEEgb3DDp8OjbyBpbnRlcm5hIGRvIGRyb3Bkb3duIGEgc2VyIHZlcmlmaWNhZGEuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIGEgb3DDp8OjbyBlc3RpdmVyIHNlbGVjaW9uYWRhLCBjYXNvIGNvbnRyw6FyaW8gYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNPcHRpb25TZWxlY3RlZChvcHRpb246IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudmFsdWVzKCkuZmluZCgobykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBvID09PSBvcHRpb247XG4gICAgICAgICAgICB9KSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWx0ZXJuYSBhIHNlbGXDp8OjbyBkZSB0b2RvcyBvcyBpdGVucyBkaXNwb27DrXZlaXMuXG4gICAgICogU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8sIHNlbGVjaW9uYSB0b2RvcyBvcyBpdGVucyBmaWx0cmFkb3MgcXVlIG7Do28gc8OjbyBhZ3J1cGFkb3Jlc1xuICAgICAqIGNhc28gbmVtIHRvZG9zIGVzdGVqYW0gc2VsZWNpb25hZG9zLCBvdSBsaW1wYSBhIHNlbGXDp8OjbyBjYXNvIHRvZG9zIGrDoSBlc3RlamFtIHNlbGVjaW9uYWRvcy5cbiAgICAgKiBBcMOzcyBhIGFsdGVyYcOnw6NvLCBub3RpZmljYSBhIG11ZGFuw6dhIGRlIHZhbG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVTZWxlY3RBbGwoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcblxuICAgICAgICBpZiAodGhpcy5hbGxTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQoW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZXMoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIHLDs3R1bG8gKGxhYmVsKSBkZSB1bWEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogRXN0ZSBtw6l0b2RvIHV0aWxpemEgYSBwcm9wcmllZGFkZSBkZWZpbmlkYSBwb3IgYG9wdGlvbkxhYmVsYCBwYXJhIGV4dHJhaXIgbyB2YWxvciBkbyByw7N0dWxvIGRhIG9ww6fDo28uXG4gICAgICogQ2FzbyBgb3B0aW9uTGFiZWxgIG7Do28gZXN0ZWphIGRlZmluaWRvLCByZXRvcm5hIGEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBwcsOzcHJpYSBvcMOnw6NvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbiBBIG9ww6fDo28gZGEgcXVhbCBvIHLDs3R1bG8gc2Vyw6EgZXh0cmHDrWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRMYWJlbEZyb21PcHRpb24ob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uTGFiZWwgPSB0aGlzLm9wdGlvbkxhYmVsKCk7XG4gICAgICAgIHJldHVybiBvcHRpb25MYWJlbCA/IFN0cmluZyhvcHRpb25bb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYSBhcyBlbnRyYWRhcyBkbyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gdmVyaWZpY2Egc2UgYXMgb3DDp8O1ZXMgZm9ybmVjaWRhcyBzw6NvIHbDoWxpZGFzLiBDYXNvIGFzIG9ww6fDtWVzIHNlamFtIG9iamV0b3MsXG4gICAgICogZ2FyYW50ZSBxdWUgYSBwcm9wcmllZGFkZSBgb3B0aW9uTGFiZWxgIGVzdGVqYSBkZWZpbmlkYSwgbGFuw6dhbmRvIHVtIGVycm8gY2FzbyBjb250csOhcmlvLlxuICAgICAqIFNlIG7Do28gaG91dmVyIG9ww6fDtWVzLCBhIHZhbGlkYcOnw6NvIMOpIGlnbm9yYWRhLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHRocm93cyB7RXJyb3J9IFNlIGFzIG9ww6fDtWVzIGZvcmVtIG9iamV0b3MgZSBgb3B0aW9uTGFiZWxgIG7Do28gZXN0aXZlciBkZWZpbmlkby5cbiAgICAgKi9cbiAgICBwcml2YXRlIF92YWxpZGF0ZUlucHV0cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucygpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc09iamVjdE9wdGlvbnMgPSBvcHRpb25zLnNvbWUoKG9wdGlvbikgPT4gdHlwZW9mIG9wdGlvbiA9PT0gJ29iamVjdCcgJiYgb3B0aW9uICE9PSBudWxsKTtcblxuICAgICAgICBpZiAoaGFzT2JqZWN0T3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbkxhYmVsKCkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBcIm9wdGlvbkxhYmVsXCIgaW5wdXQgaXMgcmVxdWlyZWQgd2hlbiBvcHRpb25zIGFyZSBvYmplY3RzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBkZSBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2N1bHRhIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBlIHJlZGVmaW5lIG8gw61uZGljZSBkbyBpdGVtIGZvY2FkbyBwYXJhIC0xLFxuICAgICAqIGluZGljYW5kbyBxdWUgbmVuaHVtIGl0ZW0gZXN0w6EgYXR1YWxtZW50ZSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jbG9zZURyb3Bkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dPcHRpb25zLnNldChmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldCgtMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRpY2lvbmEgdW0gaWRlbnRpZmljYWRvciDDum5pY28gYSBjYWRhIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIFBhcmEgY2FkYSBpdGVtIG5vIGFycmF5IGRlIG9ww6fDtWVzLCBnZXJhIHVtIG9iamV0byBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbmAgY29udGVuZG8gbyBkYWRvIG9yaWdpbmFsXG4gICAgICogZSB1bSBjYW1wbyBgaWRgIMO6bmljbyBiYXNlYWRvIG5vIHRpbWVzdGFtcCBhdHVhbCBlIG5vIMOtbmRpY2UgZG8gaXRlbS4gQ2FzbyBhIG9ww6fDo28gc2VqYSB1bSBncnVwb1xuICAgICAqIChkZXRlY3RhZG8gcGVsYSBwcmVzZW7Dp2EgZGUgdW0gYXJyYXkgYGl0ZW1zYCksIGFkaWNpb25hIHRhbWLDqW0gYSBwcm9wcmllZGFkZSBgZ3JvdXBlcjogdHJ1ZWAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSBkZSBvcMOnw7VlcyBkbyB0aXBvIGBUYCBhIHNlcmVtIHByb2Nlc3NhZGFzLlxuICAgICAqIEByZXR1cm5zIFVtIGFycmF5IGRlIG9iamV0b3MgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIGNvbSBpZGVudGlmaWNhZG9yZXMgw7puaWNvcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hZGRJZFRvT3B0aW9ucyhvcHRpb25zOiBUW10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHJldHVybiBvcHRpb25zLm1hcCgob3B0aW9uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXAoKSAmJiBBcnJheS5pc0FycmF5KChvcHRpb24gYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgICAgICAgICBncm91cGVyOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0YTogb3B0aW9uLFxuICAgICAgICAgICAgICAgIGlkOiBgaWRfJHt0aW1lc3RhbXB9XyR7aW5kZXgrK31gLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydGUgdW1hIGxpc3RhIGRlIG9ww6fDtWVzIHBvc3NpdmVsbWVudGUgYWdydXBhZGFzIGVtIHVtYSBsaXN0YSBwbGFuYSBkZSBvcMOnw7Vlcy5cbiAgICAgKiBQYXJhIGNhZGEgb3DDp8OjbyBxdWUgcG9zc3VpIHVtIGFncnVwYWRvciAoYGdyb3VwZXJgKSBlIHVtIGFycmF5IGRlIGl0ZW5zIGVtIGBkYXRhLml0ZW1zYCxcbiAgICAgKiBhZGljaW9uYSBhIG9ww6fDo28gZG8gYWdydXBhZG9yIGUsIGVtIHNlZ3VpZGEsIGFkaWNpb25hIGNhZGEgaXRlbSBkbyBncnVwbyBjb21vIHVtYSBub3ZhIG9ww6fDo29cbiAgICAgKiBpbmRpdmlkdWFsLCBhdHJpYnVpbmRvIHVtIGBpZGAgw7puaWNvIHBhcmEgY2FkYSBpdGVtIGRvIGdydXBvLlxuICAgICAqIENhc28gYSBvcMOnw6NvIG7Do28gc2VqYSB1bSBhZ3J1cGFkb3IsIGVsYSDDqSBhZGljaW9uYWRhIGRpcmV0YW1lbnRlIGFvIHJlc3VsdGFkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLCBwb2RlbmRvIGNvbnRlciBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcmV0dXJucyBMaXN0YSBwbGFuYSBkZSBvcMOnw7VlcywgaW5jbHVpbmRvIGFncnVwYWRvcmVzIGUgc2V1cyBpdGVucyBleHBhbmRpZG9zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dyb3VwZXJUb0ZsYXQob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKTogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10gPSBbXTtcblxuICAgICAgICBvcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbi5ncm91cGVyICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cEl0ZW1zID0gKG9wdGlvbi5kYXRhIGFzIGFueSkuaXRlbXMubWFwKChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICBpZDogYCR7b3B0aW9uLmlkfV9pdGVtXyR7aW5kZXh9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uZ3JvdXBJdGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG9wdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBxdWUgc2VqYW0gYWdydXBhZG9yZXMuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c05leHRPcHRpb24ob3B0aW9uczogSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdKSB7XG4gICAgICAgIGxldCBuZXh0SW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpICsgMTtcblxuICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGggJiYgb3B0aW9uc1tuZXh0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQobmV4dEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZSBvIGZvY28gcGFyYSBhIG9ww6fDo28gYW50ZXJpb3IgbmEgbGlzdGEsIGlnbm9yYW5kbyBvcMOnw7VlcyBkbyB0aXBvIFwiZ3JvdXBlclwiLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IHByZXZJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgLSAxO1xuXG4gICAgICAgIHdoaWxlIChwcmV2SW5kZXggPj0gMCAmJiBvcHRpb25zW3ByZXZJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgcHJldkluZGV4LS07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChwcmV2SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSb2xhIGEgbGlzdGEgZGUgb3DDp8O1ZXMgcGFyYSBnYXJhbnRpciBxdWUgYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGVzdGVqYSB2aXPDrXZlbC5cbiAgICAgKiBFc3RlIG3DqXRvZG8gb2J0w6ltIG8gSUQgZGEgb3DDp8OjbyBhdHVhbG1lbnRlIGZvY2FkYSBhIHBhcnRpciBkYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogU2UgdW0gSUQgdsOhbGlkbyBmb3IgZW5jb250cmFkbywgYnVzY2EgbyBlbGVtZW50byBjb3JyZXNwb25kZW50ZSBubyBET00gZSB1dGlsaXphXG4gICAgICogYHNjcm9sbEludG9WaWV3YCBwYXJhIHJvbGFyIGF0w6kgYSBvcMOnw6NvLCBhbGluaGFuZG8tYSBhbyBibG9jbyBtYWlzIHByw7N4aW1vLlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZCA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKClbdGhpcy5mb2N1c2VkSW5kZXgoKV0/LmlkO1xuXG4gICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgICAgICBlbD8uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGZvY28gbm8gaXRlbSBhdHVhbG1lbnRlIHNlbGVjaW9uYWRvIGFvIGFicmlyIG8gZHJvcGRvd24uXG4gICAgICogTm8gbW9kbyBzaW1wbGVzLCBmb2NhIG8gaXRlbSBzZWxlY2lvbmFkby4gTm8gbW9kbyBtw7psdGlwbG8sIGZvY2EgbyBwcmltZWlybyBpdGVtIHNlbGVjaW9uYWRvLlxuICAgICAqIEFww7NzIHJlbmRlcml6YcOnw6NvIGRvIG92ZXJsYXksIHJvbGEgYSBsaXN0YSBhdMOpIG8gaXRlbSBmb2NhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1NlbGVjdGVkT3B0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcbiAgICAgICAgbGV0IHNlbGVjdGVkSW5kZXggPSAtMTtcblxuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdFNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKVswXTtcbiAgICAgICAgICAgIGlmIChmaXJzdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBmaXJzdFNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZSgpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KChvKSA9PiBvLmlkID09PSBzZWxlY3RlZC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzZWRJbmRleC5zZXQoc2VsZWN0ZWRJbmRleCk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kZXggPj0gMCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgI2NvbnRhaW5lckRpdlxuICAgIGNka092ZXJsYXlPcmlnaW5cbiAgICAjdHJpZ2dlcj1cImNka092ZXJsYXlPcmlnaW5cIlxuICAgIGNsYXNzPVwic2VsZWN0LWNvbnRhaW5lciBncm91cCBmbGV4IGgtWzM1cHhdIHctZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1bM3B4XSBib3JkZXIgb3V0bGluZS0xIG91dGxpbmUtcHJpbWFyeSBmb2N1czpvdXRsaW5lXCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICdwb2ludGVyLWV2ZW50cy1ub25lIGJvcmRlci1ncmF5c2NhbGUtMjAgYmctZ3JheXNjYWxlLTUnOiBkaXNhYmxlZCgpLFxuICAgICAgICAncG9pbnRlci1ldmVudHMtYXV0byBib3JkZXItZ3JheXNjYWxlLTMwIGJnLWdyYXlzY2FsZS0wJzogIWRpc2FibGVkKCksXG4gICAgfVwiXG4gICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInNob3dPcHRpb25zKClcIlxuICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwiJ2Ryb3Bkb3duLWNvbnRhaW5lci0nICsgY29tcG9uZW50SWRcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJjb21wb25lbnRJZCArICctbGFiZWwnXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIChjbGljayk9XCJvbkNvbnRhaW5lckRpdkNsaWNrKClcIlxuICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICB0YWJpbmRleD1cIjBcIlxuPlxuICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWdyb3cgc2VsZWN0LW5vbmUgcHgtMyBweS1bN3B4XVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpICYmICFpc0NsZWFuKCksXG4gICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtNjAnOiAhZGlzYWJsZWQoKSAmJiBpc0NsZWFuKCksXG4gICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZCgpLFxuICAgICAgICB9XCJcbiAgICA+XG4gICAgICAgIHt7IHByaW50KCkgfHwgcGxhY2Vob2xkZXIoKSB9fVxuICAgIDwvc3Bhbj5cblxuICAgIEBpZiAoIWRpc2FibGVkKCkgJiYgc2hvd0NsZWFyKCkgJiYgIWlzQ2xlYW4oKSkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm14LTNcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgfVxuXG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWNvbnRhaW5lciBmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItbCBweC0zIGdyb3VwLWhvdmVyOmJnLWdyYXlzY2FsZS0xMCBncm91cC1mb2N1czpib3JkZXItcHJpbWFyeVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2JvcmRlci1ncmF5c2NhbGUtMjAnOiBkaXNhYmxlZCgpLCAnYm9yZGVyLWdyYXlzY2FsZS0zMCc6ICFkaXNhYmxlZCgpIH1cIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAndGV4dC1ncmF5c2NhbGUtMzAnOiBkaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICd0ZXh0LWdyYXlzY2FsZS05MCc6ICFkaXNhYmxlZCgpLFxuICAgICAgICAgICAgICAgICdmYS1jYXJldC1kb3duJzogIXNob3dPcHRpb25zKCksXG4gICAgICAgICAgICAgICAgJ2ZhLWNhcmV0LXVwJzogc2hvd09wdGlvbnMoKSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChkZXRhY2gpPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBbaWRdPVwiJ2Ryb3Bkb3duLWNvbnRhaW5lci0nICsgY29tcG9uZW50SWRcIlxuICAgICAgICBjbGFzcz1cImRyb3Bkb3duLWJvZHktY2xhc3Mgei1bMTAwMF0gcm91bmRlZC1bM3B4XSBiZy1ncmF5c2NhbGUtMCBweS0xIHNoYWRvdy1tZFwiXG4gICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29udGFpbmVyRGl2Lm9mZnNldFdpZHRoXCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3MtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC1bMzVweF0gZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGdyb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmaWx0ZXJGb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgZ3JvdyByb3VuZGVkLVszcHhdIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHBsLTIuNSBwci03IG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1zZWFyY2ggYWJzb2x1dGUgcmlnaHQtMi41IHRvcC0yLjUgdGV4dC1ncmF5c2NhbGUtOTBcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xlYXJGaWx0ZXIoKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIHNjcm9sbCAtLT5cbiAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0zIHRleHQtZ3JheXNjYWxlLTYwXCI+e3tcbiAgICAgICAgICAgICAgICBlbXB0eU1lc3NhZ2UoKSA/PyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLm5vX3JlY29yZHNfZm91bmQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuIl19
|
|
@@ -119,7 +119,8 @@ class DynamicField extends DynamicForm {
|
|
|
119
119
|
component.setInput('field', this.field);
|
|
120
120
|
if (!isNullOrUndefined(this.field?.name) && 'formControl' in component.instance) {
|
|
121
121
|
// Must be this way because some teams use name like "e070emp.codemp"
|
|
122
|
-
|
|
122
|
+
const name = 'customName' in this.field ? this.field.customName : this.field.name;
|
|
123
|
+
component.setInput('formControl', this.group?.['controls'][name]);
|
|
123
124
|
}
|
|
124
125
|
return component;
|
|
125
126
|
}
|
|
@@ -128,7 +129,8 @@ class DynamicField extends DynamicForm {
|
|
|
128
129
|
return;
|
|
129
130
|
component.setInput('field', this.field);
|
|
130
131
|
if ('formControl' in component.instance) {
|
|
131
|
-
|
|
132
|
+
const name = 'customName' in this.field ? this.field.customName : this.field.name;
|
|
133
|
+
component.setInput('formControl', this.group?.['controls'][name]);
|
|
132
134
|
}
|
|
133
135
|
}
|
|
134
136
|
getComponent() {
|
|
@@ -336,12 +338,21 @@ class RowComponent {
|
|
|
336
338
|
const fieldSize = new FieldSize(field.size ?? {});
|
|
337
339
|
return fieldSize.getGridClass();
|
|
338
340
|
}
|
|
341
|
+
getName(field) {
|
|
342
|
+
if ('customName' in field && field.customName) {
|
|
343
|
+
return field.customName;
|
|
344
|
+
}
|
|
345
|
+
else if ('name' in field) {
|
|
346
|
+
return field.name;
|
|
347
|
+
}
|
|
348
|
+
return '';
|
|
349
|
+
}
|
|
339
350
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
340
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RowComponent, isStandalone: true, selector: "s-row", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null }, errorMessages: { classPropertyName: "errorMessages", publicName: "errorMessages", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"w-full\"\n [formGroup]=\"group()\"\n>\n @let rowConfig = config();\n @let rowIsVisible = formUtils.getFieldProperty(rowConfig.visible, true);\n @if (rowIsVisible) {\n <div class=\"grid w-screen max-w-full grid-cols-12 gap-4\">\n @for (field of config().fields; let i = $index; track i) {\n @if (fieldIsExpandedDynamicType(field)) {\n @let fieldVisible = formUtils.getFieldProperty(field.visible, true);\n @if (fieldVisible) {\n <div\n class=\"p-1\"\n [ngClass]=\"fieldGridClass(field)\"\n >\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n\n @if (
|
|
351
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RowComponent, isStandalone: true, selector: "s-row", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, group: { classPropertyName: "group", publicName: "group", isSignal: true, isRequired: true, transformFunction: null }, errorMessages: { classPropertyName: "errorMessages", publicName: "errorMessages", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"w-full\"\n [formGroup]=\"group()\"\n>\n @let rowConfig = config();\n @let rowIsVisible = formUtils.getFieldProperty(rowConfig.visible, true);\n @if (rowIsVisible) {\n <div class=\"grid w-screen max-w-full grid-cols-12 gap-4\">\n @for (field of config().fields; let i = $index; track i) {\n @let fieldName = getName(field);\n @if (fieldIsExpandedDynamicType(field)) {\n @let fieldVisible = formUtils.getFieldProperty(field.visible, true);\n @if (fieldVisible) {\n <div\n class=\"p-1\"\n [ngClass]=\"fieldGridClass(field)\"\n >\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n\n @if (fieldName) {\n <s-control-errors\n [form]=\"group\"\n [control]=\"group().controls[fieldName]\"\n [errorMessages]=\"getErrorMessages(field.errorMessages)\"\n ></s-control-errors>\n }\n\n @if (field.footer) {\n @if (field.footer.help) {\n @let footerHelpVisible =\n field.footer.help.visible?.({\n abstractControl: group().controls[fieldName],\n formField: field,\n });\n @if (fieldName && field.footer.help.visible ? footerHelpVisible : true) {\n <span style=\"color: #888b99\">\n {{ field.footer.help.text }}\n </span>\n }\n }\n }\n\n @if (field.footer) {\n @let footerLinkVisible =\n field.footer.link?.visible?.({\n abstractControl: group().controls[fieldName],\n formField: field,\n });\n @if (fieldName && field.footer.link?.visible ? footerLinkVisible : true) {\n <div style=\"margin-left: -17px\">\n <s-button\n [label]=\"field.footer.link?.label\"\n priority=\"link\"\n (clicked)=\"\n field.footer.link?.onClick({\n abstractControl: group().controls[fieldName],\n formField: field,\n })\n \"\n [auxiliary]=\"true\"\n ></s-button>\n </div>\n }\n }\n @if (field.bottomTemplate) {\n <ng-template [ngTemplateOutlet]=\"field.bottomTemplate\"></ng-template>\n }\n </div>\n }\n } @else {\n @let gridClass = fieldGridClass(field);\n <div [ngClass]=\"gridClass\">\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n </div>\n }\n }\n </div>\n }\n</div>\n\n", dependencies: [{ kind: "ngmodule", type: ControlErrorsModule }, { kind: "component", type: i1.ControlErrorsComponent, selector: "s-control-errors", inputs: ["id", "control", "errorMessages", "form"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor"], outputs: ["clicked"] }, { kind: "directive", type: DynamicFormDirective, selector: "[sDynamicForm]", inputs: ["sDynamicForm"] }] });
|
|
341
352
|
}
|
|
342
353
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RowComponent, decorators: [{
|
|
343
354
|
type: Component,
|
|
344
|
-
args: [{ selector: 's-row', standalone: true, imports: [ControlErrorsModule, ReactiveFormsModule, NgClass, ButtonComponent, DynamicFormDirective], template: "<div\n class=\"w-full\"\n [formGroup]=\"group()\"\n>\n @let rowConfig = config();\n @let rowIsVisible = formUtils.getFieldProperty(rowConfig.visible, true);\n @if (rowIsVisible) {\n <div class=\"grid w-screen max-w-full grid-cols-12 gap-4\">\n @for (field of config().fields; let i = $index; track i) {\n @if (fieldIsExpandedDynamicType(field)) {\n @let fieldVisible = formUtils.getFieldProperty(field.visible, true);\n @if (fieldVisible) {\n <div\n class=\"p-1\"\n [ngClass]=\"fieldGridClass(field)\"\n >\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n\n @if (
|
|
355
|
+
args: [{ selector: 's-row', standalone: true, imports: [ControlErrorsModule, ReactiveFormsModule, NgClass, ButtonComponent, DynamicFormDirective], template: "<div\n class=\"w-full\"\n [formGroup]=\"group()\"\n>\n @let rowConfig = config();\n @let rowIsVisible = formUtils.getFieldProperty(rowConfig.visible, true);\n @if (rowIsVisible) {\n <div class=\"grid w-screen max-w-full grid-cols-12 gap-4\">\n @for (field of config().fields; let i = $index; track i) {\n @let fieldName = getName(field);\n @if (fieldIsExpandedDynamicType(field)) {\n @let fieldVisible = formUtils.getFieldProperty(field.visible, true);\n @if (fieldVisible) {\n <div\n class=\"p-1\"\n [ngClass]=\"fieldGridClass(field)\"\n >\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n\n @if (fieldName) {\n <s-control-errors\n [form]=\"group\"\n [control]=\"group().controls[fieldName]\"\n [errorMessages]=\"getErrorMessages(field.errorMessages)\"\n ></s-control-errors>\n }\n\n @if (field.footer) {\n @if (field.footer.help) {\n @let footerHelpVisible =\n field.footer.help.visible?.({\n abstractControl: group().controls[fieldName],\n formField: field,\n });\n @if (fieldName && field.footer.help.visible ? footerHelpVisible : true) {\n <span style=\"color: #888b99\">\n {{ field.footer.help.text }}\n </span>\n }\n }\n }\n\n @if (field.footer) {\n @let footerLinkVisible =\n field.footer.link?.visible?.({\n abstractControl: group().controls[fieldName],\n formField: field,\n });\n @if (fieldName && field.footer.link?.visible ? footerLinkVisible : true) {\n <div style=\"margin-left: -17px\">\n <s-button\n [label]=\"field.footer.link?.label\"\n priority=\"link\"\n (clicked)=\"\n field.footer.link?.onClick({\n abstractControl: group().controls[fieldName],\n formField: field,\n })\n \"\n [auxiliary]=\"true\"\n ></s-button>\n </div>\n }\n }\n @if (field.bottomTemplate) {\n <ng-template [ngTemplateOutlet]=\"field.bottomTemplate\"></ng-template>\n }\n </div>\n }\n } @else {\n @let gridClass = fieldGridClass(field);\n <div [ngClass]=\"gridClass\">\n <ng-container *sDynamicForm=\"{ id: id(), config: field, group: group() }\"></ng-container>\n </div>\n }\n }\n </div>\n }\n</div>\n\n" }]
|
|
345
356
|
}] });
|
|
346
357
|
|
|
347
358
|
class FieldsetComponent {
|
|
@@ -426,6 +437,7 @@ class LookupComponent {
|
|
|
426
437
|
hotkeysService;
|
|
427
438
|
translateService;
|
|
428
439
|
changeDetectorRef;
|
|
440
|
+
MAP_FORM_DIALOG_CONTROLS = new Map();
|
|
429
441
|
lookupDialogContainer = viewChild('dialogContainer');
|
|
430
442
|
rowType = 'Row';
|
|
431
443
|
indicatorLogo = LoadingStateIndicators.Logo;
|
|
@@ -496,7 +508,10 @@ class LookupComponent {
|
|
|
496
508
|
});
|
|
497
509
|
}
|
|
498
510
|
this.searchFields = this.searchFields.map((value) => {
|
|
511
|
+
const name = value.name.replaceAll('.', '_');
|
|
512
|
+
this.MAP_FORM_DIALOG_CONTROLS.set(value.name, name);
|
|
499
513
|
return {
|
|
514
|
+
customName: name,
|
|
500
515
|
...value,
|
|
501
516
|
};
|
|
502
517
|
});
|
|
@@ -527,19 +542,11 @@ class LookupComponent {
|
|
|
527
542
|
}
|
|
528
543
|
return gridField;
|
|
529
544
|
});
|
|
530
|
-
const hasFieldWithDotInName = this.searchFields.some((field) => field.name.includes('.'));
|
|
531
|
-
if (hasFieldWithDotInName) {
|
|
532
|
-
const fieldsWithDot = this.searchFields
|
|
533
|
-
.filter((item) => item.name.includes('.'))
|
|
534
|
-
.map((item) => item.name)
|
|
535
|
-
.join();
|
|
536
|
-
throw new Error(`This fields: [${fieldsWithDot}] can't have dot in their names, please replace.`);
|
|
537
|
-
}
|
|
538
545
|
const formGroup = this.searchFields.reduce((result, field) => {
|
|
539
|
-
if (field.
|
|
546
|
+
if (field.customName) {
|
|
540
547
|
const defaultValue = 'defaultValue' in field ? field.defaultValue : undefined;
|
|
541
|
-
result[field.
|
|
542
|
-
this.originalFormValues[field.
|
|
548
|
+
result[field.customName] = new FormControl(defaultValue);
|
|
549
|
+
this.originalFormValues[field.customName] = defaultValue;
|
|
543
550
|
}
|
|
544
551
|
return result;
|
|
545
552
|
}, {});
|
|
@@ -611,6 +618,13 @@ class LookupComponent {
|
|
|
611
618
|
}
|
|
612
619
|
makeSearchRequestParams(event) {
|
|
613
620
|
const filters = this.formGroupDialog?.getRawValue();
|
|
621
|
+
const mappedObjectChanges = Array.from(this.MAP_FORM_DIALOG_CONTROLS.entries()).map(([field, customName]) => ({ field, customName })) ??
|
|
622
|
+
[];
|
|
623
|
+
mappedObjectChanges.forEach((item) => {
|
|
624
|
+
const value = filters[item.customName];
|
|
625
|
+
delete filters[item.customName];
|
|
626
|
+
filters[item.field] = value;
|
|
627
|
+
});
|
|
614
628
|
const params = { ...event, filterData: filters };
|
|
615
629
|
const { multiSortMeta } = event;
|
|
616
630
|
this.multiSortMeta = multiSortMeta || this.multiSortMeta;
|
|
@@ -628,12 +642,18 @@ class LookupComponent {
|
|
|
628
642
|
this.onLookupRequest.next(event.query);
|
|
629
643
|
}
|
|
630
644
|
setDefaultFilters() {
|
|
631
|
-
if (!this.defaultFilter)
|
|
645
|
+
if (!this.defaultFilter) {
|
|
632
646
|
return;
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
.
|
|
636
|
-
this.formGroupDialog
|
|
647
|
+
}
|
|
648
|
+
const filteredValues = this.defaultFilter.filter(({ field }) => {
|
|
649
|
+
const formControlName = this.MAP_FORM_DIALOG_CONTROLS.get(field);
|
|
650
|
+
const hasFormControl = this.formGroupDialog.contains(formControlName);
|
|
651
|
+
const isDirty = this.formGroupDialog.get(formControlName)?.dirty;
|
|
652
|
+
return hasFormControl && !isDirty;
|
|
653
|
+
});
|
|
654
|
+
filteredValues.forEach(({ value, field }) => {
|
|
655
|
+
const formControlName = this.MAP_FORM_DIALOG_CONTROLS.get(field);
|
|
656
|
+
this.formGroupDialog.get(formControlName)?.patchValue(value instanceof Function ? value() : value);
|
|
637
657
|
});
|
|
638
658
|
}
|
|
639
659
|
async showDialog() {
|