UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

363 lines 32.3 kB
/** * @fileoverview added by tsickle * Generated from: drawer.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { animate, state, style, transition, trigger } from '@angular/animations'; import { Component, Directive, ElementRef, HostListener, Input, ViewChild, ViewContainerRef } from '@angular/core'; import { isNumber, parseInt, trim } from 'lodash-es'; import { fromEvent, Subject } from 'rxjs'; import { distinctUntilChanged, debounceTime } from 'rxjs/operators'; export class DrawerContentDirective { /** * @param {?} viewContainerRef */ constructor(viewContainerRef) { this.viewContainerRef = viewContainerRef; } } DrawerContentDirective.decorators = [ { type: Directive, args: [{ selector: '[dDrawerContentHost]', },] } ]; /** @nocollapse */ DrawerContentDirective.ctorParameters = () => [ { type: ViewContainerRef } ]; if (false) { /** @type {?} */ DrawerContentDirective.prototype.viewContainerRef; } export class DrawerComponent { /** * @param {?} elementRef */ constructor(elementRef) { this.elementRef = elementRef; this.animateState = 'void'; this.width = '300px'; this.isCover = true; this.fullScreen = false; this.clickDoms = []; this.animationDone = new Subject(); } /** * @return {?} */ ngOnInit() { this.setWidth(this.width); this._isCover = this.isCover === undefined ? true : this.isCover; // some browsers(ie11 & edge) fire the animation done event twice this.animationDoneSub = this.animationDone.pipe(distinctUntilChanged((/** * @param {?} x * @param {?} y * @return {?} */ (x, y) => { return x.fromState === y.fromState && x.toState === y.toState; }))).subscribe((/** * @param {?} event * @return {?} */ event => { this.onAnimationEnd(event); })); } /** * @param {?} width * @return {?} */ setWidth(width) { if (width.indexOf('%') >= 0) { /** @type {?} */ const widthStr = trim(width, '%'); /** @type {?} */ const widthNum = parseInt(widthStr, 10); this._width = isNumber(widthNum) ? (widthNum * window.innerWidth / 100 + 'px') : '0px'; } else { this._width = width; } this.oldWidth = this._width; } /** * @return {?} */ ngOnDestroy() { if (this.animationDoneSub) { this.animationDoneSub.unsubscribe(); } if (this.resizeSub) { this.resizeSub.unsubscribe(); } } /** * @param {?} event * @return {?} */ keydownHandler(event) { if (this.escKeyCloseable && !this.isHaveDialogOrUpload()) { this.hide(); } } /** * @param {?} event * @return {?} */ onAnimationEnd(event) { if (this.animateState === 'void') { this.onHidden(); } if (this.animateState === 'in' && this.afterOpened) { this.afterOpened(); } } // Will overwrite by drawer service /** * @return {?} */ onHidden() { } /** * @return {?} */ show() { if (!this.bodyScrollable) { document.querySelector('body').classList.add('modal-open'); } this.animateState = 'in'; this.isCover = this.isCover === undefined ? true : this.isCover; if (!this.backdropCloseable || this.isCover) { return; } /** @type {?} */ const documentClick = fromEvent(document, 'click'); setTimeout((/** * @return {?} */ () => { this.subscription = documentClick.subscribe((/** * @param {?} event * @return {?} */ (event) => { if (this.clickDoms && this.clickDoms.length > 0) { this.clickDoms.forEach((/** * @param {?} dom * @return {?} */ dom => { if (dom !== null && dom.contains(event.target)) { this.hide(); return; } })); } else { /** @type {?} */ const target = event.target; // 一定要document.contains(event.target),因为event.target可能已经不在document里了,这个时候就不能进hide了 if (this.animateState === 'in' && (!this.elementRef.nativeElement.contains(target) && document.body.contains(target)) && !this.isHaveDialogOrUpload()) { this.hide(); } } })); })); } /** * @return {?} */ hide() { this.canHideModel().then((/** * @param {?} canHide * @return {?} */ (canHide) => { if (!canHide) { return; } if (!this.bodyScrollable) { document.querySelector('body').classList.remove('modal-open'); } this.animateState = 'void'; if (this.subscription) { this.subscription.unsubscribe(); this.subscription = undefined; } })); } // Will overwrite by drawer service /** * @return {?} */ destroy() { } /** * @return {?} */ isHaveDialogOrUpload() { /** @type {?} */ const dialog = document.getElementsByClassName('modal-dialog'); /** @type {?} */ const upload = document.getElementById('d-upload-temp'); return (dialog && dialog.length > 0) || upload; } /** * @return {?} */ canHideModel() { /** @type {?} */ let hiddenResult = Promise.resolve(true); if (this.beforeHidden) { /** @type {?} */ const result = this.beforeHidden(); if (typeof result !== 'undefined') { if (result.then) { hiddenResult = result; } else if (result.subscribe) { hiddenResult = ((/** @type {?} */ (result))).toPromise(); } else { hiddenResult = Promise.resolve(result); } } } return hiddenResult; } /** * @private * @param {?=} fullScreen * @return {?} */ _setFullScreen(fullScreen) { if (this._width === this.oldWidth) { if (fullScreen === true || fullScreen === undefined) { this._width = this._isCover ? '100%' : window.innerWidth + 'px'; if (!this._isCover) { /** @type {?} */ const resizeEv = fromEvent(window, 'resize'); /** @type {?} */ const result = resizeEv.pipe(debounceTime(100)); this.resizeSub = result.subscribe((/** * @param {?} ev * @return {?} */ ev => { this._width = window.innerWidth + 'px'; })); } } } else { if (!fullScreen) { this._width = this.oldWidth; if (this.resizeSub) { this.resizeSub.unsubscribe(); } } } } /** * @return {?} */ toggleFullScreen() { this._setFullScreen(); } /** * @param {?} fullScreen * @return {?} */ setFullScreen(fullScreen) { this._setFullScreen(fullScreen); } } DrawerComponent.decorators = [ { type: Component, args: [{ selector: 'd-drawer', template: "<div\r\n class=\"drawer\"\r\n [attr.id]=\"id\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n>\r\n <div\r\n class=\"overlay-wrapper\"\r\n [ngClass]=\"{ 'display-width': _isCover && animateState === 'in' }\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"overlay-backdrop\" [@fadeInOut]=\"animateState\" (click)=\"backdropCloseable && hide()\"></div>\r\n <div\r\n class=\"drawer-nav\"\r\n [ngStyle]=\"{ width: _width }\"\r\n [@flyInOut]=\"position + '-' + animateState\"\r\n (@flyInOut.done)=\"animationDone.next($event)\"\r\n [style.left]=\"position === 'left' ? 0 : null\"\r\n [style.right]=\"position === 'right' ? 0 : null\"\r\n >\r\n <div class=\"drawer-content\" cdkScrollable>\r\n <ng-template dDrawerContentHost></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", animations: [ trigger('fadeInOut', [ state('void', style({ display: 'block', opacity: 0 })), state('in', style({ display: 'block', opacity: 0.6 })), transition('* => *', animate('300ms ease')), ]), trigger('flyInOut', [ state('left-void', style({ transform: 'translateX(-100%)', left: 0 })), state('left-in', style({ transform: 'none', left: 0 })), state('right-void', style({ transform: 'translateX(100%)', right: 0 })), state('right-in', style({ transform: 'none', right: 0 })), transition('* => *', animate('300ms ease')), ]), ], styles: [".drawer{position:fixed;top:0;bottom:0;z-index:1000}.overlay-wrapper{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-align:center;align-items:center;position:absolute;top:0;bottom:0;z-index:1000}.display-width{left:0;right:0}.overlay-backdrop{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(41,48,64,.2);width:100%;height:100%}.drawer-nav{position:absolute;top:0;bottom:0;background:#fff}.drawer-content{position:absolute;top:0;left:0;right:0;bottom:0;overflow:auto;box-shadow:0 1px 20px -5px rgba(41,48,64,.2)}"] }] } ]; /** @nocollapse */ DrawerComponent.ctorParameters = () => [ { type: ElementRef } ]; DrawerComponent.propDecorators = { id: [{ type: Input }], width: [{ type: Input }], isCover: [{ type: Input }], fullScreen: [{ type: Input }], drawerContentHost: [{ type: ViewChild, args: [DrawerContentDirective, { static: true },] }], backdropCloseable: [{ type: Input }], escKeyCloseable: [{ type: Input }], beforeHidden: [{ type: Input }], clickDoms: [{ type: Input }], afterOpened: [{ type: Input }], position: [{ type: Input }], bodyScrollable: [{ type: Input }], keydownHandler: [{ type: HostListener, args: ['document:keydown.escape', ['$event'],] }] }; if (false) { /** @type {?} */ DrawerComponent.prototype.animateState; /** @type {?} */ DrawerComponent.prototype.id; /** @type {?} */ DrawerComponent.prototype.width; /** @type {?} */ DrawerComponent.prototype.isCover; /** @type {?} */ DrawerComponent.prototype.fullScreen; /** @type {?} */ DrawerComponent.prototype.drawerContentHost; /** @type {?} */ DrawerComponent.prototype.backdropCloseable; /** @type {?} */ DrawerComponent.prototype.escKeyCloseable; /** @type {?} */ DrawerComponent.prototype.beforeHidden; /** @type {?} */ DrawerComponent.prototype.clickDoms; /** @type {?} */ DrawerComponent.prototype.afterOpened; /** @type {?} */ DrawerComponent.prototype.position; /** @type {?} */ DrawerComponent.prototype.bodyScrollable; /** @type {?} */ DrawerComponent.prototype._width; /** @type {?} */ DrawerComponent.prototype.oldWidth; /** @type {?} */ DrawerComponent.prototype._isCover; /** @type {?} */ DrawerComponent.prototype.subscription; /** @type {?} */ DrawerComponent.prototype.animationDone; /** @type {?} */ DrawerComponent.prototype.animationDoneSub; /** @type {?} */ DrawerComponent.prototype.resizeSub; /** * @type {?} * @private */ DrawerComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWRldnVpL2RyYXdlci8iLCJzb3VyY2VzIjpbImRyYXdlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBa0IsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQWUsWUFBWSxFQUFFLEtBQUssRUFDakUsU0FBUyxFQUFFLGdCQUFnQixFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBS3BFLE1BQU0sT0FBTyxzQkFBc0I7Ozs7SUFDakMsWUFBbUIsZ0JBQWtDO1FBQWxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7SUFDckQsQ0FBQzs7O1lBTEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7YUFDakM7Ozs7WUFQb0IsZ0JBQWdCOzs7O0lBU3ZCLGtEQUF5Qzs7QUF1QnZELE1BQU0sT0FBTyxlQUFlOzs7O0lBeUIxQixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBeEIxQyxpQkFBWSxHQUFHLE1BQU0sQ0FBQztRQUViLFVBQUssR0FBRyxPQUFPLENBQUM7UUFDaEIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFLbkIsY0FBUyxHQUFRLEVBQUUsQ0FBQztRQVc3QixrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFrQixDQUFD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Q0FDTCxTQUFTLFNBQUMsc0JBQXNCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dDQUNsRCxLQUFLOzhCQUNMLEtBQUs7MkJBQ0wsS0FBSzt3QkFDTCxLQUFLOzBCQUVMLEtBQUs7dUJBQ0wsS0FBSzs2QkFDTCxLQUFLOzZCQThDTCxZQUFZLFNBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUEzRG5ELHVDQUFzQjs7SUFDdEIsNkJBQW9COztJQUNwQixnQ0FBeUI7O0lBQ3pCLGtDQUF3Qjs7SUFDeEIscUNBQTRCOztJQUM1Qiw0Q0FBK0Y7O0lBQy9GLDRDQUFvQzs7SUFDcEMsMENBQWtDOztJQUNsQyx1Q0FBOEU7O0lBQzlFLG9DQUE2Qjs7SUFFN0Isc0NBQStCOztJQUMvQixtQ0FBb0M7O0lBQ3BDLHlDQUFpQzs7SUFDakMsaUNBQWU7O0lBRWYsbUNBQWlCOztJQUNqQixtQ0FBa0I7O0lBQ2xCLHVDQUEyQjs7SUFFM0Isd0NBQThDOztJQUM5QywyQ0FBK0I7O0lBQy9CLG9DQUF3Qjs7Ozs7SUFFWixxQ0FBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIsIEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCxcclxuICBPbkluaXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGlzTnVtYmVyLCBwYXJzZUludCwgdHJpbSB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCB7IGZyb21FdmVudCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ1tkRHJhd2VyQ29udGVudEhvc3RdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIERyYXdlckNvbnRlbnREaXJlY3RpdmUge1xyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XHJcbiAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2QtZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJhd2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kcmF3ZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdmYWRlSW5PdXQnLCBbXHJcbiAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoe2Rpc3BsYXk6ICdibG9jaycsIG9wYWNpdHk6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdpbicsIHN0eWxlKHtkaXNwbGF5OiAnYmxvY2snLCBvcGFjaXR5OiAwLjZ9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gKicsIGFuaW1hdGUoJzMwMG1zIGVhc2UnKSksXHJcbiAgICBdKSxcclxuICAgIHRyaWdnZXIoJ2ZseUluT3V0JywgW1xyXG4gICAgICBzdGF0ZSgnbGVmdC12b2lkJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpJywgbGVmdDogMH0pKSxcclxuICAgICAgc3RhdGUoJ2xlZnQtaW4nLCBzdHlsZSh7dHJhbnNmb3JtOiAnbm9uZScsIGxlZnQ6IDB9KSksXHJcbiAgICAgIHN0YXRlKCdyaWdodC12b2lkJywgc3R5bGUoe3RyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknLCByaWdodDogMH0pKSxcclxuICAgICAgc3RhdGUoJ3JpZ2h0LWluJywgc3R5bGUoe3RyYW5zZm9ybTogJ25vbmUnLCByaWdodDogMH0pKSxcclxuICAgICAgdHJhbnNpdGlvbignKiA9PiAqJywgYW5pbWF0ZSgnMzAwbXMgZWFzZScpKSxcclxuICAgIF0pLFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIERyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBhbmltYXRlU3RhdGUgPSAndm9pZCc7XHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZztcclxuICBASW5wdXQoKSB3aWR0aCA9ICczMDBweCc7XHJcbiAgQElucHV0KCkgaXNDb3ZlciA9IHRydWU7XHJcbiAgQElucHV0KCkgZnVsbFNjcmVlbiA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoRHJhd2VyQ29udGVudERpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgZHJhd2VyQ29udGVudEhvc3Q6IERyYXdlckNvbnRlbnREaXJlY3RpdmU7XHJcbiAgQElucHV0KCkgYmFja2Ryb3BDbG9zZWFibGU6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZXNjS2V5Q2xvc2VhYmxlOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGJlZm9yZUhpZGRlbjogKCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBJbnB1dCgpIGNsaWNrRG9tczogYW55ID0gW107XHJcbiAgLy8gV2lsbCBvdmVyd3JpdGUgYnkgZHJhd2VyIHNlcnZpY2VcclxuICBASW5wdXQoKSBhZnRlck9wZW5lZDogRnVuY3Rpb247XHJcbiAgQElucHV0KCkgcG9zaXRpb246ICdyaWdodCcgfCAnbGVmdCc7XHJcbiAgQElucHV0KCkgYm9keVNjcm9sbGFibGU6IGJvb2xlYW47IC8vIGRyYXdlcuaJk+W8gGJvZHnmmK/lkKblj6/mu5rliqhcclxuICBfd2lkdGg6IHN0cmluZztcclxuICAvLyDlhajlsY/ml7bnlKjmnaXorrDlvZXkuYvliY3nmoTlrr3luqbvvIzlm6DkuLrmsqHpga7nvannmoTmg4XlhrXkuIt3aWR0aOS4jeiDveaYr+eZvuWIhuavlFxyXG4gIG9sZFdpZHRoOiBzdHJpbmc7XHJcbiAgX2lzQ292ZXI6IGJvb2xlYW47XHJcbiAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGFuaW1hdGlvbkRvbmUgPSBuZXcgU3ViamVjdDxBbmltYXRpb25FdmVudD4oKTtcclxuICBhbmltYXRpb25Eb25lU3ViOiBTdWJzY3JpcHRpb247XHJcbiAgcmVzaXplU3ViOiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgdGhpcy5faXNDb3ZlciA9IHRoaXMuaXNDb3ZlciA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHRoaXMuaXNDb3ZlcjtcclxuXHJcbiAgICAvLyBzb21lIGJyb3dzZXJzKGllMTEgJiBlZGdlKSBmaXJlIHRoZSBhbmltYXRpb24gZG9uZSBldmVudCB0d2ljZVxyXG4gICAgdGhpcy5hbmltYXRpb25Eb25lU3ViID0gdGhpcy5hbmltYXRpb25Eb25lLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IHtcclxuICAgICAgcmV0dXJuIHguZnJvbVN0YXRlID09PSB5LmZyb21TdGF0ZSAmJiB4LnRvU3RhdGUgPT09IHkudG9TdGF0ZTtcclxuICAgIH0pKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICB0aGlzLm9uQW5pbWF0aW9uRW5kKGV2ZW50KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0V2lkdGgod2lkdGg6IHN0cmluZykge1xyXG4gICAgaWYgKHdpZHRoLmluZGV4T2YoJyUnKSA+PSAwKSB7XHJcbiAgICAgIGNvbnN0IHdpZHRoU3RyID0gdHJpbSh3aWR0aCwgJyUnKTtcclxuICAgICAgY29uc3Qgd2lkdGhOdW0gPSBwYXJzZUludCh3aWR0aFN0ciwgMTApO1xyXG4gICAgICB0aGlzLl93aWR0aCA9IGlzTnVtYmVyKHdpZHRoTnVtKSA/ICh3aWR0aE51bSAqIHdpbmRvdy5pbm5lcldpZHRoIC8gMTAwICsgJ3B4JykgOiAnMHB4JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9sZFdpZHRoID0gdGhpcy5fd2lkdGg7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGlvbkRvbmVTdWIpIHtcclxuICAgICAgdGhpcy5hbmltYXRpb25Eb25lU3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZXNpemVTdWIpIHtcclxuICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJywgWyckZXZlbnQnXSkga2V5ZG93bkhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmVzY0tleUNsb3NlYWJsZSAmJiAhdGhpcy5pc0hhdmVEaWFsb2dPclVwbG9hZCgpKSB7XHJcbiAgICAgIHRoaXMuaGlkZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25BbmltYXRpb25FbmQoZXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmFuaW1hdGVTdGF0ZSA9PT0gJ3ZvaWQnKSB7XHJcbiAgICAgIHRoaXMub25IaWRkZW4oKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmFuaW1hdGVTdGF0ZSA9PT0gJ2luJyAmJiB0aGlzLmFmdGVyT3BlbmVkKSB7XHJcbiAgICAgIHRoaXMuYWZ0ZXJPcGVuZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgb25IaWRkZW4oKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgc2hvdygpIHtcclxuICAgIGlmICghdGhpcy5ib2R5U2Nyb2xsYWJsZSkge1xyXG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbmltYXRlU3RhdGUgPSAnaW4nO1xyXG4gICAgdGhpcy5pc0NvdmVyID0gdGhpcy5pc0NvdmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogdGhpcy5pc0NvdmVyO1xyXG4gICAgaWYgKCF0aGlzLmJhY2tkcm9wQ2xvc2VhYmxlIHx8IHRoaXMuaXNDb3Zlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBkb2N1bWVudENsaWNrID0gZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAnY2xpY2snKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGRvY3VtZW50Q2xpY2suc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jbGlja0RvbXMgJiYgdGhpcy5jbGlja0RvbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5jbGlja0RvbXMuZm9yRWFjaChkb20gPT4ge1xyXG4gICAgICAgICAgICBpZiAoZG9tICE9PSBudWxsICYmIGRvbS5jb250YWlucyhldmVudC50YXJnZXQpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XHJcbiAgICAgICAgICAvLyDkuIDlrpropoFkb2N1bWVudC5jb250YWlucyhldmVudC50YXJnZXQp77yM5Zug5Li6ZXZlbnQudGFyZ2V05Y+v6IO95bey57uP5LiN5ZyoZG9jdW1lbnTph4zkuobvvIzov5nkuKrml7blgJnlsLHkuI3og73ov5toaWRl5LqGXHJcbiAgICAgICAgICBpZiAodGhpcy5hbmltYXRlU3RhdGUgPT09ICdpbicgJiYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpICYmIGRvY3VtZW50LmJvZHkuY29udGFpbnModGFyZ2V0KSlcclxuICAgICAgICAgICAgJiYgIXRoaXMuaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoaWRlKCkge1xyXG4gICAgdGhpcy5jYW5IaWRlTW9kZWwoKS50aGVuKChjYW5IaWRlKSA9PiB7XHJcbiAgICAgIGlmICghY2FuSGlkZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIXRoaXMuYm9keVNjcm9sbGFibGUpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5JykuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuYW5pbWF0ZVN0YXRlID0gJ3ZvaWQnO1xyXG4gICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFdpbGwgb3ZlcndyaXRlIGJ5IGRyYXdlciBzZXJ2aWNlXHJcbiAgICBkZXN0cm95KCkge31cclxuXHJcbiAgaXNIYXZlRGlhbG9nT3JVcGxvYWQoKSB7XHJcbiAgICBjb25zdCBkaWFsb2c6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ21vZGFsLWRpYWxvZycpO1xyXG4gICAgY29uc3QgdXBsb2FkOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZC11cGxvYWQtdGVtcCcpO1xyXG4gICAgcmV0dXJuIChkaWFsb2cgJiYgZGlhbG9nLmxlbmd0aCA+IDApIHx8IHVwbG9hZDtcclxuICB9XHJcblxyXG4gIGNhbkhpZGVNb2RlbCgpIHtcclxuICAgIGxldCBoaWRkZW5SZXN1bHQgPSBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuYmVmb3JlSGlkZGVuKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5iZWZvcmVIaWRkZW4oKTtcclxuICAgICAgaWYgKHR5cGVvZiByZXN1bHQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdC50aGVuKSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSByZXN1bHQ7XHJcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuc3Vic2NyaWJlKSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSAocmVzdWx0IGFzIE9ic2VydmFibGU8Ym9vbGVhbj4pLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBoaWRkZW5SZXN1bHQgPSBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaGlkZGVuUmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc2V0RnVsbFNjcmVlbihmdWxsU2NyZWVuPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHRoaXMuX3dpZHRoID09PSB0aGlzLm9sZFdpZHRoKSB7XHJcbiAgICAgIGlmIChmdWxsU2NyZWVuID09PSB0cnVlIHx8IGZ1bGxTY3JlZW4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3dpZHRoID0gdGhpcy5faXNDb3ZlciA/ICcxMDAlJyA6IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JztcclxuICAgICAgICBpZiAoIXRoaXMuX2lzQ292ZXIpIHtcclxuICAgICAgICAgIGNvbnN0IHJlc2l6ZUV2ID0gZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpO1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzaXplRXYucGlwZShkZWJvdW5jZVRpbWUoMTAwKSk7XHJcbiAgICAgICAgICB0aGlzLnJlc2l6ZVN1YiA9IHJlc3VsdC5zdWJzY3JpYmUoZXYgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoICsgJ3B4JztcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCFmdWxsU2NyZWVuKSB7XHJcbiAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLm9sZFdpZHRoO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZVN1Yikge1xyXG4gICAgICAgICAgdGhpcy5yZXNpemVTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVGdWxsU2NyZWVuKCkge1xyXG4gICAgdGhpcy5fc2V0RnVsbFNjcmVlbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZ1bGxTY3JlZW4oZnVsbFNjcmVlbjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fc2V0RnVsbFNjcmVlbihmdWxsU2NyZWVuKTtcclxuICB9XHJcbn1cclxuIl19