@sarasanalytics-com/design-system 0.0.163 → 0.0.165
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/interfaces/avatar-interface.mjs +1 -1
- package/esm2022/interfaces/button-interface.mjs +1 -1
- package/esm2022/interfaces/card-carousel-interface.mjs +1 -1
- package/esm2022/interfaces/chip-interface.mjs +1 -1
- package/esm2022/interfaces/form-layout.interface.mjs +1 -1
- package/esm2022/interfaces/grid-interface.mjs +1 -1
- package/esm2022/interfaces/guide-card-interface.mjs +1 -1
- package/esm2022/interfaces/header-interface.mjs +1 -1
- package/esm2022/interfaces/icon-interface.mjs +1 -1
- package/esm2022/interfaces/layout-section-interface.mjs +1 -1
- package/esm2022/interfaces/left-nav-interface.mjs +1 -1
- package/esm2022/interfaces/menu.interface.mjs +1 -1
- package/esm2022/interfaces/message-banner.mjs +1 -1
- package/esm2022/interfaces/option-interface.mjs +1 -1
- package/esm2022/interfaces/scrolling-card-interface.mjs +1 -1
- package/esm2022/interfaces/select-interface.mjs +1 -1
- package/esm2022/interfaces/status-dot.interface.mjs +1 -1
- package/esm2022/interfaces/tab-interface.mjs +1 -1
- package/esm2022/interfaces/toast-interface.mjs +1 -1
- package/esm2022/interfaces/typography-animation-interface.mjs +1 -1
- package/esm2022/lib/accordion/accordion.component.mjs +3 -3
- package/esm2022/lib/avatar/avatar.component.mjs +3 -3
- package/esm2022/lib/button/button.component.mjs +3 -3
- package/esm2022/lib/calendar-header/calendar-header.component.mjs +3 -3
- package/esm2022/lib/card/card-body/card-body.component.mjs +1 -1
- package/esm2022/lib/card/card-custom-header/card-custom-header.component.mjs +1 -1
- package/esm2022/lib/card/card-footer-actions/card-footer-actions.component.mjs +3 -3
- package/esm2022/lib/card/card-icon/card-icon.component.mjs +1 -1
- package/esm2022/lib/card/card-title-actions/card-title-actions.component.mjs +1 -1
- package/esm2022/lib/card/card.component.mjs +3 -3
- package/esm2022/lib/card/checkbox-card/checkbox-card.component.mjs +3 -3
- package/esm2022/lib/card/guide-card/guide-card.component.mjs +3 -3
- package/esm2022/lib/card/menu-card/menu-card.component.mjs +3 -3
- package/esm2022/lib/card/thumbnail-card/thumbnail-card.component.mjs +3 -3
- package/esm2022/lib/card-carousel/card-carousel.component.mjs +3 -3
- package/esm2022/lib/categories-nav/categories-nav.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/chips/chips.component.mjs +3 -3
- package/esm2022/lib/component-library.component.mjs +9 -9
- package/esm2022/lib/component-library.service.mjs +1 -1
- package/esm2022/lib/dashboard-loader/dashboard-loader.component.mjs +1 -1
- package/esm2022/lib/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog.component.mjs +3 -3
- package/esm2022/lib/dropdown/category-dropdown/category-dropdown.component.mjs +3 -3
- package/esm2022/lib/dropdown/ng-select/ng-select.component.mjs +3 -3
- package/esm2022/lib/filter/filter.component.mjs +3 -3
- package/esm2022/lib/form-input/form-input.component.mjs +3 -3
- package/esm2022/lib/form-select/form-select.component.mjs +3 -3
- package/esm2022/lib/grid-cell/grid-cell.component.mjs +10 -10
- package/esm2022/lib/header/header.component.mjs +3 -3
- package/esm2022/lib/icon/icon.component.mjs +9 -3
- package/esm2022/lib/icon/icon.service.mjs +1 -1
- package/esm2022/lib/layout-section/layout-section.component.mjs +3 -3
- package/esm2022/lib/left-nav/left-nav.component.mjs +3 -3
- package/esm2022/lib/list/list.component.mjs +3 -3
- package/esm2022/lib/menu/menu-list/menu-item.component.mjs +3 -3
- package/esm2022/lib/menu/menu.component.mjs +5 -3
- package/esm2022/lib/menu/menu.directive.mjs +1 -1
- package/esm2022/lib/message-banner/message-banner.component.mjs +3 -3
- package/esm2022/lib/message-banner-v2/message-banner-v2.component.mjs +3 -3
- package/esm2022/lib/mini-card/mini-card.component.mjs +3 -3
- package/esm2022/lib/page-layout/page-layout.component.mjs +3 -3
- package/esm2022/lib/progress-bar/progress-bar.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder-demo.component.mjs +45 -45
- package/esm2022/lib/query-builder/query-builder.component.mjs +3 -3
- package/esm2022/lib/query-builder/query-builder.service.mjs +1 -1
- package/esm2022/lib/query-builder-formly/query-builder-formly.component.mjs +3 -3
- package/esm2022/lib/query-builder-textarea/query-builder-textarea-demo.component.mjs +39 -39
- package/esm2022/lib/query-builder-textarea/query-builder-textarea.component.mjs +3 -3
- package/esm2022/lib/radio-button/radio-button.component.mjs +3 -3
- package/esm2022/lib/scrolling-cards/scrolling-cards.component.mjs +3 -3
- package/esm2022/lib/skeleton/skeleton-base.component.mjs +10 -3
- package/esm2022/lib/skeleton/skeleton-container.component.mjs +9 -9
- package/esm2022/lib/skeleton/skeleton-loader.component.mjs +220 -194
- package/esm2022/lib/skeleton/skeleton-presets.mjs +1 -1
- package/esm2022/lib/skeleton/skeleton-shapes.component.mjs +17 -9
- package/esm2022/lib/spinner/spinner.component.mjs +1 -1
- package/esm2022/lib/status-dot/status-dot.component.mjs +17 -17
- package/esm2022/lib/stepper/stepper.component.mjs +3 -3
- package/esm2022/lib/tabs/tabs.component.mjs +3 -3
- package/esm2022/lib/toast/toast.component.mjs +3 -3
- package/esm2022/lib/tool-tip/tool-tip.component.mjs +3 -3
- package/esm2022/lib/typography-animation/typography-animation.component.mjs +3 -3
- package/esm2022/utils/validators.mjs +1 -1
- package/fesm2022/sarasanalytics-com-design-system.mjs +662 -614
- package/fesm2022/sarasanalytics-com-design-system.mjs.map +1 -1
- package/interfaces/menu.interface.d.ts +2 -0
- package/lib/icon/icon.component.d.ts +3 -1
- package/lib/skeleton/skeleton-base.component.d.ts +3 -1
- package/lib/skeleton/skeleton-container.component.d.ts +1 -1
- package/lib/skeleton/skeleton-loader.component.d.ts +2 -1
- package/lib/skeleton/skeleton-presets.d.ts +2 -0
- package/lib/skeleton/skeleton-shapes.component.d.ts +8 -4
- package/package.json +1 -1
- package/styles/styles.css +434 -432
|
@@ -771,7 +771,7 @@ export class QueryBuilderTextareaComponent {
|
|
|
771
771
|
};
|
|
772
772
|
}
|
|
773
773
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: QueryBuilderTextareaComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
774
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: QueryBuilderTextareaComponent, isStandalone: true, selector: "sa-query-builder-textarea", inputs: { config: "config" }, outputs: { queryChange: "queryChange", suggestionSelected: "suggestionSelected" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "queryTextarea", first: true, predicate: ["queryTextarea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"sa-query-builder-textarea\">\n <form [formGroup]=\"form\">\n <div class=\"query-builder-header\">\n <div class=\"where-label\">Where</div>\n </div>\n\n <div class=\"query-builder-body\">\n <div class=\"textarea-container\">\n <mat-form-field class=\"query-textarea-field\" appearance=\"outline\">\n <textarea\n #queryTextarea\n matInput\n formControlName=\"queryText\"\n placeholder=\"Start typing your query...\"\n rows=\"5\"\n ></textarea>\n </mat-form-field>\n \n <!-- Custom Dropdown -->\n <div \n #dropdown\n class=\"suggestions-dropdown\" \n [class.visible]=\"isDropdownVisible\"\n [style.top.px]=\"dropdownPosition.top\"\n [style.left.px]=\"dropdownPosition.left\"\n >\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <div \n class=\"suggestion-item\"\n [class.selected]=\"i === selectedIndex\"\n [attr.data-index]=\"i\"\n (click)=\"onSuggestionClick(suggestion)\"\n (mouseenter)=\"selectedIndex = i\"\n >\n <div class=\"suggestion-main\">\n <span class=\"suggestion-name\">{{ suggestion.name }}</span>\n <span class=\"suggestion-type\">{{ suggestion.type }}</span>\n </div>\n @if (suggestion.description) {\n <div class=\"suggestion-description\">{{ suggestion.description }}</div>\n }\n @if (suggestion.unit) {\n <div class=\"suggestion-unit\">{{ suggestion.unit }}</div>\n }\n </div>\n }\n </div>\n\n <!-- Date Picker Popup -->\n <div \n class=\"date-picker-popup\" \n [class.visible]=\"isDatePickerVisible\"\n [style.top.px]=\"datePickerPosition.top\"\n [style.left.px]=\"datePickerPosition.left\"\n >\n <div class=\"date-picker-container\">\n @if (!showDualDatePicker) {\n <!-- Single Date Picker -->\n <div class=\"single-date-picker\">\n <h4>Select Date</h4>\n <mat-form-field appearance=\"outline\">\n <mat-label>Date</mat-label>\n <input matInput [matDatepicker]=\"singlePicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"singlePicker\"></mat-datepicker-toggle>\n <mat-datepicker #singlePicker></mat-datepicker>\n </mat-form-field>\n </div>\n } @else {\n <!-- Dual Date Picker for 'between' operator -->\n <div class=\"dual-date-picker\">\n <h4>Select Date Range</h4>\n <div class=\"date-range-inputs\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Start Date</mat-label>\n <input matInput [matDatepicker]=\"startPicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\n <mat-datepicker #startPicker></mat-datepicker>\n </mat-form-field>\n \n @if (firstDateSelected) {\n <mat-form-field appearance=\"outline\">\n <mat-label>End Date</mat-label>\n <input matInput [matDatepicker]=\"endPicker\" [min]=\"firstDateSelected\" (dateChange)=\"onSecondDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\n <mat-datepicker #endPicker></mat-datepicker>\n </mat-form-field>\n }\n </div>\n </div>\n }\n \n <div class=\"date-picker-actions\">\n <button mat-button (click)=\"hideDatePicker()\">Cancel</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"query-builder-footer\">\n <button mat-button class=\"reset-btn\" (click)=\"onReset()\">Reset</button>\n <button mat-raised-button color=\"primary\" class=\"apply-btn\" (click)=\"onApply()\">Apply filters</button>\n </div>\n </form>\n</div>\n", styles: [".sa-query-builder-textarea{display:flex;flex-direction:column;width:100%;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;padding:16px;box-sizing:border-box}.sa-query-builder-textarea .query-builder-header{display:flex;align-items:center;margin-bottom:8px}.sa-query-builder-textarea .query-builder-header .where-label{font-weight:500;font-size:14px;color:#333;margin-right:8px}.sa-query-builder-textarea .query-builder-body{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container{position:relative;width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field textarea{resize:vertical;min-height:100px;font-family:monospace}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown{position:absolute;z-index:1000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;max-height:300px;overflow-y:auto;min-width:250px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item{padding:12px 16px;cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .15s ease}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:hover,.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item.selected{background-color:#f5f5f5}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:last-child{border-bottom:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-name{font-weight:500;color:#333;font-size:14px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-type{font-size:12px;color:#666;background:#e8f4f8;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-description{font-size:12px;color:#666;margin-top:4px;line-height:1.3}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-unit{font-size:11px;color:#888;margin-top:2px;font-style:italic}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup{position:absolute;z-index:1001;background:#fff;border:1px solid #ccc;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:300px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container{padding:16px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container h4{margin:0 0 16px;font-size:16px;font-weight:500;color:#333}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .single-date-picker .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs{display:flex;flex-direction:column;gap:12px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid #f0f0f0}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions button{margin-left:8px}.sa-query-builder-textarea .query-builder-footer{display:flex;justify-content:flex-end;margin-top:16px;gap:8px}.sa-query-builder-textarea .query-builder-footer .reset-btn{margin-right:8px}::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }] }); }
|
|
774
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.4", type: QueryBuilderTextareaComponent, isStandalone: true, selector: "sa-query-builder-textarea", inputs: { config: "config" }, outputs: { queryChange: "queryChange", suggestionSelected: "suggestionSelected" }, host: { listeners: { "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "queryTextarea", first: true, predicate: ["queryTextarea"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }], ngImport: i0, template: "<div class=\"sa-query-builder-textarea\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"query-builder-header\">\r\n <div class=\"where-label\">Where</div>\r\n </div>\r\n\r\n <div class=\"query-builder-body\">\r\n <div class=\"textarea-container\">\r\n <mat-form-field class=\"query-textarea-field\" appearance=\"outline\">\r\n <textarea\r\n #queryTextarea\r\n matInput\r\n formControlName=\"queryText\"\r\n placeholder=\"Start typing your query...\"\r\n rows=\"5\"\r\n ></textarea>\r\n </mat-form-field>\r\n \r\n <!-- Custom Dropdown -->\r\n <div \r\n #dropdown\r\n class=\"suggestions-dropdown\" \r\n [class.visible]=\"isDropdownVisible\"\r\n [style.top.px]=\"dropdownPosition.top\"\r\n [style.left.px]=\"dropdownPosition.left\"\r\n >\r\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\r\n <div \r\n class=\"suggestion-item\"\r\n [class.selected]=\"i === selectedIndex\"\r\n [attr.data-index]=\"i\"\r\n (click)=\"onSuggestionClick(suggestion)\"\r\n (mouseenter)=\"selectedIndex = i\"\r\n >\r\n <div class=\"suggestion-main\">\r\n <span class=\"suggestion-name\">{{ suggestion.name }}</span>\r\n <span class=\"suggestion-type\">{{ suggestion.type }}</span>\r\n </div>\r\n @if (suggestion.description) {\r\n <div class=\"suggestion-description\">{{ suggestion.description }}</div>\r\n }\r\n @if (suggestion.unit) {\r\n <div class=\"suggestion-unit\">{{ suggestion.unit }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Date Picker Popup -->\r\n <div \r\n class=\"date-picker-popup\" \r\n [class.visible]=\"isDatePickerVisible\"\r\n [style.top.px]=\"datePickerPosition.top\"\r\n [style.left.px]=\"datePickerPosition.left\"\r\n >\r\n <div class=\"date-picker-container\">\r\n @if (!showDualDatePicker) {\r\n <!-- Single Date Picker -->\r\n <div class=\"single-date-picker\">\r\n <h4>Select Date</h4>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Date</mat-label>\r\n <input matInput [matDatepicker]=\"singlePicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"singlePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #singlePicker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n } @else {\r\n <!-- Dual Date Picker for 'between' operator -->\r\n <div class=\"dual-date-picker\">\r\n <h4>Select Date Range</h4>\r\n <div class=\"date-range-inputs\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Start Date</mat-label>\r\n <input matInput [matDatepicker]=\"startPicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #startPicker></mat-datepicker>\r\n </mat-form-field>\r\n \r\n @if (firstDateSelected) {\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>End Date</mat-label>\r\n <input matInput [matDatepicker]=\"endPicker\" [min]=\"firstDateSelected\" (dateChange)=\"onSecondDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #endPicker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n \r\n <div class=\"date-picker-actions\">\r\n <button mat-button (click)=\"hideDatePicker()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"query-builder-footer\">\r\n <button mat-button class=\"reset-btn\" (click)=\"onReset()\">Reset</button>\r\n <button mat-raised-button color=\"primary\" class=\"apply-btn\" (click)=\"onApply()\">Apply filters</button>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".sa-query-builder-textarea{display:flex;flex-direction:column;width:100%;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;padding:16px;box-sizing:border-box}.sa-query-builder-textarea .query-builder-header{display:flex;align-items:center;margin-bottom:8px}.sa-query-builder-textarea .query-builder-header .where-label{font-weight:500;font-size:14px;color:#333;margin-right:8px}.sa-query-builder-textarea .query-builder-body{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container{position:relative;width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field textarea{resize:vertical;min-height:100px;font-family:monospace}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown{position:absolute;z-index:1000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;max-height:300px;overflow-y:auto;min-width:250px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item{padding:12px 16px;cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .15s ease}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:hover,.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item.selected{background-color:#f5f5f5}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:last-child{border-bottom:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-name{font-weight:500;color:#333;font-size:14px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-type{font-size:12px;color:#666;background:#e8f4f8;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-description{font-size:12px;color:#666;margin-top:4px;line-height:1.3}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-unit{font-size:11px;color:#888;margin-top:2px;font-style:italic}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup{position:absolute;z-index:1001;background:#fff;border:1px solid #ccc;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:300px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container{padding:16px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container h4{margin:0 0 16px;font-size:16px;font-weight:500;color:#333}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .single-date-picker .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs{display:flex;flex-direction:column;gap:12px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid #f0f0f0}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions button{margin-left:8px}.sa-query-builder-textarea .query-builder-footer{display:flex;justify-content:flex-end;margin-top:16px;gap:8px}.sa-query-builder-textarea .query-builder-footer .reset-btn{margin-right:8px}::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i3.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i5.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i5.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i5.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatNativeDateModule }] }); }
|
|
775
775
|
}
|
|
776
776
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: QueryBuilderTextareaComponent, decorators: [{
|
|
777
777
|
type: Component,
|
|
@@ -785,7 +785,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
|
|
|
785
785
|
MatDividerModule,
|
|
786
786
|
MatDatepickerModule,
|
|
787
787
|
MatNativeDateModule
|
|
788
|
-
], template: "<div class=\"sa-query-builder-textarea\">\n <form [formGroup]=\"form\">\n <div class=\"query-builder-header\">\n <div class=\"where-label\">Where</div>\n </div>\n\n <div class=\"query-builder-body\">\n <div class=\"textarea-container\">\n <mat-form-field class=\"query-textarea-field\" appearance=\"outline\">\n <textarea\n #queryTextarea\n matInput\n formControlName=\"queryText\"\n placeholder=\"Start typing your query...\"\n rows=\"5\"\n ></textarea>\n </mat-form-field>\n \n <!-- Custom Dropdown -->\n <div \n #dropdown\n class=\"suggestions-dropdown\" \n [class.visible]=\"isDropdownVisible\"\n [style.top.px]=\"dropdownPosition.top\"\n [style.left.px]=\"dropdownPosition.left\"\n >\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\n <div \n class=\"suggestion-item\"\n [class.selected]=\"i === selectedIndex\"\n [attr.data-index]=\"i\"\n (click)=\"onSuggestionClick(suggestion)\"\n (mouseenter)=\"selectedIndex = i\"\n >\n <div class=\"suggestion-main\">\n <span class=\"suggestion-name\">{{ suggestion.name }}</span>\n <span class=\"suggestion-type\">{{ suggestion.type }}</span>\n </div>\n @if (suggestion.description) {\n <div class=\"suggestion-description\">{{ suggestion.description }}</div>\n }\n @if (suggestion.unit) {\n <div class=\"suggestion-unit\">{{ suggestion.unit }}</div>\n }\n </div>\n }\n </div>\n\n <!-- Date Picker Popup -->\n <div \n class=\"date-picker-popup\" \n [class.visible]=\"isDatePickerVisible\"\n [style.top.px]=\"datePickerPosition.top\"\n [style.left.px]=\"datePickerPosition.left\"\n >\n <div class=\"date-picker-container\">\n @if (!showDualDatePicker) {\n <!-- Single Date Picker -->\n <div class=\"single-date-picker\">\n <h4>Select Date</h4>\n <mat-form-field appearance=\"outline\">\n <mat-label>Date</mat-label>\n <input matInput [matDatepicker]=\"singlePicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"singlePicker\"></mat-datepicker-toggle>\n <mat-datepicker #singlePicker></mat-datepicker>\n </mat-form-field>\n </div>\n } @else {\n <!-- Dual Date Picker for 'between' operator -->\n <div class=\"dual-date-picker\">\n <h4>Select Date Range</h4>\n <div class=\"date-range-inputs\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Start Date</mat-label>\n <input matInput [matDatepicker]=\"startPicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\n <mat-datepicker #startPicker></mat-datepicker>\n </mat-form-field>\n \n @if (firstDateSelected) {\n <mat-form-field appearance=\"outline\">\n <mat-label>End Date</mat-label>\n <input matInput [matDatepicker]=\"endPicker\" [min]=\"firstDateSelected\" (dateChange)=\"onSecondDateSelected($event.value)\">\n <mat-datepicker-toggle matIconSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\n <mat-datepicker #endPicker></mat-datepicker>\n </mat-form-field>\n }\n </div>\n </div>\n }\n \n <div class=\"date-picker-actions\">\n <button mat-button (click)=\"hideDatePicker()\">Cancel</button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"query-builder-footer\">\n <button mat-button class=\"reset-btn\" (click)=\"onReset()\">Reset</button>\n <button mat-raised-button color=\"primary\" class=\"apply-btn\" (click)=\"onApply()\">Apply filters</button>\n </div>\n </form>\n</div>\n", styles: [".sa-query-builder-textarea{display:flex;flex-direction:column;width:100%;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;padding:16px;box-sizing:border-box}.sa-query-builder-textarea .query-builder-header{display:flex;align-items:center;margin-bottom:8px}.sa-query-builder-textarea .query-builder-header .where-label{font-weight:500;font-size:14px;color:#333;margin-right:8px}.sa-query-builder-textarea .query-builder-body{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container{position:relative;width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field textarea{resize:vertical;min-height:100px;font-family:monospace}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown{position:absolute;z-index:1000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;max-height:300px;overflow-y:auto;min-width:250px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item{padding:12px 16px;cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .15s ease}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:hover,.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item.selected{background-color:#f5f5f5}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:last-child{border-bottom:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-name{font-weight:500;color:#333;font-size:14px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-type{font-size:12px;color:#666;background:#e8f4f8;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-description{font-size:12px;color:#666;margin-top:4px;line-height:1.3}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-unit{font-size:11px;color:#888;margin-top:2px;font-style:italic}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup{position:absolute;z-index:1001;background:#fff;border:1px solid #ccc;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:300px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container{padding:16px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container h4{margin:0 0 16px;font-size:16px;font-weight:500;color:#333}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .single-date-picker .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs{display:flex;flex-direction:column;gap:12px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid #f0f0f0}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions button{margin-left:8px}.sa-query-builder-textarea .query-builder-footer{display:flex;justify-content:flex-end;margin-top:16px;gap:8px}.sa-query-builder-textarea .query-builder-footer .reset-btn{margin-right:8px}::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}\n"] }]
|
|
788
|
+
], template: "<div class=\"sa-query-builder-textarea\">\r\n <form [formGroup]=\"form\">\r\n <div class=\"query-builder-header\">\r\n <div class=\"where-label\">Where</div>\r\n </div>\r\n\r\n <div class=\"query-builder-body\">\r\n <div class=\"textarea-container\">\r\n <mat-form-field class=\"query-textarea-field\" appearance=\"outline\">\r\n <textarea\r\n #queryTextarea\r\n matInput\r\n formControlName=\"queryText\"\r\n placeholder=\"Start typing your query...\"\r\n rows=\"5\"\r\n ></textarea>\r\n </mat-form-field>\r\n \r\n <!-- Custom Dropdown -->\r\n <div \r\n #dropdown\r\n class=\"suggestions-dropdown\" \r\n [class.visible]=\"isDropdownVisible\"\r\n [style.top.px]=\"dropdownPosition.top\"\r\n [style.left.px]=\"dropdownPosition.left\"\r\n >\r\n @for (suggestion of filteredSuggestions; track suggestion.id; let i = $index) {\r\n <div \r\n class=\"suggestion-item\"\r\n [class.selected]=\"i === selectedIndex\"\r\n [attr.data-index]=\"i\"\r\n (click)=\"onSuggestionClick(suggestion)\"\r\n (mouseenter)=\"selectedIndex = i\"\r\n >\r\n <div class=\"suggestion-main\">\r\n <span class=\"suggestion-name\">{{ suggestion.name }}</span>\r\n <span class=\"suggestion-type\">{{ suggestion.type }}</span>\r\n </div>\r\n @if (suggestion.description) {\r\n <div class=\"suggestion-description\">{{ suggestion.description }}</div>\r\n }\r\n @if (suggestion.unit) {\r\n <div class=\"suggestion-unit\">{{ suggestion.unit }}</div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n <!-- Date Picker Popup -->\r\n <div \r\n class=\"date-picker-popup\" \r\n [class.visible]=\"isDatePickerVisible\"\r\n [style.top.px]=\"datePickerPosition.top\"\r\n [style.left.px]=\"datePickerPosition.left\"\r\n >\r\n <div class=\"date-picker-container\">\r\n @if (!showDualDatePicker) {\r\n <!-- Single Date Picker -->\r\n <div class=\"single-date-picker\">\r\n <h4>Select Date</h4>\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Date</mat-label>\r\n <input matInput [matDatepicker]=\"singlePicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"singlePicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #singlePicker></mat-datepicker>\r\n </mat-form-field>\r\n </div>\r\n } @else {\r\n <!-- Dual Date Picker for 'between' operator -->\r\n <div class=\"dual-date-picker\">\r\n <h4>Select Date Range</h4>\r\n <div class=\"date-range-inputs\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Start Date</mat-label>\r\n <input matInput [matDatepicker]=\"startPicker\" (dateChange)=\"onFirstDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"startPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #startPicker></mat-datepicker>\r\n </mat-form-field>\r\n \r\n @if (firstDateSelected) {\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>End Date</mat-label>\r\n <input matInput [matDatepicker]=\"endPicker\" [min]=\"firstDateSelected\" (dateChange)=\"onSecondDateSelected($event.value)\">\r\n <mat-datepicker-toggle matIconSuffix [for]=\"endPicker\"></mat-datepicker-toggle>\r\n <mat-datepicker #endPicker></mat-datepicker>\r\n </mat-form-field>\r\n }\r\n </div>\r\n </div>\r\n }\r\n \r\n <div class=\"date-picker-actions\">\r\n <button mat-button (click)=\"hideDatePicker()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"query-builder-footer\">\r\n <button mat-button class=\"reset-btn\" (click)=\"onReset()\">Reset</button>\r\n <button mat-raised-button color=\"primary\" class=\"apply-btn\" (click)=\"onApply()\">Apply filters</button>\r\n </div>\r\n </form>\r\n</div>\r\n", styles: [".sa-query-builder-textarea{display:flex;flex-direction:column;width:100%;border:1px solid #e0e0e0;border-radius:4px;background-color:#fff;padding:16px;box-sizing:border-box}.sa-query-builder-textarea .query-builder-header{display:flex;align-items:center;margin-bottom:8px}.sa-query-builder-textarea .query-builder-header .where-label{font-weight:500;font-size:14px;color:#333;margin-right:8px}.sa-query-builder-textarea .query-builder-body{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container{position:relative;width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .query-textarea-field textarea{resize:vertical;min-height:100px;font-family:monospace}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown{position:absolute;z-index:1000;background:#fff;border:1px solid #ccc;border-radius:4px;box-shadow:0 2px 8px #00000026;max-height:300px;overflow-y:auto;min-width:250px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item{padding:12px 16px;cursor:pointer;border-bottom:1px solid #f0f0f0;transition:background-color .15s ease}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:hover,.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item.selected{background-color:#f5f5f5}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item:last-child{border-bottom:none}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-name{font-weight:500;color:#333;font-size:14px}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-main .suggestion-type{font-size:12px;color:#666;background:#e8f4f8;padding:2px 6px;border-radius:3px;text-transform:uppercase;font-weight:500}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-description{font-size:12px;color:#666;margin-top:4px;line-height:1.3}.sa-query-builder-textarea .query-builder-body .textarea-container .suggestions-dropdown .suggestion-item .suggestion-unit{font-size:11px;color:#888;margin-top:2px;font-style:italic}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup{position:absolute;z-index:1001;background:#fff;border:1px solid #ccc;border-radius:8px;box-shadow:0 4px 12px #00000026;min-width:300px;display:none}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup.visible{display:block}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container{padding:16px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container h4{margin:0 0 16px;font-size:16px;font-weight:500;color:#333}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .single-date-picker .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs{display:flex;flex-direction:column;gap:12px}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .dual-date-picker .date-range-inputs .mat-mdc-form-field{width:100%}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions{display:flex;justify-content:flex-end;margin-top:16px;padding-top:12px;border-top:1px solid #f0f0f0}.sa-query-builder-textarea .query-builder-body .textarea-container .date-picker-popup .date-picker-container .date-picker-actions button{margin-left:8px}.sa-query-builder-textarea .query-builder-footer{display:flex;justify-content:flex-end;margin-top:16px;gap:8px}.sa-query-builder-textarea .query-builder-footer .reset-btn{margin-right:8px}::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}\n"] }]
|
|
789
789
|
}], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { config: [{
|
|
790
790
|
type: Input
|
|
791
791
|
}], queryChange: [{
|
|
@@ -802,4 +802,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
|
|
|
802
802
|
type: HostListener,
|
|
803
803
|
args: ['document:click', ['$event']]
|
|
804
804
|
}] } });
|
|
805
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL3F1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEvcXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL3F1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEvcXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBd0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENB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eEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNILFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFtQ3JCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5pbXBvcnQgeyBNYXROYXRpdmVEYXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgc3dpdGNoTWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXREaXZpZGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dGFyZWFRdWVyeUNvbmZpZyB7XG4gIGZpZWxkczogVGV4dGFyZWFRdWVyeUZpZWxkW107XG4gIG9wZXJhdG9yczogVGV4dGFyZWFRdWVyeU9wZXJhdG9yW107XG4gIGRlZmF1bHRDb25kaXRpb24/OiAnYW5kJyB8ICdvcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dGFyZWFRdWVyeUZpZWxkIHtcbiAga2V5OiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHVuaXQ/OiBzdHJpbmc7XG4gIG9wdGlvbnM/OiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdO1xuICBvcGVyYXRvcnM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5T3BlcmF0b3Ige1xuICB2YWx1ZTogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5R3JvdXAge1xuICBjb25kaXRpb246ICdhbmQnIHwgJ29yJztcbiAgcnVsZXM6IChUZXh0YXJlYVF1ZXJ5UnVsZSB8IFRleHRhcmVhUXVlcnlHcm91cClbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5UnVsZSB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIG9wZXJhdG9yOiBzdHJpbmc7XG4gIHZhbHVlOiBhbnk7XG4gIGNvbmRpdGlvbj86ICdhbmQnIHwgJ29yJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHVuaXQ/OiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHR5cGU6ICdmaWVsZCcgfCAnb3BlcmF0b3InIHwgJ3ZhbHVlJyB8ICdjb25kaXRpb24nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bkb3duUG9zaXRpb24ge1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYS1xdWVyeS1idWlsZGVyLXRleHRhcmVhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3F1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1idWlsZGVyLXRleHRhcmVhLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXG4gICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgIE1hdEljb25Nb2R1bGUsXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICBNYXREYXRlcGlja2VyTW9kdWxlLFxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBRdWVyeUJ1aWxkZXJUZXh0YXJlYUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY29uZmlnOiBUZXh0YXJlYVF1ZXJ5Q29uZmlnID0ge1xuICAgIGZpZWxkczogW10sXG4gICAgb3BlcmF0b3JzOiBbXG4gICAgICB7IHZhbHVlOiAnPScsIGxhYmVsOiAnPScsIGRlc2NyaXB0aW9uOiAnRXF1YWwgdG8nIH0sXG4gICAgICB7IHZhbHVlOiAnIT0nLCBsYWJlbDogJyE9JywgZGVzY3JpcHRpb246ICdOb3QgZXF1YWwgdG8nIH0sXG4gICAgICB7IHZhbHVlOiAnPicsIGxhYmVsOiAnPicsIGRlc2NyaXB0aW9uOiAnR3JlYXRlciB0aGFuJyB9LFxuICAgICAgeyB2YWx1ZTogJzwnLCBsYWJlbDogJzwnLCBkZXNjcmlwdGlvbjogJ0xlc3MgdGhhbicgfSxcbiAgICAgIHsgdmFsdWU6ICc+PScsIGxhYmVsOiAnPj0nLCBkZXNjcmlwdGlvbjogJ0dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgfSxcbiAgICAgIHsgdmFsdWU6ICc8PScsIGxhYmVsOiAnPD0nLCBkZXNjcmlwdGlvbjogJ0xlc3MgdGhhbiBvciBlcXVhbCB0bycgfSxcbiAgICAgIHsgdmFsdWU6ICdjb250YWlucycsIGxhYmVsOiAnY29udGFpbnMnLCBkZXNjcmlwdGlvbjogJ0NvbnRhaW5zIHRleHQnIH1cbiAgICBdLFxuICAgIGRlZmF1bHRDb25kaXRpb246ICdhbmQnXG4gIH07XG5cbiAgQE91dHB1dCgpIHF1ZXJ5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUZXh0YXJlYVF1ZXJ5R3JvdXA+KCk7XG4gIEBPdXRwdXQoKSBzdWdnZXN0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3Rpb25JdGVtPigpO1xuICBcbiAgQFZpZXdDaGlsZCgncXVlcnlUZXh0YXJlYScpIHF1ZXJ5VGV4dGFyZWEhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdkcm9wZG93bicpIGRyb3Bkb3duITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIFxuICBmb3JtOiBGb3JtR3JvdXA7XG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uSXRlbVtdID0gW107XG4gIGZpbHRlcmVkU3VnZ2VzdGlvbnM6IFN1Z2dlc3Rpb25JdGVtW10gPSBbXTtcbiAgaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcbiAgc2VsZWN0ZWRJbmRleCA9IDA7XG4gIGRyb3Bkb3duUG9zaXRpb246IERyb3Bkb3duUG9zaXRpb24gPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuICBzZWxlY3RlZFN1Z2dlc3Rpb246IFN1Z2dlc3Rpb25JdGVtIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvLyBEYXRlIHBpY2tlciBzdGF0ZVxuICBpc0RhdGVQaWNrZXJWaXNpYmxlID0gZmFsc2U7XG4gIGRhdGVQaWNrZXJQb3NpdGlvbjogRHJvcGRvd25Qb3NpdGlvbiA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gIGN1cnJlbnREYXRlRmllbGQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBjdXJyZW50RGF0ZU9wZXJhdG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgc2hvd0R1YWxEYXRlUGlja2VyID0gZmFsc2U7XG4gIGZpcnN0RGF0ZVNlbGVjdGVkOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gIHNlY29uZERhdGVTZWxlY3RlZDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICBcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgc2VhcmNoU3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBjdXJzb3JQb3NpdGlvbiA9IDA7XG4gIHByaXZhdGUgY3VycmVudENvbnRleHQ6ICdmaWVsZCcgfCAnb3BlcmF0b3InIHwgJ3ZhbHVlJyB8ICdjb25kaXRpb24nID0gJ2ZpZWxkJztcbiAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWRGaWVsZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVCT1VOQ0VfREVMQVkgPSAxMDtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfU1VHR0VTVElPTlMgPSAxMDtcbiAgXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XG4gICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBxdWVyeVRleHQ6IFsnJ11cbiAgICB9KTtcbiAgfVxuICBcbiAgLy8gS2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3IgZHJvcGRvd24gbmF2aWdhdGlvblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpICYmIFxuICAgICAgICAhdGhpcy5xdWVyeVRleHRhcmVhPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSkge1xuICAgICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRTdWdnZXN0aW9ucygpO1xuICAgIHRoaXMuc2V0dXBTZWFyY2hTdHJlYW0oKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gMDtcbiAgICB0aGlzLnNldHVwVGV4dGFyZWFFdmVudHMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaFN0cmVhbSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFN1YmplY3QucGlwZShcbiAgICAgIGRlYm91bmNlVGltZSh0aGlzLkRFQk9VTkNFX0RFTEFZKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBzd2l0Y2hNYXAocXVlcnkgPT4gdGhpcy5zZWFyY2hTdWdnZXN0aW9ucyhxdWVyeSkpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgKS5zdWJzY3JpYmUoc3VnZ2VzdGlvbnMgPT4ge1xuICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnM7XG4gICAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gc3VnZ2VzdGlvbnMubGVuZ3RoID4gMDtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBUZXh0YXJlYUV2ZW50cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgXG4gICAgLy8gSGFuZGxlIGlucHV0IGV2ZW50c1xuICAgIHRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgdGhpcy5vblRleHRhcmVhSW5wdXQuYmluZCh0aGlzKSk7XG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duLmJpbmQodGhpcykpO1xuICAgIHRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy51cGRhdGVDdXJzb3JQb3NpdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMudXBkYXRlQ3Vyc29yUG9zaXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMub25UZXh0YXJlYUJsdXIuYmluZCh0aGlzKSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTdWdnZXN0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBBZGQgZmllbGQgc3VnZ2VzdGlvbnNcbiAgICB0aGlzLmNvbmZpZy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogZmllbGQua2V5LFxuICAgICAgICBuYW1lOiBmaWVsZC5sYWJlbCxcbiAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsLFxuICAgICAgICBkZXNjcmlwdGlvbjogZmllbGQuZGVzY3JpcHRpb24gfHwgYCR7ZmllbGQudHlwZX0gZmllbGRgLFxuICAgICAgICB1bml0OiBmaWVsZC51bml0LFxuICAgICAgICB2YWx1ZTogZmllbGQua2V5LFxuICAgICAgICB0eXBlOiAnZmllbGQnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBcbiAgICAvLyBBZGQgb3BlcmF0b3Igc3VnZ2VzdGlvbnNcbiAgICB0aGlzLmNvbmZpZy5vcGVyYXRvcnMuZm9yRWFjaChvcCA9PiB7XG4gICAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goe1xuICAgICAgICBpZDogb3AudmFsdWUsXG4gICAgICAgIG5hbWU6IG9wLmxhYmVsLFxuICAgICAgICBsYWJlbDogb3AubGFiZWwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcC5kZXNjcmlwdGlvbiB8fCBgJHtvcC5sYWJlbH0gb3BlcmF0b3JgLFxuICAgICAgICB2YWx1ZTogb3AudmFsdWUsXG4gICAgICAgIHR5cGU6ICdvcGVyYXRvcidcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCBjb25kaXRpb24gc3VnZ2VzdGlvbnNcbiAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goXG4gICAgICB7XG4gICAgICAgIGlkOiAnQU5EJyxcbiAgICAgICAgbmFtZTogJ0FORCcsXG4gICAgICAgIGxhYmVsOiAnQU5EJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdMb2dpY2FsIEFORCBvcGVyYXRvcicsXG4gICAgICAgIHZhbHVlOiAnQU5EJyxcbiAgICAgICAgdHlwZTogJ2NvbmRpdGlvbidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiAnT1InLFxuICAgICAgICBuYW1lOiAnT1InLFxuICAgICAgICBsYWJlbDogJ09SJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdMb2dpY2FsIE9SIG9wZXJhdG9yJyxcbiAgICAgICAgdmFsdWU6ICdPUicsXG4gICAgICAgIHR5cGU6ICdjb25kaXRpb24nXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSB1cGRhdGVDdXJzb3JQb3NpdGlvbihldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCB8fCAwO1xuICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGV4dCB1cCB0byB0aGUgY3Vyc29yIHBvc2l0aW9uXG4gICAqL1xuICBnZXRUaWxsQ3Vyc29yKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybiAnJztcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGZ1bGxWYWwgPSB0ZXh0YXJlYS52YWx1ZSB8fCAnJztcbiAgICBjb25zdCBjdXJzb3JQb3MgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmN1cnNvclBvc2l0aW9uLCBmdWxsVmFsLmxlbmd0aCkpO1xuICAgIHJldHVybiBmdWxsVmFsLnN1YnN0cmluZygwLCBjdXJzb3JQb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGxhc3Qgd29yZCBiZWZvcmUgY3Vyc29yIHBvc2l0aW9uXG4gICAqL1xuICBnZXRMYXN0V29yZEJlZm9yZUN1cnNvcigpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpbGxDdXJzb3IgPSB0aGlzLmdldFRpbGxDdXJzb3IoKTtcbiAgICBcbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBBTkQvT1IgY29uZGl0aW9uc1xuICAgIGlmICh0aWxsQ3Vyc29yLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJyBhbmQnKSkge1xuICAgICAgcmV0dXJuICdhbmQnO1xuICAgIH1cbiAgICBpZiAodGlsbEN1cnNvci50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcgb3InKSkge1xuICAgICAgcmV0dXJuICdvcic7XG4gICAgfVxuICAgIFxuICAgIC8vIFNwbGl0IGJ5IHNwYWNlcywgb3BlcmF0b3JzLCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgY29uc3QgcGF0dGVybiA9IC9cXHNhbmRcXHN8XFxzb3JcXHN8W15hLXowLTkgXXxcXG4vZ2k7XG4gICAgY29uc3QgcGFydHMgPSB0aWxsQ3Vyc29yLnNwbGl0KHBhdHRlcm4pO1xuICAgIGlmIChwYXJ0cy5sZW5ndGgpIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXS50cmltKCk7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydHMgdGV4dCBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgd29yZFxuICAgKi9cbiAgaW5zZXJ0V29yZCh0ZXh0OiBzdHJpbmcsIGFwcGVuZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBmdWxsVmFsID0gdGV4dGFyZWEudmFsdWUgfHwgJyc7XG4gICAgY29uc3QgY3Vyc29yUG9zID0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgICBjb25zdCB0aWxsQ3Vyc29yID0gZnVsbFZhbC5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zKTtcbiAgICBjb25zdCBsYXN0V29yZCA9IHRoaXMuZ2V0TGFzdFdvcmRCZWZvcmVDdXJzb3IoKTtcbiAgICBcbiAgICAvLyBGaW5kIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0XG4gICAgbGV0IGluc2VydFBvcyA9IGN1cnNvclBvcztcbiAgICBpZiAoIWFwcGVuZE9ubHkgJiYgbGFzdFdvcmQpIHtcbiAgICAgIGNvbnN0IGxhc3RXb3JkSW5kZXggPSB0aWxsQ3Vyc29yLmxhc3RJbmRleE9mKGxhc3RXb3JkKTtcbiAgICAgIGlmIChsYXN0V29yZEluZGV4ICE9PSAtMSkge1xuICAgICAgICBpbnNlcnRQb3MgPSBsYXN0V29yZEluZGV4O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBTcGxpdCB0ZXh0IGFuZCBjcmVhdGUgbmV3IHZhbHVlXG4gICAgY29uc3QgYmVmb3JlID0gZnVsbFZhbC5zdWJzdHJpbmcoMCwgaW5zZXJ0UG9zKTtcbiAgICBjb25zdCBhZnRlciA9IGZ1bGxWYWwuc3Vic3RyaW5nKGN1cnNvclBvcyk7XG4gICAgY29uc3QgbmV3VmFsID0gYmVmb3JlICsgdGV4dCArIGFmdGVyO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBuZXcgY3Vyc29yIHBvc2l0aW9uXG4gICAgY29uc3QgbmV3UG9zID0gYmVmb3JlLmxlbmd0aCArIHRleHQubGVuZ3RoO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0ZXh0YXJlYSBhbmQgZm9ybSBjb250cm9sXG4gICAgdGV4dGFyZWEudmFsdWUgPSBuZXdWYWw7XG4gICAgdGhpcy5mb3JtLmdldCgncXVlcnlUZXh0Jyk/LnNldFZhbHVlKG5ld1ZhbCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIFxuICAgIC8vIFNldCBjdXJzb3IgcG9zaXRpb25cbiAgICB0ZXh0YXJlYS5mb2N1cygpO1xuICAgIHRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ID0gbmV3UG9zO1xuICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IG5ld1BvcztcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3UG9zO1xuICAgIFxuICAgIC8vIE9ubHkgcGFyc2UgcXVlcnkgd2hlbiBleHBsaWNpdGx5IG5lZWRlZCAobGlrZSBhZnRlciBzZWxlY3Rpb24pXG4gICAgLy8gRG9uJ3QgYXV0by1wYXJzZSB0byBhdm9pZCBpbmZpbml0ZSBsb29wc1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRTdWdnZXN0aW9uKHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb25JdGVtKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWE/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50V29yZCA9IHRoaXMuZ2V0Q3VycmVudFdvcmQoKTtcbiAgICBjb25zdCB3b3JkQm91bmRzID0gdGhpcy5nZXRDdXJyZW50V29yZEJvdW5kcygpO1xuICAgIFxuICAgIC8vIERldGVybWluZSB3aGF0IHRvIGluc2VydFxuICAgIGxldCBpbnNlcnRUZXh0ID0gc3VnZ2VzdGlvbi52YWx1ZTtcbiAgICBsZXQgYWRkaXRpb25hbFRleHQgPSAnJztcbiAgICBcbiAgICAvLyBBZGQgYXBwcm9wcmlhdGUgc3BhY2luZyBhbmQgZm9ybWF0dGluZyBiYXNlZCBvbiBzdWdnZXN0aW9uIHR5cGVcbiAgICBzd2l0Y2ggKHN1Z2dlc3Rpb24udHlwZSkge1xuICAgICAgY2FzZSAnZmllbGQnOlxuICAgICAgICBhZGRpdGlvbmFsVGV4dCA9ICcgJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcGVyYXRvcic6XG4gICAgICAgIGFkZGl0aW9uYWxUZXh0ID0gJyAnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgLy8gTm8gYWRkaXRpb25hbCB0ZXh0IGZvciB2YWx1ZXNcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb25kaXRpb24nOlxuICAgICAgICBpbnNlcnRUZXh0ID0gYFxcbiR7c3VnZ2VzdGlvbi52YWx1ZX0gYDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgd29yZCB3aXRoIHRoZSBzdWdnZXN0aW9uXG4gICAgY29uc3QgbmV3VGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHdvcmRCb3VuZHMuc3RhcnQpICsgXG4gICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dCArIGFkZGl0aW9uYWxUZXh0ICsgXG4gICAgICAgICAgICAgICAgICAgdGV4dC5zdWJzdHJpbmcod29yZEJvdW5kcy5lbmQpO1xuICAgIFxuICAgIC8vIFVwZGF0ZSB0ZXh0YXJlYVxuICAgIHRleHRhcmVhLnZhbHVlID0gbmV3VGV4dDtcbiAgICBcbiAgICAvLyBTZXQgY3Vyc29yIHBvc2l0aW9uXG4gICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gd29yZEJvdW5kcy5zdGFydCArIGluc2VydFRleHQubGVuZ3RoICsgYWRkaXRpb25hbFRleHQubGVuZ3RoO1xuICAgIHRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3Q3Vyc29yUG9zO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICB0aGlzLmZvcm0uZ2V0KCdxdWVyeVRleHQnKT8uc2V0VmFsdWUobmV3VGV4dCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjb250ZXh0IGFuZCBwYXJzZSBxdWVyeVxuICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICAgIHRoaXMucGFyc2VBbmRFbWl0UXVlcnkobmV3VGV4dCk7XG4gIH1cblxuICBvbkFwcGx5KCk6IHZvaWQge1xuICAgIGNvbnN0IHF1ZXJ5VGV4dCA9IHRoaXMuZm9ybS5nZXQoJ3F1ZXJ5VGV4dCcpPy52YWx1ZSB8fCAnJztcbiAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgIHRoaXMucGFyc2VBbmRFbWl0UXVlcnkocXVlcnlUZXh0KTtcbiAgfVxuXG4gIG9uUmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtLmdldCgncXVlcnlUZXh0Jyk/LnNldFZhbHVlKCcnKTtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gMDtcbiAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gJ2ZpZWxkJztcbiAgICB0aGlzLmxhc3RTZWxlY3RlZEZpZWxkID0gbnVsbDtcbiAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgIFxuICAgIGlmICh0aGlzLnF1ZXJ5VGV4dGFyZWEpIHtcbiAgICAgIHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMucXVlcnlDaGFuZ2UuZW1pdCh7XG4gICAgICBjb25kaXRpb246IHRoaXMuY29uZmlnLmRlZmF1bHRDb25kaXRpb24gfHwgJ2FuZCcsXG4gICAgICBydWxlczogW11cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25UZXh0YXJlYUlucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50O1xuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCB8fCAwO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2wgd2l0aG91dCB0cmlnZ2VyaW5nIGV2ZW50cyB0byBhdm9pZCBsb29wc1xuICAgIHRoaXMuZm9ybS5nZXQoJ3F1ZXJ5VGV4dCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjb250ZXh0IGFuZCB0cmlnZ2VyIHNlYXJjaFxuICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICAgIGNvbnN0IGN1cnJlbnRXb3JkID0gdGhpcy5nZXRDdXJyZW50V29yZCgpO1xuICAgIHRoaXMuc2VhcmNoU3ViamVjdC5uZXh0KGN1cnJlbnRXb3JkKTtcbiAgICBcbiAgICAvLyBQYXJzZSBhbmQgZW1pdCBxdWVyeVxuICAgIHRoaXMucGFyc2VBbmRFbWl0UXVlcnkodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblRleHRhcmVhQmx1cihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgIC8vIERlbGF5IGhpZGluZyBkcm9wZG93biB0byBhbGxvdyBmb3IgY2xpY2tzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZHJvcGRvd24/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICAgIH1cbiAgICB9LCAxNTApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb250ZXh0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgY29uc3QgYmVmb3JlQ3Vyc29yID0gdGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5jdXJzb3JQb3NpdGlvbik7XG4gICAgXG4gICAgLy8gRW5oYW5jZWQgY29udGV4dCBkZXRlY3Rpb25cbiAgICBjb25zdCBjdXJyZW50V29yZCA9IHRoaXMuZ2V0Q3VycmVudFdvcmQoKTtcbiAgICBjb25zdCBwcmV2aW91c1Rva2VucyA9IHRoaXMuZ2V0UHJldmlvdXNUb2tlbnMoYmVmb3JlQ3Vyc29yKTtcbiAgICBcbiAgICBpZiAodGhpcy5pc0FmdGVyT3BlcmF0b3IocHJldmlvdXNUb2tlbnMpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gJ3ZhbHVlJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNBZnRlckZpZWxkKHByZXZpb3VzVG9rZW5zKSkge1xuICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9ICdvcGVyYXRvcic7XG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZEZpZWxkID0gdGhpcy5nZXRMYXN0RmllbGQocHJldmlvdXNUb2tlbnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0FmdGVyVmFsdWUocHJldmlvdXNUb2tlbnMpKSB7XG4gICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gJ2NvbmRpdGlvbic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudENvbnRleHQgPSAnZmllbGQnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyU3VnZ2VzdGlvbnNCeUNvbnRleHQocXVlcnk6IHN0cmluZyk6IFN1Z2dlc3Rpb25JdGVtW10ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIFxuICAgIC8vIEdldCBjb250ZXh0LWFwcHJvcHJpYXRlIHN1Z2dlc3Rpb25zXG4gICAgbGV0IGNvbnRleHRTdWdnZXN0aW9ucyA9IHRoaXMuZ2V0Q29udGV4dFN1Z2dlc3Rpb25zKCk7XG4gICAgXG4gICAgLy8gRmlsdGVyIGJ5IHF1ZXJ5IGlmIHByb3ZpZGVkXG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgY29udGV4dFN1Z2dlc3Rpb25zID0gY29udGV4dFN1Z2dlc3Rpb25zLmZpbHRlcihzdWdnZXN0aW9uID0+IFxuICAgICAgICBzdWdnZXN0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgIHN1Z2dlc3Rpb24ubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgIHN1Z2dlc3Rpb24udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgIChzdWdnZXN0aW9uLmRlc2NyaXB0aW9uICYmIHN1Z2dlc3Rpb24uZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpKVxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gU29ydCBieSByZWxldmFuY2UgKGV4YWN0IG1hdGNoZXMgZmlyc3QsIHRoZW4gc3RhcnRzIHdpdGgsIHRoZW4gY29udGFpbnMpXG4gICAgY29udGV4dFN1Z2dlc3Rpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFTY29yZSA9IHRoaXMuY2FsY3VsYXRlUmVsZXZhbmNlU2NvcmUoYSwgbm9ybWFsaXplZFF1ZXJ5KTtcbiAgICAgIGNvbnN0IGJTY29yZSA9IHRoaXMuY2FsY3VsYXRlUmVsZXZhbmNlU2NvcmUoYiwgbm9ybWFsaXplZFF1ZXJ5KTtcbiAgICAgIHJldHVybiBiU2NvcmUgLSBhU2NvcmU7XG4gICAgfSk7XG4gICAgXG4gICAgcmV0dXJuIGNvbnRleHRTdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLk1BWF9TVUdHRVNUSU9OUyk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRleHRTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuY3VycmVudENvbnRleHQpIHtcbiAgICAgIGNhc2UgJ2ZpZWxkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdGlvbnMuZmlsdGVyKHMgPT4gcy50eXBlID09PSAnZmllbGQnKTtcbiAgICAgIGNhc2UgJ29wZXJhdG9yJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3BlcmF0b3JTdWdnZXN0aW9ucygpO1xuICAgICAgY2FzZSAndmFsdWUnOlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCk7XG4gICAgICBjYXNlICdjb25kaXRpb24nOlxuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdjb25kaXRpb24nKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3BlcmF0b3JTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcbiAgICBpZiAoIXRoaXMubGFzdFNlbGVjdGVkRmllbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihzID0+IHMudHlwZSA9PT0gJ29wZXJhdG9yJyk7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLmtleSA9PT0gdGhpcy5sYXN0U2VsZWN0ZWRGaWVsZCk7XG4gICAgaWYgKCFmaWVsZCB8fCAhZmllbGQub3BlcmF0b3JzKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdvcGVyYXRvcicpO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIocyA9PiBcbiAgICAgIHMudHlwZSA9PT0gJ29wZXJhdG9yJyAmJiBmaWVsZC5vcGVyYXRvcnMhLmluY2x1ZGVzKHMudmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcbiAgICBpZiAoIXRoaXMubGFzdFNlbGVjdGVkRmllbGQpIHJldHVybiBbXTtcbiAgICBcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5rZXkgPT09IHRoaXMubGFzdFNlbGVjdGVkRmllbGQpO1xuICAgIGlmICghZmllbGQgfHwgIWZpZWxkLm9wdGlvbnMpIHJldHVybiBbXTtcbiAgICBcbiAgICByZXR1cm4gZmllbGQub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XG4gICAgICBpZDogYCR7ZmllbGQua2V5fV8ke29wdGlvbi52YWx1ZX1gLFxuICAgICAgbmFtZTogb3B0aW9uLmxhYmVsLFxuICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcbiAgICAgIHZhbHVlOiBvcHRpb24udmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6ICd2YWx1ZScgYXMgY29uc3RcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZVJlbGV2YW5jZVNjb3JlKHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb25JdGVtLCBxdWVyeTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoIXF1ZXJ5KSByZXR1cm4gMTtcbiAgICBcbiAgICBjb25zdCBuYW1lID0gc3VnZ2VzdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbGFiZWwgPSBzdWdnZXN0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmFsdWUgPSBzdWdnZXN0aW9uLnZhbHVlLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gRXhhY3QgbWF0Y2ggZ2V0cyBoaWdoZXN0IHNjb3JlXG4gICAgaWYgKG5hbWUgPT09IHF1ZXJ5IHx8IGxhYmVsID09PSBxdWVyeSB8fCB2YWx1ZSA9PT0gcXVlcnkpIHJldHVybiAxMDA7XG4gICAgXG4gICAgLy8gU3RhcnRzIHdpdGggZ2V0cyBoaWdoIHNjb3JlXG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChxdWVyeSkgfHwgbGFiZWwuc3RhcnRzV2l0aChxdWVyeSkgfHwgdmFsdWUuc3RhcnRzV2l0aChxdWVyeSkpIHJldHVybiA1MDtcbiAgICBcbiAgICAvLyBDb250YWlucyBnZXRzIG1lZGl1bSBzY29yZVxuICAgIGlmIChuYW1lLmluY2x1ZGVzKHF1ZXJ5KSB8fCBsYWJlbC5pbmNsdWRlcyhxdWVyeSkgfHwgdmFsdWUuaW5jbHVkZXMocXVlcnkpKSByZXR1cm4gMjU7XG4gICAgXG4gICAgLy8gRGVzY3JpcHRpb24gbWF0Y2ggZ2V0cyBsb3cgc2NvcmVcbiAgICBpZiAoc3VnZ2VzdGlvbi5kZXNjcmlwdGlvbiAmJiBzdWdnZXN0aW9uLmRlc2NyaXB0aW9uLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocXVlcnkpKSByZXR1cm4gMTA7XG4gICAgXG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlUXVlcnkocXVlcnlUZXh0OiBzdHJpbmcpOiBUZXh0YXJlYVF1ZXJ5R3JvdXAge1xuICAgIGNvbnN0IGxpbmVzID0gcXVlcnlUZXh0LnNwbGl0KCdcXG4nKS5maWx0ZXIobGluZSA9PiBsaW5lLnRyaW0oKSk7XG4gICAgY29uc3QgcnVsZXM6IChUZXh0YXJlYVF1ZXJ5UnVsZSB8IFRleHRhcmVhUXVlcnlHcm91cClbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50Q29uZGl0aW9uOiAnYW5kJyB8ICdvcicgPSB0aGlzLmNvbmZpZy5kZWZhdWx0Q29uZGl0aW9uIHx8ICdhbmQnO1xuICAgIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZXNbaV0udHJpbSgpO1xuICAgICAgaWYgKCF0cmltbWVkTGluZSkgY29udGludWU7XG4gICAgICBcbiAgICAgIC8vIENoZWNrIGlmIGxpbmUgaXMgYSBjb25kaXRpb25cbiAgICAgIGlmICh0cmltbWVkTGluZSA9PT0gJ0FORCcgfHwgdHJpbW1lZExpbmUgPT09ICdPUicpIHtcbiAgICAgICAgY3VycmVudENvbmRpdGlvbiA9IHRyaW1tZWRMaW5lLnRvTG93ZXJDYXNlKCkgYXMgJ2FuZCcgfCAnb3InO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gUGFyc2UgcnVsZSBmcm9tIGxpbmVcbiAgICAgIGNvbnN0IHJ1bGUgPSB0aGlzLnBhcnNlUnVsZSh0cmltbWVkTGluZSk7XG4gICAgICBpZiAocnVsZSkge1xuICAgICAgICBydWxlLmNvbmRpdGlvbiA9IGN1cnJlbnRDb25kaXRpb247XG4gICAgICAgIHJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICBjb25kaXRpb246IGN1cnJlbnRDb25kaXRpb24sXG4gICAgICBydWxlc1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQW5kRW1pdFF1ZXJ5KHF1ZXJ5VGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5wYXJzZVF1ZXJ5KHF1ZXJ5VGV4dCk7XG4gICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQocXVlcnkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIHF1ZXJ5OicsIGVycm9yKTtcbiAgICAgIC8vIEVtaXQgZW1wdHkgcXVlcnkgb24gZXJyb3JcbiAgICAgIHRoaXMucXVlcnlDaGFuZ2UuZW1pdCh7XG4gICAgICAgIGNvbmRpdGlvbjogdGhpcy5jb25maWcuZGVmYXVsdENvbmRpdGlvbiB8fCAnYW5kJyxcbiAgICAgICAgcnVsZXM6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSkge1xuICAgICAgdGhpcy51cGRhdGVDdXJzb3JQb3NpdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gTWF0aC5taW4odGhpcy5zZWxlY3RlZEluZGV4ICsgMSwgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zLmxlbmd0aCAtIDEpO1xuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gTWF0aC5tYXgodGhpcy5zZWxlY3RlZEluZGV4IC0gMSwgMCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0U3VnZ2VzdGlvbih0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnNbdGhpcy5zZWxlY3RlZEluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMudXBkYXRlQ3Vyc29yUG9zaXRpb24oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50V29yZCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm4gJyc7XG4gICAgXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgY29uc3QgYm91bmRzID0gdGhpcy5nZXRDdXJyZW50V29yZEJvdW5kcygpO1xuICAgIFxuICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhib3VuZHMuc3RhcnQsIGJvdW5kcy5lbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDdXJyZW50V29yZEJvdW5kcygpOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0ge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWU7XG4gICAgY29uc3QgY3Vyc29yID0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgICBcbiAgICBsZXQgc3RhcnQgPSBjdXJzb3I7XG4gICAgbGV0IGVuZCA9IGN1cnNvcjtcbiAgICBcbiAgICAvLyBGaW5kIHdvcmQgc3RhcnQgKGdvIGJhY2sgdW50aWwgd2hpdGVzcGFjZSBvciBzdGFydCBvZiB0ZXh0KVxuICAgIHdoaWxlIChzdGFydCA+IDAgJiYgL1xcUy8udGVzdCh0ZXh0W3N0YXJ0IC0gMV0pKSB7XG4gICAgICBzdGFydC0tO1xuICAgIH1cbiAgICBcbiAgICAvLyBGaW5kIHdvcmQgZW5kIChnbyBmb3J3YXJkIHVudGlsIHdoaXRlc3BhY2Ugb3IgZW5kIG9mIHRleHQpXG4gICAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoICYmIC9cXFMvLnRlc3QodGV4dFtlbmRdKSkge1xuICAgICAgZW5kKys7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNUb2tlbnModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0ZXh0LnRyaW0oKS5zcGxpdCgvXFxzKy8pLmZpbHRlcih0b2tlbiA9PiB0b2tlbi5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBZnRlck9wZXJhdG9yKHRva2Vuczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm9wZXJhdG9ycy5zb21lKG9wID0+IG9wLnZhbHVlID09PSBsYXN0VG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FmdGVyRmllbGQodG9rZW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZmllbGRzLnNvbWUoZmllbGQgPT4gZmllbGQua2V5ID09PSBsYXN0VG9rZW4gfHwgZmllbGQubGFiZWwgPT09IGxhc3RUb2tlbik7XG4gIH1cblxuICBwcml2YXRlIGlzQWZ0ZXJWYWx1ZSh0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPCAzKSByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNvbXBsZXRlIGZpZWxkLW9wZXJhdG9yLXZhbHVlIHBhdHRlcm5cbiAgICBjb25zdCBmaWVsZCA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gM107XG4gICAgY29uc3Qgb3BlcmF0b3IgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDJdO1xuICAgIFxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5maWVsZHMuc29tZShmID0+IGYua2V5ID09PSBmaWVsZCB8fCBmLmxhYmVsID09PSBmaWVsZCkgJiZcbiAgICAgICAgICAgdGhpcy5jb25maWcub3BlcmF0b3JzLnNvbWUob3AgPT4gb3AudmFsdWUgPT09IG9wZXJhdG9yKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGFzdEZpZWxkKHRva2Vuczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBmb3IgKGxldCBpID0gdG9rZW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXTtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLmtleSA9PT0gdG9rZW4gfHwgZi5sYWJlbCA9PT0gdG9rZW4pO1xuICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5rZXk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgb25TdWdnZXN0aW9uQ2xpY2soc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbik7XG4gIH1cblxuICBwcml2YXRlIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbkl0ZW0pOiB2b2lkIHtcbiAgICBpZiAoIXN1Z2dlc3Rpb24gfHwgIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuO1xuICAgIFxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcbiAgICB0aGlzLmluc2VydFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbik7XG4gICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25TZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBjb250ZXh0IGFmdGVyIHNlbGVjdGlvbiBhbmQgYXV0by1zaG93IG5leHQgc3VnZ2VzdGlvbnNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xuICAgICAgdGhpcy5xdWVyeVRleHRhcmVhPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICBcbiAgICAgIC8vIEF1dG8tc2hvdyBuZXh0IHN1Z2dlc3Rpb25zIGJhc2VkIG9uIHNlbGVjdGlvbiB0eXBlXG4gICAgICBpZiAoc3VnZ2VzdGlvbi50eXBlID09PSAnZmllbGQnKSB7XG4gICAgICAgIHRoaXMuc2hvd09wZXJhdG9yU3VnZ2VzdGlvbnMoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3VnZ2VzdGlvbi50eXBlID09PSAnb3BlcmF0b3InKSB7XG4gICAgICAgIHRoaXMuc2hvd1ZhbHVlU3VnZ2VzdGlvbnMoKTtcbiAgICAgIH1cbiAgICB9LCAxMCk7XG4gIH1cblxuICAvLyBMZWdhY3kgbWV0aG9kIC0ga2VlcGluZyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBvbk9wdGlvblNlbGVjdGVkKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBub3QgdXNlZFxuICAgIC8vIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gdXNlcyBvblN1Z2dlc3Rpb25DbGljayBpbnN0ZWFkXG4gIH1cblxuICBwcml2YXRlIHNlYXJjaFN1Z2dlc3Rpb25zKHF1ZXJ5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFN1Z2dlc3Rpb25JdGVtW10+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IHRoaXMuZmlsdGVyU3VnZ2VzdGlvbnNCeUNvbnRleHQocXVlcnkpO1xuICAgIHJldHVybiBvZihzdWdnZXN0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVEcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd09wZXJhdG9yU3VnZ2VzdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gR2V0IG9wZXJhdG9yIHN1Z2dlc3Rpb25zIGZvciB0aGUgY3VycmVudCBmaWVsZFxuICAgIGNvbnN0IG9wZXJhdG9yU3VnZ2VzdGlvbnMgPSB0aGlzLmdldE9wZXJhdG9yU3VnZ2VzdGlvbnMoKTtcbiAgICBcbiAgICBpZiAob3BlcmF0b3JTdWdnZXN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBvcGVyYXRvclN1Z2dlc3Rpb25zO1xuICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93VmFsdWVTdWdnZXN0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiBjdXJyZW50IGZpZWxkIGlzIGEgZGF0ZSBmaWVsZFxuICAgIGNvbnN0IGN1cnJlbnRGaWVsZCA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5rZXkgPT09IHRoaXMubGFzdFNlbGVjdGVkRmllbGQpO1xuICAgIFxuICAgIGlmIChjdXJyZW50RmllbGQgJiYgY3VycmVudEZpZWxkLnR5cGUgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy5zaG93RGF0ZVBpY2tlcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgdmFsdWUvb3B0aW9ucyBzdWdnZXN0aW9ucyBmb3Igbm9uLWRhdGUgZmllbGRzXG4gICAgY29uc3QgdmFsdWVTdWdnZXN0aW9ucyA9IHRoaXMuZ2V0VmFsdWVTdWdnZXN0aW9ucygpO1xuICAgIFxuICAgIGlmICh2YWx1ZVN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucyA9IHZhbHVlU3VnZ2VzdGlvbnM7XG4gICAgICB0aGlzLmlzRHJvcGRvd25WaXNpYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB0aGlzLnVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgbm8gcHJlZGVmaW5lZCB2YWx1ZXMsIGhpZGUgZHJvcGRvd24gdG8gYWxsb3cgZnJlZSB0ZXh0IGlucHV0XG4gICAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSB8fCAhdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRleHRhcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIFxuICAgIC8vIENhbGN1bGF0ZSBjdXJzb3IgcG9zaXRpb24gaW4gdGV4dGFyZWFcbiAgICBjb25zdCBjdXJzb3JDb29yZHMgPSB0aGlzLmdldEN1cnNvckNvb3JkaW5hdGVzKCk7XG4gICAgXG4gICAgdGhpcy5kcm9wZG93blBvc2l0aW9uID0ge1xuICAgICAgdG9wOiByZWN0LnRvcCArIGN1cnNvckNvb3Jkcy50b3AgKyAyMCwgLy8gMjBweCBiZWxvdyBjdXJzb3JcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGN1cnNvckNvb3Jkcy5sZWZ0XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0RhdGVQaWNrZXIoKTogdm9pZCB7XG4gICAgLy8gSGlkZSByZWd1bGFyIGRyb3Bkb3duXG4gICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcbiAgICBcbiAgICAvLyBTZXQgdXAgZGF0ZSBwaWNrZXIgc3RhdGVcbiAgICB0aGlzLmN1cnJlbnREYXRlRmllbGQgPSB0aGlzLmxhc3RTZWxlY3RlZEZpZWxkO1xuICAgIHRoaXMuY3VycmVudERhdGVPcGVyYXRvciA9IHRoaXMuZ2V0Q3VycmVudE9wZXJhdG9yKCk7XG4gICAgdGhpcy5zaG93RHVhbERhdGVQaWNrZXIgPSB0aGlzLmN1cnJlbnREYXRlT3BlcmF0b3IgPT09ICdiZXR3ZWVuJztcbiAgICB0aGlzLmZpcnN0RGF0ZVNlbGVjdGVkID0gbnVsbDtcbiAgICB0aGlzLnNlY29uZERhdGVTZWxlY3RlZCA9IG51bGw7XG4gICAgXG4gICAgLy8gU2hvdyBkYXRlIHBpY2tlclxuICAgIHRoaXMuaXNEYXRlUGlja2VyVmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVEYXRlUGlja2VyUG9zaXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGF0ZVBpY2tlclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhIHx8ICF0aGlzLmlzRGF0ZVBpY2tlclZpc2libGUpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0ZXh0YXJlYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBcbiAgICAvLyBDYWxjdWxhdGUgY3Vyc29yIHBvc2l0aW9uIGluIHRleHRhcmVhXG4gICAgY29uc3QgY3Vyc29yQ29vcmRzID0gdGhpcy5nZXRDdXJzb3JDb29yZGluYXRlcygpO1xuICAgIFxuICAgIHRoaXMuZGF0ZVBpY2tlclBvc2l0aW9uID0ge1xuICAgICAgdG9wOiByZWN0LnRvcCArIGN1cnNvckNvb3Jkcy50b3AgKyAyMCwgLy8gMjBweCBiZWxvdyBjdXJzb3JcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGN1cnNvckNvb3Jkcy5sZWZ0XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VycmVudE9wZXJhdG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm4gbnVsbDtcbiAgICBcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICBjb25zdCBiZWZvcmVDdXJzb3IgPSB0ZXh0LnN1YnN0cmluZygwLCB0aGlzLmN1cnNvclBvc2l0aW9uKTtcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLmdldFByZXZpb3VzVG9rZW5zKGJlZm9yZUN1cnNvcik7XG4gICAgXG4gICAgLy8gTG9vayBmb3IgdGhlIG1vc3QgcmVjZW50IG9wZXJhdG9yXG4gICAgZm9yIChsZXQgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICBpZiAodGhpcy5jb25maWcub3BlcmF0b3JzLnNvbWUob3AgPT4gb3AudmFsdWUgPT09IHRva2VuKSkge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgb25GaXJzdERhdGVTZWxlY3RlZChkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5maXJzdERhdGVTZWxlY3RlZCA9IGRhdGU7XG4gICAgXG4gICAgaWYgKHRoaXMuc2hvd0R1YWxEYXRlUGlja2VyKSB7XG4gICAgICAvLyBGb3IgJ2JldHdlZW4nIG9wZXJhdG9yLCB3YWl0IGZvciBzZWNvbmQgZGF0ZVxuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3Igc2luZ2xlIGRhdGUgb3BlcmF0b3JzLCBpbnNlcnQgdGhlIGRhdGUgaW1tZWRpYXRlbHlcbiAgICAgIHRoaXMuaW5zZXJ0RGF0ZVZhbHVlKGRhdGUpO1xuICAgICAgdGhpcy5oaWRlRGF0ZVBpY2tlcigpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2Vjb25kRGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNlY29uZERhdGVTZWxlY3RlZCA9IGRhdGU7XG4gICAgXG4gICAgaWYgKHRoaXMuZmlyc3REYXRlU2VsZWN0ZWQgJiYgdGhpcy5zZWNvbmREYXRlU2VsZWN0ZWQpIHtcbiAgICAgIC8vIEluc2VydCBib3RoIGRhdGVzIGZvciAnYmV0d2Vlbicgb3BlcmF0b3JcbiAgICAgIHRoaXMuaW5zZXJ0RGF0ZVJhbmdlVmFsdWUodGhpcy5maXJzdERhdGVTZWxlY3RlZCwgdGhpcy5zZWNvbmREYXRlU2VsZWN0ZWQpO1xuICAgICAgdGhpcy5oaWRlRGF0ZVBpY2tlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0RGF0ZVZhbHVlKGRhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBkYXRlU3RyaW5nID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpO1xuICAgIHRoaXMuaW5zZXJ0VGV4dEF0Q3Vyc29yKGRhdGVTdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnREYXRlUmFuZ2VWYWx1ZShzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFydERhdGVTdHJpbmcgPSB0aGlzLmZvcm1hdERhdGUoc3RhcnREYXRlKTtcbiAgICBjb25zdCBlbmREYXRlU3RyaW5nID0gdGhpcy5mb3JtYXREYXRlKGVuZERhdGUpO1xuICAgIGNvbnN0IHJhbmdlU3RyaW5nID0gYCR7c3RhcnREYXRlU3RyaW5nfSwgJHtlbmREYXRlU3RyaW5nfWA7XG4gICAgdGhpcy5pbnNlcnRUZXh0QXRDdXJzb3IocmFuZ2VTdHJpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIC8vIEZvcm1hdCBkYXRlIGFzIFlZWVktTU0tRERcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpLnNwbGl0KCdUJylbMF07XG4gIH1cblxuICBwcml2YXRlIGluc2VydFRleHRBdEN1cnNvcih0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgY3VycmVudFRleHQgPSB0ZXh0YXJlYS52YWx1ZTtcbiAgICBjb25zdCBjdXJzb3JQb3MgPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAgIFxuICAgIC8vIEluc2VydCB0ZXh0IGF0IGN1cnNvciBwb3NpdGlvblxuICAgIGNvbnN0IG5ld1RleHQgPSBjdXJyZW50VGV4dC5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zKSArIHRleHQgKyBjdXJyZW50VGV4dC5zdWJzdHJpbmcoY3Vyc29yUG9zKTtcbiAgICBcbiAgICAvLyBVcGRhdGUgdGV4dGFyZWFcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IG5ld1RleHQ7XG4gICAgXG4gICAgLy8gVXBkYXRlIGN1cnNvciBwb3NpdGlvblxuICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IGN1cnNvclBvcyArIHRleHQubGVuZ3RoO1xuICAgIHRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3Q3Vyc29yUG9zO1xuICAgIFxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcbiAgICB0aGlzLmZvcm0uZ2V0KCdxdWVyeVRleHQnKT8uc2V0VmFsdWUobmV3VGV4dCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIFxuICAgIC8vIFBhcnNlIGFuZCBlbWl0IHF1ZXJ5XG4gICAgdGhpcy5wYXJzZUFuZEVtaXRRdWVyeShuZXdUZXh0KTtcbiAgfVxuXG4gIGhpZGVEYXRlUGlja2VyKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEYXRlUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY3VycmVudERhdGVGaWVsZCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50RGF0ZU9wZXJhdG9yID0gbnVsbDtcbiAgICB0aGlzLnNob3dEdWFsRGF0ZVBpY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuZmlyc3REYXRlU2VsZWN0ZWQgPSBudWxsO1xuICAgIHRoaXMuc2Vjb25kRGF0ZVNlbGVjdGVkID0gbnVsbDtcbiAgICBcbiAgICAvLyBGb2N1cyBiYWNrIHRvIHRleHRhcmVhXG4gICAgaWYgKHRoaXMucXVlcnlUZXh0YXJlYSkge1xuICAgICAgdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEN1cnNvckNvb3JkaW5hdGVzKCk6IHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9IHtcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07XG4gICAgXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMuY3Vyc29yUG9zaXRpb24pO1xuICAgIGNvbnN0IGxpbmVzID0gdGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgY29uc3QgY3VycmVudExpbmUgPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBsaW5lc1tjdXJyZW50TGluZV0ubGVuZ3RoO1xuICAgIFxuICAgIC8vIEFwcHJveGltYXRlIGNoYXJhY3RlciBkaW1lbnNpb25zXG4gICAgY29uc3QgY2hhcldpZHRoID0gODsgLy8gQXBwcm94aW1hdGUgY2hhcmFjdGVyIHdpZHRoIGluIHBpeGVsc1xuICAgIGNvbnN0IGxpbmVIZWlnaHQgPSAyMDsgLy8gQXBwcm94aW1hdGUgbGluZSBoZWlnaHQgaW4gcGl4ZWxzXG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcDogY3VycmVudExpbmUgKiBsaW5lSGVpZ2h0LFxuICAgICAgbGVmdDogY3VycmVudENvbHVtbiAqIGNoYXJXaWR0aFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRyb3Bkb3duKSByZXR1cm47XG4gICAgXG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gZHJvcGRvd24ucXVlcnlTZWxlY3RvcihgW2RhdGEtaW5kZXg9XCIke3RoaXMuc2VsZWN0ZWRJbmRleH1cIl1gKSBhcyBIVE1MRWxlbWVudDtcbiAgICBcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XG4gICAgICBzZWxlY3RlZEVsZW1lbnQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcGFyc2VSdWxlKHJ1bGVUZXh0OiBzdHJpbmcpOiBUZXh0YXJlYVF1ZXJ5UnVsZSB8IG51bGwge1xuICAgIC8vIEVuaGFuY2VkIHBhcnNpbmcgd2l0aCBiZXR0ZXIgb3BlcmF0b3IgZGV0ZWN0aW9uXG4gICAgY29uc3Qgb3BlcmF0b3JQYXR0ZXJuID0gdGhpcy5jb25maWcub3BlcmF0b3JzXG4gICAgICAubWFwKG9wID0+IG9wLnZhbHVlLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCAnXFxcXCQmJykpXG4gICAgICAuam9pbignfCcpO1xuICAgIFxuICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgXihcXFxcUyspXFxcXHMrKCR7b3BlcmF0b3JQYXR0ZXJufSlcXFxccysoLispJGApO1xuICAgIGNvbnN0IG1hdGNoID0gcnVsZVRleHQubWF0Y2gocmVnZXgpO1xuICAgIFxuICAgIGlmICghbWF0Y2gpIHJldHVybiBudWxsO1xuICAgIFxuICAgIGNvbnN0IFssIGZpZWxkUGFydCwgb3BlcmF0b3IsIHZhbHVlUGFydF0gPSBtYXRjaDtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSBmaWVsZCBleGlzdHNcbiAgICBjb25zdCBmaWVsZENvbmZpZyA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gXG4gICAgICBmLmtleSA9PT0gZmllbGRQYXJ0IHx8IGYubGFiZWwgPT09IGZpZWxkUGFydFxuICAgICk7XG4gICAgaWYgKCFmaWVsZENvbmZpZykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgb3BlcmF0b3JcbiAgICBjb25zdCBvcGVyYXRvckNvbmZpZyA9IHRoaXMuY29uZmlnLm9wZXJhdG9ycy5maW5kKG9wID0+IG9wLnZhbHVlID09PSBvcGVyYXRvcik7XG4gICAgaWYgKCFvcGVyYXRvckNvbmZpZykgcmV0dXJuIG51bGw7XG4gICAgXG4gICAgLy8gUGFyc2UgdmFsdWUgYmFzZWQgb24gZmllbGQgdHlwZVxuICAgIGxldCBwYXJzZWRWYWx1ZTogYW55ID0gdmFsdWVQYXJ0LnRyaW0oKTtcbiAgICBcbiAgICBpZiAoZmllbGRDb25maWcudHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IG51bVZhbHVlID0gcGFyc2VGbG9hdChwYXJzZWRWYWx1ZSk7XG4gICAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IG51bVZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmllbGRDb25maWcudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJztcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpZWxkOiBmaWVsZENvbmZpZy5rZXksXG4gICAgICBvcGVyYXRvcjogb3BlcmF0b3IsXG4gICAgICB2YWx1ZTogcGFyc2VkVmFsdWVcbiAgICB9O1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2EtcXVlcnktYnVpbGRlci10ZXh0YXJlYVwiPlxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8ZGl2IGNsYXNzPVwicXVlcnktYnVpbGRlci1oZWFkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3aGVyZS1sYWJlbFwiPldoZXJlPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicXVlcnktYnVpbGRlci1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dGFyZWEtY29udGFpbmVyXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInF1ZXJ5LXRleHRhcmVhLWZpZWxkXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICNxdWVyeVRleHRhcmVhXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicXVlcnlUZXh0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RhcnQgdHlwaW5nIHlvdXIgcXVlcnkuLi5cIlxuICAgICAgICAgICAgcm93cz1cIjVcIlxuICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBDdXN0b20gRHJvcGRvd24gLS0+XG4gICAgICAgIDxkaXYgXG4gICAgICAgICAgI2Ryb3Bkb3duXG4gICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9ucy1kcm9wZG93blwiIFxuICAgICAgICAgIFtjbGFzcy52aXNpYmxlXT1cImlzRHJvcGRvd25WaXNpYmxlXCJcbiAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRyb3Bkb3duUG9zaXRpb24udG9wXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkcm9wZG93blBvc2l0aW9uLmxlZnRcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAoc3VnZ2VzdGlvbiBvZiBmaWx0ZXJlZFN1Z2dlc3Rpb25zOyB0cmFjayBzdWdnZXN0aW9uLmlkOyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgPGRpdiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uLWl0ZW1cIlxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaSA9PT0gc2VsZWN0ZWRJbmRleFwiXG4gICAgICAgICAgICAgIFthdHRyLmRhdGEtaW5kZXhdPVwiaVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblN1Z2dlc3Rpb25DbGljayhzdWdnZXN0aW9uKVwiXG4gICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNlbGVjdGVkSW5kZXggPSBpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tbWFpblwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGlvbi1uYW1lXCI+e3sgc3VnZ2VzdGlvbi5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VnZ2VzdGlvbi10eXBlXCI+e3sgc3VnZ2VzdGlvbi50eXBlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChzdWdnZXN0aW9uLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tZGVzY3JpcHRpb25cIj57eyBzdWdnZXN0aW9uLmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzdWdnZXN0aW9uLnVuaXQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VnZ2VzdGlvbi11bml0XCI+e3sgc3VnZ2VzdGlvbi51bml0IH19PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBEYXRlIFBpY2tlciBQb3B1cCAtLT5cbiAgICAgICAgPGRpdiBcbiAgICAgICAgICBjbGFzcz1cImRhdGUtcGlja2VyLXBvcHVwXCIgXG4gICAgICAgICAgW2NsYXNzLnZpc2libGVdPVwiaXNEYXRlUGlja2VyVmlzaWJsZVwiXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJkYXRlUGlja2VyUG9zaXRpb24udG9wXCJcbiAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJkYXRlUGlja2VyUG9zaXRpb24ubGVmdFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICBAaWYgKCFzaG93RHVhbERhdGVQaWNrZXIpIHtcbiAgICAgICAgICAgICAgPCEtLSBTaW5nbGUgRGF0ZSBQaWNrZXIgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZGF0ZS1waWNrZXJcIj5cbiAgICAgICAgICAgICAgICA8aDQ+U2VsZWN0IERhdGU8L2g0PlxuICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwic2luZ2xlUGlja2VyXCIgKGRhdGVDaGFuZ2UpPVwib25GaXJzdERhdGVTZWxlY3RlZCgkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdEljb25TdWZmaXggW2Zvcl09XCJzaW5nbGVQaWNrZXJcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjc2luZ2xlUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPCEtLSBEdWFsIERhdGUgUGlja2VyIGZvciAnYmV0d2Vlbicgb3BlcmF0b3IgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkdWFsLWRhdGUtcGlja2VyXCI+XG4gICAgICAgICAgICAgICAgPGg0PlNlbGVjdCBEYXRlIFJhbmdlPC9oND5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1yYW5nZS1pbnB1dHNcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlN0YXJ0IERhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IFttYXREYXRlcGlja2VyXT1cInN0YXJ0UGlja2VyXCIgKGRhdGVDaGFuZ2UpPVwib25GaXJzdERhdGVTZWxlY3RlZCgkZXZlbnQudmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0SWNvblN1ZmZpeCBbZm9yXT1cInN0YXJ0UGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjc3RhcnRQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgIEBpZiAoZmlyc3REYXRlU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FbmQgRGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJlbmRQaWNrZXJcIiBbbWluXT1cImZpcnN0RGF0ZVNlbGVjdGVkXCIgKGRhdGVDaGFuZ2UpPVwib25TZWNvbmREYXRlU2VsZWN0ZWQoJGV2ZW50LnZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0SWNvblN1ZmZpeCBbZm9yXT1cImVuZFBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjZW5kUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cImhpZGVEYXRlUGlja2VyKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItZm9vdGVyXCI+XG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJyZXNldC1idG5cIiAoY2xpY2spPVwib25SZXNldCgpXCI+UmVzZXQ8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgY2xhc3M9XCJhcHBseS1idG5cIiAoY2xpY2spPVwib25BcHBseSgpXCI+QXBwbHkgZmlsdGVyczwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
|
|
805
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL3F1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEvcXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnQtbGlicmFyeS9zcmMvbGliL3F1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEvcXVlcnktYnVpbGRlci10ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBd0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlJLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQTBCLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFjLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENB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eEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNILFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFtQ3JCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdERhdGVwaWNrZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcclxuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5Q29uZmlnIHtcclxuICBmaWVsZHM6IFRleHRhcmVhUXVlcnlGaWVsZFtdO1xyXG4gIG9wZXJhdG9yczogVGV4dGFyZWFRdWVyeU9wZXJhdG9yW107XHJcbiAgZGVmYXVsdENvbmRpdGlvbj86ICdhbmQnIHwgJ29yJztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5RmllbGQge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIHVuaXQ/OiBzdHJpbmc7XHJcbiAgb3B0aW9ucz86IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IGFueSB9W107XHJcbiAgb3BlcmF0b3JzPzogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGV4dGFyZWFRdWVyeU9wZXJhdG9yIHtcclxuICB2YWx1ZTogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XHJcbiAgdHlwZXM/OiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUZXh0YXJlYVF1ZXJ5R3JvdXAge1xyXG4gIGNvbmRpdGlvbjogJ2FuZCcgfCAnb3InO1xyXG4gIHJ1bGVzOiAoVGV4dGFyZWFRdWVyeVJ1bGUgfCBUZXh0YXJlYVF1ZXJ5R3JvdXApW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGV4dGFyZWFRdWVyeVJ1bGUge1xyXG4gIGZpZWxkOiBzdHJpbmc7XHJcbiAgb3BlcmF0b3I6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG4gIGNvbmRpdGlvbj86ICdhbmQnIHwgJ29yJztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTdWdnZXN0aW9uSXRlbSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICB1bml0Pzogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgdHlwZTogJ2ZpZWxkJyB8ICdvcGVyYXRvcicgfCAndmFsdWUnIHwgJ2NvbmRpdGlvbic7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRHJvcGRvd25Qb3NpdGlvbiB7XHJcbiAgdG9wOiBudW1iZXI7XHJcbiAgbGVmdDogbnVtYmVyO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NhLXF1ZXJ5LWJ1aWxkZXItdGV4dGFyZWEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWVyeS1idWlsZGVyLXRleHRhcmVhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9xdWVyeS1idWlsZGVyLXRleHRhcmVhLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0RGl2aWRlck1vZHVsZSxcclxuICAgIE1hdERhdGVwaWNrZXJNb2R1bGUsXHJcbiAgICBNYXROYXRpdmVEYXRlTW9kdWxlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVlcnlCdWlsZGVyVGV4dGFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY29uZmlnOiBUZXh0YXJlYVF1ZXJ5Q29uZmlnID0ge1xyXG4gICAgZmllbGRzOiBbXSxcclxuICAgIG9wZXJhdG9yczogW1xyXG4gICAgICB7IHZhbHVlOiAnPScsIGxhYmVsOiAnPScsIGRlc2NyaXB0aW9uOiAnRXF1YWwgdG8nIH0sXHJcbiAgICAgIHsgdmFsdWU6ICchPScsIGxhYmVsOiAnIT0nLCBkZXNjcmlwdGlvbjogJ05vdCBlcXVhbCB0bycgfSxcclxuICAgICAgeyB2YWx1ZTogJz4nLCBsYWJlbDogJz4nLCBkZXNjcmlwdGlvbjogJ0dyZWF0ZXIgdGhhbicgfSxcclxuICAgICAgeyB2YWx1ZTogJzwnLCBsYWJlbDogJzwnLCBkZXNjcmlwdGlvbjogJ0xlc3MgdGhhbicgfSxcclxuICAgICAgeyB2YWx1ZTogJz49JywgbGFiZWw6ICc+PScsIGRlc2NyaXB0aW9uOiAnR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvJyB9LFxyXG4gICAgICB7IHZhbHVlOiAnPD0nLCBsYWJlbDogJzw9JywgZGVzY3JpcHRpb246ICdMZXNzIHRoYW4gb3IgZXF1YWwgdG8nIH0sXHJcbiAgICAgIHsgdmFsdWU6ICdjb250YWlucycsIGxhYmVsOiAnY29udGFpbnMnLCBkZXNjcmlwdGlvbjogJ0NvbnRhaW5zIHRleHQnIH1cclxuICAgIF0sXHJcbiAgICBkZWZhdWx0Q29uZGl0aW9uOiAnYW5kJ1xyXG4gIH07XHJcblxyXG4gIEBPdXRwdXQoKSBxdWVyeUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VGV4dGFyZWFRdWVyeUdyb3VwPigpO1xyXG4gIEBPdXRwdXQoKSBzdWdnZXN0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1Z2dlc3Rpb25JdGVtPigpO1xyXG4gIFxyXG4gIEBWaWV3Q2hpbGQoJ3F1ZXJ5VGV4dGFyZWEnKSBxdWVyeVRleHRhcmVhITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcclxuICBAVmlld0NoaWxkKCdkcm9wZG93bicpIGRyb3Bkb3duITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcbiAgXHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG4gIHN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uSXRlbVtdID0gW107XHJcbiAgZmlsdGVyZWRTdWdnZXN0aW9uczogU3VnZ2VzdGlvbkl0ZW1bXSA9IFtdO1xyXG4gIGlzRHJvcGRvd25WaXNpYmxlID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgZHJvcGRvd25Qb3NpdGlvbjogRHJvcGRvd25Qb3NpdGlvbiA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XHJcbiAgc2VsZWN0ZWRTdWdnZXN0aW9uOiBTdWdnZXN0aW9uSXRlbSB8IG51bGwgPSBudWxsO1xyXG4gIFxyXG4gIC8vIERhdGUgcGlja2VyIHN0YXRlXHJcbiAgaXNEYXRlUGlja2VyVmlzaWJsZSA9IGZhbHNlO1xyXG4gIGRhdGVQaWNrZXJQb3NpdGlvbjogRHJvcGRvd25Qb3NpdGlvbiA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XHJcbiAgY3VycmVudERhdGVGaWVsZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgY3VycmVudERhdGVPcGVyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgc2hvd0R1YWxEYXRlUGlja2VyID0gZmFsc2U7XHJcbiAgZmlyc3REYXRlU2VsZWN0ZWQ6IERhdGUgfCBudWxsID0gbnVsbDtcclxuICBzZWNvbmREYXRlU2VsZWN0ZWQ6IERhdGUgfCBudWxsID0gbnVsbDtcclxuICBcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICBwcml2YXRlIHNlYXJjaFN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHJpdmF0ZSBjdXJzb3JQb3NpdGlvbiA9IDA7XHJcbiAgcHJpdmF0ZSBjdXJyZW50Q29udGV4dDogJ2ZpZWxkJyB8ICdvcGVyYXRvcicgfCAndmFsdWUnIHwgJ2NvbmRpdGlvbicgPSAnZmllbGQnO1xyXG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkRmllbGQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgREVCT1VOQ0VfREVMQVkgPSAxMDtcclxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9TVUdHRVNUSU9OUyA9IDEwO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgcXVlcnlUZXh0OiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcbiAgXHJcbiAgLy8gS2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3IgZHJvcGRvd24gbmF2aWdhdGlvblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpICYmIFxyXG4gICAgICAgICF0aGlzLnF1ZXJ5VGV4dGFyZWE/Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpKSB7XHJcbiAgICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdFN1Z2dlc3Rpb25zKCk7XHJcbiAgICB0aGlzLnNldHVwU2VhcmNoU3RyZWFtKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gMDtcclxuICAgIHRoaXMuc2V0dXBUZXh0YXJlYUV2ZW50cygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBzZXR1cFNlYXJjaFN0cmVhbSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoU3ViamVjdC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5ERUJPVU5DRV9ERUxBWSksXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgIHN3aXRjaE1hcChxdWVyeSA9PiB0aGlzLnNlYXJjaFN1Z2dlc3Rpb25zKHF1ZXJ5KSksXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxyXG4gICAgKS5zdWJzY3JpYmUoc3VnZ2VzdGlvbnMgPT4ge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBzdWdnZXN0aW9ucztcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDA7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldHVwVGV4dGFyZWFFdmVudHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgXHJcbiAgICAvLyBIYW5kbGUgaW5wdXQgZXZlbnRzXHJcbiAgICB0ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMub25UZXh0YXJlYUlucHV0LmJpbmQodGhpcykpO1xyXG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duLmJpbmQodGhpcykpO1xyXG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLnVwZGF0ZUN1cnNvclBvc2l0aW9uLmJpbmQodGhpcykpO1xyXG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLnVwZGF0ZUN1cnNvclBvc2l0aW9uLmJpbmQodGhpcykpO1xyXG4gICAgdGV4dGFyZWEuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMub25UZXh0YXJlYUJsdXIuYmluZCh0aGlzKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTdWdnZXN0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIEFkZCBmaWVsZCBzdWdnZXN0aW9uc1xyXG4gICAgdGhpcy5jb25maWcuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goe1xyXG4gICAgICAgIGlkOiBmaWVsZC5rZXksXHJcbiAgICAgICAgbmFtZTogZmllbGQubGFiZWwsXHJcbiAgICAgICAgbGFiZWw6IGZpZWxkLmxhYmVsLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBmaWVsZC5kZXNjcmlwdGlvbiB8fCBgJHtmaWVsZC50eXBlfSBmaWVsZGAsXHJcbiAgICAgICAgdW5pdDogZmllbGQudW5pdCxcclxuICAgICAgICB2YWx1ZTogZmllbGQua2V5LFxyXG4gICAgICAgIHR5cGU6ICdmaWVsZCdcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gQWRkIG9wZXJhdG9yIHN1Z2dlc3Rpb25zXHJcbiAgICB0aGlzLmNvbmZpZy5vcGVyYXRvcnMuZm9yRWFjaChvcCA9PiB7XHJcbiAgICAgIHRoaXMuc3VnZ2VzdGlvbnMucHVzaCh7XHJcbiAgICAgICAgaWQ6IG9wLnZhbHVlLFxyXG4gICAgICAgIG5hbWU6IG9wLmxhYmVsLFxyXG4gICAgICAgIGxhYmVsOiBvcC5sYWJlbCxcclxuICAgICAgICBkZXNjcmlwdGlvbjogb3AuZGVzY3JpcHRpb24gfHwgYCR7b3AubGFiZWx9IG9wZXJhdG9yYCxcclxuICAgICAgICB2YWx1ZTogb3AudmFsdWUsXHJcbiAgICAgICAgdHlwZTogJ29wZXJhdG9yJ1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBBZGQgY29uZGl0aW9uIHN1Z2dlc3Rpb25zXHJcbiAgICB0aGlzLnN1Z2dlc3Rpb25zLnB1c2goXHJcbiAgICAgIHtcclxuICAgICAgICBpZDogJ0FORCcsXHJcbiAgICAgICAgbmFtZTogJ0FORCcsXHJcbiAgICAgICAgbGFiZWw6ICdBTkQnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTG9naWNhbCBBTkQgb3BlcmF0b3InLFxyXG4gICAgICAgIHZhbHVlOiAnQU5EJyxcclxuICAgICAgICB0eXBlOiAnY29uZGl0aW9uJ1xyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICdPUicsXHJcbiAgICAgICAgbmFtZTogJ09SJyxcclxuICAgICAgICBsYWJlbDogJ09SJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogJ0xvZ2ljYWwgT1Igb3BlcmF0b3InLFxyXG4gICAgICAgIHZhbHVlOiAnT1InLFxyXG4gICAgICAgIHR5cGU6ICdjb25kaXRpb24nXHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgdXBkYXRlQ3Vyc29yUG9zaXRpb24oZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCB8fCAwO1xyXG4gICAgdGhpcy51cGRhdGVDb250ZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXRzIHRleHQgdXAgdG8gdGhlIGN1cnNvciBwb3NpdGlvblxyXG4gICAqL1xyXG4gIGdldFRpbGxDdXJzb3IoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm4gJyc7XHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgZnVsbFZhbCA9IHRleHRhcmVhLnZhbHVlIHx8ICcnO1xyXG4gICAgY29uc3QgY3Vyc29yUG9zID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5jdXJzb3JQb3NpdGlvbiwgZnVsbFZhbC5sZW5ndGgpKTtcclxuICAgIHJldHVybiBmdWxsVmFsLnN1YnN0cmluZygwLCBjdXJzb3JQb3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyB0aGUgbGFzdCB3b3JkIGJlZm9yZSBjdXJzb3IgcG9zaXRpb25cclxuICAgKi9cclxuICBnZXRMYXN0V29yZEJlZm9yZUN1cnNvcigpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgdGlsbEN1cnNvciA9IHRoaXMuZ2V0VGlsbEN1cnNvcigpO1xyXG4gICAgXHJcbiAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciBBTkQvT1IgY29uZGl0aW9uc1xyXG4gICAgaWYgKHRpbGxDdXJzb3IudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnIGFuZCcpKSB7XHJcbiAgICAgIHJldHVybiAnYW5kJztcclxuICAgIH1cclxuICAgIGlmICh0aWxsQ3Vyc29yLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJyBvcicpKSB7XHJcbiAgICAgIHJldHVybiAnb3InO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBTcGxpdCBieSBzcGFjZXMsIG9wZXJhdG9ycywgYW5kIHNwZWNpYWwgY2hhcmFjdGVyc1xyXG4gICAgY29uc3QgcGF0dGVybiA9IC9cXHNhbmRcXHN8XFxzb3JcXHN8W15hLXowLTkgXXxcXG4vZ2k7XHJcbiAgICBjb25zdCBwYXJ0cyA9IHRpbGxDdXJzb3Iuc3BsaXQocGF0dGVybik7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoKSByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0udHJpbSgpO1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyB0ZXh0IGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCB3b3JkXHJcbiAgICovXHJcbiAgaW5zZXJ0V29yZCh0ZXh0OiBzdHJpbmcsIGFwcGVuZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IGZ1bGxWYWwgPSB0ZXh0YXJlYS52YWx1ZSB8fCAnJztcclxuICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuY3Vyc29yUG9zaXRpb247XHJcbiAgICBjb25zdCB0aWxsQ3Vyc29yID0gZnVsbFZhbC5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zKTtcclxuICAgIGNvbnN0IGxhc3RXb3JkID0gdGhpcy5nZXRMYXN0V29yZEJlZm9yZUN1cnNvcigpO1xyXG4gICAgXHJcbiAgICAvLyBGaW5kIHBvc2l0aW9uIHRvIGluc2VydCB0ZXh0XHJcbiAgICBsZXQgaW5zZXJ0UG9zID0gY3Vyc29yUG9zO1xyXG4gICAgaWYgKCFhcHBlbmRPbmx5ICYmIGxhc3RXb3JkKSB7XHJcbiAgICAgIGNvbnN0IGxhc3RXb3JkSW5kZXggPSB0aWxsQ3Vyc29yLmxhc3RJbmRleE9mKGxhc3RXb3JkKTtcclxuICAgICAgaWYgKGxhc3RXb3JkSW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgaW5zZXJ0UG9zID0gbGFzdFdvcmRJbmRleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBTcGxpdCB0ZXh0IGFuZCBjcmVhdGUgbmV3IHZhbHVlXHJcbiAgICBjb25zdCBiZWZvcmUgPSBmdWxsVmFsLnN1YnN0cmluZygwLCBpbnNlcnRQb3MpO1xyXG4gICAgY29uc3QgYWZ0ZXIgPSBmdWxsVmFsLnN1YnN0cmluZyhjdXJzb3JQb3MpO1xyXG4gICAgY29uc3QgbmV3VmFsID0gYmVmb3JlICsgdGV4dCArIGFmdGVyO1xyXG4gICAgXHJcbiAgICAvLyBDYWxjdWxhdGUgbmV3IGN1cnNvciBwb3NpdGlvblxyXG4gICAgY29uc3QgbmV3UG9zID0gYmVmb3JlLmxlbmd0aCArIHRleHQubGVuZ3RoO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgdGV4dGFyZWEgYW5kIGZvcm0gY29udHJvbFxyXG4gICAgdGV4dGFyZWEudmFsdWUgPSBuZXdWYWw7XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdxdWVyeVRleHQnKT8uc2V0VmFsdWUobmV3VmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBcclxuICAgIC8vIFNldCBjdXJzb3IgcG9zaXRpb25cclxuICAgIHRleHRhcmVhLmZvY3VzKCk7XHJcbiAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IG5ld1BvcztcclxuICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IG5ld1BvcztcclxuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSBuZXdQb3M7XHJcbiAgICBcclxuICAgIC8vIE9ubHkgcGFyc2UgcXVlcnkgd2hlbiBleHBsaWNpdGx5IG5lZWRlZCAobGlrZSBhZnRlciBzZWxlY3Rpb24pXHJcbiAgICAvLyBEb24ndCBhdXRvLXBhcnNlIHRvIGF2b2lkIGluZmluaXRlIGxvb3BzXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluc2VydFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbkl0ZW0pOiB2b2lkIHtcclxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCF0ZXh0YXJlYSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWU7XHJcbiAgICBjb25zdCBjdXJyZW50V29yZCA9IHRoaXMuZ2V0Q3VycmVudFdvcmQoKTtcclxuICAgIGNvbnN0IHdvcmRCb3VuZHMgPSB0aGlzLmdldEN1cnJlbnRXb3JkQm91bmRzKCk7XHJcbiAgICBcclxuICAgIC8vIERldGVybWluZSB3aGF0IHRvIGluc2VydFxyXG4gICAgbGV0IGluc2VydFRleHQgPSBzdWdnZXN0aW9uLnZhbHVlO1xyXG4gICAgbGV0IGFkZGl0aW9uYWxUZXh0ID0gJyc7XHJcbiAgICBcclxuICAgIC8vIEFkZCBhcHByb3ByaWF0ZSBzcGFjaW5nIGFuZCBmb3JtYXR0aW5nIGJhc2VkIG9uIHN1Z2dlc3Rpb24gdHlwZVxyXG4gICAgc3dpdGNoIChzdWdnZXN0aW9uLnR5cGUpIHtcclxuICAgICAgY2FzZSAnZmllbGQnOlxyXG4gICAgICAgIGFkZGl0aW9uYWxUZXh0ID0gJyAnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdvcGVyYXRvcic6XHJcbiAgICAgICAgYWRkaXRpb25hbFRleHQgPSAnICc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ3ZhbHVlJzpcclxuICAgICAgICAvLyBObyBhZGRpdGlvbmFsIHRleHQgZm9yIHZhbHVlc1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdjb25kaXRpb24nOlxyXG4gICAgICAgIGluc2VydFRleHQgPSBgXFxuJHtzdWdnZXN0aW9uLnZhbHVlfSBgO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBSZXBsYWNlIHRoZSBjdXJyZW50IHdvcmQgd2l0aCB0aGUgc3VnZ2VzdGlvblxyXG4gICAgY29uc3QgbmV3VGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHdvcmRCb3VuZHMuc3RhcnQpICsgXHJcbiAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0ICsgYWRkaXRpb25hbFRleHQgKyBcclxuICAgICAgICAgICAgICAgICAgIHRleHQuc3Vic3RyaW5nKHdvcmRCb3VuZHMuZW5kKTtcclxuICAgIFxyXG4gICAgLy8gVXBkYXRlIHRleHRhcmVhXHJcbiAgICB0ZXh0YXJlYS52YWx1ZSA9IG5ld1RleHQ7XHJcbiAgICBcclxuICAgIC8vIFNldCBjdXJzb3IgcG9zaXRpb25cclxuICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IHdvcmRCb3VuZHMuc3RhcnQgKyBpbnNlcnRUZXh0Lmxlbmd0aCArIGFkZGl0aW9uYWxUZXh0Lmxlbmd0aDtcclxuICAgIHRleHRhcmVhLnNldFNlbGVjdGlvblJhbmdlKG5ld0N1cnNvclBvcywgbmV3Q3Vyc29yUG9zKTtcclxuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSBuZXdDdXJzb3JQb3M7XHJcbiAgICBcclxuICAgIC8vIFVwZGF0ZSBmb3JtIGNvbnRyb2xcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3F1ZXJ5VGV4dCcpPy5zZXRWYWx1ZShuZXdUZXh0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICBcclxuICAgIC8vIFVwZGF0ZSBjb250ZXh0IGFuZCBwYXJzZSBxdWVyeVxyXG4gICAgdGhpcy51cGRhdGVDb250ZXh0KCk7XHJcbiAgICB0aGlzLnBhcnNlQW5kRW1pdFF1ZXJ5KG5ld1RleHQpO1xyXG4gIH1cclxuXHJcbiAgb25BcHBseSgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHF1ZXJ5VGV4dCA9IHRoaXMuZm9ybS5nZXQoJ3F1ZXJ5VGV4dCcpPy52YWx1ZSB8fCAnJztcclxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICB0aGlzLnBhcnNlQW5kRW1pdFF1ZXJ5KHF1ZXJ5VGV4dCk7XHJcbiAgfVxyXG5cclxuICBvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5mb3JtLmdldCgncXVlcnlUZXh0Jyk/LnNldFZhbHVlKCcnKTtcclxuICAgIHRoaXMuY3Vyc29yUG9zaXRpb24gPSAwO1xyXG4gICAgdGhpcy5jdXJyZW50Q29udGV4dCA9ICdmaWVsZCc7XHJcbiAgICB0aGlzLmxhc3RTZWxlY3RlZEZpZWxkID0gbnVsbDtcclxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLnF1ZXJ5VGV4dGFyZWEpIHtcclxuICAgICAgdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5xdWVyeUNoYW5nZS5lbWl0KHtcclxuICAgICAgY29uZGl0aW9uOiB0aGlzLmNvbmZpZy5kZWZhdWx0Q29uZGl0aW9uIHx8ICdhbmQnLFxyXG4gICAgICBydWxlczogW11cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblRleHRhcmVhSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTFRleHRBcmVhRWxlbWVudDtcclxuICAgIGlmICghdGFyZ2V0KSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IHZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgdGhpcy5jdXJzb3JQb3NpdGlvbiA9IHRhcmdldC5zZWxlY3Rpb25TdGFydCB8fCAwO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sIHdpdGhvdXQgdHJpZ2dlcmluZyBldmVudHMgdG8gYXZvaWQgbG9vcHNcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3F1ZXJ5VGV4dCcpPy5zZXRWYWx1ZSh2YWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgY29udGV4dCBhbmQgdHJpZ2dlciBzZWFyY2hcclxuICAgIHRoaXMudXBkYXRlQ29udGV4dCgpO1xyXG4gICAgY29uc3QgY3VycmVudFdvcmQgPSB0aGlzLmdldEN1cnJlbnRXb3JkKCk7XHJcbiAgICB0aGlzLnNlYXJjaFN1YmplY3QubmV4dChjdXJyZW50V29yZCk7XHJcbiAgICBcclxuICAgIC8vIFBhcnNlIGFuZCBlbWl0IHF1ZXJ5XHJcbiAgICB0aGlzLnBhcnNlQW5kRW1pdFF1ZXJ5KHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25UZXh0YXJlYUJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIERlbGF5IGhpZGluZyBkcm9wZG93biB0byBhbGxvdyBmb3IgY2xpY2tzXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKCF0aGlzLmRyb3Bkb3duPy5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlRHJvcGRvd24oKTtcclxuICAgICAgfVxyXG4gICAgfSwgMTUwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQ29udGV4dCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm47XHJcbiAgICBcclxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWU7XHJcbiAgICBjb25zdCBiZWZvcmVDdXJzb3IgPSB0ZXh0LnN1YnN0cmluZygwLCB0aGlzLmN1cnNvclBvc2l0aW9uKTtcclxuICAgIFxyXG4gICAgLy8gRW5oYW5jZWQgY29udGV4dCBkZXRlY3Rpb25cclxuICAgIGNvbnN0IGN1cnJlbnRXb3JkID0gdGhpcy5nZXRDdXJyZW50V29yZCgpO1xyXG4gICAgY29uc3QgcHJldmlvdXNUb2tlbnMgPSB0aGlzLmdldFByZXZpb3VzVG9rZW5zKGJlZm9yZUN1cnNvcik7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmlzQWZ0ZXJPcGVyYXRvcihwcmV2aW91c1Rva2VucykpIHtcclxuICAgICAgdGhpcy5jdXJyZW50Q29udGV4dCA9ICd2YWx1ZSc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNBZnRlckZpZWxkKHByZXZpb3VzVG9rZW5zKSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRDb250ZXh0ID0gJ29wZXJhdG9yJztcclxuICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRGaWVsZCA9IHRoaXMuZ2V0TGFzdEZpZWxkKHByZXZpb3VzVG9rZW5zKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5pc0FmdGVyVmFsdWUocHJldmlvdXNUb2tlbnMpKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudENvbnRleHQgPSAnY29uZGl0aW9uJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY3VycmVudENvbnRleHQgPSAnZmllbGQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJTdWdnZXN0aW9uc0J5Q29udGV4dChxdWVyeTogc3RyaW5nKTogU3VnZ2VzdGlvbkl0ZW1bXSB7XHJcbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcclxuICAgIFxyXG4gICAgLy8gR2V0IGNvbnRleHQtYXBwcm9wcmlhdGUgc3VnZ2VzdGlvbnNcclxuICAgIGxldCBjb250ZXh0U3VnZ2VzdGlvbnMgPSB0aGlzLmdldENvbnRleHRTdWdnZXN0aW9ucygpO1xyXG4gICAgXHJcbiAgICAvLyBGaWx0ZXIgYnkgcXVlcnkgaWYgcHJvdmlkZWRcclxuICAgIGlmIChub3JtYWxpemVkUXVlcnkpIHtcclxuICAgICAgY29udGV4dFN1Z2dlc3Rpb25zID0gY29udGV4dFN1Z2dlc3Rpb25zLmZpbHRlcihzdWdnZXN0aW9uID0+IFxyXG4gICAgICAgIHN1Z2dlc3Rpb24ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkgfHxcclxuICAgICAgICBzdWdnZXN0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxyXG4gICAgICAgIHN1Z2dlc3Rpb24udmFsdWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XHJcbiAgICAgICAgKHN1Z2dlc3Rpb24uZGVzY3JpcHRpb24gJiYgc3VnZ2VzdGlvbi5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIFNvcnQgYnkgcmVsZXZhbmNlIChleGFjdCBtYXRjaGVzIGZpcnN0LCB0aGVuIHN0YXJ0cyB3aXRoLCB0aGVuIGNvbnRhaW5zKVxyXG4gICAgY29udGV4dFN1Z2dlc3Rpb25zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgYVNjb3JlID0gdGhpcy5jYWxjdWxhdGVSZWxldmFuY2VTY29yZShhLCBub3JtYWxpemVkUXVlcnkpO1xyXG4gICAgICBjb25zdCBiU2NvcmUgPSB0aGlzLmNhbGN1bGF0ZVJlbGV2YW5jZVNjb3JlKGIsIG5vcm1hbGl6ZWRRdWVyeSk7XHJcbiAgICAgIHJldHVybiBiU2NvcmUgLSBhU2NvcmU7XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgcmV0dXJuIGNvbnRleHRTdWdnZXN0aW9ucy5zbGljZSgwLCB0aGlzLk1BWF9TVUdHRVNUSU9OUyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldENvbnRleHRTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcclxuICAgIHN3aXRjaCAodGhpcy5jdXJyZW50Q29udGV4dCkge1xyXG4gICAgICBjYXNlICdmaWVsZCc6XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VnZ2VzdGlvbnMuZmlsdGVyKHMgPT4gcy50eXBlID09PSAnZmllbGQnKTtcclxuICAgICAgY2FzZSAnb3BlcmF0b3InOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9wZXJhdG9yU3VnZ2VzdGlvbnMoKTtcclxuICAgICAgY2FzZSAndmFsdWUnOlxyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFZhbHVlU3VnZ2VzdGlvbnMoKTtcclxuICAgICAgY2FzZSAnY29uZGl0aW9uJzpcclxuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdjb25kaXRpb24nKTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3BlcmF0b3JTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcclxuICAgIGlmICghdGhpcy5sYXN0U2VsZWN0ZWRGaWVsZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zdWdnZXN0aW9ucy5maWx0ZXIocyA9PiBzLnR5cGUgPT09ICdvcGVyYXRvcicpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5rZXkgPT09IHRoaXMubGFzdFNlbGVjdGVkRmllbGQpO1xyXG4gICAgaWYgKCFmaWVsZCB8fCAhZmllbGQub3BlcmF0b3JzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihzID0+IHMudHlwZSA9PT0gJ29wZXJhdG9yJyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB0aGlzLnN1Z2dlc3Rpb25zLmZpbHRlcihzID0+IFxyXG4gICAgICBzLnR5cGUgPT09ICdvcGVyYXRvcicgJiYgZmllbGQub3BlcmF0b3JzIS5pbmNsdWRlcyhzLnZhbHVlKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VmFsdWVTdWdnZXN0aW9ucygpOiBTdWdnZXN0aW9uSXRlbVtdIHtcclxuICAgIGlmICghdGhpcy5sYXN0U2VsZWN0ZWRGaWVsZCkgcmV0dXJuIFtdO1xyXG4gICAgXHJcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuY29uZmlnLmZpZWxkcy5maW5kKGYgPT4gZi5rZXkgPT09IHRoaXMubGFzdFNlbGVjdGVkRmllbGQpO1xyXG4gICAgaWYgKCFmaWVsZCB8fCAhZmllbGQub3B0aW9ucykgcmV0dXJuIFtdO1xyXG4gICAgXHJcbiAgICByZXR1cm4gZmllbGQub3B0aW9ucy5tYXAob3B0aW9uID0+ICh7XHJcbiAgICAgIGlkOiBgJHtmaWVsZC5rZXl9XyR7b3B0aW9uLnZhbHVlfWAsXHJcbiAgICAgIG5hbWU6IG9wdGlvbi5sYWJlbCxcclxuICAgICAgbGFiZWw6IG9wdGlvbi5sYWJlbCxcclxuICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZS50b1N0cmluZygpLFxyXG4gICAgICB0eXBlOiAndmFsdWUnIGFzIGNvbnN0XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGN1bGF0ZVJlbGV2YW5jZVNjb3JlKHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb25JdGVtLCBxdWVyeTogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIGlmICghcXVlcnkpIHJldHVybiAxO1xyXG4gICAgXHJcbiAgICBjb25zdCBuYW1lID0gc3VnZ2VzdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICBjb25zdCBsYWJlbCA9IHN1Z2dlc3Rpb24ubGFiZWwudG9Mb3dlckNhc2UoKTtcclxuICAgIGNvbnN0IHZhbHVlID0gc3VnZ2VzdGlvbi52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgXHJcbiAgICAvLyBFeGFjdCBtYXRjaCBnZXRzIGhpZ2hlc3Qgc2NvcmVcclxuICAgIGlmIChuYW1lID09PSBxdWVyeSB8fCBsYWJlbCA9PT0gcXVlcnkgfHwgdmFsdWUgPT09IHF1ZXJ5KSByZXR1cm4gMTAwO1xyXG4gICAgXHJcbiAgICAvLyBTdGFydHMgd2l0aCBnZXRzIGhpZ2ggc2NvcmVcclxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgocXVlcnkpIHx8IGxhYmVsLnN0YXJ0c1dpdGgocXVlcnkpIHx8IHZhbHVlLnN0YXJ0c1dpdGgocXVlcnkpKSByZXR1cm4gNTA7XHJcbiAgICBcclxuICAgIC8vIENvbnRhaW5zIGdldHMgbWVkaXVtIHNjb3JlXHJcbiAgICBpZiAobmFtZS5pbmNsdWRlcyhxdWVyeSkgfHwgbGFiZWwuaW5jbHVkZXMocXVlcnkpIHx8IHZhbHVlLmluY2x1ZGVzKHF1ZXJ5KSkgcmV0dXJuIDI1O1xyXG4gICAgXHJcbiAgICAvLyBEZXNjcmlwdGlvbiBtYXRjaCBnZXRzIGxvdyBzY29yZVxyXG4gICAgaWYgKHN1Z2dlc3Rpb24uZGVzY3JpcHRpb24gJiYgc3VnZ2VzdGlvbi5kZXNjcmlwdGlvbi50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KSkgcmV0dXJuIDEwO1xyXG4gICAgXHJcbiAgICByZXR1cm4gMDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VRdWVyeShxdWVyeVRleHQ6IHN0cmluZyk6IFRleHRhcmVhUXVlcnlHcm91cCB7XHJcbiAgICBjb25zdCBsaW5lcyA9IHF1ZXJ5VGV4dC5zcGxpdCgnXFxuJykuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkpO1xyXG4gICAgY29uc3QgcnVsZXM6IChUZXh0YXJlYVF1ZXJ5UnVsZSB8IFRleHRhcmVhUXVlcnlHcm91cClbXSA9IFtdO1xyXG4gICAgbGV0IGN1cnJlbnRDb25kaXRpb246ICdhbmQnIHwgJ29yJyA9IHRoaXMuY29uZmlnLmRlZmF1bHRDb25kaXRpb24gfHwgJ2FuZCc7XHJcbiAgICBcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lc1tpXS50cmltKCk7XHJcbiAgICAgIGlmICghdHJpbW1lZExpbmUpIGNvbnRpbnVlO1xyXG4gICAgICBcclxuICAgICAgLy8gQ2hlY2sgaWYgbGluZSBpcyBhIGNvbmRpdGlvblxyXG4gICAgICBpZiAodHJpbW1lZExpbmUgPT09ICdBTkQnIHx8IHRyaW1tZWRMaW5lID09PSAnT1InKSB7XHJcbiAgICAgICAgY3VycmVudENvbmRpdGlvbiA9IHRyaW1tZWRMaW5lLnRvTG93ZXJDYXNlKCkgYXMgJ2FuZCcgfCAnb3InO1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBQYXJzZSBydWxlIGZyb20gbGluZVxyXG4gICAgICBjb25zdCBydWxlID0gdGhpcy5wYXJzZVJ1bGUodHJpbW1lZExpbmUpO1xyXG4gICAgICBpZiAocnVsZSkge1xyXG4gICAgICAgIHJ1bGUuY29uZGl0aW9uID0gY3VycmVudENvbmRpdGlvbjtcclxuICAgICAgICBydWxlcy5wdXNoKHJ1bGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGNvbmRpdGlvbjogY3VycmVudENvbmRpdGlvbixcclxuICAgICAgcnVsZXNcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlQW5kRW1pdFF1ZXJ5KHF1ZXJ5VGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMucGFyc2VRdWVyeShxdWVyeVRleHQpO1xyXG4gICAgICB0aGlzLnF1ZXJ5Q2hhbmdlLmVtaXQocXVlcnkpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcGFyc2luZyBxdWVyeTonLCBlcnJvcik7XHJcbiAgICAgIC8vIEVtaXQgZW1wdHkgcXVlcnkgb24gZXJyb3JcclxuICAgICAgdGhpcy5xdWVyeUNoYW5nZS5lbWl0KHtcclxuICAgICAgICBjb25kaXRpb246IHRoaXMuY29uZmlnLmRlZmF1bHRDb25kaXRpb24gfHwgJ2FuZCcsXHJcbiAgICAgICAgcnVsZXM6IFtdXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSkge1xyXG4gICAgICB0aGlzLnVwZGF0ZUN1cnNvclBvc2l0aW9uKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcclxuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IE1hdGgubWluKHRoaXMuc2VsZWN0ZWRJbmRleCArIDEsIHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9ucy5sZW5ndGggLSAxKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnQXJyb3dVcCc6XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSBNYXRoLm1heCh0aGlzLnNlbGVjdGVkSW5kZXggLSAxLCAwKTtcclxuICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWQoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnRW50ZXInOlxyXG4gICAgICBjYXNlICdUYWInOlxyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRTdWdnZXN0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24odGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnRXNjYXBlJzpcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgdGhpcy51cGRhdGVDdXJzb3JQb3NpdGlvbigpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDdXJyZW50V29yZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybiAnJztcclxuICAgIFxyXG4gICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudDtcclxuICAgIGNvbnN0IHRleHQgPSB0ZXh0YXJlYS52YWx1ZTtcclxuICAgIGNvbnN0IGJvdW5kcyA9IHRoaXMuZ2V0Q3VycmVudFdvcmRCb3VuZHMoKTtcclxuICAgIFxyXG4gICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKGJvdW5kcy5zdGFydCwgYm91bmRzLmVuZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEN1cnJlbnRXb3JkQm91bmRzKCk6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSB7XHJcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgdGV4dCA9IHRleHRhcmVhLnZhbHVlO1xyXG4gICAgY29uc3QgY3Vyc29yID0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcclxuICAgIFxyXG4gICAgbGV0IHN0YXJ0ID0gY3Vyc29yO1xyXG4gICAgbGV0IGVuZCA9IGN1cnNvcjtcclxuICAgIFxyXG4gICAgLy8gRmluZCB3b3JkIHN0YXJ0IChnbyBiYWNrIHVudGlsIHdoaXRlc3BhY2Ugb3Igc3RhcnQgb2YgdGV4dClcclxuICAgIHdoaWxlIChzdGFydCA+IDAgJiYgL1xcUy8udGVzdCh0ZXh0W3N0YXJ0IC0gMV0pKSB7XHJcbiAgICAgIHN0YXJ0LS07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEZpbmQgd29yZCBlbmQgKGdvIGZvcndhcmQgdW50aWwgd2hpdGVzcGFjZSBvciBlbmQgb2YgdGV4dClcclxuICAgIHdoaWxlIChlbmQgPCB0ZXh0Lmxlbmd0aCAmJiAvXFxTLy50ZXN0KHRleHRbZW5kXSkpIHtcclxuICAgICAgZW5kKys7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJldmlvdXNUb2tlbnModGV4dDogc3RyaW5nKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIHRleHQudHJpbSgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKHRva2VuID0+IHRva2VuLmxlbmd0aCA+IDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0FmdGVyT3BlcmF0b3IodG9rZW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGxhc3RUb2tlbiA9IHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV07XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcub3BlcmF0b3JzLnNvbWUob3AgPT4gb3AudmFsdWUgPT09IGxhc3RUb2tlbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzQWZ0ZXJGaWVsZCh0b2tlbnM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgY29uc3QgbGFzdFRva2VuID0gdG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXTtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5maWVsZHMuc29tZShmaWVsZCA9PiBmaWVsZC5rZXkgPT09IGxhc3RUb2tlbiB8fCBmaWVsZC5sYWJlbCA9PT0gbGFzdFRva2VuKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBZnRlclZhbHVlKHRva2Vuczogc3RyaW5nW10pOiBib29sZWFuIHtcclxuICAgIGlmICh0b2tlbnMubGVuZ3RoIDwgMykgcmV0dXJuIGZhbHNlO1xyXG4gICAgXHJcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY29tcGxldGUgZmllbGQtb3BlcmF0b3ItdmFsdWUgcGF0dGVyblxyXG4gICAgY29uc3QgZmllbGQgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDNdO1xyXG4gICAgY29uc3Qgb3BlcmF0b3IgPSB0b2tlbnNbdG9rZW5zLmxlbmd0aCAtIDJdO1xyXG4gICAgXHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuZmllbGRzLnNvbWUoZiA9PiBmLmtleSA9PT0gZmllbGQgfHwgZi5sYWJlbCA9PT0gZmllbGQpICYmXHJcbiAgICAgICAgICAgdGhpcy5jb25maWcub3BlcmF0b3JzLnNvbWUob3AgPT4gb3AudmFsdWUgPT09IG9wZXJhdG9yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TGFzdEZpZWxkKHRva2Vuczogc3RyaW5nW10pOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGZvciAobGV0IGkgPSB0b2tlbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbaV07XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5jb25maWcuZmllbGRzLmZpbmQoZiA9PiBmLmtleSA9PT0gdG9rZW4gfHwgZi5sYWJlbCA9PT0gdG9rZW4pO1xyXG4gICAgICBpZiAoZmllbGQpIHtcclxuICAgICAgICByZXR1cm4gZmllbGQua2V5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIG9uU3VnZ2VzdGlvbkNsaWNrKHN1Z2dlc3Rpb246IFN1Z2dlc3Rpb25JdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFN1Z2dlc3Rpb24oc3VnZ2VzdGlvbjogU3VnZ2VzdGlvbkl0ZW0pOiB2b2lkIHtcclxuICAgIGlmICghc3VnZ2VzdGlvbiB8fCAhdGhpcy5xdWVyeVRleHRhcmVhKSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuc2VsZWN0ZWRTdWdnZXN0aW9uID0gc3VnZ2VzdGlvbjtcclxuICAgIHRoaXMuaW5zZXJ0U3VnZ2VzdGlvbihzdWdnZXN0aW9uKTtcclxuICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICB0aGlzLnN1Z2dlc3Rpb25TZWxlY3RlZC5lbWl0KHN1Z2dlc3Rpb24pO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgY29udGV4dCBhZnRlciBzZWxlY3Rpb24gYW5kIGF1dG8tc2hvdyBuZXh0IHN1Z2dlc3Rpb25zXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy51cGRhdGVDb250ZXh0KCk7XHJcbiAgICAgIHRoaXMucXVlcnlUZXh0YXJlYT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgICBcclxuICAgICAgLy8gQXV0by1zaG93IG5leHQgc3VnZ2VzdGlvbnMgYmFzZWQgb24gc2VsZWN0aW9uIHR5cGVcclxuICAgICAgaWYgKHN1Z2dlc3Rpb24udHlwZSA9PT0gJ2ZpZWxkJykge1xyXG4gICAgICAgIHRoaXMuc2hvd09wZXJhdG9yU3VnZ2VzdGlvbnMoKTtcclxuICAgICAgfSBlbHNlIGlmIChzdWdnZXN0aW9uLnR5cGUgPT09ICdvcGVyYXRvcicpIHtcclxuICAgICAgICB0aGlzLnNob3dWYWx1ZVN1Z2dlc3Rpb25zKCk7XHJcbiAgICAgIH1cclxuICAgIH0sIDEwKTtcclxuICB9XHJcblxyXG4gIC8vIExlZ2FjeSBtZXRob2QgLSBrZWVwaW5nIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcbiAgb25PcHRpb25TZWxlY3RlZChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICAvLyBUaGlzIG1ldGhvZCBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBub3QgdXNlZFxyXG4gICAgLy8gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB1c2VzIG9uU3VnZ2VzdGlvbkNsaWNrIGluc3RlYWRcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VhcmNoU3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IE9ic2VydmFibGU8U3VnZ2VzdGlvbkl0ZW1bXT4ge1xyXG4gICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSB0aGlzLmZpbHRlclN1Z2dlc3Rpb25zQnlDb250ZXh0KHF1ZXJ5KTtcclxuICAgIHJldHVybiBvZihzdWdnZXN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhpZGVEcm9wZG93bigpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNEcm9wZG93blZpc2libGUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICB0aGlzLmZpbHRlcmVkU3VnZ2VzdGlvbnMgPSBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2hvd09wZXJhdG9yU3VnZ2VzdGlvbnMoKTogdm9pZCB7XHJcbiAgICAvLyBHZXQgb3BlcmF0b3Igc3VnZ2VzdGlvbnMgZm9yIHRoZSBjdXJyZW50IGZpZWxkXHJcbiAgICBjb25zdCBvcGVyYXRvclN1Z2dlc3Rpb25zID0gdGhpcy5nZXRPcGVyYXRvclN1Z2dlc3Rpb25zKCk7XHJcbiAgICBcclxuICAgIGlmIChvcGVyYXRvclN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gb3BlcmF0b3JTdWdnZXN0aW9ucztcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzaG93VmFsdWVTdWdnZXN0aW9ucygpOiB2b2lkIHtcclxuICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgZmllbGQgaXMgYSBkYXRlIGZpZWxkXHJcbiAgICBjb25zdCBjdXJyZW50RmllbGQgPSB0aGlzLmNvbmZpZy5maWVsZHMuZmluZChmID0+IGYua2V5ID09PSB0aGlzLmxhc3RTZWxlY3RlZEZpZWxkKTtcclxuICAgIFxyXG4gICAgaWYgKGN1cnJlbnRGaWVsZCAmJiBjdXJyZW50RmllbGQudHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgIHRoaXMuc2hvd0RhdGVQaWNrZXIoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBHZXQgdmFsdWUvb3B0aW9ucyBzdWdnZXN0aW9ucyBmb3Igbm9uLWRhdGUgZmllbGRzXHJcbiAgICBjb25zdCB2YWx1ZVN1Z2dlc3Rpb25zID0gdGhpcy5nZXRWYWx1ZVN1Z2dlc3Rpb25zKCk7XHJcbiAgICBcclxuICAgIGlmICh2YWx1ZVN1Z2dlc3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5maWx0ZXJlZFN1Z2dlc3Rpb25zID0gdmFsdWVTdWdnZXN0aW9ucztcclxuICAgICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDA7XHJcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gSWYgbm8gcHJlZGVmaW5lZCB2YWx1ZXMsIGhpZGUgZHJvcGRvd24gdG8gYWxsb3cgZnJlZSB0ZXh0IGlucHV0XHJcbiAgICAgIHRoaXMuaGlkZURyb3Bkb3duKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZURyb3Bkb3duUG9zaXRpb24oKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSB8fCAhdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgcmVjdCA9IHRleHRhcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgXHJcbiAgICAvLyBDYWxjdWxhdGUgY3Vyc29yIHBvc2l0aW9uIGluIHRleHRhcmVhXHJcbiAgICBjb25zdCBjdXJzb3JDb29yZHMgPSB0aGlzLmdldEN1cnNvckNvb3JkaW5hdGVzKCk7XHJcbiAgICBcclxuICAgIHRoaXMuZHJvcGRvd25Qb3NpdGlvbiA9IHtcclxuICAgICAgdG9wOiByZWN0LnRvcCArIGN1cnNvckNvb3Jkcy50b3AgKyAyMCwgLy8gMjBweCBiZWxvdyBjdXJzb3JcclxuICAgICAgbGVmdDogcmVjdC5sZWZ0ICsgY3Vyc29yQ29vcmRzLmxlZnRcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dEYXRlUGlja2VyKCk6IHZvaWQge1xyXG4gICAgLy8gSGlkZSByZWd1bGFyIGRyb3Bkb3duXHJcbiAgICB0aGlzLmhpZGVEcm9wZG93bigpO1xyXG4gICAgXHJcbiAgICAvLyBTZXQgdXAgZGF0ZSBwaWNrZXIgc3RhdGVcclxuICAgIHRoaXMuY3VycmVudERhdGVGaWVsZCA9IHRoaXMubGFzdFNlbGVjdGVkRmllbGQ7XHJcbiAgICB0aGlzLmN1cnJlbnREYXRlT3BlcmF0b3IgPSB0aGlzLmdldEN1cnJlbnRPcGVyYXRvcigpO1xyXG4gICAgdGhpcy5zaG93RHVhbERhdGVQaWNrZXIgPSB0aGlzLmN1cnJlbnREYXRlT3BlcmF0b3IgPT09ICdiZXR3ZWVuJztcclxuICAgIHRoaXMuZmlyc3REYXRlU2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgdGhpcy5zZWNvbmREYXRlU2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgXHJcbiAgICAvLyBTaG93IGRhdGUgcGlja2VyXHJcbiAgICB0aGlzLmlzRGF0ZVBpY2tlclZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy51cGRhdGVEYXRlUGlja2VyUG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRGF0ZVBpY2tlclBvc2l0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEgfHwgIXRoaXMuaXNEYXRlUGlja2VyVmlzaWJsZSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgcmVjdCA9IHRleHRhcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgXHJcbiAgICAvLyBDYWxjdWxhdGUgY3Vyc29yIHBvc2l0aW9uIGluIHRleHRhcmVhXHJcbiAgICBjb25zdCBjdXJzb3JDb29yZHMgPSB0aGlzLmdldEN1cnNvckNvb3JkaW5hdGVzKCk7XHJcbiAgICBcclxuICAgIHRoaXMuZGF0ZVBpY2tlclBvc2l0aW9uID0ge1xyXG4gICAgICB0b3A6IHJlY3QudG9wICsgY3Vyc29yQ29vcmRzLnRvcCArIDIwLCAvLyAyMHB4IGJlbG93IGN1cnNvclxyXG4gICAgICBsZWZ0OiByZWN0LmxlZnQgKyBjdXJzb3JDb29yZHMubGVmdFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Q3VycmVudE9wZXJhdG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLnF1ZXJ5VGV4dGFyZWEpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgdGV4dCA9IHRleHRhcmVhLnZhbHVlO1xyXG4gICAgY29uc3QgYmVmb3JlQ3Vyc29yID0gdGV4dC5zdWJzdHJpbmcoMCwgdGhpcy5jdXJzb3JQb3NpdGlvbik7XHJcbiAgICBjb25zdCB0b2tlbnMgPSB0aGlzLmdldFByZXZpb3VzVG9rZW5zKGJlZm9yZUN1cnNvcik7XHJcbiAgICBcclxuICAgIC8vIExvb2sgZm9yIHRoZSBtb3N0IHJlY2VudCBvcGVyYXRvclxyXG4gICAgZm9yIChsZXQgaSA9IHRva2Vucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xyXG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1tpXTtcclxuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wZXJhdG9ycy5zb21lKG9wID0+IG9wLnZhbHVlID09PSB0b2tlbikpIHtcclxuICAgICAgICByZXR1cm4gdG9rZW47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBvbkZpcnN0RGF0ZVNlbGVjdGVkKGRhdGU6IERhdGUpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlyc3REYXRlU2VsZWN0ZWQgPSBkYXRlO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy5zaG93RHVhbERhdGVQaWNrZXIpIHtcclxuICAgICAgLy8gRm9yICdiZXR3ZWVuJyBvcGVyYXRvciwgd2FpdCBmb3Igc2Vjb25kIGRhdGVcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gRm9yIHNpbmdsZSBkYXRlIG9wZXJhdG9ycywgaW5zZXJ0IHRoZSBkYXRlIGltbWVkaWF0ZWx5XHJcbiAgICAgIHRoaXMuaW5zZXJ0RGF0ZVZhbHVlKGRhdGUpO1xyXG4gICAgICB0aGlzLmhpZGVEYXRlUGlja2VyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlY29uZERhdGVTZWxlY3RlZChkYXRlOiBEYXRlKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlY29uZERhdGVTZWxlY3RlZCA9IGRhdGU7XHJcbiAgICBcclxuICAgIGlmICh0aGlzLmZpcnN0RGF0ZVNlbGVjdGVkICYmIHRoaXMuc2Vjb25kRGF0ZVNlbGVjdGVkKSB7XHJcbiAgICAgIC8vIEluc2VydCBib3RoIGRhdGVzIGZvciAnYmV0d2Vlbicgb3BlcmF0b3JcclxuICAgICAgdGhpcy5pbnNlcnREYXRlUmFuZ2VWYWx1ZSh0aGlzLmZpcnN0RGF0ZVNlbGVjdGVkLCB0aGlzLnNlY29uZERhdGVTZWxlY3RlZCk7XHJcbiAgICAgIHRoaXMuaGlkZURhdGVQaWNrZXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0RGF0ZVZhbHVlKGRhdGU6IERhdGUpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGVTdHJpbmcgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZSk7XHJcbiAgICB0aGlzLmluc2VydFRleHRBdEN1cnNvcihkYXRlU3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0RGF0ZVJhbmdlVmFsdWUoc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlKTogdm9pZCB7XHJcbiAgICBjb25zdCBzdGFydERhdGVTdHJpbmcgPSB0aGlzLmZvcm1hdERhdGUoc3RhcnREYXRlKTtcclxuICAgIGNvbnN0IGVuZERhdGVTdHJpbmcgPSB0aGlzLmZvcm1hdERhdGUoZW5kRGF0ZSk7XHJcbiAgICBjb25zdCByYW5nZVN0cmluZyA9IGAke3N0YXJ0RGF0ZVN0cmluZ30sICR7ZW5kRGF0ZVN0cmluZ31gO1xyXG4gICAgdGhpcy5pbnNlcnRUZXh0QXRDdXJzb3IocmFuZ2VTdHJpbmcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgLy8gRm9ybWF0IGRhdGUgYXMgWVlZWS1NTS1ERFxyXG4gICAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRUZXh0QXRDdXJzb3IodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMucXVlcnlUZXh0YXJlYS5uYXRpdmVFbGVtZW50O1xyXG4gICAgY29uc3QgY3VycmVudFRleHQgPSB0ZXh0YXJlYS52YWx1ZTtcclxuICAgIGNvbnN0IGN1cnNvclBvcyA9IHRoaXMuY3Vyc29yUG9zaXRpb247XHJcbiAgICBcclxuICAgIC8vIEluc2VydCB0ZXh0IGF0IGN1cnNvciBwb3NpdGlvblxyXG4gICAgY29uc3QgbmV3VGV4dCA9IGN1cnJlbnRUZXh0LnN1YnN0cmluZygwLCBjdXJzb3JQb3MpICsgdGV4dCArIGN1cnJlbnRUZXh0LnN1YnN0cmluZyhjdXJzb3JQb3MpO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgdGV4dGFyZWFcclxuICAgIHRleHRhcmVhLnZhbHVlID0gbmV3VGV4dDtcclxuICAgIFxyXG4gICAgLy8gVXBkYXRlIGN1cnNvciBwb3NpdGlvblxyXG4gICAgY29uc3QgbmV3Q3Vyc29yUG9zID0gY3Vyc29yUG9zICsgdGV4dC5sZW5ndGg7XHJcbiAgICB0ZXh0YXJlYS5zZXRTZWxlY3Rpb25SYW5nZShuZXdDdXJzb3JQb3MsIG5ld0N1cnNvclBvcyk7XHJcbiAgICB0aGlzLmN1cnNvclBvc2l0aW9uID0gbmV3Q3Vyc29yUG9zO1xyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgZm9ybSBjb250cm9sXHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdxdWVyeVRleHQnKT8uc2V0VmFsdWUobmV3VGV4dCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgXHJcbiAgICAvLyBQYXJzZSBhbmQgZW1pdCBxdWVyeVxyXG4gICAgdGhpcy5wYXJzZUFuZEVtaXRRdWVyeShuZXdUZXh0KTtcclxuICB9XHJcblxyXG4gIGhpZGVEYXRlUGlja2VyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0RhdGVQaWNrZXJWaXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLmN1cnJlbnREYXRlRmllbGQgPSBudWxsO1xyXG4gICAgdGhpcy5jdXJyZW50RGF0ZU9wZXJhdG9yID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0R1YWxEYXRlUGlja2VyID0gZmFsc2U7XHJcbiAgICB0aGlzLmZpcnN0RGF0ZVNlbGVjdGVkID0gbnVsbDtcclxuICAgIHRoaXMuc2Vjb25kRGF0ZVNlbGVjdGVkID0gbnVsbDtcclxuICAgIFxyXG4gICAgLy8gRm9jdXMgYmFjayB0byB0ZXh0YXJlYVxyXG4gICAgaWYgKHRoaXMucXVlcnlUZXh0YXJlYSkge1xyXG4gICAgICB0aGlzLnF1ZXJ5VGV4dGFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDdXJzb3JDb29yZGluYXRlcygpOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XHJcbiAgICBpZiAoIXRoaXMucXVlcnlUZXh0YXJlYSkgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07XHJcbiAgICBcclxuICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5xdWVyeVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCB0ZXh0ID0gdGV4dGFyZWEudmFsdWUuc3Vic3RyaW5nKDAsIHRoaXMuY3Vyc29yUG9zaXRpb24pO1xyXG4gICAgY29uc3QgbGluZXMgPSB0ZXh0LnNwbGl0KCdcXG4nKTtcclxuICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gbGluZXMubGVuZ3RoIC0gMTtcclxuICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBsaW5lc1tjdXJyZW50TGluZV0ubGVuZ3RoO1xyXG4gICAgXHJcbiAgICAvLyBBcHByb3hpbWF0ZSBjaGFyYWN0ZXIgZGltZW5zaW9uc1xyXG4gICAgY29uc3QgY2hhcldpZHRoID0gODsgLy8gQXBwcm94aW1hdGUgY2hhcmFjdGVyIHdpZHRoIGluIHBpeGVsc1xyXG4gICAgY29uc3QgbGluZUhlaWdodCA9IDIwOyAvLyBBcHByb3hpbWF0ZSBsaW5lIGhlaWdodCBpbiBwaXhlbHNcclxuICAgIFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdG9wOiBjdXJyZW50TGluZSAqIGxpbmVIZWlnaHQsXHJcbiAgICAgIGxlZnQ6IGN1cnJlbnRDb2x1bW4gKiBjaGFyV2lkdGhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZHJvcGRvd24pIHJldHVybjtcclxuICAgIFxyXG4gICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLmRyb3Bkb3duLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnQgPSBkcm9wZG93bi5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmRleD1cIiR7dGhpcy5zZWxlY3RlZEluZGV4fVwiXWApIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgXHJcbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50KSB7XHJcbiAgICAgIHNlbGVjdGVkRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBhcnNlUnVsZShydWxlVGV4dDogc3RyaW5nKTogVGV4dGFyZWFRdWVyeVJ1bGUgfCBudWxsIHtcclxuICAgIC8vIEVuaGFuY2VkIHBhcnNpbmcgd2l0aCBiZXR0ZXIgb3BlcmF0b3IgZGV0ZWN0aW9uXHJcbiAgICBjb25zdCBvcGVyYXRvclBhdHRlcm4gPSB0aGlzLmNvbmZpZy5vcGVyYXRvcnNcclxuICAgICAgLm1hcChvcCA9PiBvcC52YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgJ1xcXFwkJicpKVxyXG4gICAgICAuam9pbignfCcpO1xyXG4gICAgXHJcbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYF4oXFxcXFMrKVxcXFxzKygke29wZXJhdG9yUGF0dGVybn0pXFxcXHMrKC4rKSRgKTtcclxuICAgIGNvbnN0IG1hdGNoID0gcnVsZVRleHQubWF0Y2gocmVnZXgpO1xyXG4gICAgXHJcbiAgICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgY29uc3QgWywgZmllbGRQYXJ0LCBvcGVyYXRvciwgdmFsdWVQYXJ0XSA9IG1hdGNoO1xyXG4gICAgXHJcbiAgICAvLyBWYWxpZGF0ZSBmaWVsZCBleGlzdHNcclxuICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5jb25maWcuZmllbGRzLmZpbmQoZiA9PiBcclxuICAgICAgZi5rZXkgPT09IGZpZWxkUGFydCB8fCBmLmxhYmVsID09PSBmaWVsZFBhcnRcclxuICAgICk7XHJcbiAgICBpZiAoIWZpZWxkQ29uZmlnKSByZXR1cm4gbnVsbDtcclxuICAgIFxyXG4gICAgLy8gVmFsaWRhdGUgb3BlcmF0b3JcclxuICAgIGNvbnN0IG9wZXJhdG9yQ29uZmlnID0gdGhpcy5jb25maWcub3BlcmF0b3JzLmZpbmQob3AgPT4gb3AudmFsdWUgPT09IG9wZXJhdG9yKTtcclxuICAgIGlmICghb3BlcmF0b3JDb25maWcpIHJldHVybiBudWxsO1xyXG4gICAgXHJcbiAgICAvLyBQYXJzZSB2YWx1ZSBiYXNlZCBvbiBmaWVsZCB0eXBlXHJcbiAgICBsZXQgcGFyc2VkVmFsdWU6IGFueSA9IHZhbHVlUGFydC50cmltKCk7XHJcbiAgICBcclxuICAgIGlmIChmaWVsZENvbmZpZy50eXBlID09PSAnbnVtYmVyJykge1xyXG4gICAgICBjb25zdCBudW1WYWx1ZSA9IHBhcnNlRmxvYXQocGFyc2VkVmFsdWUpO1xyXG4gICAgICBpZiAoIWlzTmFOKG51bVZhbHVlKSkge1xyXG4gICAgICAgIHBhcnNlZFZhbHVlID0gbnVtVmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoZmllbGRDb25maWcudHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHBhcnNlZFZhbHVlID0gcGFyc2VkVmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmaWVsZDogZmllbGRDb25maWcua2V5LFxyXG4gICAgICBvcGVyYXRvcjogb3BlcmF0b3IsXHJcbiAgICAgIHZhbHVlOiBwYXJzZWRWYWx1ZVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInNhLXF1ZXJ5LWJ1aWxkZXItdGV4dGFyZWFcIj5cclxuICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1idWlsZGVyLWhlYWRlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2hlcmUtbGFiZWxcIj5XaGVyZTwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXItYm9keVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dGFyZWEtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicXVlcnktdGV4dGFyZWEtZmllbGRcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxyXG4gICAgICAgICAgPHRleHRhcmVhXHJcbiAgICAgICAgICAgICNxdWVyeVRleHRhcmVhXHJcbiAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInF1ZXJ5VGV4dFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU3RhcnQgdHlwaW5nIHlvdXIgcXVlcnkuLi5cIlxyXG4gICAgICAgICAgICByb3dzPVwiNVwiXHJcbiAgICAgICAgICA+PC90ZXh0YXJlYT5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIFxyXG4gICAgICAgIDwhLS0gQ3VzdG9tIERyb3Bkb3duIC0tPlxyXG4gICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAjZHJvcGRvd25cclxuICAgICAgICAgIGNsYXNzPVwic3VnZ2VzdGlvbnMtZHJvcGRvd25cIiBcclxuICAgICAgICAgIFtjbGFzcy52aXNpYmxlXT1cImlzRHJvcGRvd25WaXNpYmxlXCJcclxuICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiZHJvcGRvd25Qb3NpdGlvbi50b3BcIlxyXG4gICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiZHJvcGRvd25Qb3NpdGlvbi5sZWZ0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBAZm9yIChzdWdnZXN0aW9uIG9mIGZpbHRlcmVkU3VnZ2VzdGlvbnM7IHRyYWNrIHN1Z2dlc3Rpb24uaWQ7IGxldCBpID0gJGluZGV4KSB7XHJcbiAgICAgICAgICAgIDxkaXYgXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzdWdnZXN0aW9uLWl0ZW1cIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpID09PSBzZWxlY3RlZEluZGV4XCJcclxuICAgICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cImlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJvblN1Z2dlc3Rpb25DbGljayhzdWdnZXN0aW9uKVwiXHJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2VsZWN0ZWRJbmRleCA9IGlcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tbWFpblwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdWdnZXN0aW9uLW5hbWVcIj57eyBzdWdnZXN0aW9uLm5hbWUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1Z2dlc3Rpb24tdHlwZVwiPnt7IHN1Z2dlc3Rpb24udHlwZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICBAaWYgKHN1Z2dlc3Rpb24uZGVzY3JpcHRpb24pIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWdnZXN0aW9uLWRlc2NyaXB0aW9uXCI+e3sgc3VnZ2VzdGlvbi5kZXNjcmlwdGlvbiB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKHN1Z2dlc3Rpb24udW5pdCkge1xyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Z2dlc3Rpb24tdW5pdFwiPnt7IHN1Z2dlc3Rpb24udW5pdCB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gRGF0ZSBQaWNrZXIgUG9wdXAgLS0+XHJcbiAgICAgICAgPGRpdiBcclxuICAgICAgICAgIGNsYXNzPVwiZGF0ZS1waWNrZXItcG9wdXBcIiBcclxuICAgICAgICAgIFtjbGFzcy52aXNpYmxlXT1cImlzRGF0ZVBpY2tlclZpc2libGVcIlxyXG4gICAgICAgICAgW3N0eWxlLnRvcC5weF09XCJkYXRlUGlja2VyUG9zaXRpb24udG9wXCJcclxuICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImRhdGVQaWNrZXJQb3NpdGlvbi5sZWZ0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIEBpZiAoIXNob3dEdWFsRGF0ZVBpY2tlcikge1xyXG4gICAgICAgICAgICAgIDwhLS0gU2luZ2xlIERhdGUgUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaW5nbGUtZGF0ZS1waWNrZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoND5TZWxlY3QgRGF0ZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJzaW5nbGVQaWNrZXJcIiAoZGF0ZUNoYW5nZSk9XCJvbkZpcnN0RGF0ZVNlbGVjdGVkKCRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRJY29uU3VmZml4IFtmb3JdPVwic2luZ2xlUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjc2luZ2xlUGlja2VyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICA8IS0tIER1YWwgRGF0ZSBQaWNrZXIgZm9yICdiZXR3ZWVuJyBvcGVyYXRvciAtLT5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHVhbC1kYXRlLXBpY2tlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0PlNlbGVjdCBEYXRlIFJhbmdlPC9oND5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXJhbmdlLWlucHV0c1wiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlN0YXJ0IERhdGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwic3RhcnRQaWNrZXJcIiAoZGF0ZUNoYW5nZSk9XCJvbkZpcnN0RGF0ZVNlbGVjdGVkKCRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdEljb25TdWZmaXggW2Zvcl09XCJzdGFydFBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjc3RhcnRQaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoZmlyc3REYXRlU2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RW5kIERhdGU8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJlbmRQaWNrZXJcIiBbbWluXT1cImZpcnN0RGF0ZVNlbGVjdGVkXCIgKGRhdGVDaGFuZ2UpPVwib25TZWNvbmREYXRlU2VsZWN0ZWQoJGV2ZW50LnZhbHVlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRJY29uU3VmZml4IFtmb3JdPVwiZW5kUGlja2VyXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2VuZFBpY2tlcj48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiaGlkZURhdGVQaWNrZXIoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJxdWVyeS1idWlsZGVyLWZvb3RlclwiPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY2xhc3M9XCJyZXNldC1idG5cIiAoY2xpY2spPVwib25SZXNldCgpXCI+UmVzZXQ8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cImFwcGx5LWJ0blwiIChjbGljayk9XCJvbkFwcGx5KClcIj5BcHBseSBmaWx0ZXJzPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Zvcm0+XHJcbjwvZGl2PlxyXG4iXX0=
|