UNPKG

ng-zorro-antd

Version:

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

737 lines 59.1 kB
/** * @fileoverview added by tsickle * Generated from: drawer.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __decorate, __extends, __metadata } from "tslib"; /** * 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 { ConfigurableFocusTrapFactory } from '@angular/cdk/a11y'; import { ESCAPE } from '@angular/cdk/keycodes'; import { Overlay, OverlayConfig, OverlayKeyboardDispatcher } from '@angular/cdk/overlay'; import { CdkPortalOutlet, ComponentPortal, PortalInjector, TemplatePortal } from '@angular/cdk/portal'; import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Injector, Input, Optional, Output, Renderer2, TemplateRef, Type, ViewChild, ViewContainerRef } from '@angular/core'; import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config'; import { InputBoolean, toCssPixel } from 'ng-zorro-antd/core/util'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NzDrawerRef } from './drawer-ref'; /** @type {?} */ export var DRAWER_ANIMATE_DURATION = 300; /** @type {?} */ var NZ_CONFIG_COMPONENT_NAME = 'drawer'; /** * @template T, R, D */ var NzDrawerComponent = /** @class */ (function (_super) { __extends(NzDrawerComponent, _super); function NzDrawerComponent(document, nzConfigService, renderer, overlay, injector, changeDetectorRef, focusTrapFactory, viewContainerRef, overlayKeyboardDispatcher) { var _this = _super.call(this) || this; _this.document = document; _this.nzConfigService = nzConfigService; _this.renderer = renderer; _this.overlay = overlay; _this.injector = injector; _this.changeDetectorRef = changeDetectorRef; _this.focusTrapFactory = focusTrapFactory; _this.viewContainerRef = viewContainerRef; _this.overlayKeyboardDispatcher = overlayKeyboardDispatcher; _this.nzClosable = true; _this.nzMaskClosable = true; _this.nzMask = true; _this.nzCloseOnNavigation = true; _this.nzNoAnimation = false; _this.nzKeyboard = true; _this.nzPlacement = 'right'; _this.nzMaskStyle = {}; _this.nzBodyStyle = {}; _this.nzWidth = 256; _this.nzHeight = 256; _this.nzZIndex = 1000; _this.nzOffsetX = 0; _this.nzOffsetY = 0; _this.componentInstance = null; _this.nzOnViewInit = new EventEmitter(); _this.nzOnClose = new EventEmitter(); _this.destroy$ = new Subject(); _this.placementChanging = false; _this.placementChangeTimeoutId = -1; _this.isOpen = false; _this.templateContext = { $implicit: undefined, drawerRef: (/** @type {?} */ (_this)) }; _this.nzAfterOpen = new Subject(); _this.nzAfterClose = new Subject(); return _this; } Object.defineProperty(NzDrawerComponent.prototype, "nzVisible", { get: /** * @return {?} */ function () { return this.isOpen; }, set: /** * @param {?} value * @return {?} */ function (value) { this.isOpen = value; }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "offsetTransform", { get: /** * @return {?} */ function () { if (!this.isOpen || this.nzOffsetX + this.nzOffsetY === 0) { return null; } switch (this.nzPlacement) { case 'left': return "translateX(" + this.nzOffsetX + "px)"; case 'right': return "translateX(-" + this.nzOffsetX + "px)"; case 'top': return "translateY(" + this.nzOffsetY + "px)"; case 'bottom': return "translateY(-" + this.nzOffsetY + "px)"; } }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "transform", { get: /** * @return {?} */ function () { if (this.isOpen) { return null; } switch (this.nzPlacement) { case 'left': return "translateX(-100%)"; case 'right': return "translateX(100%)"; case 'top': return "translateY(-100%)"; case 'bottom': return "translateY(100%)"; } }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "width", { get: /** * @return {?} */ function () { return this.isLeftOrRight ? toCssPixel(this.nzWidth) : null; }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "height", { get: /** * @return {?} */ function () { return !this.isLeftOrRight ? toCssPixel(this.nzHeight) : null; }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "isLeftOrRight", { get: /** * @return {?} */ function () { return this.nzPlacement === 'left' || this.nzPlacement === 'right'; }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "afterOpen", { get: /** * @return {?} */ function () { return this.nzAfterOpen.asObservable(); }, enumerable: true, configurable: true }); Object.defineProperty(NzDrawerComponent.prototype, "afterClose", { get: /** * @return {?} */ function () { return this.nzAfterClose.asObservable(); }, enumerable: true, configurable: true }); /** * @param {?} value * @return {?} */ NzDrawerComponent.prototype.isTemplateRef = /** * @param {?} value * @return {?} */ function (value) { return value instanceof TemplateRef; }; /** * @return {?} */ NzDrawerComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.attachOverlay(); this.updateOverlayStyle(); this.updateBodyOverflow(); this.templateContext = { $implicit: this.nzContentParams, drawerRef: (/** @type {?} */ (this)) }; this.changeDetectorRef.detectChanges(); }; /** * @return {?} */ NzDrawerComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; this.attachBodyContent(); setTimeout((/** * @return {?} */ function () { _this.nzOnViewInit.emit(); })); }; /** * @param {?} changes * @return {?} */ NzDrawerComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { var nzPlacement = changes.nzPlacement, nzVisible = changes.nzVisible; if (nzVisible) { /** @type {?} */ var value = changes.nzVisible.currentValue; if (value) { this.open(); } else { this.close(); } } if (nzPlacement && !nzPlacement.isFirstChange()) { this.triggerPlacementChangeCycleOnce(); } }; /** * @return {?} */ NzDrawerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { this.destroy$.next(); this.destroy$.complete(); clearTimeout(this.placementChangeTimeoutId); this.disposeOverlay(); }; /** * @private * @return {?} */ NzDrawerComponent.prototype.getAnimationDuration = /** * @private * @return {?} */ function () { return this.nzNoAnimation ? 0 : DRAWER_ANIMATE_DURATION; }; // Disable the transition animation temporarily when the placement changing // Disable the transition animation temporarily when the placement changing /** * @private * @return {?} */ NzDrawerComponent.prototype.triggerPlacementChangeCycleOnce = // Disable the transition animation temporarily when the placement changing /** * @private * @return {?} */ function () { var _this = this; if (!this.nzNoAnimation) { this.placementChanging = true; this.changeDetectorRef.markForCheck(); clearTimeout(this.placementChangeTimeoutId); this.placementChangeTimeoutId = setTimeout((/** * @return {?} */ function () { _this.placementChanging = false; _this.changeDetectorRef.markForCheck(); }), this.getAnimationDuration()); } }; /** * @param {?=} result * @return {?} */ NzDrawerComponent.prototype.close = /** * @param {?=} result * @return {?} */ function (result) { var _this = this; this.isOpen = false; this.updateOverlayStyle(); this.overlayKeyboardDispatcher.remove((/** @type {?} */ (this.overlayRef))); this.changeDetectorRef.detectChanges(); setTimeout((/** * @return {?} */ function () { _this.updateBodyOverflow(); _this.restoreFocus(); _this.nzAfterClose.next(result); _this.nzAfterClose.complete(); _this.componentInstance = null; }), this.getAnimationDuration()); }; /** * @return {?} */ NzDrawerComponent.prototype.open = /** * @return {?} */ function () { var _this = this; this.attachOverlay(); this.isOpen = true; this.overlayKeyboardDispatcher.add((/** @type {?} */ (this.overlayRef))); this.updateOverlayStyle(); this.updateBodyOverflow(); this.savePreviouslyFocusedElement(); this.trapFocus(); this.changeDetectorRef.detectChanges(); setTimeout((/** * @return {?} */ function () { _this.nzAfterOpen.next(); }), this.getAnimationDuration()); }; /** * @return {?} */ NzDrawerComponent.prototype.getContentComponent = /** * @return {?} */ function () { return this.componentInstance; }; /** * @return {?} */ NzDrawerComponent.prototype.closeClick = /** * @return {?} */ function () { this.nzOnClose.emit(); }; /** * @return {?} */ NzDrawerComponent.prototype.maskClick = /** * @return {?} */ function () { if (this.nzMaskClosable && this.nzMask) { this.nzOnClose.emit(); } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.attachBodyContent = /** * @private * @return {?} */ function () { (/** @type {?} */ (this.bodyPortalOutlet)).dispose(); if (this.nzContent instanceof Type) { /** @type {?} */ var childInjector = new PortalInjector(this.injector, new WeakMap([[NzDrawerRef, this]])); /** @type {?} */ var componentPortal = new ComponentPortal(this.nzContent, null, childInjector); /** @type {?} */ var componentRef = (/** @type {?} */ (this.bodyPortalOutlet)).attachComponentPortal(componentPortal); this.componentInstance = componentRef.instance; Object.assign(componentRef.instance, this.nzContentParams); componentRef.changeDetectorRef.detectChanges(); } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.attachOverlay = /** * @private * @return {?} */ function () { var _this = this; if (!this.overlayRef) { this.portal = new TemplatePortal(this.drawerTemplate, this.viewContainerRef); this.overlayRef = this.overlay.create(this.getOverlayConfig()); } if (this.overlayRef && !this.overlayRef.hasAttached()) { this.overlayRef.attach(this.portal); (/** @type {?} */ (this.overlayRef)).keydownEvents() .pipe(takeUntil(this.destroy$)) .subscribe((/** * @param {?} event * @return {?} */ function (event) { if (event.keyCode === ESCAPE && _this.isOpen && _this.nzKeyboard) { _this.nzOnClose.emit(); } })); this.overlayRef .detachments() .pipe(takeUntil(this.destroy$)) .subscribe((/** * @return {?} */ function () { _this.disposeOverlay(); })); } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.disposeOverlay = /** * @private * @return {?} */ function () { var _a; (_a = this.overlayRef) === null || _a === void 0 ? void 0 : _a.dispose(); this.overlayRef = null; }; /** * @private * @return {?} */ NzDrawerComponent.prototype.getOverlayConfig = /** * @private * @return {?} */ function () { return new OverlayConfig({ disposeOnNavigation: this.nzCloseOnNavigation, positionStrategy: this.overlay.position().global(), scrollStrategy: this.overlay.scrollStrategies.block() }); }; /** * @private * @return {?} */ NzDrawerComponent.prototype.updateOverlayStyle = /** * @private * @return {?} */ function () { if (this.overlayRef && this.overlayRef.overlayElement) { this.renderer.setStyle(this.overlayRef.overlayElement, 'pointer-events', this.isOpen ? 'auto' : 'none'); } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.updateBodyOverflow = /** * @private * @return {?} */ function () { if (this.overlayRef) { if (this.isOpen) { (/** @type {?} */ (this.overlayRef.getConfig().scrollStrategy)).enable(); } else { (/** @type {?} */ (this.overlayRef.getConfig().scrollStrategy)).disable(); } } }; /** * @return {?} */ NzDrawerComponent.prototype.savePreviouslyFocusedElement = /** * @return {?} */ function () { if (this.document && !this.previouslyFocusedElement) { this.previouslyFocusedElement = (/** @type {?} */ (this.document.activeElement)); // We need the extra check, because IE's svg element has no blur method. if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.blur === 'function') { this.previouslyFocusedElement.blur(); } } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.trapFocus = /** * @private * @return {?} */ function () { if (!this.focusTrap && this.overlayRef && this.overlayRef.overlayElement) { this.focusTrap = this.focusTrapFactory.create((/** @type {?} */ (this.overlayRef)).overlayElement); this.focusTrap.focusInitialElement(); } }; /** * @private * @return {?} */ NzDrawerComponent.prototype.restoreFocus = /** * @private * @return {?} */ function () { // We need the extra check, because IE can set the `activeElement` to null in some cases. if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') { this.previouslyFocusedElement.focus(); } if (this.focusTrap) { this.focusTrap.destroy(); } }; NzDrawerComponent.decorators = [ { type: Component, args: [{ selector: 'nz-drawer', exportAs: 'nzDrawer', template: "\n <ng-template #drawerTemplate>\n <div\n class=\"ant-drawer\"\n [nzNoAnimation]=\"nzNoAnimation\"\n [class.ant-drawer-open]=\"isOpen\"\n [class.no-mask]=\"!nzMask\"\n [class.ant-drawer-top]=\"nzPlacement === 'top'\"\n [class.ant-drawer-bottom]=\"nzPlacement === 'bottom'\"\n [class.ant-drawer-right]=\"nzPlacement === 'right'\"\n [class.ant-drawer-left]=\"nzPlacement === 'left'\"\n [style.transform]=\"offsetTransform\"\n [style.transition]=\"placementChanging ? 'none' : null\"\n [style.zIndex]=\"nzZIndex\"\n >\n <div class=\"ant-drawer-mask\" (click)=\"maskClick()\" *ngIf=\"nzMask\" [ngStyle]=\"nzMaskStyle\"></div>\n <div\n class=\"ant-drawer-content-wrapper {{ nzWrapClassName }}\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.transform]=\"transform\"\n [style.transition]=\"placementChanging ? 'none' : null\"\n >\n <div class=\"ant-drawer-content\">\n <div class=\"ant-drawer-wrapper-body\" [style.height]=\"isLeftOrRight ? '100%' : null\">\n <div *ngIf=\"nzTitle || nzClosable\" [class.ant-drawer-header]=\"!!nzTitle\" [class.ant-drawer-header-no-title]=\"!nzTitle\">\n <div *ngIf=\"nzTitle\" class=\"ant-drawer-title\">\n <ng-container *nzStringTemplateOutlet=\"nzTitle\"><div [innerHTML]=\"nzTitle\"></div></ng-container>\n </div>\n <button *ngIf=\"nzClosable\" (click)=\"closeClick()\" aria-label=\"Close\" class=\"ant-drawer-close\" style=\"--scroll-bar: 0px;\">\n <i nz-icon nzType=\"close\"></i>\n </button>\n </div>\n <div class=\"ant-drawer-body\" [ngStyle]=\"nzBodyStyle\">\n <ng-template cdkPortalOutlet></ng-template>\n <ng-container *ngIf=\"isTemplateRef(nzContent)\">\n <ng-container *ngTemplateOutlet=\"$any(nzContent); context: templateContext\"></ng-container>\n </ng-container>\n <ng-content *ngIf=\"!nzContent\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n ", preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ NzDrawerComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] }, { type: NzConfigService }, { type: Renderer2 }, { type: Overlay }, { type: Injector }, { type: ChangeDetectorRef }, { type: ConfigurableFocusTrapFactory }, { type: ViewContainerRef }, { type: OverlayKeyboardDispatcher } ]; }; NzDrawerComponent.propDecorators = { nzContent: [{ type: Input }], nzClosable: [{ type: Input }], nzMaskClosable: [{ type: Input }], nzMask: [{ type: Input }], nzCloseOnNavigation: [{ type: Input }], nzNoAnimation: [{ type: Input }], nzKeyboard: [{ type: Input }], nzTitle: [{ type: Input }], nzPlacement: [{ type: Input }], nzMaskStyle: [{ type: Input }], nzBodyStyle: [{ type: Input }], nzWrapClassName: [{ type: Input }], nzWidth: [{ type: Input }], nzHeight: [{ type: Input }], nzZIndex: [{ type: Input }], nzOffsetX: [{ type: Input }], nzOffsetY: [{ type: Input }], nzVisible: [{ type: Input }], nzOnViewInit: [{ type: Output }], nzOnClose: [{ type: Output }], drawerTemplate: [{ type: ViewChild, args: ['drawerTemplate', { static: true },] }], bodyPortalOutlet: [{ type: ViewChild, args: [CdkPortalOutlet, { static: false },] }] }; __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDrawerComponent.prototype, "nzClosable", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME), InputBoolean(), __metadata("design:type", Boolean) ], NzDrawerComponent.prototype, "nzMaskClosable", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME), InputBoolean(), __metadata("design:type", Boolean) ], NzDrawerComponent.prototype, "nzMask", void 0); __decorate([ WithConfig(NZ_CONFIG_COMPONENT_NAME), InputBoolean(), __metadata("design:type", Boolean) ], NzDrawerComponent.prototype, "nzCloseOnNavigation", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], NzDrawerComponent.prototype, "nzNoAnimation", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzDrawerComponent.prototype, "nzKeyboard", void 0); return NzDrawerComponent; }(NzDrawerRef)); export { NzDrawerComponent }; if (false) { /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzClosable; /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzMaskClosable; /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzMask; /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzNoAnimation; /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzKeyboard; /** @type {?} */ NzDrawerComponent.ngAcceptInputType_nzCloseOnNavigation; /** @type {?} */ NzDrawerComponent.prototype.nzContent; /** @type {?} */ NzDrawerComponent.prototype.nzClosable; /** @type {?} */ NzDrawerComponent.prototype.nzMaskClosable; /** @type {?} */ NzDrawerComponent.prototype.nzMask; /** @type {?} */ NzDrawerComponent.prototype.nzCloseOnNavigation; /** @type {?} */ NzDrawerComponent.prototype.nzNoAnimation; /** @type {?} */ NzDrawerComponent.prototype.nzKeyboard; /** @type {?} */ NzDrawerComponent.prototype.nzTitle; /** @type {?} */ NzDrawerComponent.prototype.nzPlacement; /** @type {?} */ NzDrawerComponent.prototype.nzMaskStyle; /** @type {?} */ NzDrawerComponent.prototype.nzBodyStyle; /** @type {?} */ NzDrawerComponent.prototype.nzWrapClassName; /** @type {?} */ NzDrawerComponent.prototype.nzWidth; /** @type {?} */ NzDrawerComponent.prototype.nzHeight; /** @type {?} */ NzDrawerComponent.prototype.nzZIndex; /** @type {?} */ NzDrawerComponent.prototype.nzOffsetX; /** @type {?} */ NzDrawerComponent.prototype.nzOffsetY; /** * @type {?} * @private */ NzDrawerComponent.prototype.componentInstance; /** @type {?} */ NzDrawerComponent.prototype.nzOnViewInit; /** @type {?} */ NzDrawerComponent.prototype.nzOnClose; /** @type {?} */ NzDrawerComponent.prototype.drawerTemplate; /** @type {?} */ NzDrawerComponent.prototype.bodyPortalOutlet; /** @type {?} */ NzDrawerComponent.prototype.destroy$; /** @type {?} */ NzDrawerComponent.prototype.previouslyFocusedElement; /** @type {?} */ NzDrawerComponent.prototype.placementChanging; /** @type {?} */ NzDrawerComponent.prototype.placementChangeTimeoutId; /** @type {?} */ NzDrawerComponent.prototype.nzContentParams; /** @type {?} */ NzDrawerComponent.prototype.overlayRef; /** @type {?} */ NzDrawerComponent.prototype.portal; /** @type {?} */ NzDrawerComponent.prototype.focusTrap; /** @type {?} */ NzDrawerComponent.prototype.isOpen; /** @type {?} */ NzDrawerComponent.prototype.templateContext; /** @type {?} */ NzDrawerComponent.prototype.nzAfterOpen; /** @type {?} */ NzDrawerComponent.prototype.nzAfterClose; /** * @type {?} * @private */ NzDrawerComponent.prototype.document; /** @type {?} */ NzDrawerComponent.prototype.nzConfigService; /** * @type {?} * @private */ NzDrawerComponent.prototype.renderer; /** * @type {?} * @private */ NzDrawerComponent.prototype.overlay; /** * @type {?} * @private */ NzDrawerComponent.prototype.injector; /** * @type {?} * @private */ NzDrawerComponent.prototype.changeDetectorRef; /** * @type {?} * @private */ NzDrawerComponent.prototype.focusTrapFactory; /** * @type {?} * @private */ NzDrawerComponent.prototype.viewContainerRef; /** * @type {?} * @private */ NzDrawerComponent.prototype.overlayKeyboardDispatcher; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvZHJhd2VyLyIsInNvdXJjZXMiOlsiZHJhd2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBS0EsT0FBTyxFQUFFLDRCQUE0QixFQUFhLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxJQUFJLEVBQ0osU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFM0MsTUFBTSxLQUFPLHVCQUF1QixHQUFHLEdBQUc7O0lBRXBDLHdCQUF3QixHQUFHLFFBQVE7Ozs7QUFFekM7SUFv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QWU7O0lBQ2YsNENBR0U7O0lBK0NGLHdDQUFrQzs7SUFDbEMseUNBQWdDOzs7OztJQWU5QixxQ0FBeUQ7O0lBQ3pELDRDQUF1Qzs7Ozs7SUFDdkMscUNBQTJCOzs7OztJQUMzQixvQ0FBd0I7Ozs7O0lBQ3hCLHFDQUEwQjs7Ozs7SUFDMUIsOENBQTRDOzs7OztJQUM1Qyw2Q0FBc0Q7Ozs7O0lBQ3RELDZDQUEwQzs7Ozs7SUFDMUMsc0RBQTREIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeSwgRm9jdXNUcmFwIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgRVNDQVBFIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIsIE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBDZGtQb3J0YWxPdXRsZXQsIENvbXBvbmVudFBvcnRhbCwgUG9ydGFsSW5qZWN0b3IsIFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnpDb25maWdTZXJ2aWNlLCBXaXRoQ29uZmlnIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIE5nU3R5bGVJbnRlcmZhY2UsIE56U2FmZUFueSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5pbXBvcnQgeyBJbnB1dEJvb2xlYW4sIHRvQ3NzUGl4ZWwgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE56RHJhd2VyT3B0aW9uc09mQ29tcG9uZW50LCBOekRyYXdlclBsYWNlbWVudCB9IGZyb20gJy4vZHJhd2VyLW9wdGlvbnMnO1xuaW1wb3J0IHsgTnpEcmF3ZXJSZWYgfSBmcm9tICcuL2RyYXdlci1yZWYnO1xuXG5leHBvcnQgY29uc3QgRFJBV0VSX0FOSU1BVEVfRFVSQVRJT04gPSAzMDA7XG5cbmNvbnN0IE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSA9ICdkcmF3ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei1kcmF3ZXInLFxuICBleHBvcnRBczogJ256RHJhd2VyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctdGVtcGxhdGUgI2RyYXdlclRlbXBsYXRlPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImFudC1kcmF3ZXJcIlxuICAgICAgICBbbnpOb0FuaW1hdGlvbl09XCJuek5vQW5pbWF0aW9uXCJcbiAgICAgICAgW2NsYXNzLmFudC1kcmF3ZXItb3Blbl09XCJpc09wZW5cIlxuICAgICAgICBbY2xhc3Mubm8tbWFza109XCIhbnpNYXNrXCJcbiAgICAgICAgW2NsYXNzLmFudC1kcmF3ZXItdG9wXT1cIm56UGxhY2VtZW50ID09PSAndG9wJ1wiXG4gICAgICAgIFtjbGFzcy5hbnQtZHJhd2VyLWJvdHRvbV09XCJuelBsYWNlbWVudCA9PT0gJ2JvdHRvbSdcIlxuICAgICAgICBbY2xhc3MuYW50LWRyYXdlci1yaWdodF09XCJuelBsYWNlbWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtjbGFzcy5hbnQtZHJhd2VyLWxlZnRdPVwibnpQbGFjZW1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwib2Zmc2V0VHJhbnNmb3JtXCJcbiAgICAgICAgW3N0eWxlLnRyYW5zaXRpb25dPVwicGxhY2VtZW50Q2hhbmdpbmcgPyAnbm9uZScgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLnpJbmRleF09XCJuelpJbmRleFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtZHJhd2VyLW1hc2tcIiAoY2xpY2spPVwibWFza0NsaWNrKClcIiAqbmdJZj1cIm56TWFza1wiIFtuZ1N0eWxlXT1cIm56TWFza1N0eWxlXCI+PC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1kcmF3ZXItY29udGVudC13cmFwcGVyIHt7IG56V3JhcENsYXNzTmFtZSB9fVwiXG4gICAgICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodFwiXG4gICAgICAgICAgW3N0eWxlLnRyYW5zZm9ybV09XCJ0cmFuc2Zvcm1cIlxuICAgICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cInBsYWNlbWVudENoYW5naW5nID8gJ25vbmUnIDogbnVsbFwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWRyYXdlci1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWRyYXdlci13cmFwcGVyLWJvZHlcIiBbc3R5bGUuaGVpZ2h0XT1cImlzTGVmdE9yUmlnaHQgPyAnMTAwJScgOiBudWxsXCI+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJuelRpdGxlIHx8IG56Q2xvc2FibGVcIiBbY2xhc3MuYW50LWRyYXdlci1oZWFkZXJdPVwiISFuelRpdGxlXCIgW2NsYXNzLmFudC1kcmF3ZXItaGVhZGVyLW5vLXRpdGxlXT1cIiFuelRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIm56VGl0bGVcIiBjbGFzcz1cImFudC1kcmF3ZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm56U3RyaW5nVGVtcGxhdGVPdXRsZXQ9XCJuelRpdGxlXCI+PGRpdiBbaW5uZXJIVE1MXT1cIm56VGl0bGVcIj48L2Rpdj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwibnpDbG9zYWJsZVwiIChjbGljayk9XCJjbG9zZUNsaWNrKClcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiBjbGFzcz1cImFudC1kcmF3ZXItY2xvc2VcIiBzdHlsZT1cIi0tc2Nyb2xsLWJhcjogMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJjbG9zZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtZHJhd2VyLWJvZHlcIiBbbmdTdHlsZV09XCJuekJvZHlTdHlsZVwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBjZGtQb3J0YWxPdXRsZXQ+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNUZW1wbGF0ZVJlZihuekNvbnRlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiJGFueShuekNvbnRlbnQpOyBjb250ZXh0OiB0ZW1wbGF0ZUNvbnRleHRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCAqbmdJZj1cIiFuekNvbnRlbnRcIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgYCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE56RHJhd2VyQ29tcG9uZW50PFQgPSBOelNhZmVBbnksIFIgPSBOelNhZmVBbnksIEQgPSBOelNhZmVBbnk+IGV4dGVuZHMgTnpEcmF3ZXJSZWY8VCwgUj5cbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBOekRyYXdlck9wdGlvbnNPZkNvbXBvbmVudCB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNsb3NhYmxlOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uek1hc2tDbG9zYWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpNYXNrOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uek5vQW5pbWF0aW9uOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uektleWJvYXJkOiBCb29sZWFuSW5wdXQ7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekNsb3NlT25OYXZpZ2F0aW9uOiBCb29sZWFuSW5wdXQ7XG5cbiAgQElucHV0KCkgbnpDb250ZW50ITogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IEQ7IGRyYXdlclJlZjogTnpEcmF3ZXJSZWY8Uj4gfT4gfCBUeXBlPFQ+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDbG9zYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSkgQElucHV0Qm9vbGVhbigpIG56TWFza0Nsb3NhYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSBASW5wdXRCb29sZWFuKCkgbnpNYXNrOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgQFdpdGhDb25maWcoTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FKSBASW5wdXRCb29sZWFuKCkgbnpDbG9zZU9uTmF2aWdhdGlvbjogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek5vQW5pbWF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuektleWJvYXJkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgbnpUaXRsZT86IHN0cmluZyB8IFRlbXBsYXRlUmVmPHt9PjtcbiAgQElucHV0KCkgbnpQbGFjZW1lbnQ6IE56RHJhd2VyUGxhY2VtZW50ID0gJ3JpZ2h0JztcbiAgQElucHV0KCkgbnpNYXNrU3R5bGU6IE5nU3R5bGVJbnRlcmZhY2UgPSB7fTtcbiAgQElucHV0KCkgbnpCb2R5U3R5bGU6IE5nU3R5bGVJbnRlcmZhY2UgPSB7fTtcbiAgQElucHV0KCkgbnpXcmFwQ2xhc3NOYW1lPzogc3RyaW5nO1xuICBASW5wdXQoKSBueldpZHRoOiBudW1iZXIgfCBzdHJpbmcgPSAyNTY7XG4gIEBJbnB1dCgpIG56SGVpZ2h0OiBudW1iZXIgfCBzdHJpbmcgPSAyNTY7XG4gIEBJbnB1dCgpIG56WkluZGV4ID0gMTAwMDtcbiAgQElucHV0KCkgbnpPZmZzZXRYID0gMDtcbiAgQElucHV0KCkgbnpPZmZzZXRZID0gMDtcbiAgcHJpdmF0ZSBjb21wb25lbnRJbnN0YW5jZTogVCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBuelZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzT3BlbiA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IG56VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09wZW47XG4gIH1cblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPblZpZXdJbml0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2RyYXdlclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZHJhd2VyVGVtcGxhdGUhOiBUZW1wbGF0ZVJlZjx2b2lkPjtcbiAgQFZpZXdDaGlsZChDZGtQb3J0YWxPdXRsZXQsIHsgc3RhdGljOiBmYWxzZSB9KSBib2R5UG9ydGFsT3V0bGV0PzogQ2RrUG9ydGFsT3V0bGV0O1xuXG4gIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJldmlvdXNseUZvY3VzZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHBsYWNlbWVudENoYW5naW5nID0gZmFsc2U7XG4gIHBsYWNlbWVudENoYW5nZVRpbWVvdXRJZCA9IC0xO1xuICBuekNvbnRlbnRQYXJhbXM/OiBEOyAvLyBvbmx5IHNlcnZpY2VcbiAgb3ZlcmxheVJlZj86IE92ZXJsYXlSZWYgfCBudWxsO1xuICBwb3J0YWw/OiBUZW1wbGF0ZVBvcnRhbDtcbiAgZm9jdXNUcmFwPzogRm9jdXNUcmFwO1xuICBpc09wZW4gPSBmYWxzZTtcbiAgdGVtcGxhdGVDb250ZXh0OiB7ICRpbXBsaWNpdDogRCB8IHVuZGVmaW5lZDsgZHJhd2VyUmVmOiBOekRyYXdlclJlZjxSPiB9ID0ge1xuICAgICRpbXBsaWNpdDogdW5kZWZpbmVkLFxuICAgIGRyYXdlclJlZjogdGhpcyBhcyBOekRyYXdlclJlZjxSPlxuICB9O1xuXG4gIGdldCBvZmZzZXRUcmFuc2Zvcm0oKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmlzT3BlbiB8fCB0aGlzLm56T2Zmc2V0WCArIHRoaXMubnpPZmZzZXRZID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLm56UGxhY2VtZW50KSB7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVYKCR7dGhpcy5uek9mZnNldFh9cHgpYDtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVYKC0ke3RoaXMubnpPZmZzZXRYfXB4KWA7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVkoJHt0aGlzLm56T2Zmc2V0WX1weClgO1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVZKC0ke3RoaXMubnpPZmZzZXRZfXB4KWA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRyYW5zZm9ybSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5uelBsYWNlbWVudCkge1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWCgtMTAwJSlgO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVgoMTAwJSlgO1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVZKC0xMDAlKWA7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVkoMTAwJSlgO1xuICAgIH1cbiAgfVxuXG4gIGdldCB3aWR0aCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5pc0xlZnRPclJpZ2h0ID8gdG9Dc3NQaXhlbCh0aGlzLm56V2lkdGgpIDogbnVsbDtcbiAgfVxuXG4gIGdldCBoZWlnaHQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuICF0aGlzLmlzTGVmdE9yUmlnaHQgPyB0b0Nzc1BpeGVsKHRoaXMubnpIZWlnaHQpIDogbnVsbDtcbiAgfVxuXG4gIGdldCBpc0xlZnRPclJpZ2h0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm56UGxhY2VtZW50ID09PSAnbGVmdCcgfHwgdGhpcy5uelBsYWNlbWVudCA9