UNPKG

ng-zorro-antd

Version:

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

562 lines 42.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { Overlay, OverlayConfig } from '@angular/cdk/overlay'; import { Platform } from '@angular/cdk/platform'; import { TemplatePortal } from '@angular/cdk/portal'; import { Directive, ElementRef, EventEmitter, Input, Output, Renderer2, ViewContainerRef } from '@angular/core'; import { DEFAULT_DROPDOWN_POSITIONS, InputBoolean, POSITION_MAP } from 'ng-zorro-antd/core'; import { combineLatest, fromEvent, merge, EMPTY, Subject, Subscription } from 'rxjs'; import { debounceTime, distinctUntilChanged, map, mapTo, takeUntil, tap } from 'rxjs/operators'; import { NzDropdownMenuComponent } from './nz-dropdown-menu.component'; var NzDropDownDirective = /** @class */ (function () { function NzDropDownDirective(elementRef, renderer, overlay, platform, viewContainerRef) { this.elementRef = elementRef; this.renderer = renderer; this.overlay = overlay; this.platform = platform; this.viewContainerRef = viewContainerRef; this.overlayRef = null; this.destroy$ = new Subject(); this.triggerWidth = 0; this.el = this.elementRef.nativeElement; this.dropdownOpen = false; this.positions = tslib_1.__spread(DEFAULT_DROPDOWN_POSITIONS); this.positionSubscription = Subscription.EMPTY; this.overlaySubscription = Subscription.EMPTY; this.hover$ = merge(fromEvent(this.el, 'mouseenter').pipe(mapTo(true)), fromEvent(this.el, 'mouseleave').pipe(mapTo(false))); this.$click = fromEvent(this.el, 'click').pipe(tap((/** * @param {?} e * @return {?} */ function (e) { return e.stopPropagation(); })), mapTo(true)); this.nzTrigger = 'hover'; this.nzClickHide = true; this.nzDisabled = false; this.nzVisible = false; this.nzTableFilter = false; this.nzOverlayClassName = ''; this.nzOverlayStyle = {}; this.nzPlacement = 'bottomLeft'; this.nzVisibleChange = new EventEmitter(); renderer.addClass(elementRef.nativeElement, 'ant-dropdown-trigger'); } /** * @param {?} disabled * @return {?} */ NzDropDownDirective.prototype.setDisabled = /** * @param {?} disabled * @return {?} */ function (disabled) { if (disabled) { this.renderer.setAttribute(this.el, 'disabled', ''); } else { this.renderer.removeAttribute(this.el, 'disabled'); } }; /** * @private * @return {?} */ NzDropDownDirective.prototype.getOverlayConfig = /** * @private * @return {?} */ function () { return new OverlayConfig({ positionStrategy: this.overlay .position() .flexibleConnectedTo(this.el) .withLockedPosition(), minWidth: this.triggerWidth, hasBackdrop: this.nzTrigger === 'click', scrollStrategy: this.overlay.scrollStrategies.reposition() }); }; /** * @private * @return {?} */ NzDropDownDirective.prototype.createOverlay = /** * @private * @return {?} */ function () { if (!this.overlayRef) { /** @type {?} */ var config = this.getOverlayConfig(); this.overlayRef = this.overlay.create(config); this.subscribeOverlayEvent(this.overlayRef); this.subscribeToPositions((/** @type {?} */ (config.positionStrategy))); return this.overlayRef; } else { /** @type {?} */ var overlayConfig = this.overlayRef.getConfig(); this.updateOverlayConfig(overlayConfig); return this.overlayRef; } }; /** * @param {?} overlayConfig * @return {?} */ NzDropDownDirective.prototype.updateOverlayConfig = /** * @param {?} overlayConfig * @return {?} */ function (overlayConfig) { overlayConfig.minWidth = this.triggerWidth; overlayConfig.hasBackdrop = this.nzTrigger === 'click'; return overlayConfig; }; /** * @return {?} */ NzDropDownDirective.prototype.dispose = /** * @return {?} */ function () { if (this.overlayRef) { this.overlayRef.dispose(); this.overlayRef = null; this.positionSubscription.unsubscribe(); this.overlaySubscription.unsubscribe(); } }; /** * @private * @param {?} position * @return {?} */ NzDropDownDirective.prototype.subscribeToPositions = /** * @private * @param {?} position * @return {?} */ function (position) { var _this = this; this.positionSubscription.unsubscribe(); this.positionSubscription = position.positionChanges.pipe(takeUntil(this.destroy$)).subscribe((/** * @param {?} change * @return {?} */ function (change) { _this.nzDropdownMenu.setValue('dropDownPosition', change.connectionPair.originY); })); }; /** * @private * @param {?} overlayRef * @return {?} */ NzDropDownDirective.prototype.subscribeOverlayEvent = /** * @private * @param {?} overlayRef * @return {?} */ function (overlayRef) { var _this = this; this.overlaySubscription.unsubscribe(); this.overlaySubscription = merge(overlayRef.backdropClick(), overlayRef.detachments()) .pipe(takeUntil(this.destroy$)) .subscribe((/** * @return {?} */ function () { _this.nzDropdownMenu.setVisibleStateWhen(false); })); }; /** * @private * @return {?} */ NzDropDownDirective.prototype.getPortal = /** * @private * @return {?} */ function () { if (!this.portal || this.portal.templateRef !== this.nzDropdownMenu.templateRef) { this.portal = new TemplatePortal(this.nzDropdownMenu.templateRef, this.viewContainerRef); } return this.portal; }; /** * @private * @return {?} */ NzDropDownDirective.prototype.openMenu = /** * @private * @return {?} */ function () { if (!this.dropdownOpen) { /** @type {?} */ var overlayRef = this.createOverlay(); /** @type {?} */ var overlayConfig = overlayRef.getConfig(); this.setPosition((/** @type {?} */ (overlayConfig.positionStrategy))); overlayRef.attach(this.getPortal()); this.dropdownOpen = true; this.nzDropdownMenu.setValue('open', true); } }; /** * @private * @return {?} */ NzDropDownDirective.prototype.closeMenu = /** * @private * @return {?} */ function () { if (this.overlayRef) { this.overlayRef.detach(); this.dropdownOpen = false; this.nzDropdownMenu.setValue('open', false); } }; /** * @private * @param {?} positionStrategy * @return {?} */ NzDropDownDirective.prototype.setPosition = /** * @private * @param {?} positionStrategy * @return {?} */ function (positionStrategy) { this.positionStrategy = positionStrategy; positionStrategy.withPositions(tslib_1.__spread(this.positions)); }; /** * @private * @param {?} positions * @return {?} */ NzDropDownDirective.prototype.updatePositionStrategy = /** * @private * @param {?} positions * @return {?} */ function (positions) { if (this.positionStrategy) { this.positionStrategy.withPositions(positions); } }; /** * @private * @return {?} */ NzDropDownDirective.prototype.setTriggerWidth = /** * @private * @return {?} */ function () { if (this.platform.isBrowser) { /** @type {?} */ var element = this.nzMatchWidthElement ? this.nzMatchWidthElement.nativeElement : this.el; this.triggerWidth = element.getBoundingClientRect().width; } }; /** * @return {?} */ NzDropDownDirective.prototype.initActionSubscribe = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var hostVisible$ = this.nzTrigger === 'hover' ? this.hover$ : this.$click; /** @type {?} */ var dropdownMenuVisible$ = this.nzDropdownMenu.visible$; /** @type {?} */ var menuClickVisible$ = this.nzClickHide ? this.nzDropdownMenu.nzMenuDropdownService.menuItemClick$.pipe(mapTo(false)) : EMPTY; /** @type {?} */ var supVisible$ = merge(dropdownMenuVisible$, hostVisible$, menuClickVisible$); /** @type {?} */ var subVisible$ = this.nzDropdownMenu.nzMenuDropdownService.menuOpen$; combineLatest([supVisible$, subVisible$]) .pipe(map((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = tslib_1.__read(_a, 2), supVisible = _b[0], subVisible = _b[1]; return supVisible || subVisible; })), debounceTime(50), distinctUntilChanged(), takeUntil(this.destroy$)) .subscribe((/** * @param {?} visible * @return {?} */ function (visible) { if (!_this.nzDisabled && _this.nzVisible !== visible) { _this.nzVisible = visible; _this.updateOverlayByVisible(); _this.nzVisibleChange.emit(_this.nzVisible); _this.setTriggerWidth(); _this.nzDropdownMenu.setValue('triggerWidth', _this.triggerWidth); } })); }; /** * @return {?} */ NzDropDownDirective.prototype.updateOverlayByVisible = /** * @return {?} */ function () { if (this.nzVisible) { this.openMenu(); } else { this.closeMenu(); } }; /** * @return {?} */ NzDropDownDirective.prototype.updateDisabledState = /** * @return {?} */ function () { this.setDisabled(this.nzDisabled); }; /** * @param {?} placement * @param {?} positions * @return {?} */ NzDropDownDirective.prototype.regeneratePosition = /** * @param {?} placement * @param {?} positions * @return {?} */ function (placement, positions) { return tslib_1.__spread([POSITION_MAP[placement]], positions); }; /** * @return {?} */ NzDropDownDirective.prototype.ngAfterViewInit = /** * @return {?} */ function () { if (this.nzDropdownMenu) { this.setTriggerWidth(); this.initActionSubscribe(); this.updateDisabledState(); } }; /** * @return {?} */ NzDropDownDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); this.dispose(); }; /** * @param {?} changes * @return {?} */ NzDropDownDirective.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var nzVisible = changes.nzVisible, nzTrigger = changes.nzTrigger, nzPlacement = changes.nzPlacement, nzDisabled = changes.nzDisabled, nzOverlayClassName = changes.nzOverlayClassName, nzOverlayStyle = changes.nzOverlayStyle, nzTableFilter = changes.nzTableFilter; if (this.nzDropdownMenu) { if (nzVisible) { this.updateOverlayByVisible(); this.nzDropdownMenu.visible$.next(this.nzVisible); } if (nzTrigger) { this.nzDropdownMenu.setValue('nzTrigger', this.nzTrigger); } if (nzTableFilter) { this.nzDropdownMenu.setValue('nzTableFilter', this.nzTableFilter); } if (nzOverlayClassName) { this.nzDropdownMenu.setValue('nzOverlayClassName', this.nzOverlayClassName); } if (nzOverlayStyle) { this.nzDropdownMenu.setValue('nzOverlayStyle', this.nzOverlayStyle); } if (nzPlacement) { this.nzDropdownMenu.setValue('nzPlacement', this.nzPlacement); this.nzDropdownMenu.setValue('dropDownPosition', this.nzDropdownMenu.nzPlacement.indexOf('top') !== -1 ? 'top' : 'bottom'); this.positions = this.regeneratePosition(this.nzPlacement, this.positions); this.updatePositionStrategy(this.positions); } } if (nzDisabled) { this.updateDisabledState(); } }; NzDropDownDirective.decorators = [ { type: Directive, args: [{ selector: '[nz-dropdown]', exportAs: 'nzDropdown' },] } ]; /** @nocollapse */ NzDropDownDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 }, { type: Overlay }, { type: Platform }, { type: ViewContainerRef } ]; }; NzDropDownDirective.propDecorators = { nzDropdownMenu: [{ type: Input }], nzTrigger: [{ type: Input }], nzMatchWidthElement: [{ type: Input }], nzClickHide: [{ type: Input }], nzDisabled: [{ type: Input }], nzVisible: [{ type: Input }], nzTableFilter: [{ type: Input }], nzOverlayClassName: [{ type: Input }], nzOverlayStyle: [{ type: Input }], nzPlacement: [{ type: Input }], nzVisibleChange: [{ type: Output }] }; tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzDropDownDirective.prototype, "nzClickHide", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzDropDownDirective.prototype, "nzDisabled", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzDropDownDirective.prototype, "nzVisible", void 0); tslib_1.__decorate([ InputBoolean(), tslib_1.__metadata("design:type", Object) ], NzDropDownDirective.prototype, "nzTableFilter", void 0); return NzDropDownDirective; }()); export { NzDropDownDirective }; if (false) { /** * @type {?} * @private */ NzDropDownDirective.prototype.portal; /** * @type {?} * @private */ NzDropDownDirective.prototype.overlayRef; /** * @type {?} * @private */ NzDropDownDirective.prototype.destroy$; /** * @type {?} * @private */ NzDropDownDirective.prototype.triggerWidth; /** * @type {?} * @private */ NzDropDownDirective.prototype.el; /** * @type {?} * @private */ NzDropDownDirective.prototype.dropdownOpen; /** * @type {?} * @private */ NzDropDownDirective.prototype.positionStrategy; /** * @type {?} * @private */ NzDropDownDirective.prototype.positions; /** * @type {?} * @private */ NzDropDownDirective.prototype.positionSubscription; /** * @type {?} * @private */ NzDropDownDirective.prototype.overlaySubscription; /** @type {?} */ NzDropDownDirective.prototype.hover$; /** @type {?} */ NzDropDownDirective.prototype.$click; /** @type {?} */ NzDropDownDirective.prototype.nzDropdownMenu; /** @type {?} */ NzDropDownDirective.prototype.nzTrigger; /** @type {?} */ NzDropDownDirective.prototype.nzMatchWidthElement; /** @type {?} */ NzDropDownDirective.prototype.nzClickHide; /** @type {?} */ NzDropDownDirective.prototype.nzDisabled; /** @type {?} */ NzDropDownDirective.prototype.nzVisible; /** @type {?} */ NzDropDownDirective.prototype.nzTableFilter; /** @type {?} */ NzDropDownDirective.prototype.nzOverlayClassName; /** @type {?} */ NzDropDownDirective.prototype.nzOverlayStyle; /** @type {?} */ NzDropDownDirective.prototype.nzPlacement; /** @type {?} */ NzDropDownDirective.prototype.nzVisibleChange; /** @type {?} */ NzDropDownDirective.prototype.elementRef; /** * @type {?} * @private */ NzDropDownDirective.prototype.renderer; /** * @type {?} * @private */ NzDropDownDirective.prototype.overlay; /** * @type {?} * @private */ NzDropDownDirective.prototype.platform; /** * @type {?} * @private */ NzDropDownDirective.prototype.viewContainerRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnotZHJvcGRvd24uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kcm9wZG93bi8iLCJzb3VyY2VzIjpbIm56LWRyb3Bkb3duLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBSUwsT0FBTyxFQUNQLGFBQWEsRUFFZCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUVULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRyxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hHLE9BQU8sRUFBRSx1QkFBdUIsRUFBbUIsTUFBTSw4QkFBOEIsQ0FBQztBQUV4RjtJQTBMRSw2QkFDUyxVQUFzQixFQUNyQixRQUFtQixFQUNuQixPQUFnQixFQUNoQixRQUFrQixFQUNsQixnQkFBa0M7UUFKbkMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixxQkFBZ0IsR0FBaEIs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LHVDQUEyQjs7Ozs7SUFDM0Isc0NBQXdCOzs7OztJQUN4Qix1Q0FBMEI7Ozs7O0lBQzFCLCtDQUEwQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQge1xuICBDb25uZWN0ZWRQb3NpdGlvbixcbiAgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFBsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMixcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERFRkFVTFRfRFJPUERPV05fUE9TSVRJT05TLCBJbnB1dEJvb2xlYW4sIFBPU0lUSU9OX01BUCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBmcm9tRXZlbnQsIG1lcmdlLCBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1hcFRvLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE56RHJvcGRvd25NZW51Q29tcG9uZW50LCBOelBsYWNlbWVudFR5cGUgfSBmcm9tICcuL256LWRyb3Bkb3duLW1lbnUuY29tcG9uZW50JztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW256LWRyb3Bkb3duXScsXG4gIGV4cG9ydEFzOiAnbnpEcm9wZG93bidcbn0pXG5leHBvcnQgY2xhc3MgTnpEcm9wRG93bkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgcHJpdmF0ZSBwb3J0YWw6IFRlbXBsYXRlUG9ydGFsO1xuICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByaXZhdGUgdHJpZ2dlcldpZHRoID0gMDtcbiAgcHJpdmF0ZSBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgcHJpdmF0ZSBkcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBwb3NpdGlvblN0cmF0ZWd5OiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k7XG4gIHByaXZhdGUgcG9zaXRpb25zOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10gPSBbLi4uREVGQVVMVF9EUk9QRE9XTl9QT1NJVElPTlNdO1xuICBwcml2YXRlIHBvc2l0aW9uU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuICBwcml2YXRlIG92ZXJsYXlTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gIHJlYWRvbmx5IGhvdmVyJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IG1lcmdlKFxuICAgIGZyb21FdmVudCh0aGlzLmVsLCAnbW91c2VlbnRlcicpLnBpcGUobWFwVG8odHJ1ZSkpLFxuICAgIGZyb21FdmVudCh0aGlzLmVsLCAnbW91c2VsZWF2ZScpLnBpcGUobWFwVG8oZmFsc2UpKVxuICApO1xuICByZWFkb25seSAkY2xpY2s6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSBmcm9tRXZlbnQodGhpcy5lbCwgJ2NsaWNrJykucGlwZShcbiAgICB0YXAoZSA9PiBlLnN0b3BQcm9wYWdhdGlvbigpKSxcbiAgICBtYXBUbyh0cnVlKVxuICApO1xuICBASW5wdXQoKSBuekRyb3Bkb3duTWVudTogTnpEcm9wZG93bk1lbnVDb21wb25lbnQ7XG4gIEBJbnB1dCgpIG56VHJpZ2dlcjogJ2NsaWNrJyB8ICdob3ZlcicgPSAnaG92ZXInO1xuICBASW5wdXQoKSBuek1hdGNoV2lkdGhFbGVtZW50OiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDbGlja0hpZGUgPSB0cnVlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpEaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpWaXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuelRhYmxlRmlsdGVyID0gZmFsc2U7XG4gIEBJbnB1dCgpIG56T3ZlcmxheUNsYXNzTmFtZSA9ICcnO1xuICBASW5wdXQoKSBuek92ZXJsYXlTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBASW5wdXQoKSBuelBsYWNlbWVudDogTnpQbGFjZW1lbnRUeXBlID0gJ2JvdHRvbUxlZnQnO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpWaXNpYmxlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgc2V0RGlzYWJsZWQoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWwsICdkaXNhYmxlZCcsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVBdHRyaWJ1dGUodGhpcy5lbCwgJ2Rpc2FibGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKCk6IE92ZXJsYXlDb25maWcge1xuICAgIHJldHVybiBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLm92ZXJsYXlcbiAgICAgICAgLnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGhpcy5lbClcbiAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpLFxuICAgICAgbWluV2lkdGg6IHRoaXMudHJpZ2dlcldpZHRoLFxuICAgICAgaGFzQmFja2Ryb3A6IHRoaXMubnpUcmlnZ2VyID09PSAnY2xpY2snLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IE92ZXJsYXlSZWYge1xuICAgIGlmICghdGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoKTtcbiAgICAgIHRoaXMub3ZlcmxheVJlZiA9IHRoaXMub3ZlcmxheS5jcmVhdGUoY29uZmlnKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlT3ZlcmxheUV2ZW50KHRoaXMub3ZlcmxheVJlZik7XG4gICAgICB0aGlzLnN1YnNjcmliZVRvUG9zaXRpb25zKGNvbmZpZy5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk7XG4gICAgICByZXR1cm4gdGhpcy5vdmVybGF5UmVmO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gdGhpcy5vdmVybGF5UmVmLmdldENvbmZpZygpO1xuICAgICAgdGhpcy51cGRhdGVPdmVybGF5Q29uZmlnKG92ZXJsYXlDb25maWcpO1xuICAgICAgcmV0dXJuIHRoaXMub3ZlcmxheVJlZjtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVPdmVybGF5Q29uZmlnKG92ZXJsYXlDb25maWc6IE92ZXJsYXlDb25maWcpOiBPdmVybGF5Q29uZmlnIHtcbiAgICBvdmVybGF5Q29uZmlnLm1pbldpZHRoID0gdGhpcy50cmlnZ2VyV2lkdGg7XG4gICAgb3ZlcmxheUNvbmZpZy5oYXNCYWNrZHJvcCA9IHRoaXMubnpUcmlnZ2VyID09PSAnY2xpY2snO1xuICAgIHJldHVybiBvdmVybGF5Q29uZmlnO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5vdmVybGF5UmVmID0gbnVsbDtcbiAgICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMub3ZlcmxheVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9Qb3NpdGlvbnMocG9zaXRpb246IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnBvc2l0aW9uU3Vic2NyaXB0aW9uID0gcG9zaXRpb24ucG9zaXRpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoY2hhbmdlID0+IHtcbiAgICAgIHRoaXMubnpEcm9wZG93bk1lbnUuc2V0VmFsdWUoJ2Ryb3BEb3duUG9zaXRpb24nLCBjaGFuZ2UuY29ubmVjdGlvblBhaXIub3JpZ2luWSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZU92ZXJsYXlFdmVudChvdmVybGF5UmVmOiBPdmVybGF5UmVmKTogdm9pZCB7XG4gICAgdGhpcy5vdmVybGF5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vdmVybGF5U3Vic2NyaXB0aW9uID0gbWVyZ2Uob3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCksIG92ZXJsYXlSZWYuZGV0YWNobWVudHMoKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51LnNldFZpc2libGVTdGF0ZVdoZW4oZmFsc2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFBvcnRhbCgpOiBUZW1wbGF0ZVBvcnRhbCB7XG4gICAgaWYgKCF0aGlzLnBvcnRhbCB8fCB0aGlzLnBvcnRhbC50ZW1wbGF0ZVJlZiAhPT0gdGhpcy5uekRyb3Bkb3duTWVudS50ZW1wbGF0ZVJlZikge1xuICAgICAgdGhpcy5wb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGhpcy5uekRyb3Bkb3duTWVudS50ZW1wbGF0ZVJlZiwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTWVudSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcGRvd25PcGVuKSB7XG4gICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gb3ZlcmxheVJlZi5nZXRDb25maWcoKTtcbiAgICAgIHRoaXMuc2V0UG9zaXRpb24ob3ZlcmxheUNvbmZpZy5wb3NpdGlvblN0cmF0ZWd5IGFzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk7XG4gICAgICBvdmVybGF5UmVmLmF0dGFjaCh0aGlzLmdldFBvcnRhbCgpKTtcbiAgICAgIHRoaXMuZHJvcGRvd25PcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMubnpEcm9wZG93bk1lbnUuc2V0VmFsdWUoJ29wZW4nLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTWVudSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vdmVybGF5UmVmKSB7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNoKCk7XG4gICAgICB0aGlzLmRyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5uekRyb3Bkb3duTWVudS5zZXRWYWx1ZSgnb3BlbicsIGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFBvc2l0aW9uKHBvc2l0aW9uU3RyYXRlZ3k6IEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSk6IHZvaWQge1xuICAgIHRoaXMucG9zaXRpb25TdHJhdGVneSA9IHBvc2l0aW9uU3RyYXRlZ3k7XG4gICAgcG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKFsuLi50aGlzLnBvc2l0aW9uc10pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHBvc2l0aW9uczogQ29ubmVjdGVkUG9zaXRpb25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBvc2l0aW9uU3RyYXRlZ3kpIHtcbiAgICAgIHRoaXMucG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKHBvc2l0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRUcmlnZ2VyV2lkdGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5uek1hdGNoV2lkdGhFbGVtZW50ID8gdGhpcy5uek1hdGNoV2lkdGhFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiB0aGlzLmVsO1xuICAgICAgdGhpcy50cmlnZ2VyV2lkdGggPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGluaXRBY3Rpb25TdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdFZpc2libGUkID0gdGhpcy5uelRyaWdnZXIgPT09ICdob3ZlcicgPyB0aGlzLmhvdmVyJCA6IHRoaXMuJGNsaWNrO1xuICAgIGNvbnN0IGRyb3Bkb3duTWVudVZpc2libGUkID0gdGhpcy5uekRyb3Bkb3duTWVudS52aXNpYmxlJDtcbiAgICBjb25zdCBtZW51Q2xpY2tWaXNpYmxlJCA9IHRoaXMubnpDbGlja0hpZGVcbiAgICAgID8gdGhpcy5uekRyb3Bkb3duTWVudS5uek1lbnVEcm9wZG93blNlcnZpY2UubWVudUl0ZW1DbGljayQucGlwZShtYXBUbyhmYWxzZSkpXG4gICAgICA6IEVNUFRZO1xuICAgIGNvbnN0IHN1cFZpc2libGUkID0gbWVyZ2UoZHJvcGRvd25NZW51VmlzaWJsZSQsIGhvc3RWaXNpYmxlJCwgbWVudUNsaWNrVmlzaWJsZSQpO1xuICAgIGNvbnN0IHN1YlZpc2libGUkID0gdGhpcy5uekRyb3Bkb3duTWVudS5uek1lbnVEcm9wZG93blNlcnZpY2UubWVudU9wZW4kO1xuICAgIGNvbWJpbmVMYXRlc3QoW3N1cFZpc2libGUkLCBzdWJWaXNpYmxlJF0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChbc3VwVmlzaWJsZSwgc3ViVmlzaWJsZV0pID0+IHN1cFZpc2libGUgfHwgc3ViVmlzaWJsZSksXG4gICAgICAgIGRlYm91bmNlVGltZSg1MCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh2aXNpYmxlID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm56RGlzYWJsZWQgJiYgdGhpcy5uelZpc2libGUgIT09IHZpc2libGUpIHtcbiAgICAgICAgICB0aGlzLm56VmlzaWJsZSA9IHZpc2libGU7XG4gICAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5QnlWaXNpYmxlKCk7XG4gICAgICAgICAgdGhpcy5uelZpc2libGVDaGFuZ2UuZW1pdCh0aGlzLm56VmlzaWJsZSk7XG4gICAgICAgICAgdGhpcy5zZXRUcmlnZ2VyV2lkdGgoKTtcbiAgICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51LnNldFZhbHVlKCd0cmlnZ2VyV2lkdGgnLCB0aGlzLnRyaWdnZXJXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlT3ZlcmxheUJ5VmlzaWJsZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5uelZpc2libGUpIHtcbiAgICAgIHRoaXMub3Blbk1lbnUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbG9zZU1lbnUoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVEaXNhYmxlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGlzYWJsZWQodGhpcy5uekRpc2FibGVkKTtcbiAgfVxuXG4gIHJlZ2VuZXJhdGVQb3NpdGlvbihwbGFjZW1lbnQ6IE56UGxhY2VtZW50VHlwZSwgcG9zaXRpb25zOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10pOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyW10ge1xuICAgIHJldHVybiBbUE9TSVRJT05fTUFQW3BsYWNlbWVudF0sIC4uLnBvc2l0aW9uc107XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZlxuICApIHtcbiAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdhbnQtZHJvcGRvd24tdHJpZ2dlcicpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56RHJvcGRvd25NZW51KSB7XG4gICAgICB0aGlzLnNldFRyaWdnZXJXaWR0aCgpO1xuICAgICAgdGhpcy5pbml0QWN0aW9uU3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgbnpWaXNpYmxlLFxuICAgICAgbnpUcmlnZ2VyLFxuICAgICAgbnpQbGFjZW1lbnQsXG4gICAgICBuekRpc2FibGVkLFxuICAgICAgbnpPdmVybGF5Q2xhc3NOYW1lLFxuICAgICAgbnpPdmVybGF5U3R5bGUsXG4gICAgICBuelRhYmxlRmlsdGVyXG4gICAgfSA9IGNoYW5nZXM7XG4gICAgaWYgKHRoaXMubnpEcm9wZG93bk1lbnUpIHtcbiAgICAgIGlmIChuelZpc2libGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVPdmVybGF5QnlWaXNpYmxlKCk7XG4gICAgICAgIHRoaXMubnpEcm9wZG93bk1lbnUudmlzaWJsZSQubmV4dCh0aGlzLm56VmlzaWJsZSk7XG4gICAgICB9XG4gICAgICBpZiAobnpUcmlnZ2VyKSB7XG4gICAgICAgIHRoaXMubnpEcm9wZG93bk1lbnUuc2V0VmFsdWUoJ256VHJpZ2dlcicsIHRoaXMubnpUcmlnZ2VyKTtcbiAgICAgIH1cbiAgICAgIGlmIChuelRhYmxlRmlsdGVyKSB7XG4gICAgICAgIHRoaXMubnpEcm9wZG93bk1lbnUuc2V0VmFsdWUoJ256VGFibGVGaWx0ZXInLCB0aGlzLm56VGFibGVGaWx0ZXIpO1xuICAgICAgfVxuICAgICAgaWYgKG56T3ZlcmxheUNsYXNzTmFtZSkge1xuICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51LnNldFZhbHVlKCduek92ZXJsYXlDbGFzc05hbWUnLCB0aGlzLm56T3ZlcmxheUNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobnpPdmVybGF5U3R5bGUpIHtcbiAgICAgICAgdGhpcy5uekRyb3Bkb3duTWVudS5zZXRWYWx1ZSgnbnpPdmVybGF5U3R5bGUnLCB0aGlzLm56T3ZlcmxheVN0eWxlKTtcbiAgICAgIH1cbiAgICAgIGlmIChuelBsYWNlbWVudCkge1xuICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51LnNldFZhbHVlKCduelBsYWNlbWVudCcsIHRoaXMubnpQbGFjZW1lbnQpO1xuICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51LnNldFZhbHVlKFxuICAgICAgICAgICdkcm9wRG93blBvc2l0aW9uJyxcbiAgICAgICAgICB0aGlzLm56RHJvcGRvd25NZW51Lm56UGxhY2VtZW50LmluZGV4T2YoJ3RvcCcpICE9PSAtMSA/ICd0b3AnIDogJ2JvdHRvbSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSB0aGlzLnJlZ2VuZXJhdGVQb3NpdGlvbih0aGlzLm56UGxhY2VtZW50LCB0aGlzLnBvc2l0aW9ucyk7XG4gICAgICAgIHRoaXMudXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLnBvc2l0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuekRpc2FibGVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZURpc2FibGVkU3RhdGUoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==