UNPKG

@versatiledatakit/shared

Version:

Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.

209 lines 31.3 kB
/* * Copyright 2023-2025 Broadcom * SPDX-License-Identifier: Apache-2.0 */ /* eslint-disable */ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { FormControl } from '@angular/forms'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { debounceTime } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/common"; const _c0 = ["searchButton"]; function VdkSearchComponent_ng_container_3_button_1_Template(rf, ctx) { if (rf & 1) { const _r6 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 7); i0.ɵɵlistener("click", function VdkSearchComponent_ng_container_3_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.clearSearch(); }); i0.ɵɵelement(1, "cds-icon", 8); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r2 = i0.ɵɵnextContext(2); i0.ɵɵproperty("title", ctx_r2.clearSearchTitle); i0.ɵɵattribute("aria-label", ctx_r2.clearSearchTitle); } } function VdkSearchComponent_ng_container_3_ng_template_2_Template(rf, ctx) { if (rf & 1) { const _r9 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 9, 10); i0.ɵɵlistener("click", function VdkSearchComponent_ng_container_3_ng_template_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(2); return ctx_r8.triggerSearch(); }); i0.ɵɵtext(2); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵattribute("disabled", +(ctx_r4.searchQueryValue == null ? null : ctx_r4.searchQueryValue.length) < ctx_r4.searchTermMinimalLength ? "" : null)("aria-label", ctx_r4.searchButtonAriaLabelText || null); i0.ɵɵadvance(2); i0.ɵɵtextInterpolate1(" ", ctx_r4.searchButtonText, " "); } } function VdkSearchComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementContainerStart(0); i0.ɵɵtemplate(1, VdkSearchComponent_ng_container_3_button_1_Template, 2, 2, "button", 5); i0.ɵɵtemplate(2, VdkSearchComponent_ng_container_3_ng_template_2_Template, 3, 3, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const _r3 = i0.ɵɵreference(3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", !ctx_r0.showSearchButton || !ctx_r0.isSeachButtonVisible)("ngIfElse", _r3); } } function VdkSearchComponent_clr_control_helper_4_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "clr-control-helper", 11); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r1.helperText); } } const defaultSearchInputPadding = 24; export class VdkSearchComponent { constructor() { this.searchInputPaddingRight = `${defaultSearchInputPadding}px`; this._disabled = false; this.searchQueryValue = ''; this.clearSearchTitle = 'Clear Search'; this.helperText = ''; this.debounceTime = 100; this.searchTermMinimalLength = 2; this.showSearchButton = false; this.searchButtonText = 'Search'; this.searchButtonAriaLabelText = 'Search'; this.search = new EventEmitter(); this.triggerSearch$ = new BehaviorSubject(undefined); this.focused = false; this.finalPlaceholder = 'Search'; } get disabled() { return this._disabled; } set disabled(value) { this._disabled = value; if (value) { this.searchQuery?.disable({ emitEvent: false }); } else { this.searchQuery?.enable({ emitEvent: false }); } } set placeholder(pass) { this.finalPlaceholder = pass ? pass : 'Search'; } ngOnInit() { this.searchQuery = new FormControl(this.searchQueryValue); this.searchQuerySub = combineLatest([this.searchQuery.valueChanges, this.triggerSearch$]) .pipe(debounceTime(this.debounceTime)) .subscribe(([query]) => { const queryLength = query.length; query = query.trim(); this.searchQueryValue = query; // not emit search event if it hasn't been inputted something different from whitespace if (this.searchQueryValue.length === 0 && queryLength !== 0) { return; } // Make sure that the 'Search' button will be visible in 'Manual Search' mode upon every change. this.isSeachButtonVisible = this.showSearchButton; const shouldNotifyForQueryChange = !this.showSearchButton || this.hasSearchBeenTriggeredManually; const inputHasMinLengthOrIsCleared = this.searchQueryValue.length >= this.searchTermMinimalLength || this.searchQueryValue.length === 0; if (shouldNotifyForQueryChange && inputHasMinLengthOrIsCleared) { // If we are about to notify that the search term has changed replace 'Search' button with the `X` one. this.isSeachButtonVisible = false; this.search.emit(query); } this.hasSearchBeenTriggeredManually = false; this.computeSearchInputPadding(); }); } ngOnDestroy() { if (this.searchQuerySub) { this.searchQuerySub.unsubscribe(); } } clearSearch() { this.searchQuery.setValue(''); if (this.showSearchButton) { this.triggerSearch(); } } handleKeyDown(event) { if (event.key === 'Enter') { this.triggerSearch(); } } triggerSearch() { this.hasSearchBeenTriggeredManually = true; this.triggerSearch$.next(); } computeSearchInputPadding() { if (this.showSearchButton && this.isSeachButtonVisible) { // Wait for the search button to be rendered as changes 'shouldShowSearchButton' might not be applied in the template. // Useful especially after the first rendering. setTimeout(() => { this.searchInputPaddingRight = Math.round(this.searchButton?.nativeElement.clientWidth || defaultSearchInputPadding) + 'px'; }); } else { this.searchInputPaddingRight = `${defaultSearchInputPadding}px`; } } } VdkSearchComponent.ɵfac = function VdkSearchComponent_Factory(t) { return new (t || VdkSearchComponent)(); }; VdkSearchComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VdkSearchComponent, selectors: [["vdk-search"]], viewQuery: function VdkSearchComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5, ElementRef); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchButton = _t.first); } }, inputs: { disabled: "disabled", searchQueryValue: "searchQueryValue", clearSearchTitle: "clearSearchTitle", placeholder: "placeholder", helperText: "helperText", debounceTime: "debounceTime", searchTermMinimalLength: "searchTermMinimalLength", showSearchButton: "showSearchButton", searchButtonText: "searchButtonText", searchButtonAriaLabelText: "searchButtonAriaLabelText", searchAriaLabelText: "searchAriaLabelText" }, outputs: { search: "search" }, decls: 5, vars: 13, consts: [[1, "search-container"], ["shape", "search", "size", "18", "data-test-id", "search-icon"], ["type", "text", "data-test-id", "search-input", 1, "clr-input", 3, "value", "formControl", "placeholder", "focus", "blur", "keydown"], [4, "ngIf"], ["data-test-id", "search-results-text", 4, "ngIf"], ["class", "clear-search-btn", "data-test-id", "clear-search-btn", "type", "button", 3, "title", "click", 4, "ngIf", "ngIfElse"], ["searchButtonSection", ""], ["data-test-id", "clear-search-btn", "type", "button", 1, "clear-search-btn", 3, "title", "click"], ["shape", "times-circle", "size", "16"], ["data-test-id", "search-button", 1, "btn", "btn-link", 3, "click"], ["searchButton", ""], ["data-test-id", "search-results-text"]], template: function VdkSearchComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 0); i0.ɵɵelement(1, "cds-icon", 1); i0.ɵɵelementStart(2, "input", 2); i0.ɵɵlistener("focus", function VdkSearchComponent_Template_input_focus_2_listener() { return ctx.focused = true; })("blur", function VdkSearchComponent_Template_input_blur_2_listener() { return ctx.focused = false; })("keydown", function VdkSearchComponent_Template_input_keydown_2_listener($event) { return ctx.handleKeyDown($event); }); i0.ɵɵelementEnd(); i0.ɵɵtemplate(3, VdkSearchComponent_ng_container_3_Template, 4, 2, "ng-container", 3); i0.ɵɵtemplate(4, VdkSearchComponent_clr_control_helper_4_Template, 2, 1, "clr-control-helper", 4); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵclassProp("disabled", ctx.disabled)("focused", ctx.focused); i0.ɵɵadvance(1); i0.ɵɵattribute("class", ctx.searchQueryValue ? "is-highlight" : ""); i0.ɵɵadvance(1); i0.ɵɵstyleProp("padding-right", ctx.searchInputPaddingRight); i0.ɵɵproperty("value", ctx.searchQueryValue)("formControl", ctx.searchQuery)("placeholder", ctx.finalPlaceholder); i0.ɵɵattribute("aria-label", ctx.searchAriaLabelText || ctx.finalPlaceholder); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.searchQueryValue); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx.helperText); } }, directives: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.NgIf], styles: ["[_nghost-%COMP%]{width:200px;display:block}.search-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;position:relative;width:100%;margin-bottom:0;margin:.5rem 0}.search-container.disabled[_ngcontent-%COMP%]{cursor:not-allowed}.search-container.disabled[_ngcontent-%COMP%] *[_ngcontent-%COMP%]{pointer-events:none}.search-container.disabled[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:#888}.search-container.disabled[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{fill:#888}.search-container.disabled[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#888}.search-container[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{height:18px;position:absolute;top:3px;left:0}.search-container.focused[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{fill:var(--clr-forms-focused-color);stroke:var(--clr-forms-focused-color);stroke-width:.75px}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%]{position:absolute;top:-1px;right:0;padding:0;border:transparent;background-color:transparent}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#565656;opacity:.8}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]:hover{cursor:pointer;opacity:1}.search-container[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]{position:absolute;right:0;top:-6px;margin:0}.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{padding:0 24px;flex:1 1 24px}.dark[_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%]{color:#d3d3d3}.dark[_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%], .dark [_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#acbac3}"] }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VdkSearchComponent, [{ type: Component, args: [{ selector: 'vdk-search', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<div\n class=\"search-container\"\n [class.disabled]=\"disabled\"\n [class.focused]=\"focused\"\n>\n <cds-icon\n shape=\"search\"\n size=\"18\"\n [attr.class]=\"searchQueryValue ? 'is-highlight' : ''\"\n data-test-id=\"search-icon\"\n >\n </cds-icon>\n\n <input\n type=\"text\"\n (focus)=\"focused = true\"\n (blur)=\"focused = false\"\n (keydown)=\"handleKeyDown($event)\"\n class=\"clr-input\"\n [attr.aria-label]=\"searchAriaLabelText || finalPlaceholder\"\n [value]=\"searchQueryValue\"\n [formControl]=\"searchQuery\"\n [placeholder]=\"finalPlaceholder\"\n [style.padding-right]=\"searchInputPaddingRight\"\n data-test-id=\"search-input\"\n />\n\n <ng-container *ngIf=\"searchQueryValue\">\n <button\n *ngIf=\"!showSearchButton || !isSeachButtonVisible; else searchButtonSection\"\n class=\"clear-search-btn\"\n [title]=\"clearSearchTitle\"\n [attr.aria-label]=\"clearSearchTitle\"\n (click)=\"clearSearch()\"\n data-test-id=\"clear-search-btn\"\n type=\"button\"\n >\n <cds-icon shape=\"times-circle\" size=\"16\"> </cds-icon>\n </button>\n\n <ng-template #searchButtonSection>\n <button\n class=\"btn btn-link\"\n #searchButton\n data-test-id=\"search-button\"\n [attr.disabled]=\"+searchQueryValue?.length < searchTermMinimalLength ? '': null\"\n [attr.aria-label]=\"searchButtonAriaLabelText || null\"\n (click)=\"triggerSearch()\"\n >\n {{ searchButtonText }}\n </button>\n </ng-template>\n </ng-container>\n\n <clr-control-helper *ngIf=\"helperText\" data-test-id=\"search-results-text\"\n >{{helperText}}</clr-control-helper\n >\n</div>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */:host{width:200px;display:block}.search-container{display:flex;flex-direction:column;position:relative;width:100%;margin-bottom:0;margin:.5rem 0}.search-container.disabled{cursor:not-allowed}.search-container.disabled *{pointer-events:none}.search-container.disabled input{color:#888}.search-container.disabled cds-icon[shape=search]{fill:#888}.search-container.disabled .clear-search-btn cds-icon[shape=times-circle]{fill:#888}.search-container cds-icon[shape=search]{height:18px;position:absolute;top:3px;left:0}.search-container.focused cds-icon[shape=search]{fill:var(--clr-forms-focused-color);stroke:var(--clr-forms-focused-color);stroke-width:.75px}.search-container .clear-search-btn{position:absolute;top:-1px;right:0;padding:0;border:transparent;background-color:transparent}.search-container .clear-search-btn cds-icon[shape=times-circle]{fill:#565656;opacity:.8}.search-container .clear-search-btn cds-icon[shape=times-circle]:hover{cursor:pointer;opacity:1}.search-container .btn-link{position:absolute;right:0;top:-6px;margin:0}.search-container input{padding:0 24px;flex:1 1 24px}:host-context(.dark) .clear-search-btn{color:#d3d3d3}:host-context(.dark) .clear-search-btn cds-icon[shape=times-circle]{fill:#acbac3}\n"] }] }], null, { disabled: [{ type: Input, args: ['disabled'] }], searchQueryValue: [{ type: Input }], clearSearchTitle: [{ type: Input }], placeholder: [{ type: Input, args: ['placeholder'] }], helperText: [{ type: Input }], debounceTime: [{ type: Input }], searchTermMinimalLength: [{ type: Input }], showSearchButton: [{ type: Input }], searchButtonText: [{ type: Input }], searchButtonAriaLabelText: [{ type: Input }], searchAriaLabelText: [{ type: Input }], search: [{ type: Output }], searchButton: [{ type: ViewChild, args: ['searchButton', { read: ElementRef }] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbW1vbnMvbmd4LWNvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21tb25zL25neC1jb21wb25lbnRzL3NlYXJjaC9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsb0JBQW9CO0FBRXBCLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQXlCLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztJQ3NCdEMsaUNBUUM7SUFIRyxrTEFBUyxvQkFBYSxJQUFDO0lBSXZCLDhCQUFxRDtJQUN6RCxpQkFBUzs7O0lBUEwsK0NBQTBCO0lBQzFCLHFEQUFvQzs7OztJQVNwQyxxQ0FPQztJQURHLHVMQUFTLHNCQUFlLElBQUM7SUFFekIsWUFDSjtJQUFBLGlCQUFTOzs7SUFMTCxtSkFBZ0Ysd0RBQUE7SUFJaEYsZUFDSjtJQURJLHdEQUNKOzs7SUF2QlIsNkJBQXVDO0lBQ25DLHdGQVVTO0lBRVQsbUlBV2M7SUFDbEIsMEJBQWU7Ozs7SUF2Qk4sZUFBa0Q7SUFBbEQsK0VBQWtELGlCQUFBOzs7SUF5QjNELDhDQUNLO0lBQUEsWUFBYztJQUFBLGlCQUNsQjs7O0lBREksZUFBYztJQUFkLHVDQUFjOztBRC9DdkIsTUFBTSx5QkFBeUIs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USxVQUFVOzs7OztRQ2xEakQsOEJBSUM7UUFDRyw4QkFNVztRQUVYLGdDQVlFO1FBVkUsNEdBQW1CLElBQUksSUFBQyw2RkFDTixLQUFLLElBREMsMkZBRWIseUJBQXFCLElBRlI7UUFGNUIsaUJBWUU7UUFFRixxRkF5QmU7UUFFZixpR0FFQztRQUNMLGlCQUFNOztRQXZERix3Q0FBMkIsd0JBQUE7UUFNdkIsZUFBcUQ7UUFBckQsbUVBQXFEO1FBZXJELGVBQStDO1FBQS9DLDREQUErQztRQUgvQyw0Q0FBMEIsZ0NBQUEscUNBQUE7UUFEMUIsNkVBQTJEO1FBUWhELGVBQXNCO1FBQXRCLDJDQUFzQjtRQTJCaEIsZUFBZ0I7UUFBaEIscUNBQWdCOzt1RkR2QzVCLGtCQUFrQjtjQUw5QixTQUFTOzJCQUNJLFlBQVk7Z0JBWVgsUUFBUTtrQkFEbEIsS0FBSzttQkFBQyxVQUFVO1lBV1IsZ0JBQWdCO2tCQUF4QixLQUFLO1lBQ0csZ0JBQWdCO2tCQUF4QixLQUFLO1lBRUYsV0FBVztrQkFEZCxLQUFLO21CQUFDLGFBQWE7WUFLWCxVQUFVO2tCQUFsQixLQUFLO1lBQ0csWUFBWTtrQkFBcEIsS0FBSztZQUNHLHVCQUF1QjtrQkFBL0IsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLHlCQUF5QjtrQkFBakMsS0FBSztZQUNHLG1CQUFtQjtrQkFBM0IsS0FBSztZQUVJLE1BQU07a0JBQWYsTUFBTTtZQUdQLFlBQVk7a0JBRFgsU0FBUzttQkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IGRlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmcgPSAyNDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd2ZGstc2VhcmNoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2guY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWZGtTZWFyY2hDb21wb25lbnQge1xuICAgIHNlYXJjaElucHV0UGFkZGluZ1JpZ2h0ID0gYCR7ZGVmYXVsdFNlYXJjaElucHV0UGFkZGluZ31weGA7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgQElucHV0KCdkaXNhYmxlZCcpXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5Py5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2VhcmNoUXVlcnlWYWx1ZTogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgY2xlYXJTZWFyY2hUaXRsZTogc3RyaW5nID0gJ0NsZWFyIFNlYXJjaCc7XG4gICAgQElucHV0KCdwbGFjZWhvbGRlcicpXG4gICAgc2V0IHBsYWNlaG9sZGVyKHBhc3M6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbmFsUGxhY2Vob2xkZXIgPSBwYXNzID8gcGFzcyA6ICdTZWFyY2gnO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIGRlYm91bmNlVGltZTogbnVtYmVyID0gMTAwO1xuICAgIEBJbnB1dCgpIHNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoOiBudW1iZXIgPSAyO1xuICAgIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b24gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzZWFyY2hCdXR0b25UZXh0OiBzdHJpbmcgPSAnU2VhcmNoJztcbiAgICBASW5wdXQoKSBzZWFyY2hCdXR0b25BcmlhTGFiZWxUZXh0OiBzdHJpbmcgPSAnU2VhcmNoJztcbiAgICBASW5wdXQoKSBzZWFyY2hBcmlhTGFiZWxUZXh0OiBzdHJpbmc7XG5cbiAgICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHNlYXJjaEJ1dHRvbj86IEVsZW1lbnRSZWY7XG4gICAgaXNTZWFjaEJ1dHRvblZpc2libGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHRyaWdnZXJTZWFyY2gkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgaGFzU2VhcmNoQmVlblRyaWdnZXJlZE1hbnVhbGx5OiBib29sZWFuO1xuXG4gICAgcHVibGljIHNlYXJjaFF1ZXJ5OiBGb3JtQ29udHJvbDtcbiAgICBwdWJsaWMgc2VhcmNoUXVlcnlTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaW5hbFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoJztcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VhcmNoUXVlcnlWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVN1YiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2VhcmNoUXVlcnkudmFsdWVDaGFuZ2VzLCB0aGlzLnRyaWdnZXJTZWFyY2gkXSlcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbcXVlcnldKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlMZW5ndGggPSBxdWVyeS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS50cmltKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVZhbHVlID0gcXVlcnk7XG5cbiAgICAgICAgICAgICAgICAvLyBub3QgZW1pdCBzZWFyY2ggZXZlbnQgaWYgaXQgaGFzbid0IGJlZW4gaW5wdXR0ZWQgc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hRdWVyeVZhbHVlLmxlbmd0aCA9PT0gMCAmJiBxdWVyeUxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlICdTZWFyY2gnIGJ1dHRvbiB3aWxsIGJlIHZpc2libGUgaW4gJ01hbnVhbCBTZWFyY2gnIG1vZGUgdXBvbiBldmVyeSBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlYWNoQnV0dG9uVmlzaWJsZSA9IHRoaXMuc2hvd1NlYXJjaEJ1dHRvbjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZE5vdGlmeUZvclF1ZXJ5Q2hhbmdlID0gIXRoaXMuc2hvd1NlYXJjaEJ1dHRvbiB8fCB0aGlzLmhhc1NlYXJjaEJlZW5UcmlnZ2VyZWRNYW51YWxseTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEhhc01pbkxlbmd0aE9ySXNDbGVhcmVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoIHx8IHRoaXMuc2VhcmNoUXVlcnlWYWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZE5vdGlmeUZvclF1ZXJ5Q2hhbmdlICYmIGlucHV0SGFzTWluTGVuZ3RoT3JJc0NsZWFyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGFib3V0IHRvIG5vdGlmeSB0aGF0IHRoZSBzZWFyY2ggdGVybSBoYXMgY2hhbmdlZCByZXBsYWNlICdTZWFyY2gnIGJ1dHRvbiB3aXRoIHRoZSBgWGAgb25lLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VhY2hCdXR0b25WaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLmVtaXQocXVlcnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2VhcmNoQmVlblRyaWdnZXJlZE1hbnVhbGx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlU2VhcmNoSW5wdXRQYWRkaW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnlTdWIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnlTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5LnNldFZhbHVlKCcnKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1NlYXJjaEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlclNlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNTZWFyY2hCZWVuVHJpZ2dlcmVkTWFudWFsbHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJTZWFyY2gkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVTZWFyY2hJbnB1dFBhZGRpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hCdXR0b24gJiYgdGhpcy5pc1NlYWNoQnV0dG9uVmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNlYXJjaCBidXR0b24gdG8gYmUgcmVuZGVyZWQgYXMgY2hhbmdlcyAnc2hvdWxkU2hvd1NlYXJjaEJ1dHRvbicgbWlnaHQgbm90IGJlIGFwcGxpZWQgaW4gdGhlIHRlbXBsYXRlLlxuICAgICAgICAgICAgLy8gVXNlZnVsIGVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlcmluZy5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRQYWRkaW5nUmlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuc2VhcmNoQnV0dG9uPy5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IGRlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmcpICsgJ3B4JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dFBhZGRpbmdSaWdodCA9IGAke2RlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmd9cHhgO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPCEtLVxuICAgfiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gICB+IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gIC0tPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtjbGFzcy5mb2N1c2VkXT1cImZvY3VzZWRcIlxuPlxuICAgIDxjZHMtaWNvblxuICAgICAgICBzaGFwZT1cInNlYXJjaFwiXG4gICAgICAgIHNpemU9XCIxOFwiXG4gICAgICAgIFthdHRyLmNsYXNzXT1cInNlYXJjaFF1ZXJ5VmFsdWUgPyAnaXMtaGlnaGxpZ2h0JyA6ICcnXCJcbiAgICAgICAgZGF0YS10ZXN0LWlkPVwic2VhcmNoLWljb25cIlxuICAgID5cbiAgICA8L2Nkcy1pY29uPlxuXG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgKGZvY3VzKT1cImZvY3VzZWQgPSB0cnVlXCJcbiAgICAgICAgKGJsdXIpPVwiZm9jdXNlZCA9IGZhbHNlXCJcbiAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjbHItaW5wdXRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNlYXJjaEFyaWFMYWJlbFRleHQgfHwgZmluYWxQbGFjZWhvbGRlclwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hRdWVyeVZhbHVlXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFF1ZXJ5XCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbmFsUGxhY2Vob2xkZXJcIlxuICAgICAgICBbc3R5bGUucGFkZGluZy1yaWdodF09XCJzZWFyY2hJbnB1dFBhZGRpbmdSaWdodFwiXG4gICAgICAgIGRhdGEtdGVzdC1pZD1cInNlYXJjaC1pbnB1dFwiXG4gICAgLz5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hRdWVyeVZhbHVlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiIXNob3dTZWFyY2hCdXR0b24gfHwgIWlzU2VhY2hCdXR0b25WaXNpYmxlOyBlbHNlIHNlYXJjaEJ1dHRvblNlY3Rpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJjbGVhclNlYXJjaFRpdGxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xlYXJTZWFyY2hUaXRsZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXG4gICAgICAgICAgICBkYXRhLXRlc3QtaWQ9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8Y2RzLWljb24gc2hhcGU9XCJ0aW1lcy1jaXJjbGVcIiBzaXplPVwiMTZcIj4gPC9jZHMtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzZWFyY2hCdXR0b25TZWN0aW9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAjc2VhcmNoQnV0dG9uXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0LWlkPVwic2VhcmNoLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiK3NlYXJjaFF1ZXJ5VmFsdWU/Lmxlbmd0aCA8IHNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoID8gJyc6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2VhcmNoQnV0dG9uQXJpYUxhYmVsVGV4dCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlclNlYXJjaCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzZWFyY2hCdXR0b25UZXh0IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxjbHItY29udHJvbC1oZWxwZXIgKm5nSWY9XCJoZWxwZXJUZXh0XCIgZGF0YS10ZXN0LWlkPVwic2VhcmNoLXJlc3VsdHMtdGV4dFwiXG4gICAgICAgID57e2hlbHBlclRleHR9fTwvY2xyLWNvbnRyb2wtaGVscGVyXG4gICAgPlxuPC9kaXY+XG4iXX0=