UNPKG

ng-devui

Version:

DevUI components based on Angular

67 lines 24.7 kB
import { ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Output, QueryList, Renderer2 } from '@angular/core'; import { TableThComponent } from '../head/th/th.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/forms"; import * as i3 from "ng-devui/checkbox"; import * as i4 from "ng-devui/dropdown"; import * as i5 from "ng-devui/popover"; export class TableTrComponent { constructor(eleRef, render2, cdr) { this.eleRef = eleRef; this.render2 = render2; this.cdr = cdr; this.headerRowspan = 1; this.checkOptionsIndex = 1050; this.curLabel = ''; this.showTip = false; this.selectOptionOnCheckbox = false; this.headerCheckStatusEvent = new EventEmitter(); this.checkStatusEvent = new EventEmitter(); } ngOnInit() { } ngAfterViewInit() { if (this.thList) { this.firstTh = this.thList.first; } this.initFixedColumnStatus(); this.cdr.detectChanges(); } initFixedColumnStatus() { const fixLeftList = this.eleRef.nativeElement.querySelectorAll('.devui-sticky-left-cell'); const fixRightList = this.eleRef.nativeElement.querySelectorAll('.devui-sticky-right-cell'); if (fixLeftList?.length) { const lastEle = fixLeftList[fixLeftList.length - 1]; this.render2.addClass(lastEle, 'devui-last-sticky-left-cell'); } if (fixRightList?.length) { const firstEle = fixRightList[0]; this.render2.addClass(firstEle, 'devui-first-sticky-right-cell'); } } onHeaderCheckChange(checked) { this.headerChecked = checked; this.headerHalfChecked = false; this.headerCheckStatusEvent.emit(checked); } onOptionSelect(option) { if (option.onChecked) { option.onChecked(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableTrComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TableTrComponent, selector: "[dTableRow]", outputs: { headerCheckStatusEvent: "headerCheckStatusEvent", checkStatusEvent: "checkStatusEvent" }, queries: [{ propertyName: "thList", predicate: TableThComponent }], ngImport: i0, template: "<th\n *ngIf=\"headerCheckable\"\n [attr.rowspan]=\"headerRowspan\"\n class=\"devui-checkable-cell\"\n [ngClass]=\"{ 'devui-sticky-left-cell': firstTh?.fixedLeft }\"\n [style.left]=\"'0px'\"\n>\n <d-checkbox\n *ngIf=\"!headerCheckOptions || !headerCheckOptions.length || !selectOptionOnCheckbox\"\n class=\"check-box-all\"\n [name]=\"'checkbox'\"\n (change)=\"onHeaderCheckChange($event)\"\n [(ngModel)]=\"headerChecked\"\n [halfchecked]=\"headerHalfChecked\"\n [disabled]=\"headerCheckDisabled\"\n ></d-checkbox>\n\n <div *ngIf=\"headerCheckOptions && headerCheckOptions.length > 0\" dDropDown appendToBody [trigger]=\"'hover'\" class=\"select-options\">\n <div dDropDownToggle *ngIf=\"selectOptionOnCheckbox\">\n <d-checkbox\n class=\"check-box-all\"\n [name]=\"'checkbox'\"\n (change)=\"onHeaderCheckChange($event)\"\n [(ngModel)]=\"headerChecked\"\n [halfchecked]=\"headerHalfChecked\"\n [disabled]=\"headerCheckDisabled\"\n dPopover\n [zIndex]=\"checkOptionsIndex\"\n [position]=\"'right'\"\n [visible]=\"headerCheckOptions?.length && showTip\"\n [content]=\"checkboxTemplate\"\n ></d-checkbox>\n <ng-template #checkboxTemplate>\n <div>\n <span>{{ curLabel }}</span>\n <svg\n width=\"16px\"\n height=\"16px\"\n class=\"close-icon\"\n (click)=\"showTip = false\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g _ngcontent-sjo-c218=\"\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n _ngcontent-sjo-c218=\"\"\n d=\"M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M5.87867966,5.17157288 C5.68341751,4.97631073 5.36683502,4.97631073 5.17157288,5.17157288 C4.99800652,5.34513923 4.97872137,5.61456363 5.11371742,5.80943177 L5.17157288,5.87867966 L7.29218611,7.99929289 L5.17157288,10.1213203 C4.97631073,10.3165825 4.97631073,10.633165 5.17157288,10.8284271 C5.34513923,11.0019935 5.61456363,11.0212786 5.80943177,10.8862826 L5.87867966,10.8284271 L7.99929289,8.70639967 L10.1213203,10.8284271 C10.3165825,11.0236893 10.633165,11.0236893 10.8284271,10.8284271 C11.0019935,10.6548608 11.0212786,10.3854364 10.8862826,10.1905682 L10.8284271,10.1213203 L8.70710678,8 L10.8284271,5.87867966 C11.0236893,5.68341751 11.0236893,5.36683502 10.8284271,5.17157288 C10.6548608,4.99800652 10.3854364,4.97872137 10.1905682,5.11371742 L10.1213203,5.17157288 L8,7.29289322 L5.87867966,5.17157288 Z\"\n id=\"\u5F62\u72B6\"\n fill=\"#D5D5DB\"\n fill-rule=\"nonzero\"\n ></path>\n </g>\n </svg>\n </div>\n </ng-template>\n </div>\n <div *ngIf=\"!selectOptionOnCheckbox\" dDropDownToggle>\n <svg\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"16px\"\n version=\"1.1\"\n viewBox=\"0 0 16 16\"\n width=\"16px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\" id=\"chevron_down\" stroke=\"none\" stroke-width=\"1\">\n <polygon points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\n </g>\n </svg>\n </div>\n <ul dDropDownMenu class=\"devui-dropdown-menu\" role=\"menu\">\n <li\n *ngFor=\"let option of headerCheckOptions\"\n [ngClass]=\"{ active: curLabel === option.label }\"\n role=\"menuitem\"\n (click)=\"onOptionSelect(option); curLabel = option.label; showTip = true\"\n >\n <a class=\"devui-dropdown-item\">{{ option.label }}</a>\n </li>\n </ul>\n </div>\n</th>\n<ng-content></ng-content>\n", styles: [".select-options{cursor:pointer;vertical-align:middle}svg>g>polygon{fill:var(--devui-icon-text, #808080)}.close-icon{cursor:pointer;vertical-align:text-bottom;margin-left:12px}.active{background-color:var(--devui-list-item-active-bg, #cedefd)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.CheckBoxComponent, selector: "d-checkbox", inputs: ["name", "label", "cssClass", "color", "disabled", "isShowTitle", "title", "labelTemplate", "halfchecked", "showAnimation", "showGlowStyle", "beforeChange"], outputs: ["change"] }, { kind: "directive", type: i4.DropDownDirective, selector: "[dDropDown]", inputs: ["isOpen", "disabled", "showAnimation", "trigger", "closeScope", "closeOnMouseLeaveMenu", "autofocusToggleElement"], outputs: ["toggleEvent"], exportAs: ["d-dropdown"] }, { kind: "directive", type: i4.DropDownMenuDirective, selector: "[dDropDownMenu]", exportAs: ["d-dropdown-menu"] }, { kind: "directive", type: i4.DropDownToggleDirective, selector: "[dDropDownToggle]", inputs: ["toggleOnFocus", "autoFocus"], exportAs: ["d-dropdown-toggle"] }, { kind: "component", type: i4.DropDownAppendToBodyComponent, selector: "[dDropDown][appendToBody]", inputs: ["alignOrigin", "appendToBodyDirections", "appendToBodyScrollStrategy"], exportAs: ["d-dropdown-append-to-body"] }, { kind: "directive", type: i5.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TableTrComponent, decorators: [{ type: Component, args: [{ selector: '[dTableRow]', template: "<th\n *ngIf=\"headerCheckable\"\n [attr.rowspan]=\"headerRowspan\"\n class=\"devui-checkable-cell\"\n [ngClass]=\"{ 'devui-sticky-left-cell': firstTh?.fixedLeft }\"\n [style.left]=\"'0px'\"\n>\n <d-checkbox\n *ngIf=\"!headerCheckOptions || !headerCheckOptions.length || !selectOptionOnCheckbox\"\n class=\"check-box-all\"\n [name]=\"'checkbox'\"\n (change)=\"onHeaderCheckChange($event)\"\n [(ngModel)]=\"headerChecked\"\n [halfchecked]=\"headerHalfChecked\"\n [disabled]=\"headerCheckDisabled\"\n ></d-checkbox>\n\n <div *ngIf=\"headerCheckOptions && headerCheckOptions.length > 0\" dDropDown appendToBody [trigger]=\"'hover'\" class=\"select-options\">\n <div dDropDownToggle *ngIf=\"selectOptionOnCheckbox\">\n <d-checkbox\n class=\"check-box-all\"\n [name]=\"'checkbox'\"\n (change)=\"onHeaderCheckChange($event)\"\n [(ngModel)]=\"headerChecked\"\n [halfchecked]=\"headerHalfChecked\"\n [disabled]=\"headerCheckDisabled\"\n dPopover\n [zIndex]=\"checkOptionsIndex\"\n [position]=\"'right'\"\n [visible]=\"headerCheckOptions?.length && showTip\"\n [content]=\"checkboxTemplate\"\n ></d-checkbox>\n <ng-template #checkboxTemplate>\n <div>\n <span>{{ curLabel }}</span>\n <svg\n width=\"16px\"\n height=\"16px\"\n class=\"close-icon\"\n (click)=\"showTip = false\"\n viewBox=\"0 0 16 16\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n >\n <g _ngcontent-sjo-c218=\"\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n _ngcontent-sjo-c218=\"\"\n d=\"M8,1 C11.8659932,1 15,4.13400675 15,8 C15,11.8659932 11.8659932,15 8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 Z M5.87867966,5.17157288 C5.68341751,4.97631073 5.36683502,4.97631073 5.17157288,5.17157288 C4.99800652,5.34513923 4.97872137,5.61456363 5.11371742,5.80943177 L5.17157288,5.87867966 L7.29218611,7.99929289 L5.17157288,10.1213203 C4.97631073,10.3165825 4.97631073,10.633165 5.17157288,10.8284271 C5.34513923,11.0019935 5.61456363,11.0212786 5.80943177,10.8862826 L5.87867966,10.8284271 L7.99929289,8.70639967 L10.1213203,10.8284271 C10.3165825,11.0236893 10.633165,11.0236893 10.8284271,10.8284271 C11.0019935,10.6548608 11.0212786,10.3854364 10.8862826,10.1905682 L10.8284271,10.1213203 L8.70710678,8 L10.8284271,5.87867966 C11.0236893,5.68341751 11.0236893,5.36683502 10.8284271,5.17157288 C10.6548608,4.99800652 10.3854364,4.97872137 10.1905682,5.11371742 L10.1213203,5.17157288 L8,7.29289322 L5.87867966,5.17157288 Z\"\n id=\"\u5F62\u72B6\"\n fill=\"#D5D5DB\"\n fill-rule=\"nonzero\"\n ></path>\n </g>\n </svg>\n </div>\n </ng-template>\n </div>\n <div *ngIf=\"!selectOptionOnCheckbox\" dDropDownToggle>\n <svg\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n height=\"16px\"\n version=\"1.1\"\n viewBox=\"0 0 16 16\"\n width=\"16px\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g fill=\"none\" fill-rule=\"evenodd\" id=\"chevron_down\" stroke=\"none\" stroke-width=\"1\">\n <polygon points=\"4.5 5 8 8.76923077 11.5 5 13 6.61538462 8 12 3 6.61538462\"></polygon>\n </g>\n </svg>\n </div>\n <ul dDropDownMenu class=\"devui-dropdown-menu\" role=\"menu\">\n <li\n *ngFor=\"let option of headerCheckOptions\"\n [ngClass]=\"{ active: curLabel === option.label }\"\n role=\"menuitem\"\n (click)=\"onOptionSelect(option); curLabel = option.label; showTip = true\"\n >\n <a class=\"devui-dropdown-item\">{{ option.label }}</a>\n </li>\n </ul>\n </div>\n</th>\n<ng-content></ng-content>\n", styles: [".select-options{cursor:pointer;vertical-align:middle}svg>g>polygon{fill:var(--devui-icon-text, #808080)}.close-icon{cursor:pointer;vertical-align:text-bottom;margin-left:12px}.active{background-color:var(--devui-list-item-active-bg, #cedefd)}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }], propDecorators: { thList: [{ type: ContentChildren, args: [TableThComponent] }], headerCheckStatusEvent: [{ type: Output }], checkStatusEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vZGV2dWkvZGF0YS10YWJsZS90YWJsZS9yb3cvdHIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vZGV2dWkvZGF0YS10YWJsZS90YWJsZS9yb3cvdHIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFDN0gsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7QUFRM0QsTUFBTSxPQUFPLGdCQUFnQjtJQWlCM0IsWUFDVSxNQUFrQixFQUNsQixPQUFrQixFQUNsQixHQUFzQjtRQUZ0QixXQUFNLEdBQU4sTUFBTSxDQUFZO1FBQ2xCLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFoQmhDLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRWxCLHNCQUFpQixHQUFHLElBQUksQ0FBQztRQUN6QixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQiwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFNckIsMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUNyRCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztJQUtwRSxDQUFDO0lBRUwsUUFBUTtJQUNSLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNuQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDMUYsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM1RixJQUFJLFdBQVcsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsSUFBSSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFHSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsT0FBTztRQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUM3QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUF5QjtRQUN0QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQixNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7K0dBNURVLGdCQUFnQjttR0FBaEIsZ0JBQWdCLCtLQUNWLGdCQUFnQiw2QkNibkMsODVIQXFGQTs7NEZEekVhLGdCQUFnQjtrQkFONUIsU0FBUzsrQkFFRSxhQUFhO3VJQUtZLE1BQU07c0JBQXhDLGVBQWU7dUJBQUMsZ0JBQWdCO2dCQWN2QixzQkFBc0I7c0JBQS9CLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvd0NoZWNrQ2hhbmdlRXZlbnRBcmcsIFRhYmxlQ2hlY2tPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YS10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZVRoQ29tcG9uZW50IH0gZnJvbSAnLi4vaGVhZC90aC90aC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3IqL1xuICBzZWxlY3RvcjogJ1tkVGFibGVSb3ddJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJsZVRyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgQENvbnRlbnRDaGlsZHJlbihUYWJsZVRoQ29tcG9uZW50KSB0aExpc3Q6IFF1ZXJ5TGlzdDxUYWJsZVRoQ29tcG9uZW50PjtcbiAgaGVhZGVyQ2hlY2thYmxlOiBib29sZWFuO1xuICBoZWFkZXJDaGVja0Rpc2FibGVkOiBib29sZWFuO1xuICBoZWFkZXJSb3dzcGFuID0gMTtcbiAgaGVhZGVyQ2hlY2tPcHRpb25zOiBUYWJsZUNoZWNrT3B0aW9uc1tdO1xuICBjaGVja09wdGlvbnNJbmRleCA9IDEwNTA7XG4gIGN1ckxhYmVsID0gJyc7XG4gIHNob3dUaXAgPSBmYWxzZTtcbiAgc2VsZWN0T3B0aW9uT25DaGVja2JveCA9IGZhbHNlO1xuXG4gIGhlYWRlckNoZWNrZWQ6IGJvb2xlYW47XG4gIGhlYWRlckhhbGZDaGVja2VkOiBib29sZWFuO1xuICBmaXJzdFRoOiBUYWJsZVRoQ29tcG9uZW50O1xuXG4gIEBPdXRwdXQoKSBoZWFkZXJDaGVja1N0YXR1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgY2hlY2tTdGF0dXNFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93Q2hlY2tDaGFuZ2VFdmVudEFyZz4oKTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXIyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMudGhMaXN0KSB7XG4gICAgICB0aGlzLmZpcnN0VGggPSB0aGlzLnRoTGlzdC5maXJzdDtcbiAgICB9XG4gICAgdGhpcy5pbml0Rml4ZWRDb2x1bW5TdGF0dXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBpbml0Rml4ZWRDb2x1bW5TdGF0dXMoKSB7XG4gICAgY29uc3QgZml4TGVmdExpc3QgPSB0aGlzLmVsZVJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXZ1aS1zdGlja3ktbGVmdC1jZWxsJyk7XG4gICAgY29uc3QgZml4UmlnaHRMaXN0ID0gdGhpcy5lbGVSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGV2dWktc3RpY2t5LXJpZ2h0LWNlbGwnKTtcbiAgICBpZiAoZml4TGVmdExpc3Q/Lmxlbmd0aCkge1xuICAgICAgY29uc3QgbGFzdEVsZSA9IGZpeExlZnRMaXN0W2ZpeExlZnRMaXN0Lmxlbmd0aCAtIDFdO1xuICAgICAgdGhpcy5yZW5kZXIyLmFkZENsYXNzKGxhc3RFbGUsICdkZXZ1aS1sYXN0LXN0aWNreS1sZWZ0LWNlbGwnKTtcbiAgICB9XG5cbiAgICBpZiAoZml4UmlnaHRMaXN0Py5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpcnN0RWxlID0gZml4UmlnaHRMaXN0WzBdO1xuICAgICAgdGhpcy5yZW5kZXIyLmFkZENsYXNzKGZpcnN0RWxlLCAnZGV2dWktZmlyc3Qtc3RpY2t5LXJpZ2h0LWNlbGwnKTtcbiAgICB9XG5cblxuICB9XG5cbiAgb25IZWFkZXJDaGVja0NoYW5nZShjaGVja2VkKSB7XG4gICAgdGhpcy5oZWFkZXJDaGVja2VkID0gY2hlY2tlZDtcbiAgICB0aGlzLmhlYWRlckhhbGZDaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5oZWFkZXJDaGVja1N0YXR1c0V2ZW50LmVtaXQoY2hlY2tlZCk7XG4gIH1cblxuICBvbk9wdGlvblNlbGVjdChvcHRpb246IFRhYmxlQ2hlY2tPcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbi5vbkNoZWNrZWQpIHtcbiAgICAgIG9wdGlvbi5vbkNoZWNrZWQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjx0aFxuICAqbmdJZj1cImhlYWRlckNoZWNrYWJsZVwiXG4gIFthdHRyLnJvd3NwYW5dPVwiaGVhZGVyUm93c3BhblwiXG4gIGNsYXNzPVwiZGV2dWktY2hlY2thYmxlLWNlbGxcIlxuICBbbmdDbGFzc109XCJ7ICdkZXZ1aS1zdGlja3ktbGVmdC1jZWxsJzogZmlyc3RUaD8uZml4ZWRMZWZ0IH1cIlxuICBbc3R5bGUubGVmdF09XCInMHB4J1wiXG4+XG4gIDxkLWNoZWNrYm94XG4gICAgKm5nSWY9XCIhaGVhZGVyQ2hlY2tPcHRpb25zIHx8ICFoZWFkZXJDaGVja09wdGlvbnMubGVuZ3RoIHx8ICFzZWxlY3RPcHRpb25PbkNoZWNrYm94XCJcbiAgICBjbGFzcz1cImNoZWNrLWJveC1hbGxcIlxuICAgIFtuYW1lXT1cIidjaGVja2JveCdcIlxuICAgIChjaGFuZ2UpPVwib25IZWFkZXJDaGVja0NoYW5nZSgkZXZlbnQpXCJcbiAgICBbKG5nTW9kZWwpXT1cImhlYWRlckNoZWNrZWRcIlxuICAgIFtoYWxmY2hlY2tlZF09XCJoZWFkZXJIYWxmQ2hlY2tlZFwiXG4gICAgW2Rpc2FibGVkXT1cImhlYWRlckNoZWNrRGlzYWJsZWRcIlxuICA+PC9kLWNoZWNrYm94PlxuXG4gIDxkaXYgKm5nSWY9XCJoZWFkZXJDaGVja09wdGlvbnMgJiYgaGVhZGVyQ2hlY2tPcHRpb25zLmxlbmd0aCA+IDBcIiBkRHJvcERvd24gYXBwZW5kVG9Cb2R5IFt0cmlnZ2VyXT1cIidob3ZlcidcIiBjbGFzcz1cInNlbGVjdC1vcHRpb25zXCI+XG4gICAgPGRpdiBkRHJvcERvd25Ub2dnbGUgKm5nSWY9XCJzZWxlY3RPcHRpb25PbkNoZWNrYm94XCI+XG4gICAgICA8ZC1jaGVja2JveFxuICAgICAgICBjbGFzcz1cImNoZWNrLWJveC1hbGxcIlxuICAgICAgICBbbmFtZV09XCInY2hlY2tib3gnXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkhlYWRlckNoZWNrQ2hhbmdlKCRldmVudClcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImhlYWRlckNoZWNrZWRcIlxuICAgICAgICBbaGFsZmNoZWNrZWRdPVwiaGVhZGVySGFsZkNoZWNrZWRcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiaGVhZGVyQ2hlY2tEaXNhYmxlZFwiXG4gICAgICAgIGRQb3BvdmVyXG4gICAgICAgIFt6SW5kZXhdPVwiY2hlY2tPcHRpb25zSW5kZXhcIlxuICAgICAgICBbcG9zaXRpb25dPVwiJ3JpZ2h0J1wiXG4gICAgICAgIFt2aXNpYmxlXT1cImhlYWRlckNoZWNrT3B0aW9ucz8ubGVuZ3RoICYmIHNob3dUaXBcIlxuICAgICAgICBbY29udGVudF09XCJjaGVja2JveFRlbXBsYXRlXCJcbiAgICAgID48L2QtY2hlY2tib3g+XG4gICAgICA8bmctdGVtcGxhdGUgI2NoZWNrYm94VGVtcGxhdGU+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHNwYW4+e3sgY3VyTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgd2lkdGg9XCIxNnB4XCJcbiAgICAgICAgICAgIGhlaWdodD1cIjE2cHhcIlxuICAgICAgICAgICAgY2xhc3M9XCJjbG9zZS1pY29uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzaG93VGlwID0gZmFsc2VcIlxuICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZyBfbmdjb250ZW50LXNqby1jMjE4PVwiXCIgc3Ryb2tlPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjFcIiBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cbiAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICBfbmdjb250ZW50LXNqby1jMjE4PVwiXCJcbiAgICAgICAgICAgICAgICBkPVwiTTgsMSBDMTEuODY1OTkzMiwxIDE1LDQuMTM0MDA2NzUgMTUsOCBDMTUsMTEuODY1OTkzMiAxMS44NjU5OTMyLDE1IDgsMTUgQzQuMTM0MDA2NzUsMTUgMSwxMS44NjU5OTMyIDEsOCBDMSw0LjEzNDAwNjc1IDQuMTM0MDA2NzUsMSA4LDEgWiBNNS44Nzg2Nzk2Niw1LjE3MTU3Mjg4IEM1LjY4MzQxNzUxLDQuOTc2MzEwNzMgNS4zNjY4MzUwMiw0Ljk3NjMxMDczIDUuMTcxNTcyODgsNS4xNzE1NzI4OCBDNC45OTgwMDY1Miw1LjM0NTEzOTIzIDQuOTc4NzIxMzcsNS42MTQ1NjM2MyA1LjExMzcxNzQyLDUuODA5NDMxNzcgTDUuMTcxNTcyODgsNS44Nzg2Nzk2NiBMNy4yOTIxODYxMSw3Ljk5OTI5Mjg5IEw1LjE3MTU3Mjg4LDEwLjEyMTMyMDMgQzQuOTc2MzEwNzMsMTAuMzE2NTgyNSA0Ljk3NjMxMDczLDEwLjYzMzE2NSA1LjE3MTU3Mjg4LDEwLjgyODQyNzEgQzUuMzQ1MTM5MjMsMTEuMDAxOTkzNSA1LjYxNDU2MzYzLDExLjAyMTI3ODYgNS44MDk0MzE3NywxMC44ODYyODI2IEw1Ljg3ODY3OTY2LDEwLjgyODQyNzEgTDcuOTk5MjkyODksOC43MDYzOTk2NyBMMTAuMTIxMzIwMywxMC44Mjg0MjcxIEMxMC4zMTY1ODI1LDExLjAyMzY4OTMgMTAuNjMzMTY1LDExLjAyMzY4OTMgMTAuODI4NDI3MSwxMC44Mjg0MjcxIEMxMS4wMDE5OTM1LDEwLjY1NDg2MDggMTEuMDIxMjc4NiwxMC4zODU0MzY0IDEwLjg4NjI4MjYsMTAuMTkwNTY4MiBMMTAuODI4NDI3MSwxMC4xMjEzMjAzIEw4LjcwNzEwNjc4LDggTDEwLjgyODQyNzEsNS44Nzg2Nzk2NiBDMTEuMDIzNjg5Myw1LjY4MzQxNzUxIDExLjAyMzY4OTMsNS4zNjY4MzUwMiAxMC44Mjg0MjcxLDUuMTcxNTcyODggQzEwLjY1NDg2MDgsNC45OTgwMDY1MiAxMC4zODU0MzY0LDQuOTc4NzIxMzcgMTAuMTkwNTY4Miw1LjExMzcxNzQyIEwxMC4xMjEzMjAzLDUuMTcxNTcyODggTDgsNy4yOTI4OTMyMiBMNS44Nzg2Nzk2Niw1LjE3MTU3Mjg4IFpcIlxuICAgICAgICAgICAgICAgIGlkPVwi5b2i54q2XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0Q1RDVEQlwiXG4gICAgICAgICAgICAgICAgZmlsbC1ydWxlPVwibm9uemVyb1wiXG4gICAgICAgICAgICAgID48L3BhdGg+XG4gICAgICAgICAgICA8L2c+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiIXNlbGVjdE9wdGlvbk9uQ2hlY2tib3hcIiBkRHJvcERvd25Ub2dnbGU+XG4gICAgICA8c3ZnXG4gICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXG4gICAgICAgIGhlaWdodD1cIjE2cHhcIlxuICAgICAgICB2ZXJzaW9uPVwiMS4xXCJcbiAgICAgICAgdmlld0JveD1cIjAgMCAxNiAxNlwiXG4gICAgICAgIHdpZHRoPVwiMTZweFwiXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgPlxuICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBpZD1cImNoZXZyb25fZG93blwiIHN0cm9rZT1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCIxXCI+XG4gICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNC41IDUgOCA4Ljc2OTIzMDc3IDExLjUgNSAxMyA2LjYxNTM4NDYyIDggMTIgMyA2LjYxNTM4NDYyXCI+PC9wb2x5Z29uPlxuICAgICAgICA8L2c+XG4gICAgICA8L3N2Zz5cbiAgICA8L2Rpdj5cbiAgICA8dWwgZERyb3BEb3duTWVudSBjbGFzcz1cImRldnVpLWRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxuICAgICAgPGxpXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgaGVhZGVyQ2hlY2tPcHRpb25zXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IGN1ckxhYmVsID09PSBvcHRpb24ubGFiZWwgfVwiXG4gICAgICAgIHJvbGU9XCJtZW51aXRlbVwiXG4gICAgICAgIChjbGljayk9XCJvbk9wdGlvblNlbGVjdChvcHRpb24pOyBjdXJMYWJlbCA9IG9wdGlvbi5sYWJlbDsgc2hvd1RpcCA9IHRydWVcIlxuICAgICAgPlxuICAgICAgICA8YSBjbGFzcz1cImRldnVpLWRyb3Bkb3duLWl0ZW1cIj57eyBvcHRpb24ubGFiZWwgfX08L2E+XG4gICAgICA8L2xpPlxuICAgIDwvdWw+XG4gIDwvZGl2PlxuPC90aD5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==