UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

112 lines 25.3 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, ViewEncapsulation, } from "@angular/core"; import { expandV2 } from "../../animations/expand"; import { KEYBOARD_CODE } from "../../constants/keycode.constants"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../icon/icon.component"; /** * <example-url>./../examples/index.html#/expander</example-url> */ export class ExpanderComponent { /** * Use this to have expander opened by default. */ set open(value) { const previousValue = this.state === "expanded"; if (previousValue !== value) { this.state = value ? "expanded" : "collapsed"; } } get open() { return this.state === "expanded"; } constructor(cdRef) { this.cdRef = cdRef; /** * Adds "disabled" attribute to expander */ this.disabled = false; /** * Adds icon to expander's header */ this.icon = ""; /** * Adds title to expander's header */ this.header = ""; /** * Hides left dotted border of expander. */ this.hideLeftBorder = false; /** * Is emitted when expander is expanded/collapsed */ this.openChange = new EventEmitter(); this.state = "collapsed"; this.isCustomHeaderContentEmpty = false; this.actionKeys = [KEYBOARD_CODE.SPACE, KEYBOARD_CODE.ENTER].map(String); } ngAfterContentInit() { this.isCustomHeaderContentEmpty = this.customHeaderContent.nativeElement.childNodes.length === 0; } toggle() { if (!this.disabled) { this.open = !this.open; this.openChange.emit(this.open); this.cdRef.detectChanges(); } } getIconColor() { return this.disabled ? "gray" : "primary-blue"; } onKeyDown(event) { if (this.actionKeys.includes(event.code)) { if (event.target === event.currentTarget) { event.preventDefault(); this.toggle(); } } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpanderComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ExpanderComponent, selector: "nui-expander", inputs: { disabled: "disabled", icon: "icon", header: "header", hideLeftBorder: "hideLeftBorder", open: "open" }, outputs: { openChange: "openChange" }, viewQueries: [{ propertyName: "customHeaderContent", first: true, predicate: ["customHeaderContent"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"nui-expander\" [class.nui-expander--expanded]=\"state === 'expanded'\">\n <div\n class=\"nui-expander__header\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Expander toggle\"\n [attr.aria-expanded]=\"state === 'expanded'\"\n [attr.aria-disabled]=\"disabled\"\n [class.nui-expander__header--empty]=\"\n !header && isCustomHeaderContentEmpty\n \"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"toggle()\"\n >\n <nui-icon\n class=\"nui-expander__header-icon\"\n [iconColor]=\"getIconColor()\"\n aria-hidden=\"true\"\n icon=\"{{ open ? 'triangle-down' : 'triangle-right' }}\"\n ></nui-icon>\n <div\n class=\"nui-expander__header-content-wrapper\"\n [class.nui-expander__custom-header--empty]=\"\n isCustomHeaderContentEmpty\n \"\n >\n <div\n #customHeaderContent\n class=\"nui-expander__custom-header\"\n [class.nui-expander__custom-header--empty]=\"\n isCustomHeaderContentEmpty\n \"\n >\n <ng-content select=\"[nuiExpanderHeader]\"></ng-content>\n </div>\n <div\n class=\"nui-expander__header-content\"\n *ngIf=\"isCustomHeaderContentEmpty\"\n [class.nui-expander__header-content--with-icon]=\"!!icon\"\n >\n <nui-icon\n class=\"nui-expander__header-content-icon\"\n [icon]=\"icon\"\n *ngIf=\"!!icon\"\n ></nui-icon>\n <span class=\"nui-expander__header-title\">{{ header }}</span>\n </div>\n </div>\n </div>\n <div\n class=\"nui-expander__body-wrapper\"\n role=\"region\"\n [attr.aria-label]=\"header || null\"\n >\n <div\n class=\"nui-expander__body\"\n [class.hide-left-border]=\"hideLeftBorder\"\n *ngIf=\"open\"\n @expandContent\n >\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [".nui-expander--expanded{padding-bottom:5px}.nui-expander__icon{align-items:center;align-self:flex-start;display:flex;flex-shrink:0;height:30px;justify-content:center;width:30px;margin-left:-7px}.nui-expander__header{align-items:center;border-radius:3px;cursor:pointer;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.nui-expander__header:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui-expander__header-title{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;line-height:18px;font-size:13px;font-weight:600;color:#111;color:var(--nui-color-text-default,#111)}.nui-expander__header-icon{align-items:center;align-self:flex-start;display:flex;flex-shrink:0;height:30px;justify-content:center;width:30px}.nui-expander__header-content{align-items:center;display:flex;flex-grow:2;justify-content:flex-start;padding-left:5px;min-width:0;padding-right:5px}.nui-expander__header-content-icon{align-items:center;align-self:flex-start;flex-shrink:0;height:30px;justify-content:center;width:30px}.nui-expander__header-content--with-icon{padding-left:0}.nui-expander__header-content-wrapper{display:flex;flex-grow:2;min-width:0;width:100%}.nui-expander__header.nui-expander__header--empty.nui-expander__header{display:inline-flex}.nui-expander__header.nui-expander__header--empty .nui-expander__header-content{padding-left:0;padding-right:0}.nui-expander__custom-header{width:100%}.nui-expander__custom-header--empty{display:flex;width:auto}.nui-expander__body{border:none;border-left:dotted 2px #d9d9d9;border-left:dotted 2px var(--nui-color-line-default, #d9d9d9);color:#111;color:var(--nui-color-text-default, #111);margin-left:14px;padding-left:14px}.nui-expander__body.hide-left-border{border-left:0}.nui-expander__body.ng-animating{overflow:hidden}.nui-expander__header:focus{outline:none;box-shadow:0 0 0 2px #00c4d280}.nui-expander p{margin:0}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }], animations: [expandV2], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExpanderComponent, decorators: [{ type: Component, args: [{ selector: "nui-expander", animations: [expandV2], encapsulation: ViewEncapsulation.None, template: "<div class=\"nui-expander\" [class.nui-expander--expanded]=\"state === 'expanded'\">\n <div\n class=\"nui-expander__header\"\n tabindex=\"0\"\n role=\"button\"\n aria-label=\"Expander toggle\"\n [attr.aria-expanded]=\"state === 'expanded'\"\n [attr.aria-disabled]=\"disabled\"\n [class.nui-expander__header--empty]=\"\n !header && isCustomHeaderContentEmpty\n \"\n (keydown)=\"onKeyDown($event)\"\n (click)=\"toggle()\"\n >\n <nui-icon\n class=\"nui-expander__header-icon\"\n [iconColor]=\"getIconColor()\"\n aria-hidden=\"true\"\n icon=\"{{ open ? 'triangle-down' : 'triangle-right' }}\"\n ></nui-icon>\n <div\n class=\"nui-expander__header-content-wrapper\"\n [class.nui-expander__custom-header--empty]=\"\n isCustomHeaderContentEmpty\n \"\n >\n <div\n #customHeaderContent\n class=\"nui-expander__custom-header\"\n [class.nui-expander__custom-header--empty]=\"\n isCustomHeaderContentEmpty\n \"\n >\n <ng-content select=\"[nuiExpanderHeader]\"></ng-content>\n </div>\n <div\n class=\"nui-expander__header-content\"\n *ngIf=\"isCustomHeaderContentEmpty\"\n [class.nui-expander__header-content--with-icon]=\"!!icon\"\n >\n <nui-icon\n class=\"nui-expander__header-content-icon\"\n [icon]=\"icon\"\n *ngIf=\"!!icon\"\n ></nui-icon>\n <span class=\"nui-expander__header-title\">{{ header }}</span>\n </div>\n </div>\n </div>\n <div\n class=\"nui-expander__body-wrapper\"\n role=\"region\"\n [attr.aria-label]=\"header || null\"\n >\n <div\n class=\"nui-expander__body\"\n [class.hide-left-border]=\"hideLeftBorder\"\n *ngIf=\"open\"\n @expandContent\n >\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [".nui-expander--expanded{padding-bottom:5px}.nui-expander__icon{align-items:center;align-self:flex-start;display:flex;flex-shrink:0;height:30px;justify-content:center;width:30px;margin-left:-7px}.nui-expander__header{align-items:center;border-radius:3px;cursor:pointer;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.nui-expander__header:hover{background-color:var(--nui-color-bg-transparent-hover,rgba(17, 17, 17, .05))}.nui-expander__header-title{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;line-height:18px;font-size:13px;font-weight:600;color:#111;color:var(--nui-color-text-default,#111)}.nui-expander__header-icon{align-items:center;align-self:flex-start;display:flex;flex-shrink:0;height:30px;justify-content:center;width:30px}.nui-expander__header-content{align-items:center;display:flex;flex-grow:2;justify-content:flex-start;padding-left:5px;min-width:0;padding-right:5px}.nui-expander__header-content-icon{align-items:center;align-self:flex-start;flex-shrink:0;height:30px;justify-content:center;width:30px}.nui-expander__header-content--with-icon{padding-left:0}.nui-expander__header-content-wrapper{display:flex;flex-grow:2;min-width:0;width:100%}.nui-expander__header.nui-expander__header--empty.nui-expander__header{display:inline-flex}.nui-expander__header.nui-expander__header--empty .nui-expander__header-content{padding-left:0;padding-right:0}.nui-expander__custom-header{width:100%}.nui-expander__custom-header--empty{display:flex;width:auto}.nui-expander__body{border:none;border-left:dotted 2px #d9d9d9;border-left:dotted 2px var(--nui-color-line-default, #d9d9d9);color:#111;color:var(--nui-color-text-default, #111);margin-left:14px;padding-left:14px}.nui-expander__body.hide-left-border{border-left:0}.nui-expander__body.ng-animating{overflow:hidden}.nui-expander__header:focus{outline:none;box-shadow:0 0 0 2px #00c4d280}.nui-expander p{margin:0}\n"] }] }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { disabled: [{ type: Input }], icon: [{ type: Input }], header: [{ type: Input }], hideLeftBorder: [{ type: Input }], open: [{ type: Input }], openChange: [{ type: Output }], customHeaderContent: [{ type: ViewChild, args: ["customHeaderContent", { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9leHBhbmRlci9leHBhbmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2V4cGFuZGVyL2V4cGFuZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7O0FBRWxFOztHQUVHO0FBUUgsTUFBTSxPQUFPLGlCQUFpQjtJQWlCMUI7O09BRUc7SUFDSCxJQUFhLElBQUksQ0FBQyxLQUFjO1FBQzVCLE1BQU0sYUFBYSxHQUFZLElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDO1FBQ3pELElBQUksYUFBYSxLQUFLLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7U0FDakQ7SUFDTCxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQztJQUNyQyxDQUFDO0lBY0QsWUFBb0IsS0FBd0I7UUFBeEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUExQzVDOztXQUVHO1FBQ00sYUFBUSxHQUFZLEtBQUssQ0FBQztRQUNuQzs7V0FFRztRQUNNLFNBQUksR0FBVyxFQUFFLENBQUM7UUFDM0I7O1dBRUc7UUFDTSxXQUFNLEdBQVcsRUFBRSxDQUFDO1FBQzdCOztXQUVHO1FBQ00sbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFjekM7O1dBRUc7UUFDTyxlQUFVLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFLbkUsVUFBSyxHQUE2QixXQUFXLENBQUM7UUFDOUMsK0JBQTBCLEdBQVksS0FBSyxDQUFDO1FBRTNDLGVBQVUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU3QixDQUFDO0lBRXpDLGtCQUFrQjtRQUNyQixJQUFJLENBQUMsMEJBQTBCO1lBQzNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLE1BQU07UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNoQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFTSxZQUFZO1FBQ2YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNuRCxDQUFDO0lBRU0sU0FBUyxDQUFDLEtBQW9CO1FBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsYUFBYSxFQUFFO2dCQUN0QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNqQjtTQUNKO0lBQ0wsQ0FBQzsrR0FyRVEsaUJBQWlCO21HQUFqQixpQkFBaUIsdVZDN0M5Qixnc0VBZ0VBLDJ6RUR2QmdCLENBQUMsUUFBUSxDQUFDOzs0RkFJYixpQkFBaUI7a0JBUDdCLFNBQVM7K0JBQ0ksY0FBYyxjQUVaLENBQUMsUUFBUSxDQUFDLGlCQUVQLGlCQUFpQixDQUFDLElBQUk7c0ZBTTVCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsSUFBSTtzQkFBWixLQUFLO2dCQUlHLE1BQU07c0JBQWQsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlPLElBQUk7c0JBQWhCLEtBQUs7Z0JBYUksVUFBVTtzQkFBbkIsTUFBTTtnQkFHQSxtQkFBbUI7c0JBRHpCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgZXhwYW5kVjIgfSBmcm9tIFwiLi4vLi4vYW5pbWF0aW9ucy9leHBhbmRcIjtcbmltcG9ydCB7IEtFWUJPQVJEX0NPREUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzL2tleWNvZGUuY29uc3RhbnRzXCI7XG5cbi8qKlxuICogPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvZXhwYW5kZXI8L2V4YW1wbGUtdXJsPlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogXCJudWktZXhwYW5kZXJcIixcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2V4cGFuZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgYW5pbWF0aW9uczogW2V4cGFuZFYyXSxcbiAgICBzdHlsZVVybHM6IFtcIi4vZXhwYW5kZXIuY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRXhwYW5kZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgICAvKipcbiAgICAgKiBBZGRzIFwiZGlzYWJsZWRcIiBhdHRyaWJ1dGUgdG8gZXhwYW5kZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEFkZHMgaWNvbiB0byBleHBhbmRlcidzIGhlYWRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGljb246IHN0cmluZyA9IFwiXCI7XG4gICAgLyoqXG4gICAgICogQWRkcyB0aXRsZSB0byBleHBhbmRlcidzIGhlYWRlclxuICAgICAqL1xuICAgIEBJbnB1dCgpIGhlYWRlcjogc3RyaW5nID0gXCJcIjtcbiAgICAvKipcbiAgICAgKiBIaWRlcyBsZWZ0IGRvdHRlZCBib3JkZXIgb2YgZXhwYW5kZXIuXG4gICAgICovXG4gICAgQElucHV0KCkgaGlkZUxlZnRCb3JkZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBVc2UgdGhpcyB0byBoYXZlIGV4cGFuZGVyIG9wZW5lZCBieSBkZWZhdWx0LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCBvcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmFsdWU6IGJvb2xlYW4gPSB0aGlzLnN0YXRlID09PSBcImV4cGFuZGVkXCI7XG4gICAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHZhbHVlID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gXCJleHBhbmRlZFwiO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJcyBlbWl0dGVkIHdoZW4gZXhwYW5kZXIgaXMgZXhwYW5kZWQvY29sbGFwc2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIEBWaWV3Q2hpbGQoXCJjdXN0b21IZWFkZXJDb250ZW50XCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgcHVibGljIGN1c3RvbUhlYWRlckNvbnRlbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgc3RhdGU6IFwiZXhwYW5kZWRcIiB8IFwiY29sbGFwc2VkXCIgPSBcImNvbGxhcHNlZFwiO1xuICAgIHB1YmxpYyBpc0N1c3RvbUhlYWRlckNvbnRlbnRFbXB0eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBhY3Rpb25LZXlzID0gW0tFWUJPQVJEX0NPREUuU1BBQ0UsIEtFWUJPQVJEX0NPREUuRU5URVJdLm1hcChTdHJpbmcpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzQ3VzdG9tSGVhZGVyQ29udGVudEVtcHR5ID1cbiAgICAgICAgICAgIHRoaXMuY3VzdG9tSGVhZGVyQ29udGVudC5uYXRpdmVFbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAwO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5vcGVuID0gIXRoaXMub3BlbjtcbiAgICAgICAgICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KHRoaXMub3Blbik7XG4gICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJY29uQ29sb3IoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyBcImdyYXlcIiA6IFwicHJpbWFyeS1ibHVlXCI7XG4gICAgfVxuXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25LZXlzLmluY2x1ZGVzKGV2ZW50LmNvZGUpKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm51aS1leHBhbmRlclwiIFtjbGFzcy5udWktZXhwYW5kZXItLWV4cGFuZGVkXT1cInN0YXRlID09PSAnZXhwYW5kZWQnXCI+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm51aS1leHBhbmRlcl9faGVhZGVyXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJFeHBhbmRlciB0b2dnbGVcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInN0YXRlID09PSAnZXhwYW5kZWQnXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIFtjbGFzcy5udWktZXhwYW5kZXJfX2hlYWRlci0tZW1wdHldPVwiXG4gICAgICAgICAgICAhaGVhZGVyICYmIGlzQ3VzdG9tSGVhZGVyQ29udGVudEVtcHR5XG4gICAgICAgIFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICA+XG4gICAgICAgIDxudWktaWNvblxuICAgICAgICAgICAgY2xhc3M9XCJudWktZXhwYW5kZXJfX2hlYWRlci1pY29uXCJcbiAgICAgICAgICAgIFtpY29uQ29sb3JdPVwiZ2V0SWNvbkNvbG9yKClcIlxuICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgIGljb249XCJ7eyBvcGVuID8gJ3RyaWFuZ2xlLWRvd24nIDogJ3RyaWFuZ2xlLXJpZ2h0JyB9fVwiXG4gICAgICAgID48L251aS1pY29uPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm51aS1leHBhbmRlcl9faGVhZGVyLWNvbnRlbnQtd3JhcHBlclwiXG4gICAgICAgICAgICBbY2xhc3MubnVpLWV4cGFuZGVyX19jdXN0b20taGVhZGVyLS1lbXB0eV09XCJcbiAgICAgICAgICAgICAgICBpc0N1c3RvbUhlYWRlckNvbnRlbnRFbXB0eVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICNjdXN0b21IZWFkZXJDb250ZW50XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJudWktZXhwYW5kZXJfX2N1c3RvbS1oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5udWktZXhwYW5kZXJfX2N1c3RvbS1oZWFkZXItLWVtcHR5XT1cIlxuICAgICAgICAgICAgICAgICAgICBpc0N1c3RvbUhlYWRlckNvbnRlbnRFbXB0eVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW251aUV4cGFuZGVySGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibnVpLWV4cGFuZGVyX19oZWFkZXItY29udGVudFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0N1c3RvbUhlYWRlckNvbnRlbnRFbXB0eVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm51aS1leHBhbmRlcl9faGVhZGVyLWNvbnRlbnQtLXdpdGgtaWNvbl09XCIhIWljb25cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxudWktaWNvblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm51aS1leHBhbmRlcl9faGVhZGVyLWNvbnRlbnQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEhaWNvblwiXG4gICAgICAgICAgICAgICAgPjwvbnVpLWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJudWktZXhwYW5kZXJfX2hlYWRlci10aXRsZVwiPnt7IGhlYWRlciB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibnVpLWV4cGFuZGVyX19ib2R5LXdyYXBwZXJcIlxuICAgICAgICByb2xlPVwicmVnaW9uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJoZWFkZXIgfHwgbnVsbFwiXG4gICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cIm51aS1leHBhbmRlcl9fYm9keVwiXG4gICAgICAgICAgICBbY2xhc3MuaGlkZS1sZWZ0LWJvcmRlcl09XCJoaWRlTGVmdEJvcmRlclwiXG4gICAgICAgICAgICAqbmdJZj1cIm9wZW5cIlxuICAgICAgICAgICAgQGV4cGFuZENvbnRlbnRcbiAgICAgICAgPlxuICAgICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19