ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
434 lines • 33.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: modal.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal, PortalInjector, TemplatePortal } from '@angular/cdk/portal';
import { Injectable, Injector, Optional, SkipSelf, TemplateRef } from '@angular/core';
import { warn } from 'ng-zorro-antd/core/logger';
import { isNotNil } from 'ng-zorro-antd/core/util';
import { defer, Subject } from 'rxjs';
import { startWith } from 'rxjs/operators';
import { MODAL_MASK_CLASS_NAME } from './modal-config';
import { NzModalConfirmContainerComponent } from './modal-confirm-container.component';
import { NzModalContainerComponent } from './modal-container.component';
import { NzModalRef } from './modal-ref';
import { ModalOptions } from './modal-types';
import { applyConfigDefaults, setContentInstanceParams } from './utils';
var NzModalService = /** @class */ (function () {
function NzModalService(overlay, injector, parentModal) {
var _this = this;
this.overlay = overlay;
this.injector = injector;
this.parentModal = parentModal;
this.openModalsAtThisLevel = [];
this.afterAllClosedAtThisLevel = new Subject();
this.afterAllClose = (/** @type {?} */ (defer((/**
* @return {?}
*/
function () {
return _this.openModals.length ? _this._afterAllClosed : _this._afterAllClosed.pipe(startWith(undefined));
}))));
}
Object.defineProperty(NzModalService.prototype, "openModals", {
get: /**
* @return {?}
*/
function () {
return this.parentModal ? this.parentModal.openModals : this.openModalsAtThisLevel;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzModalService.prototype, "_afterAllClosed", {
get: /**
* @return {?}
*/
function () {
/** @type {?} */
var parent = this.parentModal;
return parent ? parent._afterAllClosed : this.afterAllClosedAtThisLevel;
},
enumerable: true,
configurable: true
});
/**
* @template T, R
* @param {?} config
* @return {?}
*/
NzModalService.prototype.create = /**
* @template T, R
* @param {?} config
* @return {?}
*/
function (config) {
return this.open((/** @type {?} */ (config.nzContent)), config);
};
/**
* @return {?}
*/
NzModalService.prototype.closeAll = /**
* @return {?}
*/
function () {
this.closeModals(this.openModals);
};
/**
* @template T
* @param {?=} options
* @param {?=} confirmType
* @return {?}
*/
NzModalService.prototype.confirm = /**
* @template T
* @param {?=} options
* @param {?=} confirmType
* @return {?}
*/
function (options, confirmType) {
if (options === void 0) { options = {}; }
if (confirmType === void 0) { confirmType = 'confirm'; }
if ('nzFooter' in options) {
warn("The Confirm-Modal doesn't support \"nzFooter\", this property will be ignored.");
}
if (!('nzWidth' in options)) {
options.nzWidth = 416;
}
if (!('nzMaskClosable' in options)) {
options.nzMaskClosable = false;
}
options.nzModalType = 'confirm';
options.nzClassName = "ant-modal-confirm ant-modal-confirm-" + confirmType + " " + (options.nzClassName || '');
return this.create(options);
};
/**
* @template T
* @param {?=} options
* @return {?}
*/
NzModalService.prototype.info = /**
* @template T
* @param {?=} options
* @return {?}
*/
function (options) {
if (options === void 0) { options = {}; }
return this.confirmFactory(options, 'info');
};
/**
* @template T
* @param {?=} options
* @return {?}
*/
NzModalService.prototype.success = /**
* @template T
* @param {?=} options
* @return {?}
*/
function (options) {
if (options === void 0) { options = {}; }
return this.confirmFactory(options, 'success');
};
/**
* @template T
* @param {?=} options
* @return {?}
*/
NzModalService.prototype.error = /**
* @template T
* @param {?=} options
* @return {?}
*/
function (options) {
if (options === void 0) { options = {}; }
return this.confirmFactory(options, 'error');
};
/**
* @template T
* @param {?=} options
* @return {?}
*/
NzModalService.prototype.warning = /**
* @template T
* @param {?=} options
* @return {?}
*/
function (options) {
if (options === void 0) { options = {}; }
return this.confirmFactory(options, 'warning');
};
/**
* @private
* @template T, R
* @param {?} componentOrTemplateRef
* @param {?=} config
* @return {?}
*/
NzModalService.prototype.open = /**
* @private
* @template T, R
* @param {?} componentOrTemplateRef
* @param {?=} config
* @return {?}
*/
function (componentOrTemplateRef, config) {
var _this = this;
/** @type {?} */
var configMerged = applyConfigDefaults(config || {}, new ModalOptions());
/** @type {?} */
var overlayRef = this.createOverlay(configMerged);
/** @type {?} */
var modalContainer = this.attachModalContainer(overlayRef, configMerged);
/** @type {?} */
var modalRef = this.attachModalContent(componentOrTemplateRef, modalContainer, overlayRef, configMerged);
modalContainer.modalRef = modalRef;
this.openModals.push(modalRef);
modalRef.afterClose.subscribe((/**
* @return {?}
*/
function () { return _this.removeOpenModal(modalRef); }));
return modalRef;
};
/**
* @private
* @param {?} modalRef
* @return {?}
*/
NzModalService.prototype.removeOpenModal = /**
* @private
* @param {?} modalRef
* @return {?}
*/
function (modalRef) {
/** @type {?} */
var index = this.openModals.indexOf(modalRef);
if (index > -1) {
this.openModals.splice(index, 1);
if (!this.openModals.length) {
this._afterAllClosed.next();
}
}
};
/**
* @private
* @param {?} dialogs
* @return {?}
*/
NzModalService.prototype.closeModals = /**
* @private
* @param {?} dialogs
* @return {?}
*/
function (dialogs) {
/** @type {?} */
var i = dialogs.length;
while (i--) {
dialogs[i].close();
if (!this.openModals.length) {
this._afterAllClosed.next();
}
}
};
/**
* @private
* @param {?} config
* @return {?}
*/
NzModalService.prototype.createOverlay = /**
* @private
* @param {?} config
* @return {?}
*/
function (config) {
/** @type {?} */
var overlayConfig = new OverlayConfig({
hasBackdrop: true,
scrollStrategy: this.overlay.scrollStrategies.block(),
positionStrategy: this.overlay.position().global(),
disposeOnNavigation: config.nzCloseOnNavigation
});
if (config.nzMask) {
overlayConfig.backdropClass = MODAL_MASK_CLASS_NAME;
}
return this.overlay.create(overlayConfig);
};
/**
* @private
* @param {?} overlayRef
* @param {?} config
* @return {?}
*/
NzModalService.prototype.attachModalContainer = /**
* @private
* @param {?} overlayRef
* @param {?} config
* @return {?}
*/
function (overlayRef, config) {
/** @type {?} */
var userInjector = config && config.nzViewContainerRef && config.nzViewContainerRef.injector;
/** @type {?} */
var injector = new PortalInjector(userInjector || this.injector, new WeakMap([
[OverlayRef, overlayRef],
[ModalOptions, config]
]));
/** @type {?} */
var ContainerComponent = config.nzModalType === 'confirm'
? // If the mode is `confirm`, use `NzModalConfirmContainerComponent`
NzModalConfirmContainerComponent
: // If the mode is not `confirm`, use `NzModalContainerComponent`
NzModalContainerComponent;
/** @type {?} */
var containerPortal = new ComponentPortal(ContainerComponent, config.nzViewContainerRef, injector);
/** @type {?} */
var containerRef = overlayRef.attach(containerPortal);
return containerRef.instance;
};
/**
* @private
* @template T, R
* @param {?} componentOrTemplateRef
* @param {?} modalContainer
* @param {?} overlayRef
* @param {?} config
* @return {?}
*/
NzModalService.prototype.attachModalContent = /**
* @private
* @template T, R
* @param {?} componentOrTemplateRef
* @param {?} modalContainer
* @param {?} overlayRef
* @param {?} config
* @return {?}
*/
function (componentOrTemplateRef, modalContainer, overlayRef, config) {
/** @type {?} */
var modalRef = new NzModalRef(overlayRef, config, modalContainer);
if (componentOrTemplateRef instanceof TemplateRef) {
modalContainer.attachTemplatePortal(new TemplatePortal(componentOrTemplateRef, (/** @type {?} */ (null)), (/** @type {?} */ ({ $implicit: config.nzComponentParams, modalRef: modalRef }))));
}
else if (isNotNil(componentOrTemplateRef) && typeof componentOrTemplateRef !== 'string') {
/** @type {?} */
var injector = this.createInjector(modalRef, config);
/** @type {?} */
var contentRef = modalContainer.attachComponentPortal(new ComponentPortal(componentOrTemplateRef, config.nzViewContainerRef, injector));
setContentInstanceParams(contentRef.instance, config.nzComponentParams);
modalRef.componentInstance = contentRef.instance;
}
return modalRef;
};
/**
* @private
* @template T, R
* @param {?} modalRef
* @param {?} config
* @return {?}
*/
NzModalService.prototype.createInjector = /**
* @private
* @template T, R
* @param {?} modalRef
* @param {?} config
* @return {?}
*/
function (modalRef, config) {
/** @type {?} */
var userInjector = config && config.nzViewContainerRef && config.nzViewContainerRef.injector;
/** @type {?} */
var injectionTokens = new WeakMap([[NzModalRef, modalRef]]);
return new PortalInjector(userInjector || this.injector, injectionTokens);
};
/**
* @private
* @template T
* @param {?=} options
* @param {?=} confirmType
* @return {?}
*/
NzModalService.prototype.confirmFactory = /**
* @private
* @template T
* @param {?=} options
* @param {?=} confirmType
* @return {?}
*/
function (options, confirmType) {
if (options === void 0) { options = {}; }
/** @type {?} */
var iconMap = {
info: 'info-circle',
success: 'check-circle',
error: 'close-circle',
warning: 'exclamation-circle'
};
if (!('nzIconType' in options)) {
options.nzIconType = iconMap[confirmType];
}
if (!('nzCancelText' in options)) {
// Remove the Cancel button if the user not specify a Cancel button
options.nzCancelText = null;
}
return this.confirm(options, confirmType);
};
/**
* @return {?}
*/
NzModalService.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.closeModals(this.openModalsAtThisLevel);
this.afterAllClosedAtThisLevel.complete();
};
NzModalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
NzModalService.ctorParameters = function () { return [
{ type: Overlay },
{ type: Injector },
{ type: NzModalService, decorators: [{ type: Optional }, { type: SkipSelf }] }
]; };
return NzModalService;
}());
export { NzModalService };
if (false) {
/**
* @type {?}
* @private
*/
NzModalService.prototype.openModalsAtThisLevel;
/**
* @type {?}
* @private
*/
NzModalService.prototype.afterAllClosedAtThisLevel;
/** @type {?} */
NzModalService.prototype.afterAllClose;
/**
* @type {?}
* @private
*/
NzModalService.prototype.overlay;
/**
* @type {?}
* @private
*/
NzModalService.prototype.injector;
/**
* @type {?}
* @private
*/
NzModalService.prototype.parentModal;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvbW9kYWwvIiwic291cmNlcyI6WyJtb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVFBLE9BQU8sRUFBaUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RixPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBYSxRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxLQUFLLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBZSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXhFO0lBa0JFLHdCQUFvQixPQUFnQixFQUFVLFFBQWtCLEVBQWtDLFdBQTJCO1FBQTdILGlCQUFpSTtRQUE3RyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQVUsYUFB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LFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUMsQ0FBQzs7Z0JBdExGLFVBQVU7Ozs7Z0JBbkJhLE9BQU87Z0JBRVYsUUFBUTtnQkFtQ29GLGNBQWMsdUJBQTFELFFBQVEsWUFBSSxRQUFROztJQXFLekYscUJBQUM7Q0FBQSxBQXZMRCxJQXVMQztTQXRMWSxjQUFjOzs7Ozs7SUFDekIsK0NBQWlEOzs7OztJQUNqRCxtREFBaUU7O0lBV2pFLHVDQUVzQjs7Ozs7SUFFVixpQ0FBd0I7Ozs7O0lBQUUsa0NBQTBCOzs7OztJQUFFLHFDQUEyRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBQb3J0YWxJbmplY3RvciwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBTa2lwU2VsZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHdhcm4gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvbG9nZ2VyJztcbmltcG9ydCB7IEluZGV4YWJsZU9iamVjdCwgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IGlzTm90TmlsIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgZGVmZXIsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTU9EQUxfTUFTS19DTEFTU19OQU1FIH0gZnJvbSAnLi9tb2RhbC1jb25maWcnO1xuaW1wb3J0IHsgTnpNb2RhbENvbmZpcm1Db250YWluZXJDb21wb25lbnQgfSBmcm9tICcuL21vZGFsLWNvbmZpcm0tY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlTW9kYWxDb250YWluZXIgfSBmcm9tICcuL21vZGFsLWNvbnRhaW5lcic7XG5pbXBvcnQgeyBOek1vZGFsQ29udGFpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE56TW9kYWxSZWYgfSBmcm9tICcuL21vZGFsLXJlZic7XG5pbXBvcnQgeyBDb25maXJtVHlwZSwgTW9kYWxPcHRpb25zIH0gZnJvbSAnLi9tb2RhbC10eXBlcyc7XG5pbXBvcnQgeyBhcHBseUNvbmZpZ0RlZmF1bHRzLCBzZXRDb250ZW50SW5zdGFuY2VQYXJhbXMgfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBDb250ZW50VHlwZTxUPiA9IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPiB8IHN0cmluZztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE56TW9kYWxTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBvcGVuTW9kYWxzQXRUaGlzTGV2ZWw6IE56TW9kYWxSZWZbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGFmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGdldCBvcGVuTW9kYWxzKCk6IE56TW9kYWxSZWZbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50TW9kYWwgPyB0aGlzLnBhcmVudE1vZGFsLm9wZW5Nb2RhbHMgOiB0aGlzLm9wZW5Nb2RhbHNBdFRoaXNMZXZlbDtcbiAgfVxuXG4gIGdldCBfYWZ0ZXJBbGxDbG9zZWQoKTogU3ViamVjdDx2b2lkPiB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnRNb2RhbDtcbiAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Ll9hZnRlckFsbENsb3NlZCA6IHRoaXMuYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbDtcbiAgfVxuXG4gIHJlYWRvbmx5IGFmdGVyQWxsQ2xvc2U6IE9ic2VydmFibGU8dm9pZD4gPSBkZWZlcigoKSA9PlxuICAgIHRoaXMub3Blbk1vZGFscy5sZW5ndGggPyB0aGlzLl9hZnRlckFsbENsb3NlZCA6IHRoaXMuX2FmdGVyQWxsQ2xvc2VkLnBpcGUoc3RhcnRXaXRoKHVuZGVmaW5lZCkpXG4gICkgYXMgT2JzZXJ2YWJsZTx2b2lkPjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwcml2YXRlIHBhcmVudE1vZGFsOiBOek1vZGFsU2VydmljZSkge31cblxuICBjcmVhdGU8VCwgUiA9IE56U2FmZUFueT4oY29uZmlnOiBNb2RhbE9wdGlvbnM8VCwgUj4pOiBOek1vZGFsUmVmPFQsIFI+IHtcbiAgICByZXR1cm4gdGhpcy5vcGVuPFQsIFI+KGNvbmZpZy5uekNvbnRlbnQgYXMgQ29tcG9uZW50VHlwZTxUPiwgY29uZmlnKTtcbiAgfVxuXG4gIGNsb3NlQWxsKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VNb2RhbHModGhpcy5vcGVuTW9kYWxzKTtcbiAgfVxuXG4gIGNvbmZpcm08VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30sIGNvbmZpcm1UeXBlOiBDb25maXJtVHlwZSA9ICdjb25maXJtJyk6IE56TW9kYWxSZWY8VD4ge1xuICAgIGlmICgnbnpGb290ZXInIGluIG9wdGlvbnMpIHtcbiAgICAgIHdhcm4oYFRoZSBDb25maXJtLU1vZGFsIGRvZXNuJ3Qgc3VwcG9ydCBcIm56Rm9vdGVyXCIsIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkLmApO1xuICAgIH1cbiAgICBpZiAoISgnbnpXaWR0aCcgaW4gb3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMubnpXaWR0aCA9IDQxNjtcbiAgICB9XG4gICAgaWYgKCEoJ256TWFza0Nsb3NhYmxlJyBpbiBvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucy5uek1hc2tDbG9zYWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9wdGlvbnMubnpNb2RhbFR5cGUgPSAnY29uZmlybSc7XG4gICAgb3B0aW9ucy5uekNsYXNzTmFtZSA9IGBhbnQtbW9kYWwtY29uZmlybSBhbnQtbW9kYWwtY29uZmlybS0ke2NvbmZpcm1UeXBlfSAke29wdGlvbnMubnpDbGFzc05hbWUgfHwgJyd9YDtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUob3B0aW9ucyk7XG4gIH1cblxuICBpbmZvPFQ+KG9wdGlvbnM6IE1vZGFsT3B0aW9uczxUPiA9IHt9KTogTnpNb2RhbFJlZjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlybUZhY3Rvcnkob3B0aW9ucywgJ2luZm8nKTtcbiAgfVxuXG4gIHN1Y2Nlc3M8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnc3VjY2VzcycpO1xuICB9XG5cbiAgZXJyb3I8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnZXJyb3InKTtcbiAgfVxuXG4gIHdhcm5pbmc8VD4ob3B0aW9uczogTW9kYWxPcHRpb25zPFQ+ID0ge30pOiBOek1vZGFsUmVmPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5jb25maXJtRmFjdG9yeShvcHRpb25zLCAnd2FybmluZycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuPFQsIFI+KGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbnRlbnRUeXBlPFQ+LCBjb25maWc/OiBNb2RhbE9wdGlvbnMpOiBOek1vZGFsUmVmPFQsIFI+IHtcbiAgICBjb25zdCBjb25maWdNZXJnZWQgPSBhcHBseUNvbmZpZ0RlZmF1bHRzKGNvbmZpZyB8fCB7fSwgbmV3IE1vZGFsT3B0aW9ucygpKTtcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KGNvbmZpZ01lcmdlZCk7XG4gICAgY29uc3QgbW9kYWxDb250YWluZXIgPSB0aGlzLmF0dGFjaE1vZGFsQ29udGFpbmVyKG92ZXJsYXlSZWYsIGNvbmZpZ01lcmdlZCk7XG4gICAgY29uc3QgbW9kYWxSZWYgPSB0aGlzLmF0dGFjaE1vZGFsQ29udGVudDxULCBSPihjb21wb25lbnRPclRlbXBsYXRlUmVmLCBtb2RhbENvbnRhaW5lciwgb3ZlcmxheVJlZiwgY29uZmlnTWVyZ2VkKTtcbiAgICBtb2RhbENvbnRhaW5lci5tb2RhbFJlZiA9IG1vZGFsUmVmO1xuXG4gICAgdGhpcy5vcGVuTW9kYWxzLnB1c2gobW9kYWxSZWYpO1xuICAgIG1vZGFsUmVmLmFmdGVyQ2xvc2Uuc3Vic2NyaWJlKCgpID0+IHRoaXMucmVtb3ZlT3Blbk1vZGFsKG1vZGFsUmVmKSk7XG5cbiAgICByZXR1cm4gbW9kYWxSZWY7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZU9wZW5Nb2RhbChtb2RhbFJlZjogTnpNb2RhbFJlZik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuTW9kYWxzLmluZGV4T2YobW9kYWxSZWYpO1xuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLm9wZW5Nb2RhbHMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgaWYgKCF0aGlzLm9wZW5Nb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsb3NlTW9kYWxzKGRpYWxvZ3M6IE56TW9kYWxSZWZbXSk6IHZvaWQge1xuICAgIGxldCBpID0gZGlhbG9ncy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgZGlhbG9nc1tpXS5jbG9zZSgpO1xuICAgICAgaWYgKCF0aGlzLm9wZW5Nb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoY29uZmlnOiBNb2RhbE9wdGlvbnMpOiBPdmVybGF5UmVmIHtcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLFxuICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogY29uZmlnLm56Q2xvc2VPbk5hdmlnYXRpb25cbiAgICB9KTtcblxuICAgIGlmIChjb25maWcubnpNYXNrKSB7XG4gICAgICBvdmVybGF5Q29uZmlnLmJhY2tkcm9wQ2xhc3MgPSBNT0RBTF9NQVNLX0NMQVNTX05BTUU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaE1vZGFsQ29udGFpbmVyKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIGNvbmZpZzogTW9kYWxPcHRpb25zKTogQmFzZU1vZGFsQ29udGFpbmVyIHtcbiAgICBjb25zdCB1c2VySW5qZWN0b3IgPSBjb25maWcgJiYgY29uZmlnLm56Vmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcubnpWaWV3Q29udGFpbmVyUmVmLmluamVjdG9yO1xuICAgIGNvbnN0IGluamVjdG9yID0gbmV3IFBvcnRhbEluamVjdG9yKFxuICAgICAgdXNlckluamVjdG9yIHx8IHRoaXMuaW5qZWN0b3IsXG4gICAgICBuZXcgV2Vha01hcDxOelNhZmVBbnksIE56U2FmZUFueT4oW1xuICAgICAgICBbT3ZlcmxheVJlZiwgb3ZlcmxheVJlZl0sXG4gICAgICAgIFtNb2RhbE9wdGlvbnMsIGNvbmZpZ11cbiAgICAgIF0pXG4gICAgKTtcblxuICAgIGNvbnN0IENvbnRhaW5lckNvbXBvbmVudCA9XG4gICAgICBjb25maWcubnpNb2RhbFR5cGUgPT09ICdjb25maXJtJ1xuICAgICAgICA/IC8vIElmIHRoZSBtb2RlIGlzIGBjb25maXJtYCwgdXNlIGBOek1vZGFsQ29uZmlybUNvbnRhaW5lckNvbXBvbmVudGBcbiAgICAgICAgICBOek1vZGFsQ29uZmlybUNvbnRhaW5lckNvbXBvbmVudFxuICAgICAgICA6IC8vIElmIHRoZSBtb2RlIGlzIG5vdCBgY29uZmlybWAsIHVzZSBgTnpNb2RhbENvbnRhaW5lckNvbXBvbmVudGBcbiAgICAgICAgICBOek1vZGFsQ29udGFpbmVyQ29tcG9uZW50O1xuXG4gICAgY29uc3QgY29udGFpbmVyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbDxCYXNlTW9kYWxDb250YWluZXI+KENvbnRhaW5lckNvbXBvbmVudCwgY29uZmlnLm56Vmlld0NvbnRhaW5lclJlZiwgaW5qZWN0b3IpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IG92ZXJsYXlSZWYuYXR0YWNoPEJhc2VNb2RhbENvbnRhaW5lcj4oY29udGFpbmVyUG9ydGFsKTtcblxuICAgIHJldHVybiBjb250YWluZXJSZWYuaW5zdGFuY2U7XG4gIH1cblxuICBwcml2YXRlIGF0dGFjaE1vZGFsQ29udGVudDxULCBSPihcbiAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmOiBDb250ZW50VHlwZTxUPixcbiAgICBtb2RhbENvbnRhaW5lcjogQmFzZU1vZGFsQ29udGFpbmVyLFxuICAgIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgY29uZmlnOiBNb2RhbE9wdGlvbnM8VD5cbiAgKTogTnpNb2RhbFJlZjxULCBSPiB7XG4gICAgY29uc3QgbW9kYWxSZWYgPSBuZXcgTnpNb2RhbFJlZjxULCBSPihvdmVybGF5UmVmLCBjb25maWcsIG1vZGFsQ29udGFpbmVyKTtcblxuICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIG1vZGFsQ29udGFpbmVyLmF0dGFjaFRlbXBsYXRlUG9ydGFsKFxuICAgICAgICBuZXcgVGVtcGxhdGVQb3J0YWw8VD4oY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgbnVsbCEsIHsgJGltcGxpY2l0OiBjb25maWcubnpDb21wb25lbnRQYXJhbXMsIG1vZGFsUmVmIH0gYXMgTnpTYWZlQW55KVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGlzTm90TmlsKGNvbXBvbmVudE9yVGVtcGxhdGVSZWYpICYmIHR5cGVvZiBjb21wb25lbnRPclRlbXBsYXRlUmVmICE9PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLmNyZWF0ZUluamVjdG9yPFQsIFI+KG1vZGFsUmVmLCBjb25maWcpO1xuICAgICAgY29uc3QgY29udGVudFJlZiA9IG1vZGFsQ29udGFpbmVyLmF0dGFjaENvbXBvbmVudFBvcnRhbDxUPihcbiAgICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChjb21wb25lbnRPclRlbXBsYXRlUmVmLCBjb25maWcubnpWaWV3Q29udGFpbmVyUmVmLCBpbmplY3RvcilcbiAgICAgICk7XG4gICAgICBzZXRDb250ZW50SW5zdGFuY2VQYXJhbXM8VD4oY29udGVudFJlZi5pbnN0YW5jZSwgY29uZmlnLm56Q29tcG9uZW50UGFyYW1zKTtcbiAgICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlID0gY29udGVudFJlZi5pbnN0YW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGFsUmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmplY3RvcjxULCBSPihtb2RhbFJlZjogTnpNb2RhbFJlZjxULCBSPiwgY29uZmlnOiBNb2RhbE9wdGlvbnM8VD4pOiBQb3J0YWxJbmplY3RvciB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID0gY29uZmlnICYmIGNvbmZpZy5uelZpZXdDb250YWluZXJSZWYgJiYgY29uZmlnLm56Vmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcbiAgICBjb25zdCBpbmplY3Rpb25Ub2tlbnMgPSBuZXcgV2Vha01hcDxOelNhZmVBbnksIE56U2FmZUFueT4oW1tOek1vZGFsUmVmLCBtb2RhbFJlZl1dKTtcblxuICAgIHJldHVybiBuZXcgUG9ydGFsSW5qZWN0b3IodXNlckluamVjdG9yIHx8IHRoaXMuaW5qZWN0b3IsIGluamVjdGlvblRva2Vucyk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpcm1GYWN0b3J5PFQ+KG9wdGlvbnM6IE1vZGFsT3B0aW9uczxUPiA9IHt9LCBjb25maXJtVHlwZTogQ29uZmlybVR5cGUpOiBOek1vZGFsUmVmPFQ+IHtcbiAgICBjb25zdCBpY29uTWFwOiBJbmRleGFibGVPYmplY3QgPSB7XG4gICAgICBpbmZvOiAnaW5mby1jaXJjbGUnLFxuICAgICAgc3VjY2VzczogJ2NoZWNrLWNpcmNsZScsXG4gICAgICBlcnJvcjogJ2Nsb3NlLWNpcmNsZScsXG4gICAgICB3YXJuaW5nOiAnZXhjbGFtYXRpb24tY2lyY2xlJ1xuICAgIH07XG4gICAgaWYgKCEoJ256SWNvblR5cGUnIGluIG9wdGlvbnMpKSB7XG4gICAgICBvcHRpb25zLm56SWNvblR5cGUgPSBpY29uTWFwW2NvbmZpcm1UeXBlXTtcbiAgICB9XG4gICAgaWYgKCEoJ256Q2FuY2VsVGV4dCcgaW4gb3B0aW9ucykpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgQ2FuY2VsIGJ1dHRvbiBpZiB0aGUgdXNlciBub3Qgc3BlY2lmeSBhIENhbmNlbCBidXR0b25cbiAgICAgIG9wdGlvbnMubnpDYW5jZWxUZXh0ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlybShvcHRpb25zLCBjb25maXJtVHlwZSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlTW9kYWxzKHRoaXMub3Blbk1vZGFsc0F0VGhpc0xldmVsKTtcbiAgICB0aGlzLmFmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgfVxufVxuIl19