UNPKG

ng-zorro-antd

Version:

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

150 lines 20 kB
/** * 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 { ESCAPE, hasModifierKey } from '@angular/cdk/keycodes'; import { EventEmitter } from '@angular/core'; import { Subject } from 'rxjs'; import { filter, take, takeUntil } from 'rxjs/operators'; import { isPromise } from 'ng-zorro-antd/core/util'; export class NzModalRef { constructor(overlayRef, config, containerInstance) { this.overlayRef = overlayRef; this.config = config; this.containerInstance = containerInstance; this.componentInstance = null; this.state = 0 /* OPEN */; this.afterClose = new Subject(); this.afterOpen = new Subject(); this.destroy$ = new Subject(); containerInstance.animationStateChanged .pipe(filter(event => event.phaseName === 'done' && event.toState === 'enter'), take(1)) .subscribe(() => { this.afterOpen.next(); this.afterOpen.complete(); if (config.nzAfterOpen instanceof EventEmitter) { config.nzAfterOpen.emit(); } }); containerInstance.animationStateChanged .pipe(filter(event => event.phaseName === 'done' && event.toState === 'exit'), take(1)) .subscribe(() => { clearTimeout(this.closeTimeout); this._finishDialogClose(); }); containerInstance.containerClick.pipe(take(1), takeUntil(this.destroy$)).subscribe(() => { const cancelable = !this.config.nzCancelLoading && !this.config.nzOkLoading; if (cancelable) { this.trigger("cancel" /* CANCEL */); } }); overlayRef .keydownEvents() .pipe(filter(event => this.config.nzKeyboard && !this.config.nzCancelLoading && !this.config.nzOkLoading && event.keyCode === ESCAPE && !hasModifierKey(event))) .subscribe(event => { event.preventDefault(); this.trigger("cancel" /* CANCEL */); }); containerInstance.cancelTriggered .pipe(takeUntil(this.destroy$)) .subscribe(() => this.trigger("cancel" /* CANCEL */)); containerInstance.okTriggered.pipe(takeUntil(this.destroy$)).subscribe(() => this.trigger("ok" /* OK */)); overlayRef.detachments().subscribe(() => { this.afterClose.next(this.result); this.afterClose.complete(); if (config.nzAfterClose instanceof EventEmitter) { config.nzAfterClose.emit(this.result); } this.componentInstance = null; this.overlayRef.dispose(); }); } getContentComponent() { return this.componentInstance; } getElement() { return this.containerInstance.getNativeElement(); } destroy(result) { this.close(result); } triggerOk() { return this.trigger("ok" /* OK */); } triggerCancel() { return this.trigger("cancel" /* CANCEL */); } close(result) { if (this.state !== 0 /* OPEN */) { return; } this.result = result; this.containerInstance.animationStateChanged .pipe(filter(event => event.phaseName === 'start'), take(1)) .subscribe(event => { this.overlayRef.detachBackdrop(); this.closeTimeout = setTimeout(() => { this._finishDialogClose(); }, event.totalTime + 100); }); this.containerInstance.startExitAnimation(); this.state = 1 /* CLOSING */; } updateConfig(config) { Object.assign(this.config, config); this.containerInstance.bindBackdropStyle(); this.containerInstance.cdr.markForCheck(); } getState() { return this.state; } getConfig() { return this.config; } getBackdropElement() { return this.overlayRef.backdropElement; } async trigger(action) { const trigger = { ok: this.config.nzOnOk, cancel: this.config.nzOnCancel }[action]; const loadingKey = { ok: 'nzOkLoading', cancel: 'nzCancelLoading' }[action]; const loading = this.config[loadingKey]; if (loading) { return; } if (trigger instanceof EventEmitter) { trigger.emit(this.getContentComponent()); } else if (typeof trigger === 'function') { const result = trigger(this.getContentComponent()); if (isPromise(result)) { this.config[loadingKey] = true; let doClose = false; try { doClose = await result; } finally { this.config[loadingKey] = false; this.closeWhitResult(doClose); } } else { this.closeWhitResult(result); } } } closeWhitResult(result) { if (result !== false) { this.close(result); } } _finishDialogClose() { this.state = 2 /* CLOSED */; this.overlayRef.dispose(); this.destroy$.next(); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtcmVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50cy9tb2RhbC9tb2RhbC1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBaUJwRCxNQUFNLE9BQU8sVUFBVTtJQVdyQixZQUNVLFVBQXNCLEVBQ3RCLE1BQW9CLEVBQ3JCLGlCQUE4QztRQUY3QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDckIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUE2QjtRQWJ2RCxzQkFBaUIsR0FBYSxJQUFJLENBQUM7UUFFbkMsVUFBSyxnQkFBbUM7UUFDeEMsZUFBVSxHQUFlLElBQUksT0FBTyxFQUFFLENBQUM7UUFDdkMsY0FBUyxHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBSWpDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBT3JDLGlCQUFpQixDQUFDLHFCQUFxQjthQUNwQyxJQUFJLENBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsRUFDeEUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxF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LEtBQUssQ0FBQztnQkFDekMsSUFBSTtvQkFDRixPQUFPLEdBQUcsTUFBTSxNQUFNLENBQUM7aUJBQ3hCO3dCQUFTO29CQUNSLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUMvQjthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDOUI7U0FDRjtJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsTUFBaUI7UUFDdkMsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxLQUFLLGlCQUFzQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBFU0NBUEUsIGhhc01vZGlmaWVyS2V5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2tleWNvZGVzJztcbmltcG9ydCB7IE92ZXJsYXlSZWYgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgaXNQcm9taXNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuXG5pbXBvcnQgeyBCYXNlTW9kYWxDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL21vZGFsLWNvbnRhaW5lci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnpNb2RhbExlZ2FjeUFQSSB9IGZyb20gJy4vbW9kYWwtbGVnYWN5LWFwaSc7XG5pbXBvcnQgeyBNb2RhbE9wdGlvbnMgfSBmcm9tICcuL21vZGFsLXR5cGVzJztcblxuZXhwb3J0IGNvbnN0IGVudW0gTnpNb2RhbFN0YXRlIHtcbiAgT1BFTixcbiAgQ0xPU0lORyxcbiAgQ0xPU0VEXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIE56VHJpZ2dlckFjdGlvbiB7XG4gIENBTkNFTCA9ICdjYW5jZWwnLFxuICBPSyA9ICdvaydcbn1cblxuZXhwb3J0IGNsYXNzIE56TW9kYWxSZWY8VCA9IE56U2FmZUFueSwgUiA9IE56U2FmZUFueT4gaW1wbGVtZW50cyBOek1vZGFsTGVnYWN5QVBJPFQsIFI+IHtcbiAgY29tcG9uZW50SW5zdGFuY2U6IFQgfCBudWxsID0gbnVsbDtcbiAgcmVzdWx0PzogUjtcbiAgc3RhdGU6IE56TW9kYWxTdGF0ZSA9IE56TW9kYWxTdGF0ZS5PUEVOO1xuICBhZnRlckNsb3NlOiBTdWJqZWN0PFI+ID0gbmV3IFN1YmplY3QoKTtcbiAgYWZ0ZXJPcGVuOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcblxuICBwcml2YXRlIGNsb3NlVGltZW91dD86IG51bWJlcjtcblxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgcHJpdmF0ZSBjb25maWc6IE1vZGFsT3B0aW9ucyxcbiAgICBwdWJsaWMgY29udGFpbmVySW5zdGFuY2U6IEJhc2VNb2RhbENvbnRhaW5lckNvbXBvbmVudFxuICApIHtcbiAgICBjb250YWluZXJJbnN0YW5jZS5hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQucGhhc2VOYW1lID09PSAnZG9uZScgJiYgZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJyksXG4gICAgICAgIHRha2UoMSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFmdGVyT3Blbi5uZXh0KCk7XG4gICAgICAgIHRoaXMuYWZ0ZXJPcGVuLmNvbXBsZXRlKCk7XG4gICAgICAgIGlmIChjb25maWcubnpBZnRlck9wZW4gaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICBjb25maWcubnpBZnRlck9wZW4uZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNvbnRhaW5lckluc3RhbmNlLmFuaW1hdGlvblN0YXRlQ2hhbmdlZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5waGFzZU5hbWUgPT09ICdkb25lJyAmJiBldmVudC50b1N0YXRlID09PSAnZXhpdCcpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5fZmluaXNoRGlhbG9nQ2xvc2UoKTtcbiAgICAgIH0pO1xuXG4gICAgY29udGFpbmVySW5zdGFuY2UuY29udGFpbmVyQ2xpY2sucGlwZSh0YWtlKDEpLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBjb25zdCBjYW5jZWxhYmxlID0gIXRoaXMuY29uZmlnLm56Q2FuY2VsTG9hZGluZyAmJiAhdGhpcy5jb25maWcubnpPa0xvYWRpbmc7XG4gICAgICBpZiAoY2FuY2VsYWJsZSkge1xuICAgICAgICB0aGlzLnRyaWdnZXIoTnpUcmlnZ2VyQWN0aW9uLkNBTkNFTCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBvdmVybGF5UmVmXG4gICAgICAua2V5ZG93bkV2ZW50cygpXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKFxuICAgICAgICAgIGV2ZW50ID0+XG4gICAgICAgICAgICAodGhpcy5jb25maWcubnpLZXlib2FyZCBhcyBib29sZWFuKSAmJlxuICAgICAgICAgICAgIXRoaXMuY29uZmlnLm56Q2FuY2VsTG9hZGluZyAmJlxuICAgICAgICAgICAgIXRoaXMuY29uZmlnLm56T2tMb2FkaW5nICYmXG4gICAgICAgICAgICBldmVudC5rZXlDb2RlID09PSBFU0NBUEUgJiZcbiAgICAgICAgICAgICFoYXNNb2RpZmllcktleShldmVudClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMudHJpZ2dlcihOelRyaWdnZXJBY3Rpb24uQ0FOQ0VMKTtcbiAgICAgIH0pO1xuXG4gICAgY29udGFpbmVySW5zdGFuY2UuY2FuY2VsVHJpZ2dlcmVkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMudHJpZ2dlcihOelRyaWdnZXJBY3Rpb24uQ0FOQ0VMKSk7XG5cbiAgICBjb250YWluZXJJbnN0YW5jZS5va1RyaWdnZXJlZC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHRoaXMudHJpZ2dlcihOelRyaWdnZXJBY3Rpb24uT0spKTtcblxuICAgIG92ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hZnRlckNsb3NlLm5leHQodGhpcy5yZXN1bHQpO1xuICAgICAgdGhpcy5hZnRlckNsb3NlLmNvbXBsZXRlKCk7XG4gICAgICBpZiAoY29uZmlnLm56QWZ0ZXJDbG9zZSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICBjb25maWcubnpBZnRlckNsb3NlLmVtaXQodGhpcy5yZXN1bHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5jb21wb25lbnRJbnN0YW5jZSA9IG51bGw7XG4gICAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udGVudENvbXBvbmVudCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZSBhcyBUO1xuICB9XG5cbiAgZ2V0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVySW5zdGFuY2UuZ2V0TmF0aXZlRWxlbWVudCgpO1xuICB9XG5cbiAgZGVzdHJveShyZXN1bHQ/OiBSKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZShyZXN1bHQpO1xuICB9XG5cbiAgdHJpZ2dlck9rKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnRyaWdnZXIoTnpUcmlnZ2VyQWN0aW9uLk9LKTtcbiAgfVxuXG4gIHRyaWdnZXJDYW5jZWwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihOelRyaWdnZXJBY3Rpb24uQ0FOQ0VMKTtcbiAgfVxuXG4gIGNsb3NlKHJlc3VsdD86IFIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gTnpNb2RhbFN0YXRlLk9QRU4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgdGhpcy5jb250YWluZXJJbnN0YW5jZS5hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQucGhhc2VOYW1lID09PSAnc3RhcnQnKSxcbiAgICAgICAgdGFrZSgxKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIHRoaXMub3ZlcmxheVJlZi5kZXRhY2hCYWNrZHJvcCgpO1xuICAgICAgICB0aGlzLmNsb3NlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbmlzaERpYWxvZ0Nsb3NlKCk7XG4gICAgICAgIH0sIGV2ZW50LnRvdGFsVGltZSArIDEwMCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuY29udGFpbmVySW5zdGFuY2Uuc3RhcnRFeGl0QW5pbWF0aW9uKCk7XG4gICAgdGhpcy5zdGF0ZSA9IE56TW9kYWxTdGF0ZS5DTE9TSU5HO1xuICB9XG5cbiAgdXBkYXRlQ29uZmlnKGNvbmZpZzogTW9kYWxPcHRpb25zKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNvbmZpZywgY29uZmlnKTtcbiAgICB0aGlzLmNvbnRhaW5lckluc3RhbmNlLmJpbmRCYWNrZHJvcFN0eWxlKCk7XG4gICAgdGhpcy5jb250YWluZXJJbnN0YW5jZS5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXRTdGF0ZSgpOiBOek1vZGFsU3RhdGUge1xuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IE1vZGFsT3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgZ2V0QmFja2Ryb3BFbGVtZW50KCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyaWdnZXIoYWN0aW9uOiBOelRyaWdnZXJBY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0cmlnZ2VyID0geyBvazogdGhpcy5jb25maWcubnpPbk9rLCBjYW5jZWw6IHRoaXMuY29uZmlnLm56T25DYW5jZWwgfVthY3Rpb25dO1xuICAgIGNvbnN0IGxvYWRpbmdLZXkgPSB7IG9rOiAnbnpPa0xvYWRpbmcnLCBjYW5jZWw6ICduekNhbmNlbExvYWRpbmcnIH1bYWN0aW9uXSBhcyAnbnpPa0xvYWRpbmcnIHwgJ256Q2FuY2VsTG9hZGluZyc7XG4gICAgY29uc3QgbG9hZGluZyA9IHRoaXMuY29uZmlnW2xvYWRpbmdLZXldO1xuICAgIGlmIChsb2FkaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0cmlnZ2VyIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICB0cmlnZ2VyLmVtaXQodGhpcy5nZXRDb250ZW50Q29tcG9uZW50KCkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRyaWdnZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRyaWdnZXIodGhpcy5nZXRDb250ZW50Q29tcG9uZW50KCkpO1xuICAgICAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgICAgIHRoaXMuY29uZmlnW2xvYWRpbmdLZXldID0gdHJ1ZTtcbiAgICAgICAgbGV0IGRvQ2xvc2U6IGJvb2xlYW4gfCB2b2lkIHwge30gPSBmYWxzZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBkb0Nsb3NlID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuY29uZmlnW2xvYWRpbmdLZXldID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jbG9zZVdoaXRSZXN1bHQoZG9DbG9zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2xvc2VXaGl0UmVzdWx0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVdoaXRSZXN1bHQocmVzdWx0OiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jbG9zZShyZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIF9maW5pc2hEaWFsb2dDbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gTnpNb2RhbFN0YXRlLkNMT1NFRDtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICB9XG59XG4iXX0=