@tsi-developpement/tsi-shared-ui 1.0.9 → 1.1.1

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.
@@ -96,7 +96,7 @@ export class TsiSearchComboComponent extends TsiInputBase {
96
96
  get isStatusCombo() {
97
97
  return this.comboType === 'status';
98
98
  }
99
- lightenColor(hex, percent = 50) {
99
+ lightenColor(hex, percent = 70) {
100
100
  if (!hex)
101
101
  return '';
102
102
  hex = hex.replace(/^#/, '');
@@ -112,6 +112,16 @@ export class TsiSearchComboComponent extends TsiInputBase {
112
112
  .join('');
113
113
  return newHex;
114
114
  }
115
+ getReadableTextColor(hex) {
116
+ if (!hex)
117
+ return 'black';
118
+ hex = hex.replace(/^#/, '');
119
+ const r = parseInt(hex.substring(0, 2), 16);
120
+ const g = parseInt(hex.substring(2, 4), 16);
121
+ const b = parseInt(hex.substring(4, 6), 16);
122
+ const brightness = (r * 299 + g * 587 + b * 114) / 1000;
123
+ return brightness > 230 ? 'black' : `#${hex}`;
124
+ }
115
125
  getStatusOption(value) {
116
126
  return this.statusMetadata?.options.find(o => o.translatedLabel === value);
117
127
  }
@@ -599,11 +609,11 @@ export class TsiSearchComboComponent extends TsiInputBase {
599
609
  this.onClick.emit(event);
600
610
  }
601
611
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, deps: [{ token: i1.EntityConfigurationService }, { token: i2.TsiModalService }, { token: i3.TsiNotificationService }, { token: i4.HttpClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
602
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"opt.colorHex\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-block;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.5rem;padding-top:.05rem;padding-bottom:.05rem;font-weight:600;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:center}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.1)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i10.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i11.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }] }); }
612
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: { elementSourceUrl: "elementSourceUrl", listSourceUrl: "listSourceUrl", idField: ["id-field", "idField"], labelField: ["label-field", "labelField"], multiple: "multiple", sort: "sort", showClear: "showClear", reloadDataSource: "reloadDataSource", isFiltered: "isFiltered", selectedLabel: "selectedLabel", maxWidth: "maxWidth", businessClass: "businessClass", comboType: "comboType", statusMetadata: "statusMetadata", currentRowItem: "currentRowItem", datasource: "datasource", bind: "bind", showSearchButton: "showSearchButton", showAddButton: "showAddButton", showConsultButton: "showConsultButton", showUpdateButton: "showUpdateButton" }, outputs: { bindChange: "bindChange", dataSourceLoaded: "datasource-loaded", init: "init", isLoaded: "isLoaded", selectedLabelChange: "selectedLabelChange", onClick: "onClick", onSearchButtonClick: "onSearchButtonClick" }, host: { listeners: { "keydown.enter": "onEnterKey($event)" } }, usesInheritance: true, ngImport: i0, template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i9.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i10.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i11.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }] }); }
603
613
  }
604
614
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiSearchComboComponent, decorators: [{
605
615
  type: Component,
606
- args: [{ selector: 'Tsi-Search-Combo', template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"opt.colorHex\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-block;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.5rem;padding-top:.05rem;padding-bottom:.05rem;font-weight:600;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:center}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.1)}\n"] }]
616
+ args: [{ selector: 'Tsi-Search-Combo', template: "<div class=\"flex\">\r\n <p-dropdown [placeholder]=\"placeHolder\" class=\"{{myStyleClass}}\" [required]=\"isRequired\"\r\n styleClass=\"{{myStyleClass}} border-radius-7 {{validationStatusCssClass}}\" appendTo=\"body\" optionLabel=\"label\"\r\n optionValue=\"id\" filterBy=\"label\" [options]=\"datasource\" [disabled]=\"disabled\" [lazy]=\"!dataLoaded\"\r\n [(ngModel)]=\"bind\" [filter]=\"true\" [showClear]=\"showClear\" [autoDisplayFirst]=\"false\"\r\n (onChange)=\"bindValueChanged($event)\" (onHide)=\"onHide()\" (onShow)=\"onOpen()\"\r\n (onFilter)=\"searchValueChanged($event)\" (onClear)=\"clearSelectedValue()\" (onClick)=\"onSearchComboClick($event)\"\r\n [style]=\"{'max-width': maxWidth, 'width':'100%', 'height': '1.7rem'}\"\r\n [ngClass]=\"isAr ? 'p-dropdown-clear-iconAR': 'p-dropdown-clear-iconFR' \">\r\n <!-- Ajout d'un bouton dans le dropdown -->\r\n <ng-template pTemplate=\"header\">\r\n <div class=\"dropdown-header flex gap-1 pt-2 px-2\">\r\n <Tsi-Button *ngIf=\"showSearchButton\" type=\"button\" icon=\"pi pi-search\" title=\"title-search-combo-Ouvrir\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"openSearchDialog()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAddButton\" type=\"button\" icon=\"pi pi-plus\" title=\"title-search-combo-Ajouter\"\r\n styleClass=\"p-button-success hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"addElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showAdvancedSearchButton\" type=\"button\" icon=\"pi pi-sort-amount-down\"\r\n title=\"Lister les articles pivot\u00E9s\" styleClass=\"p-button-secondary hover:shadow-6 h-2rem p-button-icon-only\"\r\n (click)=\"openAdvancedSearchComponent()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showConsultButton\" type=\"button\" icon=\"pi pi-eye\" title=\"title-search-combo-Consulter\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"consultElement()\">\r\n </Tsi-Button>\r\n\r\n <Tsi-Button *ngIf=\"showUpdateButton\" type=\"button\" icon=\"pi pi-pencil\" title=\"title-search-combo-update\"\r\n styleClass=\"p-button-primary hover:shadow-6 h-2rem p-button-icon-only\" (click)=\"updateElement()\">\r\n </Tsi-Button>\r\n\r\n </div>\r\n </ng-template>\r\n <ng-template let-target pTemplate=\"item\">\r\n <div pTooltip=\"{{target.label}}\" tooltipPosition=\"top\" tooltipStyleClass=\"custom-tooltip\">\r\n\r\n \r\n <ng-container *ngIf=\"isStatusCombo && statusMetadata; else normalOption\">\r\n <ng-container *ngIf=\"getStatusOption(target.label) as opt\">\r\n <span\r\n class=\"font-bold status-badge\"\r\n [style.background-color]=\"lightenColor(opt.colorHex)\"\r\n [style.color]=\"getReadableTextColor(opt.colorHex)\"\r\n [style.padding-top]=\"'0.1rem'\"\r\n [style.padding-bottom]=\"'0.1rem'\"\r\n >\r\n {{target.label}}\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-template #normalOption>\r\n <span>{{target.label}}</span>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </p-dropdown>\r\n\r\n <!-- Bubble Info -->\r\n <Tsi-Bubble-Info [infoText]=\"infoText\"></Tsi-Bubble-Info>\r\n</div>", styles: [".ng-select .ng-select-container .ng-value-container .ng-input>input{z-index:10!important}::ng-deep .p-icon-wrapper{align-items:center!important;justify-content:center!important}::ng-deep .p-dropdown-clear-icon{position:unset!important;top:unset!important;margin-top:unset!important}::ng-deep .p-dropdown-panel{max-width:30rem!important}::ng-deep .p-dropdown-clear-iconAR svg{left:0!important}::ng-deep .p-dropdown-clear-iconFR svg{right:2.5rem;left:auto}::ng-deep .custom-tooltip{max-width:300px;white-space:normal;word-wrap:break-word}.status-badge{display:inline-flex;align-items:center;justify-content:center;min-width:max-content;width:100%;text-align:center;white-space:nowrap;border-radius:.4rem;padding:.1rem .2rem;font-weight:600;line-height:1.2;color:#fff;box-shadow:0 1px 2px #0000000d;transition:all .2s ease-in-out;cursor:default;transform-origin:top center;border-top-left-radius:inherit;border-bottom-right-radius:inherit}.status-badge:hover{transform:scale(1.06);box-shadow:0 2px 4px #0000001a;filter:brightness(1.2)}\n"] }]
607
617
  }], ctorParameters: () => [{ type: i1.EntityConfigurationService }, { type: i2.TsiModalService }, { type: i3.TsiNotificationService }, { type: i4.HttpClient }, { type: i0.ChangeDetectorRef }], propDecorators: { onEnterKey: [{
608
618
  type: HostListener,
609
619
  args: ['keydown.enter', ['$event']]
@@ -672,4 +682,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
672
682
  }], showUpdateButton: [{
673
683
  type: Input
674
684
  }] } });
675
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFlBQWlCO0lBZ0I1RCxVQUFVLENBQUMsS0FBVTtRQUNuQixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUss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QUFVO3NCQUF0QixLQUFLO2dCQWdCYSxJQUFJO3NCQUF0QixLQUFLO3VCQUFDLE1BQU07Z0JBWUgsVUFBVTtzQkFBbkIsTUFBTTtnQkFDc0IsZ0JBQWdCO3NCQUE1QyxNQUFNO3VCQUFDLG1CQUFtQjtnQkFDakIsSUFBSTtzQkFBYixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLE9BQU87c0JBQWhCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQXFFRSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBUc2lJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi90c2ktYmFzZS90c2ktaW5wdXQtYmFzZS90c2ktaW5wdXQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRfTW9kZXMsIEdyaWRTZWxlY3Rpb25Nb2RlLCBNb2RhbFNpemVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBUeXBlUmVnaXN0cnlIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy90eXBlLXJlZ2lzdHJ5LmhlbHBlcic7XHJcbmltcG9ydCB7IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi9lbnRpdHktY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZ3VpZC5oZWxwZXInO1xyXG5pbXBvcnQgeyBUc2lNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RhbC90c2ktbW9kYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlLCBTdGF0dXNPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1TZWFyY2gtQ29tYm8nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaVNlYXJjaENvbWJvQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9yZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pc0lucHV0RGF0YXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dvdHRlbkRhdGFzb3VyY2U6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYmluZD86IGFueTtcclxuICBwcml2YXRlIF9iaW5kQ2hhbmdlRW1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRSb3dJdGVtPzogYW55O1xyXG4gIHB1YmxpYyBkYXRhTG9hZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9zZWxlY3RlZD86IGFueTtcclxuICBwcml2YXRlIF9kaWFsb2dSZWZlcmVuY2U/OiBEeW5hbWljRGlhbG9nUmVmIHwgdW5kZWZpbmVkO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25FbnRlcktleShldmVudDogYW55KSB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGVudGVyIGtleSBldmVudCBoZXJlXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KFwiZWxlbWVudFNvdXJjZVVybFwiKSBlbGVtZW50U291cmNlVXJsPzogc3RyaW5nO1xyXG4gIEBJbnB1dChcImxpc3RTb3VyY2VVcmxcIikgbGlzdFNvdXJjZVVybD86IHN0cmluZyB8ICgoaXRlbTogYW55KSA9PiBzdHJpbmcpO1xyXG4gIEBJbnB1dChcImlkLWZpZWxkXCIpIGlkRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KFwibGFiZWwtZmllbGRcIikgbGFiZWxGaWVsZDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoXCJtdWx0aXBsZVwiKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dChcInNvcnRcIikgc29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHJlbG9hZERhdGFTb3VyY2U6IE9ic2VydmFibGU8YW55PiB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBpc0ZpbHRlcmVkPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGJ1c2luZXNzQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKSBjb21ib1R5cGU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3RhdHVzTWV0YWRhdGE/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBjdXJyZW50Um93SXRlbSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dJdGVtO1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbnRSb3dJdGVtKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dJdGVtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBnZXQgZGF0YXNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhc291cmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGFzb3VyY2UoZGF0YXNvdXJjZTogYW55W10pIHtcclxuICAgIC8vc2V0IHRoZSBkYXRhIHNvdXJjZVxyXG4gICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZSA9IGRhdGFzb3VyY2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKClcclxuXHJcbiAgICAgIHRoaXMuX2lzSW5wdXREYXRhc291cmNlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBASW5wdXQoXCJiaW5kXCIpIGdldCBiaW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JpbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgYmluZCh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9iaW5kID0gdmFsdWU7XHJcbiAgICB0aGlzLmlucHV0RmllbGQgPSB2YWx1ZTtcclxuICAgIHRoaXMuX29uQmluZFNldCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICBAT3V0cHV0KCkgYmluZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KFwiZGF0YXNvdXJjZS1sb2FkZWRcIikgZGF0YVNvdXJjZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tYm9TdGF0dXNNb2RlbD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkTGFiZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TZWFyY2hCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZTogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lNb2RhbFNlcnZpY2U6IFRzaU1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHByb3RlY3RlZCBfY2RSZWY/OiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHN1cGVyKF9jZFJlZilcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzU3RhdHVzQ29tYm8oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21ib1R5cGUgPT09ICdzdGF0dXMnO1xyXG4gIH1cclxuICBcclxuICBsaWdodGVuQ29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBlcmNlbnQ6IG51bWJlciA9IDUwKTogc3RyaW5nIHtcclxuICAgIGlmICghaGV4KSByZXR1cm4gJyc7XHJcbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XHJcbiAgICBcclxuICAgIGxldCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgbGV0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBsZXQgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHIgKyAoMjU1IC0gcikgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgKyAoMjU1IC0gZykgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGIgKyAoMjU1IC0gYikgKiBwZXJjZW50IC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgbmV3SGV4ID1cclxuICAgICAgJyMnICtcclxuICAgICAgW3IsIGcsIGJdXHJcbiAgICAgICAgLm1hcCh4ID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpXHJcbiAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdIZXg7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0dXNPcHRpb24odmFsdWU6IHN0cmluZyk6IFN0YXR1c09wdGlvbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0dXNNZXRhZGF0YT8ub3B0aW9ucy5maW5kKG8gPT4gby50cmFuc2xhdGVkTGFiZWwgPT09IHZhbHVlKTtcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAgIHRoaXMuY2hlY2tJZkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50RXhpc3RzKCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tJZkZvcm1OYW1lRXhpc3RzKCk7IFxyXG4gICAgdGhpcy5faW5pdFBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoKTtcclxuICAgIHRoaXMuX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBhd2FpdCB0aGlzLl9pbml0aWFsTG9hZERhdGEoKTtcclxuICAgIGxldCBsYW5ndWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShydGxNb2RlS2V5cy5ydGxNb2RlRW5hYmxlZCk7XHJcbiAgICBpZiAobGFuZ3VlICYmIEpTT04ucGFyc2UobGFuZ3VlKSkge1xyXG4gICAgICB0aGlzLmlzQXIgPSB0cnVlXHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5pc0FyID0gZmFsc2VcclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5tYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggKyAncmVtJztcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0FkZEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgc2hvd0NvbnN1bHRCdXR0b24/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHNob3dVcGRhdGVCdXR0b24/OiBib29sZWFuO1xyXG4gIHNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblxyXG4gIGNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcblxyXG4gICAgICBuZXh0OiAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9ICEhZW50aXR5Py5hZHZhbmNlZFNlYXJjaENvbXBvbmVudDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gY2hlY2tJZkZvcm1OYW1lRXhpc3RzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgaWYgKHRoaXMuc2hvd0FkZEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5zaG93VXBkYXRlQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICByZXNvbHZlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNGb3JtID0gISFlbnRpdHk/LmZvcm1OYW1lO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhcInNob3dBZGRCdXR0b25cIix0aGlzLnNob3dBZGRCdXR0b24pXHJcblxyXG4gICAgICAgIGlmKCFoYXNGb3JtKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zaG93VXBkYXRlQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IHRoaXMuc2hvd0FkZEJ1dHRvbjtcclxuICAgICAgICB9ICAgICAgICBcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaG93QWRkQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0FkZEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93VXBkYXRlQnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH0pO1xyXG59ICBcclxuXHJcblxyXG4gIG9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9ICEhZW50aXR5Py5hZHZhbmNlZFNlYXJjaENvbXBvbmVudDtcclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuYWR2YW5jZWRTZWFyY2hDb21wb25lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgICAgIGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsXHJcbiAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlLFxyXG4gICAgICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5DT05TVUxULFxyXG4gICAgICAgICAgICAgIGN1c3RvbURhdGE6IGVudGl0eVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZSA9IHRoaXMuX3RzaU1vZGFsU2VydmljZT8ub3BlbihUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuYWR2YW5jZWRTZWFyY2hDb21wb25lbnQpLCBjb25mKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBlcnNvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNlbGVjdGVkUGVyc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBvcGVuU2VhcmNoRGlhbG9nKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJjbGFzczogXCIsIHRoaXMuYnVzaW5lc3NDbGFzcylcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHsgaXNBZHZhbmNlZFNlYXJjaDogdHJ1ZSwgc2VsZWN0aW9uTW9kZTogR3JpZFNlbGVjdGlvbk1vZGUuU2luZ2xlLCBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCwgY3VzdG9tRGF0YTogZW50aXR5IH0sXHJcbiAgICAgICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5saXN0Q29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5Lmxpc3RDb21wb25lbnQpLCBjb25mKTtcclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKHNlbGVjdGVkUGVyc29uOiBhbnkpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBlcnNvbikge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNlbGVjdGVkUGVyc29uO1xyXG4gICAgICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGFkZEVsZW1lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7IG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5DUkVBVEUsIGN1c3RvbURhdGE6IGVudGl0eSB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZSA9IHRoaXMuX3RzaU1vZGFsU2VydmljZT8ub3BlbihUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuZm9ybU5hbWUpLCBjb25mKTtcclxuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKHNhdmVkRWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzYXZlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICBpZiAodHlwZW9mIHNhdmVkRWxlbWVudCA9PT0gJ29iamVjdCcgJiYgc2F2ZWRFbGVtZW50ICE9PSBudWxsICYmICd1aWQnIGluIHNhdmVkRWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kID0gc2F2ZWRFbGVtZW50Py51aWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzYXZlZEVsZW1lbnQgPT09ICdzdHJpbmcnICYmIEd1aWQuaXNWYWxpZChzYXZlZEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzYXZlZEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUVsZW1lbnQoKSB7XHJcbiAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJBdWN1biDDqWzDqW1lbnQgc8OpbGVjdGlvbm7DqSBwb3VyIGxhIG1pc2Ugw6Agam91ci5cIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkVESVQsXHJcbiAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHksXHJcbiAgICAgICAgICBpZDogdGhpcy5iaW5kXHJcbiAgICAgICAgfSxcclxuICAgICAgICBcclxuICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSwgY29uZik7XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKCh1cGRhdGVkRWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGlmICh1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdXBkYXRlZEVsZW1lbnQgPT09ICdvYmplY3QnICYmIHVwZGF0ZWRFbGVtZW50ICE9PSBudWxsICYmICd1aWQnIGluIHVwZGF0ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICB0aGlzLmJpbmQgPSB1cGRhdGVkRWxlbWVudC51aWQ7XHJcbiAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQodXBkYXRlZEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICB0aGlzLmJpbmQgPSB1cGRhdGVkRWxlbWVudDtcclxuICAgICAgICAgIHRoaXMuYmluZENoYW5nZS5lbWl0KHRoaXMuYmluZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbn0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5jb25zdWx0RWxlbWVudCgpIHtcclxuICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgaWYgKCF0aGlzLmJpbmQpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcIkF1Y3VuIMOpbMOpbWVudCBzw6lsZWN0aW9ubsOpIHBvdXIgbGEgY29uc3VsdGF0aW9uLlwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgaWYgKCFlbnRpdHkgfHwgIWVudGl0eS5mb3JtTmFtZSkge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCxcclxuICAgICAgICAgIGN1c3RvbURhdGE6IGVudGl0eSxcclxuICAgICAgICAgIGlkOiB0aGlzLmJpbmQgICBcclxuICAgICAgICB9LFxyXG4gICAgICAgIHN0eWxlQ2xhc3M6ICcnLFxyXG4gICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICBtYXhpbWl6YWJsZTogdHJ1ZSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZSA9IHRoaXMuX3RzaU1vZGFsU2VydmljZT8ub3BlbihcclxuICAgICAgICBUeXBlUmVnaXN0cnlIZWxwZXIuZ2V0VHlwZShlbnRpdHkuZm9ybU5hbWUpLFxyXG4gICAgICAgIGNvbmZcclxuICAgICAgKTtcclxuXHJcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZmVyZW5jZT8ub25DbG9zZS5zdWJzY3JpYmUoKF8pID0+IHtcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycmV1ciBsb3JzIGRlIGxhIHLDqWN1cMOpcmF0aW9uIGRlcyBpbmZvcyBkJ2VudGl0w6kgOlwiLCBlcnIpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGV2ZW50c1xyXG4gIGJpbmRWYWx1ZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5iaW5kID0gZXZlbnQudmFsdWU7XHJcbiAgICBpZiAodGhpcy5iaW5kICE9PSBudWxsICYmIHRoaXMuYmluZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5iaW5kXHJcbiAgICB9XHJcbiAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdChldmVudC52YWx1ZSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9iaW5kQ2hhbmdlRW1pdHRlZCkge1xyXG4gICAgICB0aGlzLl9iaW5kQ2hhbmdlRW1pdHRlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHNlbGVjdGVkRWxlbWVudDogYW55ID0gdGhpcy5kYXRhc291cmNlLmZpbmQoZSA9PiBlLmlkID09IHRoaXMuYmluZCk7XHJcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbENoYW5nZS5lbWl0KHNlbGVjdGVkRWxlbWVudC5sYWJlbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWFyY2hWYWx1ZUNoYW5nZWQoc2VhcmNoVmFsdWU6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCAmJiAhdGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2Uoc2VhcmNoVmFsdWUuZmlsdGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uT3BlbigpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgfHwgdHlwZW9mIHRoaXMubGlzdFNvdXJjZVVybCA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgdGhpcy5fbG9hZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uSGlkZSgpIHtcclxuICAgIGlmICh0aGlzLmRhdGFMb2FkZWQpIHtcclxuICAgICAgdGhpcy5iaW5kID0gdGhpcy5fc2VsZWN0ZWRcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyU2VsZWN0ZWRWYWx1ZSgpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkID0gdW5kZWZpbmVkXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gcHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBfbG9hZERhdGFTb3VyY2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRmlsdGVyZWQpIHtcclxuICAgICAgICB0aGlzLl9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKGtleXdvcmQ6IHN0cmluZyA9IFwiXCIpIHtcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZUxpc3RJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpLCB0aGlzLl9nZW5lcmF0ZUh0dHBQYXJhbXMoa2V5d29yZCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCkge1xyXG4gICAgaWYgKHRoaXMuX3ZhbGlkYXRlTGlzdElucHV0cygpKSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBbXTtcclxuICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuX2h0dHBDbGllbnQuZ2V0KHRoaXMuX2luaXRMaXN0RGF0YVNvdXJjZUVuZHBvaW50KCkpXHJcbiAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UgPSBkYXRhO1xyXG4gICAgICAgICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRCaW5kRWxlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZUJpbmRFbGVtZW50SW5wdXRzKCkpIHtcclxuICAgICAgaWYgKHRoaXMuYmluZCkge1xyXG4gICAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSBbXTtcclxuICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2h0dHBDbGllbnQuZ2V0KHRoaXMuX2luaXRFbGVtZW50RW5kcG9pbnQoKSkpO1xyXG5cclxuICAgICAgICAgIGxldCB0ZW1wQXJyYXk6IGFueVtdID0gW107XHJcbiAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBpZDogZGF0YVt0aGlzLmlkRmllbGRdLFxyXG4gICAgICAgICAgICBsYWJlbDogZGF0YVt0aGlzLmxhYmVsRmllbGRdXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gb2JqLmlkO1xyXG4gICAgICAgICAgdGVtcEFycmF5LnB1c2gob2JqKTtcclxuICAgICAgICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0ZW1wQXJyYXk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYWJlbENoYW5nZS5lbWl0KG9iai5sYWJlbCk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2VMb2FkZWQuZW1pdCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NvbXBhcmVGdW5jdGlvbigpOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlciB7XHJcbiAgICByZXR1cm4gKGEsIGIpID0+IHtcclxuICAgICAgaWYgKGEubGFiZWwgPiBiLmxhYmVsKSB7IHJldHVybiAxOyB9XHJcbiAgICAgIGlmIChhLmxhYmVsIDwgYi5sYWJlbCkgeyByZXR1cm4gLTE7IH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGVMaXN0SW5wdXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubGlzdFNvdXJjZVVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy5saXN0U291cmNlVXJsID09PSAnJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xpc3RTb3VyY2VVcmwgdXJsIG5vdCBkZWZpbmVkJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRlQmluZEVsZW1lbnRJbnB1dHMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5lbGVtZW50U291cmNlVXJsID09IHVuZGVmaW5lZCB8fCB0aGlzLmVsZW1lbnRTb3VyY2VVcmwgPT09ICcnKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZWxlbWVudFNvdXJjZVVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFBhcmFtZXRlcnNXaXRoRGVmYXVsdHMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pZEZpZWxkID09IHVuZGVmaW5lZCB8fCB0aGlzLmlkRmllbGQgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy5pZEZpZWxkID0gXCJpZFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmxhYmVsRmllbGQgPT0gdW5kZWZpbmVkIHx8IHRoaXMubGFiZWxGaWVsZCA9PT0gXCJcIikge1xyXG4gICAgICB0aGlzLmxhYmVsRmllbGQgPSBcImxpYmVsbGVcIjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRFbGVtZW50RW5kcG9pbnQoKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmJpbmQpIHtcclxuICAgICAgcmV0dXJuIGVuY29kZVVSSShgJHt0aGlzLmVsZW1lbnRTb3VyY2VVcmx9LyR7dGhpcy5iaW5kfWApO1xyXG4gICAgfVxyXG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ25vIGJpbmQgaW5wdXQgd2FzIHByb3ZpZGVkLCBjYW5ub3QgY3JlYXRlIGJpbmRFbGVtZW50VXJsJylcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRMaXN0RGF0YVNvdXJjZUVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMubGlzdFNvdXJjZVVybCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3lvdSBtdXN0IHByb3ZpZGUgdGhlIGxpc3Qgc291cmNlIHVybCcpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICByZXR1cm4gZW5jb2RlVVJJKGAke3RoaXMubGlzdFNvdXJjZVVybH1gKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBsZXQgdGVtcExpc3RTb3VyY2VVcmwgPSB0aGlzLmxpc3RTb3VyY2VVcmwodGhpcy5jdXJyZW50Um93SXRlbSlcclxuICAgICAgcmV0dXJuIGVuY29kZVVSSShgJHt0ZW1wTGlzdFNvdXJjZVVybH1gKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFwiXCJcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2luaXRpYWxMb2FkRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9tYXBHb3R0ZW5EYXRhU291cmNlVG9Mb2NhbERhdGFzb3VyY2UoKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fbG9hZEJpbmRFbGVtZW50KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfb25CaW5kU2V0KCkge1xyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCAmJiAhdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQgJiYgIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRCaW5kRWxlbWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbG9hZEFsbERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5fbG9hZE5vdFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRSZWxvYWREYXRhU291cmNlU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMucmVsb2FkRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLl9yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbG9hZERhdGFTb3VyY2Uuc3Vic2NyaWJlKFxyXG4gICAgICAgIChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmICh0eXBlb2YgKGRhdGEpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIGlmIChkYXRhICE9IHVuZGVmaW5lZCAmJiBkYXRhICE9IG51bGwgJiYgZGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdFNvdXJjZVVybCA9IGRhdGE7XHJcbiAgICAgICAgICAgICAgdGhpcy5fbG9hZEFsbERhdGEoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UgPSBkYXRhXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk6IHZvaWQge1xyXG4gICAgbGV0IHRlbXBBcnJheTogYW55W10gPSBbXTtcclxuICAgIHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgaWQ6IGVsZW1lbnRbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICBsYWJlbDogZWxlbWVudFt0aGlzLmxhYmVsRmllbGRdXHJcbiAgICAgIH07XHJcbiAgICAgIHRlbXBBcnJheS5wdXNoKG9iaik7XHJcbiAgICB9KVxyXG4gICAgdGhpcy5fZGF0YXNvdXJjZSA9IHRlbXBBcnJheTtcclxuICAgIGlmICh0aGlzLnNvcnQpIHtcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZS5zb3J0KHRoaXMuX2NvbXBhcmVGdW5jdGlvbigpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZGF0YUxvYWRlZCA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2VMb2FkZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2VuZXJhdGVIdHRwUGFyYW1zKGtleXdvcmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGFueSB7XHJcbiAgICAvL2luaXQgcGFyYW1zXHJcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcclxuICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQoJ3ZhbHVlJywga2V5d29yZCA/PyAnJyk7XHJcblxyXG4gICAgcmV0dXJuIHsgcGFyYW1zOiBwYXJhbXMgfTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoQ29tYm9DbGljayhldmVudDogYW55KSB7XHJcbiAgICB0aGlzLm9uQ2xpY2suZW1pdChldmVudCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmbGV4XCI+XHJcbiAgPHAtZHJvcGRvd24gW3BsYWNlaG9sZGVyXT1cInBsYWNlSG9sZGVyXCIgY2xhc3M9XCJ7e215U3R5bGVDbGFzc319XCIgW3JlcXVpcmVkXT1cImlzUmVxdWlyZWRcIlxyXG4gICAgc3R5bGVDbGFzcz1cInt7bXlTdHlsZUNsYXNzfX0gYm9yZGVyLXJhZGl1cy03IHt7dmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzfX1cIiBhcHBlbmRUbz1cImJvZHlcIiBvcHRpb25MYWJlbD1cImxhYmVsXCJcclxuICAgIG9wdGlvblZhbHVlPVwiaWRcIiBmaWx0ZXJCeT1cImxhYmVsXCIgW29wdGlvbnNdPVwiZGF0YXNvdXJjZVwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIFtsYXp5XT1cIiFkYXRhTG9hZGVkXCJcclxuICAgIFsobmdNb2RlbCldPVwiYmluZFwiIFtmaWx0ZXJdPVwidHJ1ZVwiIFtzaG93Q2xlYXJdPVwic2hvd0NsZWFyXCIgW2F1dG9EaXNwbGF5Rmlyc3RdPVwiZmFsc2VcIlxyXG4gICAgKG9uQ2hhbmdlKT1cImJpbmRWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChvbkhpZGUpPVwib25IaWRlKClcIiAob25TaG93KT1cIm9uT3BlbigpXCJcclxuICAgIChvbkZpbHRlcik9XCJzZWFyY2hWYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChvbkNsZWFyKT1cImNsZWFyU2VsZWN0ZWRWYWx1ZSgpXCIgKG9uQ2xpY2spPVwib25TZWFyY2hDb21ib0NsaWNrKCRldmVudClcIlxyXG4gICAgW3N0eWxlXT1cInsnbWF4LXdpZHRoJzogbWF4V2lkdGgsICd3aWR0aCc6JzEwMCUnLCAnaGVpZ2h0JzogJzEuN3JlbSd9XCJcclxuICAgIFtuZ0NsYXNzXT1cImlzQXIgPyAncC1kcm9wZG93bi1jbGVhci1pY29uQVInOiAncC1kcm9wZG93bi1jbGVhci1pY29uRlInIFwiPlxyXG4gICAgPCEtLSBBam91dCBkJ3VuIGJvdXRvbiBkYW5zIGxlIGRyb3Bkb3duIC0tPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24taGVhZGVyIGZsZXggZ2FwLTEgcHQtMiBweC0yXCI+XHJcbiAgICAgICAgPFRzaS1CdXR0b24gKm5nSWY9XCJzaG93U2VhcmNoQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1zZWFyY2hcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1PdXZyaXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJvcGVuU2VhcmNoRGlhbG9nKClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd0FkZEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGx1c1wiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLUFqb3V0ZXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXN1Y2Nlc3MgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJhZGRFbGVtZW50KClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1zb3J0LWFtb3VudC1kb3duXCJcclxuICAgICAgICAgIHRpdGxlPVwiTGlzdGVyIGxlcyBhcnRpY2xlcyBwaXZvdMOpc1wiIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zZWNvbmRhcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd0NvbnN1bHRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLWV5ZVwiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLUNvbnN1bHRlclwiXHJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cImNvbnN1bHRFbGVtZW50KClcIj5cclxuICAgICAgICA8L1RzaS1CdXR0b24+XHJcblxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1VwZGF0ZUJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktcGVuY2lsXCIgdGl0bGU9XCJ0aXRsZS1zZWFyY2gtY29tYm8tdXBkYXRlXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwidXBkYXRlRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlIGxldC10YXJnZXQgcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICA8ZGl2IHBUb29sdGlwPVwie3t0YXJnZXQubGFiZWx9fVwiIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiIHRvb2x0aXBTdHlsZUNsYXNzPVwiY3VzdG9tLXRvb2x0aXBcIj5cclxuXHJcbiAgICAgICAgXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzU3RhdHVzQ29tYm8gJiYgc3RhdHVzTWV0YWRhdGE7IGVsc2Ugbm9ybWFsT3B0aW9uXCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0U3RhdHVzT3B0aW9uKHRhcmdldC5sYWJlbCkgYXMgb3B0XCI+XHJcbiAgICAgICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvbnQtYm9sZCBzdGF0dXMtYmFkZ2VcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwibGlnaHRlbkNvbG9yKG9wdC5jb2xvckhleClcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cIm9wdC5jb2xvckhleFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICB7e3RhcmdldC5sYWJlbH19XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI25vcm1hbE9wdGlvbj5cclxuICAgICAgICAgIDxzcGFuPnt7dGFyZ2V0LmxhYmVsfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC1kcm9wZG93bj5cclxuXHJcbiAgPCEtLSBCdWJibGUgSW5mbyAtLT5cclxuICA8VHNpLUJ1YmJsZS1JbmZvIFtpbmZvVGV4dF09XCJpbmZvVGV4dFwiPjwvVHNpLUJ1YmJsZS1JbmZvPlxyXG48L2Rpdj4iXX0=
685
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLXNlYXJjaC1jb21iby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy90c2ktc2VhcmNoLWNvbWJvL3RzaS1zZWFyY2gtY29tYm8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvdHNpLXNlYXJjaC1jb21iby90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxjQUFjLEVBQTRCLE1BQU0sTUFBTSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUN6RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFVeEQsTUFBTSxPQUFPLHVCQUF3QixTQUFRLFlBQWlCO0lBZ0I1RCxVQUFVLENBQUMsS0FBVTtRQUNuQixrQ0FBa0M7UUFDbEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUss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Q0csZ0JBQWdCO3NCQUF4QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tYm9TdGF0dXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xyXG5pbXBvcnQgeyBUc2lJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi90c2ktYmFzZS90c2ktaW5wdXQtYmFzZS90c2ktaW5wdXQtYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBydGxNb2RlS2V5cyB9IGZyb20gJy4uLy4uLy4uL2NvbnN0cy9sb2NhbHMuY29uc3QnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRfTW9kZXMsIEdyaWRTZWxlY3Rpb25Nb2RlLCBNb2RhbFNpemVFbnVtIH0gZnJvbSAnLi4vLi4vLi4vZW51bXMnO1xyXG5pbXBvcnQgeyBUeXBlUmVnaXN0cnlIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi90c2ktaGVscGVycy90eXBlLXJlZ2lzdHJ5LmhlbHBlcic7XHJcbmltcG9ydCB7IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29uZmlndXJhdGlvbi9lbnRpdHktY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktbm90aWZpY2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnLi4vLi4vLi4vdHNpLWhlbHBlcnMvZ3VpZC5oZWxwZXInO1xyXG5pbXBvcnQgeyBUc2lNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9tb2RhbC90c2ktbW9kYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5pbXBvcnQgeyBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlLCBTdGF0dXNPcHRpb24gfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1TZWFyY2gtQ29tYm8nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktc2VhcmNoLWNvbWJvLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRzaVNlYXJjaENvbWJvQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlPGFueT4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIF9yZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9pc0lucHV0RGF0YXNvdXJjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dvdHRlbkRhdGFzb3VyY2U6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYmluZD86IGFueTtcclxuICBwcml2YXRlIF9iaW5kQ2hhbmdlRW1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRSb3dJdGVtPzogYW55O1xyXG4gIHB1YmxpYyBkYXRhTG9hZGVkOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9zZWxlY3RlZD86IGFueTtcclxuICBwcml2YXRlIF9kaWFsb2dSZWZlcmVuY2U/OiBEeW5hbWljRGlhbG9nUmVmIHwgdW5kZWZpbmVkO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicsIFsnJGV2ZW50J10pXHJcbiAgb25FbnRlcktleShldmVudDogYW55KSB7XHJcbiAgICAvLyBIYW5kbGUgdGhlIGVudGVyIGtleSBldmVudCBoZXJlXHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICB9XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KFwiZWxlbWVudFNvdXJjZVVybFwiKSBlbGVtZW50U291cmNlVXJsPzogc3RyaW5nO1xyXG4gIEBJbnB1dChcImxpc3RTb3VyY2VVcmxcIikgbGlzdFNvdXJjZVVybD86IHN0cmluZyB8ICgoaXRlbTogYW55KSA9PiBzdHJpbmcpO1xyXG4gIEBJbnB1dChcImlkLWZpZWxkXCIpIGlkRmllbGQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgQElucHV0KFwibGFiZWwtZmllbGRcIikgbGFiZWxGaWVsZDogc3RyaW5nID0gXCJcIjtcclxuICBASW5wdXQoXCJtdWx0aXBsZVwiKSBtdWx0aXBsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dChcInNvcnRcIikgc29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2xlYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHJlbG9hZERhdGFTb3VyY2U6IE9ic2VydmFibGU8YW55PiB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBpc0ZpbHRlcmVkPzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkTGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgbWF4V2lkdGg6IHN0cmluZyA9ICcnO1xyXG4gIEBJbnB1dCgpIGJ1c2luZXNzQ2xhc3M6IHN0cmluZyA9ICcnO1xyXG5cclxuICBASW5wdXQoKSBjb21ib1R5cGU/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc3RhdHVzTWV0YWRhdGE/OiBTdGF0dXNNZXRhZGF0YVJlc3BvbnNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBjdXJyZW50Um93SXRlbSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRSb3dJdGVtO1xyXG4gIH1cclxuXHJcbiAgc2V0IGN1cnJlbnRSb3dJdGVtKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dJdGVtID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBnZXQgZGF0YXNvdXJjZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhc291cmNlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGFzb3VyY2UoZGF0YXNvdXJjZTogYW55W10pIHtcclxuICAgIC8vc2V0IHRoZSBkYXRhIHNvdXJjZVxyXG4gICAgdGhpcy5fZ290dGVuRGF0YXNvdXJjZSA9IGRhdGFzb3VyY2U7XHJcblxyXG4gICAgaWYgKHRoaXMuX2dvdHRlbkRhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKClcclxuXHJcbiAgICAgIHRoaXMuX2lzSW5wdXREYXRhc291cmNlID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBASW5wdXQoXCJiaW5kXCIpIGdldCBiaW5kKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JpbmQ7XHJcbiAgfVxyXG5cclxuICBzZXQgYmluZCh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLl9iaW5kID0gdmFsdWU7XHJcbiAgICB0aGlzLmlucHV0RmllbGQgPSB2YWx1ZTtcclxuICAgIHRoaXMuX29uQmluZFNldCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICBAT3V0cHV0KCkgYmluZENoYW5nZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KFwiZGF0YXNvdXJjZS1sb2FkZWRcIikgZGF0YVNvdXJjZUxvYWRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tYm9TdGF0dXNNb2RlbD4oKTtcclxuICBAT3V0cHV0KCkgaXNMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbWJvU3RhdHVzTW9kZWw+KCk7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkTGFiZWxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgb25DbGljazogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25TZWFyY2hCdXR0b25DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZTogRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lNb2RhbFNlcnZpY2U6IFRzaU1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHR0cENsaWVudDogSHR0cENsaWVudCxcclxuICAgIHByb3RlY3RlZCBfY2RSZWY/OiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICApIHtcclxuICAgIHN1cGVyKF9jZFJlZilcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBoYW5kbGUgbGlmZWN5Y2xlIGhvb2tzXHJcbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzU3RhdHVzQ29tYm8oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21ib1R5cGUgPT09ICdzdGF0dXMnO1xyXG4gIH1cclxuICBcclxuICBsaWdodGVuQ29sb3IoaGV4OiBzdHJpbmcgfCB1bmRlZmluZWQsIHBlcmNlbnQ6IG51bWJlciA9IDcwKTogc3RyaW5nIHtcclxuICAgIGlmICghaGV4KSByZXR1cm4gJyc7XHJcbiAgICBoZXggPSBoZXgucmVwbGFjZSgvXiMvLCAnJyk7XHJcbiAgICBcclxuICAgIGxldCByID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZygwLCAyKSwgMTYpO1xyXG4gICAgbGV0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBsZXQgYiA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoNCwgNiksIDE2KTtcclxuXHJcbiAgICByID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKHIgKyAoMjU1IC0gcikgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBnID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGcgKyAoMjU1IC0gZykgKiBwZXJjZW50IC8gMTAwKSk7XHJcbiAgICBiID0gTWF0aC5taW4oMjU1LCBNYXRoLmZsb29yKGIgKyAoMjU1IC0gYikgKiBwZXJjZW50IC8gMTAwKSk7XHJcblxyXG4gICAgY29uc3QgbmV3SGV4ID1cclxuICAgICAgJyMnICtcclxuICAgICAgW3IsIGcsIGJdXHJcbiAgICAgICAgLm1hcCh4ID0+IHgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpXHJcbiAgICAgICAgLmpvaW4oJycpO1xyXG5cclxuICAgIHJldHVybiBuZXdIZXg7XHJcbiAgfVxyXG5cclxuICBnZXRSZWFkYWJsZVRleHRDb2xvcihoZXg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIWhleCkgcmV0dXJuICdibGFjayc7XHJcblxyXG4gICAgaGV4ID0gaGV4LnJlcGxhY2UoL14jLywgJycpO1xyXG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zdWJzdHJpbmcoMCwgMiksIDE2KTtcclxuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc3Vic3RyaW5nKDIsIDQpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnN1YnN0cmluZyg0LCA2KSwgMTYpO1xyXG5cclxuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XHJcblxyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAyMzAgPyAnYmxhY2snIDogYCMke2hleH1gO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzT3B0aW9uKHZhbHVlOiBzdHJpbmcpOiBTdGF0dXNPcHRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzTWV0YWRhdGE/Lm9wdGlvbnMuZmluZChvID0+IG8udHJhbnNsYXRlZExhYmVsID09PSB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICB0aGlzLmNoZWNrSWZBZHZhbmNlZFNlYXJjaENvbXBvbmVudEV4aXN0cygpO1xyXG4gICAgICBhd2FpdCB0aGlzLmNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOyBcclxuICAgIHRoaXMuX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk7XHJcbiAgICB0aGlzLl9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpO1xyXG4gICAgYXdhaXQgdGhpcy5faW5pdGlhbExvYWREYXRhKCk7XHJcbiAgICBsZXQgbGFuZ3VlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0ocnRsTW9kZUtleXMucnRsTW9kZUVuYWJsZWQpO1xyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG5cclxuICAgIHRoaXMubWF4V2lkdGggPSB0aGlzLm1heFdpZHRoICsgJ3JlbSc7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNob3dDb25zdWx0QnV0dG9uPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBzaG93VXBkYXRlQnV0dG9uPzogYm9vbGVhbjtcclxuICBzaG93QWR2YW5jZWRTZWFyY2hCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cclxuICBjaGVja0lmQWR2YW5jZWRTZWFyY2hDb21wb25lbnRFeGlzdHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG5cclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIHRoaXMuc2hvd0FkdmFuY2VkU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuIGNoZWNrSWZGb3JtTmFtZUV4aXN0cygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICAgIGlmICh0aGlzLnNob3dBZGRCdXR0b24gPT09IHVuZGVmaW5lZCkgdGhpcy5zaG93QWRkQnV0dG9uID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzRm9ybSA9ICEhZW50aXR5Py5mb3JtTmFtZTtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzaG93QWRkQnV0dG9uXCIsdGhpcy5zaG93QWRkQnV0dG9uKVxyXG5cclxuICAgICAgICBpZighaGFzRm9ybSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDb25zdWx0QnV0dG9uID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHRoaXMuc2hvd0NvbnN1bHRCdXR0b24gPSB0aGlzLnNob3dBZGRCdXR0b247XHJcbiAgICAgICAgfSAgICAgICAgXHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNob3dVcGRhdGVCdXR0b24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgdGhpcy5zaG93VXBkYXRlQnV0dG9uID0gdGhpcy5zaG93QWRkQnV0dG9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0FkZEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dBZGRCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5zaG93Q29uc3VsdEJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dDb25zdWx0QnV0dG9uID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd1VwZGF0ZUJ1dHRvbiA9PT0gdW5kZWZpbmVkKSB0aGlzLnNob3dVcGRhdGVCdXR0b24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9KTtcclxufSAgXHJcblxyXG5cclxuICBvcGVuQWR2YW5jZWRTZWFyY2hDb21wb25lbnQoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaG93QWR2YW5jZWRTZWFyY2hCdXR0b24gPSAhIWVudGl0eT8uYWR2YW5jZWRTZWFyY2hDb21wb25lbnQ7XHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgICAgICBpc0FkdmFuY2VkU2VhcmNoOiB0cnVlLFxyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSxcclxuICAgICAgICAgICAgICBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ09OU1VMVCxcclxuICAgICAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHlcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmFkdmFuY2VkU2VhcmNoQ29tcG9uZW50KSwgY29uZik7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgoc2VsZWN0ZWRQZXJzb246IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICAgICAgICB0aGlzLnNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgb3BlblNlYXJjaERpYWxvZygpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiY2xhc3M6IFwiLCB0aGlzLmJ1c2luZXNzQ2xhc3MpXHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiBhc3luYyAoZW50aXR5OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB7IGlzQWR2YW5jZWRTZWFyY2g6IHRydWUsIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZSwgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsIGN1c3RvbURhdGE6IGVudGl0eSB9LFxyXG4gICAgICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLmhlaWdodCxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkubGlzdENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5saXN0Q29tcG9uZW50KSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzZWxlY3RlZFBlcnNvbjogYW55KSA9PiB7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRQZXJzb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmQgPSBzZWxlY3RlZFBlcnNvbjtcclxuICAgICAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICBhZGRFbGVtZW50KCkge1xyXG4gICAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9uYW1lRW50aXR5XCIpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UuZ2V0RW50aXR5SW5mbyh0aGlzLmJ1c2luZXNzQ2xhc3MpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgICAgICBsZXQgY29uZjogRHluYW1pY0RpYWxvZ0NvbmZpZyA9IHtcclxuICAgICAgICAgICAgZGF0YTogeyBtb2RlOiBDb21wb25lbnRfTW9kZXMuQ1JFQVRFLCBjdXN0b21EYXRhOiBlbnRpdHkgfSxcclxuICAgICAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgICAgIHdpZHRoOiBNb2RhbFNpemVFbnVtLk1lZGl1bS53aWR0aCxcclxuICAgICAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfZm9ybV9uYW1lX25mXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSwgY29uZik7XHJcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChzYXZlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2F2ZWRFbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzYXZlZEVsZW1lbnQgPT09ICdvYmplY3QnICYmIHNhdmVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiBzYXZlZEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmluZCA9IHNhdmVkRWxlbWVudD8udWlkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2F2ZWRFbGVtZW50ID09PSAnc3RyaW5nJyAmJiBHdWlkLmlzVmFsaWQoc2F2ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kID0gc2F2ZWRFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVFbGVtZW50KCkge1xyXG4gIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X25hbWVFbnRpdHlcIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAoIXRoaXMuYmluZCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwiQXVjdW4gw6lsw6ltZW50IHPDqWxlY3Rpb25uw6kgcG91ciBsYSBtaXNlIMOgIGpvdXIuXCIpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5lbnRpdHlDb25maWd1cmF0aW9uU2VydmljZS5nZXRFbnRpdHlJbmZvKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgIG5leHQ6IGFzeW5jIChlbnRpdHk6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoIWVudGl0eSB8fCAhZW50aXR5LmZvcm1OYW1lKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2U/LmVycm9yKFwic2VhcmNoX2NvbWJvX2NvbXBvbmVudF9mb3JtX25hbWVfbmZcIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBjb25mOiBEeW5hbWljRGlhbG9nQ29uZmlnID0ge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIG1vZGU6IENvbXBvbmVudF9Nb2Rlcy5FRElULFxyXG4gICAgICAgICAgY3VzdG9tRGF0YTogZW50aXR5LFxyXG4gICAgICAgICAgaWQ6IHRoaXMuYmluZFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgXHJcbiAgICAgICAgc3R5bGVDbGFzczogJycsXHJcbiAgICAgICAgd2lkdGg6IE1vZGFsU2l6ZUVudW0uTWVkaXVtLndpZHRoLFxyXG4gICAgICAgIGhlaWdodDogTW9kYWxTaXplRW51bS5NZWRpdW0uaGVpZ2h0LFxyXG4gICAgICAgIG1heGltaXphYmxlOiB0cnVlLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlID0gdGhpcy5fdHNpTW9kYWxTZXJ2aWNlPy5vcGVuKFR5cGVSZWdpc3RyeUhlbHBlci5nZXRUeXBlKGVudGl0eS5mb3JtTmFtZSksIGNvbmYpO1xyXG5cclxuICAgICAgdGhpcy5fZGlhbG9nUmVmZXJlbmNlPy5vbkNsb3NlLnN1YnNjcmliZSgodXBkYXRlZEVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAodXBkYXRlZEVsZW1lbnQpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHVwZGF0ZWRFbGVtZW50ID09PSAnb2JqZWN0JyAmJiB1cGRhdGVkRWxlbWVudCAhPT0gbnVsbCAmJiAndWlkJyBpbiB1cGRhdGVkRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQudWlkO1xyXG4gICAgICAgICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQodGhpcy5iaW5kKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB1cGRhdGVkRWxlbWVudCA9PT0gJ3N0cmluZycgJiYgR3VpZC5pc1ZhbGlkKHVwZGF0ZWRFbGVtZW50KSkge1xyXG4gICAgICAgICAgdGhpcy5iaW5kID0gdXBkYXRlZEVsZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLmJpbmRDaGFuZ2UuZW1pdCh0aGlzLmJpbmQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG59KTtcclxuICAgIH0sXHJcbiAgICBlcnJvcjogKGVycikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XHJcbiAgICB9XHJcbiAgfSk7XHJcbn1cclxuY29uc3VsdEVsZW1lbnQoKSB7XHJcbiAgaWYgKCF0aGlzLmJ1c2luZXNzQ2xhc3MpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlPy5lcnJvcihcInNlYXJjaF9jb21ib19jb21wb25lbnRfbmFtZUVudGl0eVwiKTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGlmICghdGhpcy5iaW5kKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJBdWN1biDDqWzDqW1lbnQgc8OpbGVjdGlvbm7DqSBwb3VyIGxhIGNvbnN1bHRhdGlvbi5cIik7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm8odGhpcy5idXNpbmVzc0NsYXNzKS5zdWJzY3JpYmUoe1xyXG4gICAgbmV4dDogYXN5bmMgKGVudGl0eTogYW55KSA9PiB7XHJcbiAgICAgIGlmICghZW50aXR5IHx8ICFlbnRpdHkuZm9ybU5hbWUpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZT8uZXJyb3IoXCJzZWFyY2hfY29tYm9fY29tcG9uZW50X2Zvcm1fbmFtZV9uZlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbmY6IER5bmFtaWNEaWFsb2dDb25maWcgPSB7XHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgbW9kZTogQ29tcG9uZW50X01vZGVzLkNPTlNVTFQsXHJcbiAgICAgICAgICBjdXN0b21EYXRhOiBlbnRpdHksXHJcbiAgICAgICAgICBpZDogdGhpcy5iaW5kICAgXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdHlsZUNsYXNzOiAnJyxcclxuICAgICAgICB3aWR0aDogTW9kYWxTaXplRW51bS5NZWRpdW0ud2lkdGgsXHJcbiAgICAgICAgaGVpZ2h0OiBNb2RhbFNpemVFbnVtLk1lZGl1bS5oZWlnaHQsXHJcbiAgICAgICAgbWF4aW1pemFibGU6IHRydWUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2UgPSB0aGlzLl90c2lNb2RhbFNlcnZpY2U/Lm9wZW4oXHJcbiAgICAgICAgVHlwZVJlZ2lzdHJ5SGVscGVyLmdldFR5cGUoZW50aXR5LmZvcm1OYW1lKSxcclxuICAgICAgICBjb25mXHJcbiAgICAgICk7XHJcblxyXG4gICAgICB0aGlzLl9kaWFsb2dSZWZlcmVuY2U/Lm9uQ2xvc2Uuc3Vic2NyaWJlKChfKSA9PiB7XHJcbiAgICAgIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJldXIgbG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkZXMgaW5mb3MgZCdlbnRpdMOpIDpcIiwgZXJyKTtcclxuICAgIH1cclxuICB9KTtcclxufVxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBldmVudHNcclxuICBiaW5kVmFsdWVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuYmluZCA9IGV2ZW50LnZhbHVlO1xyXG4gICAgaWYgKHRoaXMuYmluZCAhPT0gbnVsbCAmJiB0aGlzLmJpbmQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZCA9IHRoaXMuYmluZFxyXG4gICAgfVxyXG4gICAgdGhpcy5iaW5kQ2hhbmdlLmVtaXQoZXZlbnQudmFsdWUpO1xyXG5cclxuICAgIGlmICghdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQpIHtcclxuICAgICAgdGhpcy5fYmluZENoYW5nZUVtaXR0ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBzZWxlY3RlZEVsZW1lbnQ6IGFueSA9IHRoaXMuZGF0YXNvdXJjZS5maW5kKGUgPT4gZS5pZCA9PSB0aGlzLmJpbmQpO1xyXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChzZWxlY3RlZEVsZW1lbnQubGFiZWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWVDaGFuZ2VkKHNlYXJjaFZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2lzSW5wdXREYXRhc291cmNlKSB7XHJcbiAgICAgIHRoaXMuX2xvYWRTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKHNlYXJjaFZhbHVlLmZpbHRlcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk9wZW4oKSB7XHJcbiAgICBpZiAodGhpcy5pc0ZpbHRlcmVkIHx8IHR5cGVvZiB0aGlzLmxpc3RTb3VyY2VVcmwgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIHRoaXMuX2xvYWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkhpZGUoKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhTG9hZGVkKSB7XHJcbiAgICAgIHRoaXMuYmluZCA9IHRoaXMuX3NlbGVjdGVkXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGVhclNlbGVjdGVkVmFsdWUoKSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZCA9IHVuZGVmaW5lZFxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbWV0aG9kc1xyXG4gIHByaXZhdGUgX2xvYWREYXRhU291cmNlKCkge1xyXG4gICAgaWYgKCF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBpZiAodGhpcy5pc0ZpbHRlcmVkKSB7XHJcbiAgICAgICAgdGhpcy5fbG9hZFNlcnZlclNpZGVQYWdlZERhdGFTb3VyY2UoKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLl9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZShrZXl3b3JkOiBzdHJpbmcgPSBcIlwiKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVMaXN0SW5wdXRzKCkpIHtcclxuICAgICAgdGhpcy5fZGF0YXNvdXJjZSA9IFtdO1xyXG4gICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faHR0cENsaWVudC5nZXQodGhpcy5faW5pdExpc3REYXRhU291cmNlRW5kcG9pbnQoKSwgdGhpcy5fZ2VuZXJhdGVIdHRwUGFyYW1zKGtleXdvcmQpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2FkTm90U2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpIHtcclxuICAgIGlmICh0aGlzLl92YWxpZGF0ZUxpc3RJbnB1dHMoKSkge1xyXG4gICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgIHRoaXMuZGF0YUxvYWRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlID0gZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkQmluZEVsZW1lbnQoKSB7XHJcbiAgICBpZiAodGhpcy5fdmFsaWRhdGVCaW5kRWxlbWVudElucHV0cygpKSB7XHJcbiAgICAgIGlmICh0aGlzLmJpbmQpIHtcclxuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl9odHRwQ2xpZW50LmdldCh0aGlzLl9pbml0RWxlbWVudEVuZHBvaW50KCkpKTtcclxuXHJcbiAgICAgICAgICBsZXQgdGVtcEFycmF5OiBhbnlbXSA9IFtdO1xyXG4gICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgaWQ6IGRhdGFbdGhpcy5pZEZpZWxkXSxcclxuICAgICAgICAgICAgbGFiZWw6IGRhdGFbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG9iai5pZDtcclxuICAgICAgICAgIHRlbXBBcnJheS5wdXNoKG9iaik7XHJcbiAgICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gdGVtcEFycmF5O1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTGFiZWxDaGFuZ2UuZW1pdChvYmoubGFiZWwpO1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgdGhpcy5kYXRhTG9hZGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jb21wYXJlRnVuY3Rpb24oKTogKGE6IGFueSwgYjogYW55KSA9PiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChhLCBiKSA9PiB7XHJcbiAgICAgIGlmIChhLmxhYmVsID4gYi5sYWJlbCkgeyByZXR1cm4gMTsgfVxyXG4gICAgICBpZiAoYS5sYWJlbCA8IGIubGFiZWwpIHsgcmV0dXJuIC0xOyB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZhbGlkYXRlTGlzdElucHV0cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmxpc3RTb3VyY2VVcmwgPT0gdW5kZWZpbmVkIHx8IHRoaXMubGlzdFNvdXJjZVVybCA9PT0gJycpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaXN0U291cmNlVXJsIHVybCBub3QgZGVmaW5lZCcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92YWxpZGF0ZUJpbmRFbGVtZW50SW5wdXRzKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZWxlbWVudFNvdXJjZVVybCA9PSB1bmRlZmluZWQgfHwgdGhpcy5lbGVtZW50U291cmNlVXJsID09PSAnJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2VsZW1lbnRTb3VyY2VVcmwgbm90IGRlZmluZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRQYXJhbWV0ZXJzV2l0aERlZmF1bHRzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaWRGaWVsZCA9PSB1bmRlZmluZWQgfHwgdGhpcy5pZEZpZWxkID09PSBcIlwiKSB7XHJcbiAgICAgIHRoaXMuaWRGaWVsZCA9IFwiaWRcIjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5sYWJlbEZpZWxkID09IHVuZGVmaW5lZCB8fCB0aGlzLmxhYmVsRmllbGQgPT09IFwiXCIpIHtcclxuICAgICAgdGhpcy5sYWJlbEZpZWxkID0gXCJsaWJlbGxlXCI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RWxlbWVudEVuZHBvaW50KCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5iaW5kKSB7XHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGhpcy5lbGVtZW50U291cmNlVXJsfS8ke3RoaXMuYmluZH1gKTtcclxuICAgIH1cclxuICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdubyBiaW5kIGlucHV0IHdhcyBwcm92aWRlZCwgY2Fubm90IGNyZWF0ZSBiaW5kRWxlbWVudFVybCcpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TGlzdERhdGFTb3VyY2VFbmRwb2ludCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmxpc3RTb3VyY2VVcmwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCd5b3UgbXVzdCBwcm92aWRlIHRoZSBsaXN0IHNvdXJjZSB1cmwnKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgdGhpcy5saXN0U291cmNlVXJsID09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGVuY29kZVVSSShgJHt0aGlzLmxpc3RTb3VyY2VVcmx9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIHRoaXMubGlzdFNvdXJjZVVybCA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgbGV0IHRlbXBMaXN0U291cmNlVXJsID0gdGhpcy5saXN0U291cmNlVXJsKHRoaXMuY3VycmVudFJvd0l0ZW0pXHJcbiAgICAgIHJldHVybiBlbmNvZGVVUkkoYCR7dGVtcExpc3RTb3VyY2VVcmx9YClcclxuICAgIH1cclxuICAgIHJldHVybiBcIlwiXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9pbml0aWFsTG9hZERhdGEoKSB7XHJcbiAgICBpZiAodGhpcy5faXNJbnB1dERhdGFzb3VyY2UpIHtcclxuICAgICAgdGhpcy5fbWFwR290dGVuRGF0YVNvdXJjZVRvTG9jYWxEYXRhc291cmNlKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2xvYWRCaW5kRWxlbWVudCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX29uQmluZFNldCgpIHtcclxuICAgIGlmICh0aGlzLmlzRmlsdGVyZWQgJiYgIXRoaXMuX2JpbmRDaGFuZ2VFbWl0dGVkICYmICF0aGlzLl9pc0lucHV0RGF0YXNvdXJjZSkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9sb2FkQmluZEVsZW1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvYWRBbGxEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuaXNGaWx0ZXJlZCkge1xyXG4gICAgICB0aGlzLl9sb2FkU2VydmVyU2lkZVBhZ2VkRGF0YVNvdXJjZSgpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvYWROb3RTZXJ2ZXJTaWRlUGFnZWREYXRhU291cmNlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0UmVsb2FkRGF0YVNvdXJjZVN1YnNjcmlwdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnJlbG9hZERhdGFTb3VyY2UpIHtcclxuICAgICAgdGhpcy5fcmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWREYXRhU291cmNlLnN1YnNjcmliZShcclxuICAgICAgICAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIChkYXRhKSA9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBpZiAoZGF0YSAhPSB1bmRlZmluZWQgJiYgZGF0YSAhPSBudWxsICYmIGRhdGEgIT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RTb3VyY2VVcmwgPSBkYXRhO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvYWRBbGxEYXRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlID0gZGF0YVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcEdvdHRlbkRhdGFTb3VyY2VUb0xvY2FsRGF0YXNvdXJjZSgpOiB2b2lkIHtcclxuICAgIGxldCB0ZW1wQXJyYXk6IGFueVtdID0gW107XHJcbiAgICB0aGlzLl9nb3R0ZW5EYXRhc291cmNlLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGlkOiBlbGVtZW50W3RoaXMuaWRGaWVsZF0sXHJcbiAgICAgICAgbGFiZWw6IGVsZW1lbnRbdGhpcy5sYWJlbEZpZWxkXVxyXG4gICAgICB9O1xyXG4gICAgICB0ZW1wQXJyYXkucHVzaChvYmopO1xyXG4gICAgfSlcclxuICAgIHRoaXMuX2RhdGFzb3VyY2UgPSB0ZW1wQXJyYXk7XHJcbiAgICBpZiAodGhpcy5zb3J0KSB7XHJcbiAgICAgIHRoaXMuX2RhdGFzb3VyY2Uuc29ydCh0aGlzLl9jb21wYXJlRnVuY3Rpb24oKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGFMb2FkZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlTG9hZGVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dlbmVyYXRlSHR0cFBhcmFtcyhrZXl3b3JkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhbnkge1xyXG4gICAgLy9pbml0IHBhcmFtc1xyXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XHJcbiAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCd2YWx1ZScsIGtleXdvcmQgPz8gJycpO1xyXG5cclxuICAgIHJldHVybiB7IHBhcmFtczogcGFyYW1zIH07XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaENvbWJvQ2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5vbkNsaWNrLmVtaXQoZXZlbnQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZmxleFwiPlxyXG4gIDxwLWRyb3Bkb3duIFtwbGFjZWhvbGRlcl09XCJwbGFjZUhvbGRlclwiIGNsYXNzPVwie3tteVN0eWxlQ2xhc3N9fVwiIFtyZXF1aXJlZF09XCJpc1JlcXVpcmVkXCJcclxuICAgIHN0eWxlQ2xhc3M9XCJ7e215U3R5bGVDbGFzc319IGJvcmRlci1yYWRpdXMtNyB7e3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc319XCIgYXBwZW5kVG89XCJib2R5XCIgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXHJcbiAgICBvcHRpb25WYWx1ZT1cImlkXCIgZmlsdGVyQnk9XCJsYWJlbFwiIFtvcHRpb25zXT1cImRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbGF6eV09XCIhZGF0YUxvYWRlZFwiXHJcbiAgICBbKG5nTW9kZWwpXT1cImJpbmRcIiBbZmlsdGVyXT1cInRydWVcIiBbc2hvd0NsZWFyXT1cInNob3dDbGVhclwiIFthdXRvRGlzcGxheUZpcnN0XT1cImZhbHNlXCJcclxuICAgIChvbkNoYW5nZSk9XCJiaW5kVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25IaWRlKT1cIm9uSGlkZSgpXCIgKG9uU2hvdyk9XCJvbk9wZW4oKVwiXHJcbiAgICAob25GaWx0ZXIpPVwic2VhcmNoVmFsdWVDaGFuZ2VkKCRldmVudClcIiAob25DbGVhcik9XCJjbGVhclNlbGVjdGVkVmFsdWUoKVwiIChvbkNsaWNrKT1cIm9uU2VhcmNoQ29tYm9DbGljaygkZXZlbnQpXCJcclxuICAgIFtzdHlsZV09XCJ7J21heC13aWR0aCc6IG1heFdpZHRoLCAnd2lkdGgnOicxMDAlJywgJ2hlaWdodCc6ICcxLjdyZW0nfVwiXHJcbiAgICBbbmdDbGFzc109XCJpc0FyID8gJ3AtZHJvcGRvd24tY2xlYXItaWNvbkFSJzogJ3AtZHJvcGRvd24tY2xlYXItaWNvbkZSJyBcIj5cclxuICAgIDwhLS0gQWpvdXQgZCd1biBib3V0b24gZGFucyBsZSBkcm9wZG93biAtLT5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLWhlYWRlciBmbGV4IGdhcC0xIHB0LTIgcHgtMlwiPlxyXG4gICAgICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd1NlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc2VhcmNoXCIgdGl0bGU9XCJ0aXRsZS1zZWFyY2gtY29tYm8tT3V2cmlyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1wcmltYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwib3BlblNlYXJjaERpYWxvZygpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBsdXNcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Bam91dGVyXCJcclxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1zdWNjZXNzIGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIiAoY2xpY2spPVwiYWRkRWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZHZhbmNlZFNlYXJjaEJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiBpY29uPVwicGkgcGktc29ydC1hbW91bnQtZG93blwiXHJcbiAgICAgICAgICB0aXRsZT1cIkxpc3RlciBsZXMgYXJ0aWNsZXMgcGl2b3TDqXNcIiBzdHlsZUNsYXNzPVwicC1idXR0b24tc2Vjb25kYXJ5IGhvdmVyOnNoYWRvdy02IGgtMnJlbSBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZHZhbmNlZFNlYXJjaENvbXBvbmVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwaSBwaS1leWVcIiB0aXRsZT1cInRpdGxlLXNlYXJjaC1jb21iby1Db25zdWx0ZXJcIlxyXG4gICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXByaW1hcnkgaG92ZXI6c2hhZG93LTYgaC0ycmVtIHAtYnV0dG9uLWljb24tb25seVwiIChjbGljayk9XCJjb25zdWx0RWxlbWVudCgpXCI+XHJcbiAgICAgICAgPC9Uc2ktQnV0dG9uPlxyXG5cclxuICAgICAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dVcGRhdGVCdXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInBpIHBpLXBlbmNpbFwiIHRpdGxlPVwidGl0bGUtc2VhcmNoLWNvbWJvLXVwZGF0ZVwiXHJcbiAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcHJpbWFyeSBob3ZlcjpzaGFkb3ctNiBoLTJyZW0gcC1idXR0b24taWNvbi1vbmx5XCIgKGNsaWNrKT1cInVwZGF0ZUVsZW1lbnQoKVwiPlxyXG4gICAgICAgIDwvVHNpLUJ1dHRvbj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtdGFyZ2V0IHBUZW1wbGF0ZT1cIml0ZW1cIj5cclxuICAgICAgPGRpdiBwVG9vbHRpcD1cInt7dGFyZ2V0LmxhYmVsfX1cIiB0b29sdGlwUG9zaXRpb249XCJ0b3BcIiB0b29sdGlwU3R5bGVDbGFzcz1cImN1c3RvbS10b29sdGlwXCI+XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1N0YXR1c0NvbWJvICYmIHN0YXR1c01ldGFkYXRhOyBlbHNlIG5vcm1hbE9wdGlvblwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldFN0YXR1c09wdGlvbih0YXJnZXQubGFiZWwpIGFzIG9wdFwiPlxyXG4gICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGQgc3RhdHVzLWJhZGdlXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImxpZ2h0ZW5Db2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJnZXRSZWFkYWJsZVRleHRDb2xvcihvcHQuY29sb3JIZXgpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLXRvcF09XCInMC4xcmVtJ1wiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUucGFkZGluZy1ib3R0b21dPVwiJzAuMXJlbSdcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAge3t0YXJnZXQubGFiZWx9fVxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNub3JtYWxPcHRpb24+XHJcbiAgICAgICAgICA8c3Bhbj57e3RhcmdldC5sYWJlbH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3AtZHJvcGRvd24+XHJcblxyXG4gIDwhLS0gQnViYmxlIEluZm8gLS0+XHJcbiAgPFRzaS1CdWJibGUtSW5mbyBbaW5mb1RleHRdPVwiaW5mb1RleHRcIj48L1RzaS1CdWJibGUtSW5mbz5cclxuPC9kaXY+Il19