UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

208 lines 28.8 kB
import { __decorate } from "tslib"; import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, Input, Optional, ViewEncapsulation } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { filter, startWith, takeUntil } from 'rxjs/operators'; import { WithConfig } from 'ng-zorro-antd/core/config'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import { NzIconDirective } from 'ng-zorro-antd/icon'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/core/config"; import * as i2 from "@angular/cdk/bidi"; import * as i3 from "@angular/common"; import * as i4 from "ng-zorro-antd/icon"; import * as i5 from "ng-zorro-antd/core/transition-patch"; const NZ_CONFIG_MODULE_NAME = 'button'; export class NzButtonComponent { constructor(ngZone, elementRef, cdr, renderer, nzConfigService, directionality) { this.ngZone = ngZone; this.elementRef = elementRef; this.cdr = cdr; this.renderer = renderer; this.nzConfigService = nzConfigService; this.directionality = directionality; this._nzModuleName = NZ_CONFIG_MODULE_NAME; this.nzBlock = false; this.nzGhost = false; this.nzSearch = false; this.nzLoading = false; this.nzDanger = false; this.disabled = false; this.tabIndex = null; this.nzType = null; this.nzShape = null; this.nzSize = 'default'; this.dir = 'ltr'; this.destroy$ = new Subject(); this.loading$ = new Subject(); this.nzConfigService .getConfigChangeEventForComponent(NZ_CONFIG_MODULE_NAME) .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.cdr.markForCheck(); }); } insertSpan(nodes, renderer) { nodes.forEach(node => { if (node.nodeName === '#text') { const span = renderer.createElement('span'); const parent = renderer.parentNode(node); renderer.insertBefore(parent, span, node); renderer.appendChild(span, node); } }); } assertIconOnly(element, renderer) { const listOfNode = Array.from(element.childNodes); const iconCount = listOfNode.filter(node => { const iconChildNodes = Array.from(node.childNodes || []); return node.nodeName === 'SPAN' && iconChildNodes.length > 0 && iconChildNodes.every(ic => ic.nodeName === 'svg'); }).length; const noText = listOfNode.every(node => node.nodeName !== '#text'); // ignore icon const noSpan = listOfNode .filter(node => { const iconChildNodes = Array.from(node.childNodes || []); return !(node.nodeName === 'SPAN' && iconChildNodes.length > 0 && iconChildNodes.every(ic => ic.nodeName === 'svg')); }) .every(node => node.nodeName !== 'SPAN'); const isIconOnly = noSpan && noText && iconCount >= 1; if (isIconOnly) { renderer.addClass(element, 'ant-btn-icon-only'); } } ngOnInit() { this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction) => { this.dir = direction; this.cdr.detectChanges(); }); this.dir = this.directionality.value; this.ngZone.runOutsideAngular(() => { // Caretaker note: this event listener could've been added through `host.click` or `HostListener`. // The compiler generates the `ɵɵlistener` instruction which wraps the actual listener internally into the // function, which runs `markDirty()` before running the actual listener (the decorated class method). // Since we're preventing the default behavior and stopping event propagation this doesn't require Angular to run the change detection. fromEvent(this.elementRef.nativeElement, 'click', { capture: true }) .pipe(takeUntil(this.destroy$)) .subscribe(event => { if ((this.disabled && event.target?.tagName === 'A') || this.nzLoading) { event.preventDefault(); event.stopImmediatePropagation(); } }); }); } ngOnChanges(changes) { const { nzLoading } = changes; if (nzLoading) { this.loading$.next(this.nzLoading); } } ngAfterViewInit() { this.assertIconOnly(this.elementRef.nativeElement, this.renderer); this.insertSpan(this.elementRef.nativeElement.childNodes, this.renderer); } ngAfterContentInit() { this.loading$ .pipe(startWith(this.nzLoading), filter(() => !!this.nzIconDirectiveElement), takeUntil(this.destroy$)) .subscribe(loading => { const nativeElement = this.nzIconDirectiveElement.nativeElement; if (loading) { this.renderer.setStyle(nativeElement, 'display', 'none'); } else { this.renderer.removeStyle(nativeElement, 'display'); } }); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NzButtonComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i1.NzConfigService }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component }); NzButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: { nzBlock: "nzBlock", nzGhost: "nzGhost", nzSearch: "nzSearch", nzLoading: "nzLoading", nzDanger: "nzDanger", disabled: "disabled", tabIndex: "tabIndex", nzType: "nzType", nzShape: "nzShape", nzSize: "nzSize" }, host: { properties: { "class.ant-btn-primary": "nzType === 'primary'", "class.ant-btn-dashed": "nzType === 'dashed'", "class.ant-btn-link": "nzType === 'link'", "class.ant-btn-text": "nzType === 'text'", "class.ant-btn-circle": "nzShape === 'circle'", "class.ant-btn-round": "nzShape === 'round'", "class.ant-btn-lg": "nzSize === 'large'", "class.ant-btn-sm": "nzSize === 'small'", "class.ant-btn-dangerous": "nzDanger", "class.ant-btn-loading": "nzLoading", "class.ant-btn-background-ghost": "nzGhost", "class.ant-btn-block": "nzBlock", "class.ant-input-search-button": "nzSearch", "class.ant-btn-rtl": "dir === 'rtl'", "attr.tabindex": "disabled ? -1 : (tabIndex === null ? null : tabIndex)", "attr.disabled": "disabled || null" }, classAttribute: "ant-btn" }, queries: [{ propertyName: "nzIconDirectiveElement", first: true, predicate: NzIconDirective, descendants: true, read: ElementRef }], exportAs: ["nzButton"], usesOnChanges: true, ngImport: i0, template: ` <span nz-icon nzType="loading" *ngIf="nzLoading"></span> <ng-content></ng-content> `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i5.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "nzBlock", void 0); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "nzGhost", void 0); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "nzSearch", void 0); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "nzLoading", void 0); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "nzDanger", void 0); __decorate([ InputBoolean() ], NzButtonComponent.prototype, "disabled", void 0); __decorate([ WithConfig() ], NzButtonComponent.prototype, "nzSize", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: NzButtonComponent, decorators: [{ type: Component, args: [{ selector: 'button[nz-button], a[nz-button]', exportAs: 'nzButton', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: ` <span nz-icon nzType="loading" *ngIf="nzLoading"></span> <ng-content></ng-content> `, host: { class: 'ant-btn', '[class.ant-btn-primary]': `nzType === 'primary'`, '[class.ant-btn-dashed]': `nzType === 'dashed'`, '[class.ant-btn-link]': `nzType === 'link'`, '[class.ant-btn-text]': `nzType === 'text'`, '[class.ant-btn-circle]': `nzShape === 'circle'`, '[class.ant-btn-round]': `nzShape === 'round'`, '[class.ant-btn-lg]': `nzSize === 'large'`, '[class.ant-btn-sm]': `nzSize === 'small'`, '[class.ant-btn-dangerous]': `nzDanger`, '[class.ant-btn-loading]': `nzLoading`, '[class.ant-btn-background-ghost]': `nzGhost`, '[class.ant-btn-block]': `nzBlock`, '[class.ant-input-search-button]': `nzSearch`, '[class.ant-btn-rtl]': `dir === 'rtl'`, '[attr.tabindex]': 'disabled ? -1 : (tabIndex === null ? null : tabIndex)', '[attr.disabled]': 'disabled || null' } }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i1.NzConfigService }, { type: i2.Directionality, decorators: [{ type: Optional }] }]; }, propDecorators: { nzIconDirectiveElement: [{ type: ContentChild, args: [NzIconDirective, { read: ElementRef }] }], nzBlock: [{ type: Input }], nzGhost: [{ type: Input }], nzSearch: [{ type: Input }], nzLoading: [{ type: Input }], nzDanger: [{ type: Input }], disabled: [{ type: Input }], tabIndex: [{ type: Input }], nzType: [{ type: Input }], nzShape: [{ type: Input }], nzSize: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQU1BLE9BQU8sRUFHTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLFFBQVEsRUFHUixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUQsT0FBTyxFQUFnQyxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7O0FBTXJELE1BQU0scUJBQXFCLEdBQWdCLFFBQVEsQ0FBQztBQWdDcEQsTUFBTSxPQUFPLGlCQUFpQjtJQTJENUIsWUFDVSxNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsR0FBc0IsRUFDdEIsUUFBbUIsRUFDcEIsZUFBZ0MsRUFDbkIsY0FBOEI7UUFMMUMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNwQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEUzQyxrQkFBYSxHQUFnQixxQkFBcUIsQ0FBQztRQVNuQyxZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFDekIsYUFBUSxHQUFZLEtBQUssQ0FB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OzRDQXhEMEMsc0JBQXNCO3NCQUExRSxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBQzFCLE9BQU87c0JBQS9CLEtBQUs7Z0JBQ21CLE9BQU87c0JBQS9CLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ21CLFNBQVM7c0JBQWpDLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ21CLFFBQVE7c0JBQWhDLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNpQixNQUFNO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25hbGl0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9iaWRpJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHN0YXJ0V2l0aCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOekNvbmZpZ0tleSwgTnpDb25maWdTZXJ2aWNlLCBXaXRoQ29uZmlnIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpJY29uRGlyZWN0aXZlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcblxuZXhwb3J0IHR5cGUgTnpCdXR0b25UeXBlID0gJ3ByaW1hcnknIHwgJ2RlZmF1bHQnIHwgJ2Rhc2hlZCcgfCAnbGluaycgfCAndGV4dCcgfCBudWxsO1xuZXhwb3J0IHR5cGUgTnpCdXR0b25TaGFwZSA9ICdjaXJjbGUnIHwgJ3JvdW5kJyB8IG51bGw7XG5leHBvcnQgdHlwZSBOekJ1dHRvblNpemUgPSAnbGFyZ2UnIHwgJ2RlZmF1bHQnIHwgJ3NtYWxsJztcblxuY29uc3QgTlpfQ09ORklHX01PRFVMRV9OQU1FOiBOekNvbmZpZ0tleSA9ICdidXR0b24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdidXR0b25bbnotYnV0dG9uXSwgYVtuei1idXR0b25dJyxcbiAgZXhwb3J0QXM6ICduekJ1dHRvbicsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImxvYWRpbmdcIiAqbmdJZj1cIm56TG9hZGluZ1wiPjwvc3Bhbj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIGAsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogJ2FudC1idG4nLFxuICAgICdbY2xhc3MuYW50LWJ0bi1wcmltYXJ5XSc6IGBuelR5cGUgPT09ICdwcmltYXJ5J2AsXG4gICAgJ1tjbGFzcy5hbnQtYnRuLWRhc2hlZF0nOiBgbnpUeXBlID09PSAnZGFzaGVkJ2AsXG4gICAgJ1tjbGFzcy5hbnQtYnRuLWxpbmtdJzogYG56VHlwZSA9PT0gJ2xpbmsnYCxcbiAgICAnW2NsYXNzLmFudC1idG4tdGV4dF0nOiBgbnpUeXBlID09PSAndGV4dCdgLFxuICAgICdbY2xhc3MuYW50LWJ0bi1jaXJjbGVdJzogYG56U2hhcGUgPT09ICdjaXJjbGUnYCxcbiAgICAnW2NsYXNzLmFudC1idG4tcm91bmRdJzogYG56U2hhcGUgPT09ICdyb3VuZCdgLFxuICAgICdbY2xhc3MuYW50LWJ0bi1sZ10nOiBgbnpTaXplID09PSAnbGFyZ2UnYCxcbiAgICAnW2NsYXNzLmFudC1idG4tc21dJzogYG56U2l6ZSA9PT0gJ3NtYWxsJ2AsXG4gICAgJ1tjbGFzcy5hbnQtYnRuLWRhbmdlcm91c10nOiBgbnpEYW5nZXJgLFxuICAgICdbY2xhc3MuYW50LWJ0bi1sb2FkaW5nXSc6IGBuekxvYWRpbmdgLFxuICAgICdbY2xhc3MuYW50LWJ0bi1iYWNrZ3JvdW5kLWdob3N0XSc6IGBuekdob3N0YCxcbiAgICAnW2NsYXNzLmFudC1idG4tYmxvY2tdJzogYG56QmxvY2tgLFxuICAgICdbY2xhc3MuYW50LWlucHV0LXNlYXJjaC1idXR0b25dJzogYG56U2VhcmNoYCxcbiAgICAnW2NsYXNzLmFudC1idG4tcnRsXSc6IGBkaXIgPT09ICdydGwnYCxcbiAgICAnW2F0dHIudGFiaW5kZXhdJzogJ2Rpc2FibGVkID8gLTEgOiAodGFiSW5kZXggPT09IG51bGwgPyBudWxsIDogdGFiSW5kZXgpJyxcbiAgICAnW2F0dHIuZGlzYWJsZWRdJzogJ2Rpc2FibGVkIHx8IG51bGwnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgTnpCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCwgT25Jbml0IHtcbiAgcmVhZG9ubHkgX256TW9kdWxlTmFtZTogTnpDb25maWdLZXkgPSBOWl9DT05GSUdfTU9EVUxFX05BTUU7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekJsb2NrOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekdob3N0OiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uelNlYXJjaDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpMb2FkaW5nOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekRhbmdlcjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcblxuICBAQ29udGVudENoaWxkKE56SWNvbkRpcmVjdGl2ZSwgeyByZWFkOiBFbGVtZW50UmVmIH0pIG56SWNvbkRpcmVjdGl2ZUVsZW1lbnQhOiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpCbG9jazogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpHaG9zdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpTZWFyY2g6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIG56TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEYW5nZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgQElucHV0Qm9vbGVhbigpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhYkluZGV4OiBudW1iZXIgfCBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpUeXBlOiBOekJ1dHRvblR5cGUgPSBudWxsO1xuICBASW5wdXQoKSBuelNoYXBlOiBOekJ1dHRvblNoYXBlID0gbnVsbDtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoKSBuelNpemU6IE56QnV0dG9uU2l6ZSA9ICdkZWZhdWx0JztcbiAgZGlyOiBEaXJlY3Rpb24gPSAnbHRyJztcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgbG9hZGluZyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGluc2VydFNwYW4obm9kZXM6IE5vZGVMaXN0LCByZW5kZXJlcjogUmVuZGVyZXIyKTogdm9pZCB7XG4gICAgbm9kZXMuZm9yRWFjaChub2RlID0+IHtcbiAgICAgIGlmIChub2RlLm5vZGVOYW1lID09PSAnI3RleHQnKSB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSByZW5kZXJlci5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHJlbmRlcmVyLnBhcmVudE5vZGUobm9kZSk7XG4gICAgICAgIHJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnQsIHNwYW4sIG5vZGUpO1xuICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChzcGFuLCBub2RlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzc2VydEljb25Pbmx5KGVsZW1lbnQ6IEhUTUxCdXR0b25FbGVtZW50LCByZW5kZXJlcjogUmVuZGVyZXIyKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdE9mTm9kZSA9IEFycmF5LmZyb20oZWxlbWVudC5jaGlsZE5vZGVzKTtcbiAgICBjb25zdCBpY29uQ291bnQgPSBsaXN0T2ZOb2RlLmZpbHRlcihub2RlID0+IHtcbiAgICAgIGNvbnN0IGljb25DaGlsZE5vZGVzID0gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMgfHwgW10pO1xuICAgICAgcmV0dXJuIG5vZGUubm9kZU5hbWUgPT09ICdTUEFOJyAmJiBpY29uQ2hpbGROb2Rlcy5sZW5ndGggPiAwICYmIGljb25DaGlsZE5vZGVzLmV2ZXJ5KGljID0+IGljLm5vZGVOYW1lID09PSAnc3ZnJyk7XG4gICAgfSkubGVuZ3RoO1xuICAgIGNvbnN0IG5vVGV4dCA9IGxpc3RPZk5vZGUuZXZlcnkobm9kZSA9PiBub2RlLm5vZGVOYW1lICE9PSAnI3RleHQnKTtcbiAgICAvLyBpZ25vcmUgaWNvblxuICAgIGNvbnN0IG5vU3BhbiA9IGxpc3RPZk5vZGVcbiAgICAgIC5maWx0ZXIobm9kZSA9PiB7XG4gICAgICAgIGNvbnN0IGljb25DaGlsZE5vZGVzID0gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMgfHwgW10pO1xuICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICBub2RlLm5vZGVOYW1lID09PSAnU1BBTicgJiZcbiAgICAgICAgICBpY29uQ2hpbGROb2Rlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgaWNvbkNoaWxkTm9kZXMuZXZlcnkoaWMgPT4gaWMubm9kZU5hbWUgPT09ICdzdmcnKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5ldmVyeShub2RlID0+IG5vZGUubm9kZU5hbWUgIT09ICdTUEFOJyk7XG4gICAgY29uc3QgaXNJY29uT25seSA9IG5vU3BhbiAmJiBub1RleHQgJiYgaWNvbkNvdW50ID49IDE7XG4gICAgaWYgKGlzSWNvbk9ubHkpIHtcbiAgICAgIHJlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnQsICdhbnQtYnRuLWljb24tb25seScpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHVibGljIG56Q29uZmlnU2VydmljZTogTnpDb25maWdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5XG4gICkge1xuICAgIHRoaXMubnpDb25maWdTZXJ2aWNlXG4gICAgICAuZ2V0Q29uZmlnQ2hhbmdlRXZlbnRGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmRpcmVjdGlvbmFsaXR5LmNoYW5nZT8ucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoZGlyZWN0aW9uOiBEaXJlY3Rpb24pID0+IHtcbiAgICAgIHRoaXMuZGlyID0gZGlyZWN0aW9uO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5kaXIgPSB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gQ2FyZXRha2VyIG5vdGU6IHRoaXMgZXZlbnQgbGlzdGVuZXIgY291bGQndmUgYmVlbiBhZGRlZCB0aHJvdWdoIGBob3N0LmNsaWNrYCBvciBgSG9zdExpc3RlbmVyYC5cbiAgICAgIC8vIFRoZSBjb21waWxlciBnZW5lcmF0ZXMgdGhlIGDJtcm1bGlzdGVuZXJgIGluc3RydWN0aW9uIHdoaWNoIHdyYXBzIHRoZSBhY3R1YWwgbGlzdGVuZXIgaW50ZXJuYWxseSBpbnRvIHRoZVxuICAgICAgLy8gZnVuY3Rpb24sIHdoaWNoIHJ1bnMgYG1hcmtEaXJ0eSgpYCBiZWZvcmUgcnVubmluZyB0aGUgYWN0dWFsIGxpc3RlbmVyICh0aGUgZGVjb3JhdGVkIGNsYXNzIG1ldGhvZCkuXG4gICAgICAvLyBTaW5jZSB3ZSdyZSBwcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZCBzdG9wcGluZyBldmVudCBwcm9wYWdhdGlvbiB0aGlzIGRvZXNuJ3QgcmVxdWlyZSBBbmd1bGFyIHRvIHJ1biB0aGUgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NsaWNrJywgeyBjYXB0dXJlOiB0cnVlIH0pXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgICAgaWYgKCh0aGlzLmRpc2FibGVkICYmIChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy50YWdOYW1lID09PSAnQScpIHx8IHRoaXMubnpMb2FkaW5nKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56TG9hZGluZyB9ID0gY2hhbmdlcztcbiAgICBpZiAobnpMb2FkaW5nKSB7XG4gICAgICB0aGlzLmxvYWRpbmckLm5leHQodGhpcy5uekxvYWRpbmcpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydEljb25Pbmx5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnJlbmRlcmVyKTtcbiAgICB0aGlzLmluc2VydFNwYW4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGROb2RlcywgdGhpcy5yZW5kZXJlcik7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLm56TG9hZGluZyksXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMubnpJY29uRGlyZWN0aXZlRWxlbWVudCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShsb2FkaW5nID0+IHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMubnpJY29uRGlyZWN0aXZlRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAobG9hZGluZykge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUobmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlU3R5bGUobmF0aXZlRWxlbWVudCwgJ2Rpc3BsYXknKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==