UNPKG

ng-zorro-antd

Version:

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

488 lines 43.6 kB
/** * @fileoverview added by tsickle * Generated from: resizable.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __decorate, __metadata } 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 { Platform } from '@angular/cdk/platform'; import { Directive, ElementRef, EventEmitter, Input, NgZone, Output, Renderer2 } from '@angular/core'; import { ensureInBounds, InputBoolean } from 'ng-zorro-antd/core/util'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { getEventWithPoint } from './resizable-utils'; import { NzResizableService } from './resizable.service'; /** * @record */ export function NzResizeEvent() { } if (false) { /** @type {?|undefined} */ NzResizeEvent.prototype.width; /** @type {?|undefined} */ NzResizeEvent.prototype.height; /** @type {?|undefined} */ NzResizeEvent.prototype.col; /** @type {?|undefined} */ NzResizeEvent.prototype.mouseEvent; } export class NzResizableDirective { /** * @param {?} elementRef * @param {?} renderer * @param {?} nzResizableService * @param {?} platform * @param {?} ngZone */ constructor(elementRef, renderer, nzResizableService, platform, ngZone) { this.elementRef = elementRef; this.renderer = renderer; this.nzResizableService = nzResizableService; this.platform = platform; this.ngZone = ngZone; this.nzBounds = 'parent'; this.nzMinHeight = 40; this.nzMinWidth = 40; this.nzGridColumnCount = -1; this.nzMaxColumn = -1; this.nzMinColumn = -1; this.nzLockAspectRatio = false; this.nzPreview = false; this.nzResize = new EventEmitter(); this.nzResizeEnd = new EventEmitter(); this.nzResizeStart = new EventEmitter(); this.resizing = false; this.destroy$ = new Subject(); this.nzResizableService.handleMouseDown$.pipe(takeUntil(this.destroy$)).subscribe((/** * @param {?} event * @return {?} */ event => { this.resizing = true; this.nzResizableService.startResizing(event.mouseEvent); this.currentHandleEvent = event; this.setCursor(); this.nzResizeStart.emit({ mouseEvent: event.mouseEvent }); this.elRect = this.el.getBoundingClientRect(); })); this.nzResizableService.documentMouseUp$.pipe(takeUntil(this.destroy$)).subscribe((/** * @param {?} event * @return {?} */ event => { if (this.resizing) { this.resizing = false; this.nzResizableService.documentMouseUp$.next(); this.endResize(event); } })); this.nzResizableService.documentMouseMove$.pipe(takeUntil(this.destroy$)).subscribe((/** * @param {?} event * @return {?} */ event => { if (this.resizing) { this.resize(event); } })); } /** * @return {?} */ onMouseenter() { this.nzResizableService.mouseEntered$.next(true); } /** * @return {?} */ onMouseleave() { this.nzResizableService.mouseEntered$.next(false); } /** * @return {?} */ setPosition() { /** @type {?} */ const position = getComputedStyle(this.el).position; if (position === 'static' || !position) { this.renderer.setStyle(this.el, 'position', 'relative'); } } /** * @param {?} width * @param {?} height * @param {?} ratio * @return {?} */ calcSize(width, height, ratio) { /** @type {?} */ let newWidth; /** @type {?} */ let newHeight; /** @type {?} */ let maxWidth; /** @type {?} */ let maxHeight; /** @type {?} */ let col = 0; /** @type {?} */ let spanWidth = 0; /** @type {?} */ let minWidth = this.nzMinWidth; /** @type {?} */ let boundWidth = Infinity; /** @type {?} */ let boundHeight = Infinity; if (this.nzBounds === 'parent') { /** @type {?} */ const parent = this.renderer.parentNode(this.el); if (parent instanceof HTMLElement) { /** @type {?} */ const parentRect = parent.getBoundingClientRect(); boundWidth = parentRect.width; boundHeight = parentRect.height; } } else if (this.nzBounds === 'window') { if (typeof window !== 'undefined') { boundWidth = window.innerWidth; boundHeight = window.innerHeight; } } else if (this.nzBounds && this.nzBounds.nativeElement && this.nzBounds.nativeElement instanceof HTMLElement) { /** @type {?} */ const boundsRect = this.nzBounds.nativeElement.getBoundingClientRect(); boundWidth = boundsRect.width; boundHeight = boundsRect.height; } maxWidth = ensureInBounds(this.nzMaxWidth, boundWidth); maxHeight = ensureInBounds(this.nzMaxHeight, boundHeight); if (this.nzGridColumnCount !== -1) { spanWidth = maxWidth / this.nzGridColumnCount; minWidth = this.nzMinColumn !== -1 ? spanWidth * this.nzMinColumn : minWidth; maxWidth = this.nzMaxColumn !== -1 ? spanWidth * this.nzMaxColumn : maxWidth; } if (ratio !== -1) { if (/(left|right)/i.test((/** @type {?} */ (this.currentHandleEvent)).direction)) { newWidth = Math.min(Math.max(width, minWidth), maxWidth); newHeight = Math.min(Math.max(newWidth / ratio, this.nzMinHeight), maxHeight); if (newHeight >= maxHeight || newHeight <= this.nzMinHeight) { newWidth = Math.min(Math.max(newHeight * ratio, minWidth), maxWidth); } } else { newHeight = Math.min(Math.max(height, this.nzMinHeight), maxHeight); newWidth = Math.min(Math.max(newHeight * ratio, minWidth), maxWidth); if (newWidth >= maxWidth || newWidth <= minWidth) { newHeight = Math.min(Math.max(newWidth / ratio, this.nzMinHeight), maxHeight); } } } else { newWidth = Math.min(Math.max(width, minWidth), maxWidth); newHeight = Math.min(Math.max(height, this.nzMinHeight), maxHeight); } if (this.nzGridColumnCount !== -1) { col = Math.round(newWidth / spanWidth); newWidth = col * spanWidth; } return { col, width: newWidth, height: newHeight }; } /** * @return {?} */ setCursor() { switch ((/** @type {?} */ (this.currentHandleEvent)).direction) { case 'left': case 'right': this.renderer.setStyle(document.body, 'cursor', 'ew-resize'); break; case 'top': case 'bottom': this.renderer.setStyle(document.body, 'cursor', 'ns-resize'); break; case 'topLeft': case 'bottomRight': this.renderer.setStyle(document.body, 'cursor', 'nwse-resize'); break; case 'topRight': case 'bottomLeft': this.renderer.setStyle(document.body, 'cursor', 'nesw-resize'); break; } this.renderer.setStyle(document.body, 'user-select', 'none'); } /** * @param {?} event * @return {?} */ resize(event) { /** @type {?} */ const elRect = this.elRect; /** @type {?} */ const resizeEvent = getEventWithPoint(event); /** @type {?} */ const handleEvent = getEventWithPoint((/** @type {?} */ (this.currentHandleEvent)).mouseEvent); /** @type {?} */ let width = elRect.width; /** @type {?} */ let height = elRect.height; /** @type {?} */ const ratio = this.nzLockAspectRatio ? width / height : -1; switch ((/** @type {?} */ (this.currentHandleEvent)).direction) { case 'bottomRight': width = resizeEvent.clientX - elRect.left; height = resizeEvent.clientY - elRect.top; break; case 'bottomLeft': width = elRect.width + handleEvent.clientX - resizeEvent.clientX; height = resizeEvent.clientY - elRect.top; break; case 'topRight': width = resizeEvent.clientX - elRect.left; height = elRect.height + handleEvent.clientY - resizeEvent.clientY; break; case 'topLeft': width = elRect.width + handleEvent.clientX - resizeEvent.clientX; height = elRect.height + handleEvent.clientY - resizeEvent.clientY; break; case 'top': height = elRect.height + handleEvent.clientY - resizeEvent.clientY; break; case 'right': width = resizeEvent.clientX - elRect.left; break; case 'bottom': height = resizeEvent.clientY - elRect.top; break; case 'left': width = elRect.width + handleEvent.clientX - resizeEvent.clientX; } /** @type {?} */ const size = this.calcSize(width, height, ratio); this.sizeCache = Object.assign({}, size); this.ngZone.run((/** * @return {?} */ () => { this.nzResize.emit(Object.assign(Object.assign({}, size), { mouseEvent: event })); })); if (this.nzPreview) { this.previewResize(size); } } /** * @param {?} event * @return {?} */ endResize(event) { this.renderer.setStyle(document.body, 'cursor', ''); this.renderer.setStyle(document.body, 'user-select', ''); this.removeGhostElement(); /** @type {?} */ const size = this.sizeCache ? Object.assign({}, this.sizeCache) : { width: this.elRect.width, height: this.elRect.height }; this.ngZone.run((/** * @return {?} */ () => { this.nzResizeEnd.emit(Object.assign(Object.assign({}, size), { mouseEvent: event })); })); this.sizeCache = null; this.currentHandleEvent = null; } /** * @param {?} __0 * @return {?} */ previewResize({ width, height }) { this.createGhostElement(); this.renderer.setStyle(this.ghostElement, 'width', `${width}px`); this.renderer.setStyle(this.ghostElement, 'height', `${height}px`); } /** * @return {?} */ createGhostElement() { if (!this.ghostElement) { this.ghostElement = this.renderer.createElement('div'); this.renderer.setAttribute(this.ghostElement, 'class', 'nz-resizable-preview'); } this.renderer.appendChild(this.el, this.ghostElement); } /** * @return {?} */ removeGhostElement() { if (this.ghostElement) { this.renderer.removeChild(this.el, this.ghostElement); } } /** * @return {?} */ ngAfterViewInit() { if (this.platform.isBrowser) { this.el = this.elementRef.nativeElement; this.setPosition(); } } /** * @return {?} */ ngOnDestroy() { this.ghostElement = null; this.sizeCache = null; this.destroy$.next(); this.destroy$.complete(); } } NzResizableDirective.decorators = [ { type: Directive, args: [{ selector: '[nz-resizable]', exportAs: 'nzResizable', providers: [NzResizableService], host: { '[class.nz-resizable]': 'true', '[class.nz-resizable-resizing]': 'resizing', '(mouseenter)': 'onMouseenter()', '(mouseleave)': 'onMouseleave()' } },] } ]; /** @nocollapse */ NzResizableDirective.ctorParameters = () => [ { type: ElementRef }, { type: Renderer2 }, { type: NzResizableService }, { type: Platform }, { type: NgZone } ]; NzResizableDirective.propDecorators = { nzBounds: [{ type: Input }], nzMaxHeight: [{ type: Input }], nzMaxWidth: [{ type: Input }], nzMinHeight: [{ type: Input }], nzMinWidth: [{ type: Input }], nzGridColumnCount: [{ type: Input }], nzMaxColumn: [{ type: Input }], nzMinColumn: [{ type: Input }], nzLockAspectRatio: [{ type: Input }], nzPreview: [{ type: Input }], nzResize: [{ type: Output }], nzResizeEnd: [{ type: Output }], nzResizeStart: [{ type: Output }] }; __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzResizableDirective.prototype, "nzLockAspectRatio", void 0); __decorate([ InputBoolean(), __metadata("design:type", Boolean) ], NzResizableDirective.prototype, "nzPreview", void 0); if (false) { /** @type {?} */ NzResizableDirective.ngAcceptInputType_nzLockAspectRatio; /** @type {?} */ NzResizableDirective.ngAcceptInputType_nzPreview; /** @type {?} */ NzResizableDirective.prototype.nzBounds; /** @type {?} */ NzResizableDirective.prototype.nzMaxHeight; /** @type {?} */ NzResizableDirective.prototype.nzMaxWidth; /** @type {?} */ NzResizableDirective.prototype.nzMinHeight; /** @type {?} */ NzResizableDirective.prototype.nzMinWidth; /** @type {?} */ NzResizableDirective.prototype.nzGridColumnCount; /** @type {?} */ NzResizableDirective.prototype.nzMaxColumn; /** @type {?} */ NzResizableDirective.prototype.nzMinColumn; /** @type {?} */ NzResizableDirective.prototype.nzLockAspectRatio; /** @type {?} */ NzResizableDirective.prototype.nzPreview; /** @type {?} */ NzResizableDirective.prototype.nzResize; /** @type {?} */ NzResizableDirective.prototype.nzResizeEnd; /** @type {?} */ NzResizableDirective.prototype.nzResizeStart; /** @type {?} */ NzResizableDirective.prototype.resizing; /** * @type {?} * @private */ NzResizableDirective.prototype.elRect; /** * @type {?} * @private */ NzResizableDirective.prototype.currentHandleEvent; /** * @type {?} * @private */ NzResizableDirective.prototype.ghostElement; /** * @type {?} * @private */ NzResizableDirective.prototype.el; /** * @type {?} * @private */ NzResizableDirective.prototype.sizeCache; /** * @type {?} * @private */ NzResizableDirective.prototype.destroy$; /** * @type {?} * @private */ NzResizableDirective.prototype.elementRef; /** * @type {?} * @private */ NzResizableDirective.prototype.renderer; /** * @type {?} * @private */ NzResizableDirective.prototype.nzResizableService; /** * @type {?} * @private */ NzResizableDirective.prototype.platform; /** * @type {?} * @private */ NzResizableDirective.prototype.ngZone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXphYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvcmVzaXphYmxlLyIsInNvdXJjZXMiOlsicmVzaXphYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBYSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2hJLE9BQU8sRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFHekQsbUNBS0M7OztJQUpDLDhCQUFlOztJQUNmLCtCQUFnQjs7SUFDaEIsNEJBQWE7O0lBQ2IsbUNBQXFDOztBQWN2QyxNQUFNLE9BQU8sb0JBQW9COzs7Ozs7OztJQTBCL0IsWUFDVSxVQUFtQyxFQUNuQyxRQUFtQixFQUNuQixrQkFBc0MsRUFDdEMsUUFBa0IsRUFDbEIsTUFBYztRQUpkLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUEzQmYsYUFBUSxHQUFrRCxRQUFRLENBQUM7UUFHbkUsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsZUFBVSxH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N0IsMENBQTRCOztJQUM1QiwyQ0FBa0M7O0lBQ2xDLDBDQUFpQzs7SUFDakMsaURBQXdDOztJQUN4QywyQ0FBa0M7O0lBQ2xDLDJDQUFrQzs7SUFDbEMsaURBQTREOztJQUM1RCx5Q0FBb0Q7O0lBQ3BELHdDQUFnRTs7SUFDaEUsMkNBQW1FOztJQUNuRSw2Q0FBcUU7O0lBRXJFLHdDQUFpQjs7Ozs7SUFDakIsc0NBQXFDOzs7OztJQUNyQyxrREFBZ0U7Ozs7O0lBQ2hFLDRDQUE0Qzs7Ozs7SUFDNUMsa0NBQXdCOzs7OztJQUN4Qix5Q0FBd0M7Ozs7O0lBQ3hDLHdDQUF1Qzs7Ozs7SUFHckMsMENBQTJDOzs7OztJQUMzQyx3Q0FBMkI7Ozs7O0lBQzNCLGtEQUE4Qzs7Ozs7SUFDOUMsd0NBQTBCOzs7OztJQUMxQixzQ0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT3V0cHV0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS90eXBlcyc7XG5cbmltcG9ydCB7IGVuc3VyZUluQm91bmRzLCBJbnB1dEJvb2xlYW4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGdldEV2ZW50V2l0aFBvaW50IH0gZnJvbSAnLi9yZXNpemFibGUtdXRpbHMnO1xuaW1wb3J0IHsgTnpSZXNpemFibGVTZXJ2aWNlIH0gZnJvbSAnLi9yZXNpemFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOelJlc2l6ZUhhbmRsZU1vdXNlRG93bkV2ZW50IH0gZnJvbSAnLi9yZXNpemUtaGFuZGxlLmNvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnpSZXNpemVFdmVudCB7XG4gIHdpZHRoPzogbnVtYmVyO1xuICBoZWlnaHQ/OiBudW1iZXI7XG4gIGNvbD86IG51bWJlcjtcbiAgbW91c2VFdmVudD86IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50O1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbnotcmVzaXphYmxlXScsXG4gIGV4cG9ydEFzOiAnbnpSZXNpemFibGUnLFxuICBwcm92aWRlcnM6IFtOelJlc2l6YWJsZVNlcnZpY2VdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5uei1yZXNpemFibGVdJzogJ3RydWUnLFxuICAgICdbY2xhc3MubnotcmVzaXphYmxlLXJlc2l6aW5nXSc6ICdyZXNpemluZycsXG4gICAgJyhtb3VzZWVudGVyKSc6ICdvbk1vdXNlZW50ZXIoKScsXG4gICAgJyhtb3VzZWxlYXZlKSc6ICdvbk1vdXNlbGVhdmUoKSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOelJlc2l6YWJsZURpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBuZ0FjY2VwdElucHV0VHlwZV9uekxvY2tBc3BlY3RSYXRpbzogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpQcmV2aWV3OiBCb29sZWFuSW5wdXQ7XG5cbiAgQElucHV0KCkgbnpCb3VuZHM6ICd3aW5kb3cnIHwgJ3BhcmVudCcgfCBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9ICdwYXJlbnQnO1xuICBASW5wdXQoKSBuek1heEhlaWdodDogbnVtYmVyO1xuICBASW5wdXQoKSBuek1heFdpZHRoOiBudW1iZXI7XG4gIEBJbnB1dCgpIG56TWluSGVpZ2h0OiBudW1iZXIgPSA0MDtcbiAgQElucHV0KCkgbnpNaW5XaWR0aDogbnVtYmVyID0gNDA7XG4gIEBJbnB1dCgpIG56R3JpZENvbHVtbkNvdW50OiBudW1iZXIgPSAtMTtcbiAgQElucHV0KCkgbnpNYXhDb2x1bW46IG51bWJlciA9IC0xO1xuICBASW5wdXQoKSBuek1pbkNvbHVtbjogbnVtYmVyID0gLTE7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekxvY2tBc3BlY3RSYXRpbzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpQcmV2aWV3OiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSByZWFkb25seSBuelJlc2l6ZSA9IG5ldyBFdmVudEVtaXR0ZXI8TnpSZXNpemVFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IG56UmVzaXplRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxOelJlc2l6ZUV2ZW50PigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpSZXNpemVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8TnpSZXNpemVFdmVudD4oKTtcblxuICByZXNpemluZyA9IGZhbHNlO1xuICBwcml2YXRlIGVsUmVjdDogQ2xpZW50UmVjdCB8IERPTVJlY3Q7XG4gIHByaXZhdGUgY3VycmVudEhhbmRsZUV2ZW50OiBOelJlc2l6ZUhhbmRsZU1vdXNlRG93bkV2ZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBnaG9zdEVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBlbDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgc2l6ZUNhY2hlOiBOelJlc2l6ZUV2ZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuelJlc2l6YWJsZVNlcnZpY2U6IE56UmVzaXphYmxlU2VydmljZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMubnpSZXNpemFibGVTZXJ2aWNlLmhhbmRsZU1vdXNlRG93biQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMubnpSZXNpemFibGVTZXJ2aWNlLnN0YXJ0UmVzaXppbmcoZXZlbnQubW91c2VFdmVudCk7XG4gICAgICB0aGlzLmN1cnJlbnRIYW5kbGVFdmVudCA9IGV2ZW50O1xuICAgICAgdGhpcy5zZXRDdXJzb3IoKTtcbiAgICAgIHRoaXMubnpSZXNpemVTdGFydC5lbWl0KHtcbiAgICAgICAgbW91c2VFdmVudDogZXZlbnQubW91c2VFdmVudFxuICAgICAgfSk7XG4gICAgICB0aGlzLmVsUmVjdCA9IHRoaXMuZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm56UmVzaXphYmxlU2VydmljZS5kb2N1bWVudE1vdXNlVXAkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMucmVzaXppbmcpIHtcbiAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm56UmVzaXphYmxlU2VydmljZS5kb2N1bWVudE1vdXNlVXAkLm5leHQoKTtcbiAgICAgICAgdGhpcy5lbmRSZXNpemUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5uelJlc2l6YWJsZVNlcnZpY2UuZG9jdW1lbnRNb3VzZU1vdmUkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKHRoaXMucmVzaXppbmcpIHtcbiAgICAgICAgdGhpcy5yZXNpemUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25Nb3VzZWVudGVyKCk6IHZvaWQge1xuICAgIHRoaXMubnpSZXNpemFibGVTZXJ2aWNlLm1vdXNlRW50ZXJlZCQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIG9uTW91c2VsZWF2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm56UmVzaXphYmxlU2VydmljZS5tb3VzZUVudGVyZWQkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgc2V0UG9zaXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWwpLnBvc2l0aW9uO1xuICAgIGlmIChwb3NpdGlvbiA9PT0gJ3N0YXRpYycgfHwgIXBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwsICdwb3NpdGlvbicsICdyZWxhdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGNTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCByYXRpbzogbnVtYmVyKTogTnpSZXNpemVFdmVudCB7XG4gICAgbGV0IG5ld1dpZHRoOiBudW1iZXI7XG4gICAgbGV0IG5ld0hlaWdodDogbnVtYmVyO1xuICAgIGxldCBtYXhXaWR0aDogbnVtYmVyO1xuICAgIGxldCBtYXhIZWlnaHQ6IG51bWJlcjtcbiAgICBsZXQgY29sID0gMDtcbiAgICBsZXQgc3BhbldpZHRoID0gMDtcbiAgICBsZXQgbWluV2lkdGggPSB0aGlzLm56TWluV2lkdGg7XG4gICAgbGV0IGJvdW5kV2lkdGggPSBJbmZpbml0eTtcbiAgICBsZXQgYm91bmRIZWlnaHQgPSBJbmZpbml0eTtcbiAgICBpZiAodGhpcy5uekJvdW5kcyA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucmVuZGVyZXIucGFyZW50Tm9kZSh0aGlzLmVsKTtcbiAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBjb25zdCBwYXJlbnRSZWN0ID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBib3VuZFdpZHRoID0gcGFyZW50UmVjdC53aWR0aDtcbiAgICAgICAgYm91bmRIZWlnaHQgPSBwYXJlbnRSZWN0LmhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubnpCb3VuZHMgPT09ICd3aW5kb3cnKSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgYm91bmRXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICBib3VuZEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMubnpCb3VuZHMgJiYgdGhpcy5uekJvdW5kcy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubnpCb3VuZHMubmF0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBjb25zdCBib3VuZHNSZWN0ID0gdGhpcy5uekJvdW5kcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgYm91bmRXaWR0aCA9IGJvdW5kc1JlY3Qud2lkdGg7XG4gICAgICBib3VuZEhlaWdodCA9IGJvdW5kc1JlY3QuaGVpZ2h0O1xuICAgIH1cblxuICAgIG1heFdpZHRoID0gZW5zdXJlSW5Cb3VuZHModGhpcy5uek1heFdpZHRoLCBib3VuZFdpZHRoKTtcbiAgICBtYXhIZWlnaHQgPSBlbnN1cmVJbkJvdW5kcyh0aGlzLm56TWF4SGVpZ2h0LCBib3VuZEhlaWdodCk7XG5cbiAgICBpZiAodGhpcy5uekdyaWRDb2x1bW5Db3VudCAhPT0gLTEpIHtcbiAgICAgIHNwYW5XaWR0aCA9IG1heFdpZHRoIC8gdGhpcy5uekdyaWRDb2x1bW5Db3VudDtcbiAgICAgIG1pbldpZHRoID0gdGhpcy5uek1pbkNvbHVtbiAhPT0gLTEgPyBzcGFuV2lkdGggKiB0aGlzLm56TWluQ29sdW1uIDogbWluV2lkdGg7XG4gICAgICBtYXhXaWR0aCA9IHRoaXMubnpNYXhDb2x1bW4gIT09IC0xID8gc3BhbldpZHRoICogdGhpcy5uek1heENvbHVtbiA6IG1heFdpZHRoO1xuICAgIH1cblxuICAgIGlmIChyYXRpbyAhPT0gLTEpIHtcbiAgICAgIGlmICgvKGxlZnR8cmlnaHQpL2kudGVzdCh0aGlzLmN1cnJlbnRIYW5kbGVFdmVudCEuZGlyZWN0aW9uKSkge1xuICAgICAgICBuZXdXaWR0aCA9IE1hdGgubWluKE1hdGgubWF4KHdpZHRoLCBtaW5XaWR0aCksIG1heFdpZHRoKTtcbiAgICAgICAgbmV3SGVpZ2h0ID0gTWF0aC5taW4oTWF0aC5tYXgobmV3V2lkdGggLyByYXRpbywgdGhpcy5uek1pbkhlaWdodCksIG1heEhlaWdodCk7XG4gICAgICAgIGlmIChuZXdIZWlnaHQgPj0gbWF4SGVpZ2h0IHx8IG5ld0hlaWdodCA8PSB0aGlzLm56TWluSGVpZ2h0KSB7XG4gICAgICAgICAgbmV3V2lkdGggPSBNYXRoLm1pbihNYXRoLm1heChuZXdIZWlnaHQgKiByYXRpbywgbWluV2lkdGgpLCBtYXhXaWR0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KGhlaWdodCwgdGhpcy5uek1pbkhlaWdodCksIG1heEhlaWdodCk7XG4gICAgICAgIG5ld1dpZHRoID0gTWF0aC5taW4oTWF0aC5tYXgobmV3SGVpZ2h0ICogcmF0aW8sIG1pbldpZHRoKSwgbWF4V2lkdGgpO1xuICAgICAgICBpZiAobmV3V2lkdGggPj0gbWF4V2lkdGggfHwgbmV3V2lkdGggPD0gbWluV2lkdGgpIHtcbiAgICAgICAgICBuZXdIZWlnaHQgPSBNYXRoLm1pbihNYXRoLm1heChuZXdXaWR0aCAvIHJhdGlvLCB0aGlzLm56TWluSGVpZ2h0KSwgbWF4SGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdXaWR0aCA9IE1hdGgubWluKE1hdGgubWF4KHdpZHRoLCBtaW5XaWR0aCksIG1heFdpZHRoKTtcbiAgICAgIG5ld0hlaWdodCA9IE1hdGgubWluKE1hdGgubWF4KGhlaWdodCwgdGhpcy5uek1pbkhlaWdodCksIG1heEhlaWdodCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubnpHcmlkQ29sdW1uQ291bnQgIT09IC0xKSB7XG4gICAgICBjb2wgPSBNYXRoLnJvdW5kKG5ld1dpZHRoIC8gc3BhbldpZHRoKTtcbiAgICAgIG5ld1dpZHRoID0gY29sICogc3BhbldpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb2wsXG4gICAgICB3aWR0aDogbmV3V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5ld0hlaWdodFxuICAgIH07XG4gIH1cblxuICBzZXRDdXJzb3IoKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLmN1cnJlbnRIYW5kbGVFdmVudCEuZGlyZWN0aW9uKSB7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnY3Vyc29yJywgJ2V3LXJlc2l6ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICdjdXJzb3InLCAnbnMtcmVzaXplJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ2N1cnNvcicsICdud3NlLXJlc2l6ZScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFJpZ2h0JzpcbiAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGRvY3VtZW50LmJvZHksICdjdXJzb3InLCAnbmVzdy1yZXNpemUnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcbiAgfVxuXG4gIHJlc2l6ZShldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBlbFJlY3QgPSB0aGlzLmVsUmVjdDtcbiAgICBjb25zdCByZXNpemVFdmVudCA9IGdldEV2ZW50V2l0aFBvaW50KGV2ZW50KTtcbiAgICBjb25zdCBoYW5kbGVFdmVudCA9IGdldEV2ZW50V2l0aFBvaW50KHRoaXMuY3VycmVudEhhbmRsZUV2ZW50IS5tb3VzZUV2ZW50KTtcbiAgICBsZXQgd2lkdGggPSBlbFJlY3Qud2lkdGg7XG4gICAgbGV0IGhlaWdodCA9IGVsUmVjdC5oZWlnaHQ7XG4gICAgY29uc3QgcmF0aW8gPSB0aGlzLm56TG9ja0FzcGVjdFJhdGlvID8gd2lkdGggLyBoZWlnaHQgOiAtMTtcbiAgICBzd2l0Y2ggKHRoaXMuY3VycmVudEhhbmRsZUV2ZW50IS5kaXJlY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2JvdHRvbVJpZ2h0JzpcbiAgICAgICAgd2lkdGggPSByZXNpemVFdmVudC5jbGllbnRYIC0gZWxSZWN0LmxlZnQ7XG4gICAgICAgIGhlaWdodCA9IHJlc2l6ZUV2ZW50LmNsaWVudFkgLSBlbFJlY3QudG9wO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbUxlZnQnOlxuICAgICAgICB3aWR0aCA9IGVsUmVjdC53aWR0aCArIGhhbmRsZUV2ZW50LmNsaWVudFggLSByZXNpemVFdmVudC5jbGllbnRYO1xuICAgICAgICBoZWlnaHQgPSByZXNpemVFdmVudC5jbGllbnRZIC0gZWxSZWN0LnRvcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BSaWdodCc6XG4gICAgICAgIHdpZHRoID0gcmVzaXplRXZlbnQuY2xpZW50WCAtIGVsUmVjdC5sZWZ0O1xuICAgICAgICBoZWlnaHQgPSBlbFJlY3QuaGVpZ2h0ICsgaGFuZGxlRXZlbnQuY2xpZW50WSAtIHJlc2l6ZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgIHdpZHRoID0gZWxSZWN0LndpZHRoICsgaGFuZGxlRXZlbnQuY2xpZW50WCAtIHJlc2l6ZUV2ZW50LmNsaWVudFg7XG4gICAgICAgIGhlaWdodCA9IGVsUmVjdC5oZWlnaHQgKyBoYW5kbGVFdmVudC5jbGllbnRZIC0gcmVzaXplRXZlbnQuY2xpZW50WTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBoZWlnaHQgPSBlbFJlY3QuaGVpZ2h0ICsgaGFuZGxlRXZlbnQuY2xpZW50WSAtIHJlc2l6ZUV2ZW50LmNsaWVudFk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICB3aWR0aCA9IHJlc2l6ZUV2ZW50LmNsaWVudFggLSBlbFJlY3QubGVmdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBoZWlnaHQgPSByZXNpemVFdmVudC5jbGllbnRZIC0gZWxSZWN0LnRvcDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgd2lkdGggPSBlbFJlY3Qud2lkdGggKyBoYW5kbGVFdmVudC5jbGllbnRYIC0gcmVzaXplRXZlbnQuY2xpZW50WDtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuY2FsY1NpemUod2lkdGgsIGhlaWdodCwgcmF0aW8pO1xuICAgIHRoaXMuc2l6ZUNhY2hlID0geyAuLi5zaXplIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMubnpSZXNpemUuZW1pdCh7XG4gICAgICAgIC4uLnNpemUsXG4gICAgICAgIG1vdXNlRXZlbnQ6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAodGhpcy5uelByZXZpZXcpIHtcbiAgICAgIHRoaXMucHJldmlld1Jlc2l6ZShzaXplKTtcbiAgICB9XG4gIH1cblxuICBlbmRSZXNpemUoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShkb2N1bWVudC5ib2R5LCAnY3Vyc29yJywgJycpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJycpO1xuICAgIHRoaXMucmVtb3ZlR2hvc3RFbGVtZW50KCk7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZUNhY2hlXG4gICAgICA/IHsgLi4udGhpcy5zaXplQ2FjaGUgfVxuICAgICAgOiB7XG4gICAgICAgICAgd2lkdGg6IHRoaXMuZWxSZWN0LndpZHRoLFxuICAgICAgICAgIGhlaWdodDogdGhpcy5lbFJlY3QuaGVpZ2h0XG4gICAgICAgIH07XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMubnpSZXNpemVFbmQuZW1pdCh7XG4gICAgICAgIC4uLnNpemUsXG4gICAgICAgIG1vdXNlRXZlbnQ6IGV2ZW50XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnNpemVDYWNoZSA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50SGFuZGxlRXZlbnQgPSBudWxsO1xuICB9XG5cbiAgcHJldmlld1Jlc2l6ZSh7IHdpZHRoLCBoZWlnaHQgfTogTnpSZXNpemVFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuY3JlYXRlR2hvc3RFbGVtZW50KCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmdob3N0RWxlbWVudCwgJ3dpZHRoJywgYCR7d2lkdGh9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZ2hvc3RFbGVtZW50LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gIH1cblxuICBjcmVhdGVHaG9zdEVsZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdob3N0RWxlbWVudCkge1xuICAgICAgdGhpcy5naG9zdEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5naG9zdEVsZW1lbnQsICdjbGFzcycsICduei1yZXNpemFibGUtcHJldmlldycpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuZWwsIHRoaXMuZ2hvc3RFbGVtZW50KTtcbiAgfVxuXG4gIHJlbW92ZUdob3N0RWxlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5naG9zdEVsZW1lbnQpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQodGhpcy5lbCwgdGhpcy5naG9zdEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgIHRoaXMuZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMuc2V0UG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmdob3N0RWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5zaXplQ2FjaGUgPSBudWxsO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIl19