UNPKG

@neocomplexx/ngx-neo-modal

Version:

This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.0.5.

573 lines 38.4 kB
/** * @fileoverview added by tsickle * Generated from: lib/ngx-neo-modal.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable } from '@angular/core'; import { NgxNeoModalComponent, AlertButton } from './ngx-neo-modal.component'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; var NgxNeoModalService = /** @class */ (function () { function NgxNeoModalService(modalService) { var _this = this; this.modalService = modalService; this.originalAlert = window.alert; window.alert = (/** * @param {?} msg * @return {?} */ function (msg) { return tslib_1.__awaiter(_this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.alert(msg)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }); } /** * @private * @param {?} config * @return {?} */ NgxNeoModalService.prototype.openModal = /** * @private * @param {?} config * @return {?} */ function (config) { return tslib_1.__awaiter(this, void 0, void 0, function () { var modalRef; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: modalRef = this.modalService.open(NgxNeoModalComponent, { backdrop: 'static', keyboard: false, centered: true, windowClass: 'neoWindow' }); modalRef.componentInstance.config = (this.mergeDeep(modalRef.componentInstance.config, config)); modalRef.componentInstance.changeRef.markForCheck(); return [4 /*yield*/, modalRef.result]; case 1: return [2 /*return*/, _a.sent()]; } }); }); }; /** * Show message. Can be use as window.alert */ /** * Show message. Can be use as window.alert * @param {?} msg * @param {?=} autofocus * @return {?} */ NgxNeoModalService.prototype.alert = /** * Show message. Can be use as window.alert * @param {?} msg * @param {?=} autofocus * @return {?} */ function (msg, autofocus) { if (autofocus === void 0) { autofocus = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { var config; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: config = { title: { visibility: false }, message: msg, button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return [4 /*yield*/, this.openModal(config)]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; /** * * Show succsessfull message */ /** * * Show succsessfull message * @param {?} msg * @param {?=} autofocus * @return {?} */ NgxNeoModalService.prototype.success = /** * * Show succsessfull message * @param {?} msg * @param {?=} autofocus * @return {?} */ function (msg, autofocus) { if (autofocus === void 0) { autofocus = true; } return tslib_1.__awaiter(this, void 0, void 0, function () { var config; return tslib_1.__generator(this, function (_a) { config = { title: { text: '¡Buen trabajo!' }, message: msg, type: 'success', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return [2 /*return*/, this.openModal(config)]; }); }); }; /** * * Warning message */ /** * * Warning message * @param {?} msg * @param {?=} autofocus * @return {?} */ NgxNeoModalService.prototype.warning = /** * * Warning message * @param {?} msg * @param {?=} autofocus * @return {?} */ function (msg, autofocus) { if (autofocus === void 0) { autofocus = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { var config; return tslib_1.__generator(this, function (_a) { config = { title: { text: '¡Cuidado!' }, message: msg, type: 'warning', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return [2 /*return*/, this.openModal(config)]; }); }); }; /** * * Error message */ /** * * Error message * @param {?} msg * @param {?=} autofocus * @return {?} */ NgxNeoModalService.prototype.error = /** * * Error message * @param {?} msg * @param {?=} autofocus * @return {?} */ function (msg, autofocus) { if (autofocus === void 0) { autofocus = true; } return tslib_1.__awaiter(this, void 0, void 0, function () { var config; return tslib_1.__generator(this, function (_a) { config = { title: { text: '¡Error!' }, message: msg, type: 'error', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return [2 /*return*/, this.openModal(config)]; }); }); }; /** * * Information message */ /** * * Information message * @param {?} msg * @param {?=} autofocus * @return {?} */ NgxNeoModalService.prototype.info = /** * * Information message * @param {?} msg * @param {?=} autofocus * @return {?} */ function (msg, autofocus) { if (autofocus === void 0) { autofocus = true; } return tslib_1.__awaiter(this, void 0, void 0, function () { var config; return tslib_1.__generator(this, function (_a) { config = { title: { text: '¡Información importante!' }, message: msg, type: 'info', button: { cancel: { visibility: false }, accept: { autofocus: autofocus, } } }; return [2 /*return*/, this.openModal(config)]; }); }); }; /** * * Show decission modal with question and two options for accept or reject. */ // tslint:disable-next-line:max-line-length /** * * Show decission modal with question and two options for accept or reject. * @param {?} questionMsg * @param {?=} successMsg * @param {?=} cancelMsg * @param {?=} autofocus * @return {?} */ // tslint:disable-next-line:max-line-length NgxNeoModalService.prototype.decision = /** * * Show decission modal with question and two options for accept or reject. * @param {?} questionMsg * @param {?=} successMsg * @param {?=} cancelMsg * @param {?=} autofocus * @return {?} */ // tslint:disable-next-line:max-line-length function (questionMsg, successMsg, cancelMsg, autofocus) { if (autofocus === void 0) { autofocus = AlertButton.Cancel; } return tslib_1.__awaiter(this, void 0, void 0, function () { var buttonAcceptFocus, buttonCancelFocus, config; var _this = this; return tslib_1.__generator(this, function (_a) { buttonAcceptFocus = autofocus === AlertButton.Accept; buttonCancelFocus = autofocus === AlertButton.Cancel; config = { title: { text: '¿Está seguro?' }, message: questionMsg, type: 'question', button: { cancel: { autofocus: buttonCancelFocus }, accept: { autofocus: buttonAcceptFocus } } }; return [2 /*return*/, this.openModal(config) .then((/** * @param {?} value * @return {?} */ function (value) { if (value.ButtonResponse === AlertButton.Accept) { if (successMsg && successMsg !== '') { _this.success(successMsg); } } else { if (cancelMsg) { _this.info(cancelMsg); } } return Promise.resolve(value); }))]; }); }); }; /** * * Input text message */ // tslint:disable-next-line:max-line-length /** * * Input text message * @param {?} title * @param {?} placeholder * @param {?=} successMsg * @param {?=} autofocus * @param {?=} buttonAutofocus * @return {?} */ // tslint:disable-next-line:max-line-length NgxNeoModalService.prototype.input = /** * * Input text message * @param {?} title * @param {?} placeholder * @param {?=} successMsg * @param {?=} autofocus * @param {?=} buttonAutofocus * @return {?} */ // tslint:disable-next-line:max-line-length function (title, placeholder, successMsg, autofocus, buttonAutofocus) { if (autofocus === void 0) { autofocus = true; } if (buttonAutofocus === void 0) { buttonAutofocus = AlertButton.Accept; } return tslib_1.__awaiter(this, void 0, void 0, function () { var buttonAcceptFocus, buttonCancelFocus, config; var _this = this; return tslib_1.__generator(this, function (_a) { buttonAcceptFocus = buttonAutofocus === AlertButton.Accept; buttonCancelFocus = buttonAutofocus === AlertButton.Cancel; config = { title: { text: title }, message: '', input: { placeholder: placeholder, visibility: true, autofocus: autofocus }, button: { accepct: { autofocus: buttonAcceptFocus }, cancel: { autofocus: buttonCancelFocus } } }; return [2 /*return*/, this.openModal(config) .then((/** * @param {?} value * @return {?} */ function (value) { if (value.ButtonResponse === AlertButton.Accept) { if (successMsg) { _this.success(successMsg); } } return Promise.resolve(value); }))]; }); }); }; // tslint:disable:no-bitwise // tslint:disable:no-bitwise /** * @param {?} title * @param {?} message * @param {?} buttonFocus * @return {?} */ NgxNeoModalService.prototype.yesNoCancel = // tslint:disable:no-bitwise /** * @param {?} title * @param {?} message * @param {?} buttonFocus * @return {?} */ function (title, message, buttonFocus) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2 /*return*/, this.custom(title, message, (AlertButton.Yes | AlertButton.No | AlertButton.Cancel), buttonFocus)]; }); }); }; /** * @private * @param {?} title * @param {?} message * @param {?} buttons * @param {?} buttonFocus * @return {?} */ NgxNeoModalService.prototype.custom = /** * @private * @param {?} title * @param {?} message * @param {?} buttons * @param {?} buttonFocus * @return {?} */ function (title, message, buttons, buttonFocus) { return tslib_1.__awaiter(this, void 0, void 0, function () { var buttonAccept, buttonYes, buttonCancel, buttonNo, buttonRetry, buttonAcceptFocus, buttonYesFocus, buttonCancelFocus, buttonNoFocus, buttonRetryFocus, config; return tslib_1.__generator(this, function (_a) { buttonAccept = (buttons & AlertButton.Accept) > 0; buttonYes = (buttons & AlertButton.Yes) > 0; buttonCancel = (buttons & AlertButton.Cancel) > 0; buttonNo = (buttons & AlertButton.No) > 0; buttonRetry = (buttons & AlertButton.Retry) > 0; buttonAcceptFocus = buttonFocus === AlertButton.Accept; buttonYesFocus = buttonFocus === AlertButton.Yes; buttonCancelFocus = buttonFocus === AlertButton.Cancel; buttonNoFocus = buttonFocus === AlertButton.No; buttonRetryFocus = buttonFocus === AlertButton.Retry; config = { title: { text: title }, message: message, button: { yes: { visibility: buttonYes, autofocus: buttonYesFocus }, no: { visibility: buttonNo, autofocus: buttonNoFocus }, retry: { visibility: buttonRetry, autofocus: buttonRetryFocus }, cancel: { visibility: buttonCancel, autofocus: buttonCancelFocus }, accept: { visibility: buttonAccept, autofocus: buttonAcceptFocus } } }; return [2 /*return*/, this.openModal(config)]; }); }); }; /** * @private * @param {?} item * @return {?} */ NgxNeoModalService.prototype.isObject = /** * @private * @param {?} item * @return {?} */ function (item) { return (item && typeof item === 'object' && !Array.isArray(item)); }; // this will lead to infinite recursion on circular references // this will lead to infinite recursion on circular references /** * @private * @param {?} target * @param {...?} sources * @return {?} */ NgxNeoModalService.prototype.mergeDeep = // this will lead to infinite recursion on circular references /** * @private * @param {?} target * @param {...?} sources * @return {?} */ function (target) { var _a, _b; var sources = []; for (var _i = 1; _i < arguments.length; _i++) { sources[_i - 1] = arguments[_i]; } if (!sources.length) { return target; } /** @type {?} */ var source = sources.shift(); if (this.isObject(target) && this.isObject(source)) { for (var key in source) { if (this.isObject(source[key])) { if (!target[key]) { Object.assign(target, (_a = {}, _a[key] = {}, _a)); } this.mergeDeep(target[key], source[key]); } else { Object.assign(target, (_b = {}, _b[key] = source[key], _b)); } } } return this.mergeDeep.apply(this, tslib_1.__spread([target], sources)); }; NgxNeoModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ NgxNeoModalService.ctorParameters = function () { return [ { type: NgbModal } ]; }; return NgxNeoModalService; }()); export { NgxNeoModalService }; if (false) { /** @type {?} */ NgxNeoModalService.prototype.template; /** @type {?} */ NgxNeoModalService.prototype.originalAlert; /** * @type {?} * @private */ NgxNeoModalService.prototype.modalService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5lby1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5lb2NvbXBsZXh4L25neC1uZW8tbW9kYWwvIiwic291cmNlcyI6WyJsaWIvbmd4LW5lby1tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFlLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV0RDtJQU1FLDRCQUFvQixZQUFzQjtRQUExQyxpQkFLQztRQUxtQixpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDbEMsTUFBTSxDQUFDLEtBQUs7Ozs7UUFBRyxVQUFPLEdBQUc7Ozs0QkFDdkIscUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBQTs7d0JBQXJCLFNBQXFCLENBQUM7Ozs7YUFDdkIsQ0FBQSxDQUFDO0lBQ0osQ0FBQzs7Ozs7O0lBRWEsc0NBQVM7Ozs7O0lBQXZCLFVBQXdCLE1BQVc7Ozs7Ozt3QkFDM0IsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFOzRCQUM1RCxRQUFRLEVBQUUsUUFBUTs0QkFDbEIsUUFBUSxFQUFFLEtBQUs7NEJBQ2YsUUFBUSxFQUFFLElBQUk7NEJBQ2QsV0FBVyxFQUFFLFdBQVc7eUJBQ3pCLENBQUM7d0JBRUYsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUNoRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsU0FBUyxD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QUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7b0JBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFlBQUksR0FBQyxHQUFHLElBQUcsRUFBRSxNQUFHLENBQUM7cUJBQUU7b0JBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2lCQUMxQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBSSxHQUFDLEdBQUcsSUFBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQUcsQ0FBQztpQkFDL0M7YUFDRjtTQUNGO1FBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxPQUFkLElBQUksb0JBQVcsTUFBTSxHQUFLLE9BQU8sR0FBRTtJQUM1QyxDQUFDOztnQkE5U0YsVUFBVTs7OztnQkFGRixRQUFROztJQW1UakIseUJBQUM7Q0FBQSxBQWpURCxJQWlUQztTQWhUWSxrQkFBa0I7OztJQUM3QixzQ0FBYzs7SUFFZCwyQ0FBMEI7Ozs7O0lBRWQsMENBQThCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmd4TmVvTW9kYWxDb21wb25lbnQsIEFsZXJ0UmVzdWx0LCBBbGVydEJ1dHRvbiB9IGZyb20gJy4vbmd4LW5lby1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3hOZW9Nb2RhbFNlcnZpY2Uge1xuICB0ZW1wbGF0ZTogYW55O1xuXG4gIHB1YmxpYyBvcmlnaW5hbEFsZXJ0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XG4gICAgdGhpcy5vcmlnaW5hbEFsZXJ0ID0gd2luZG93LmFsZXJ0O1xuICAgIHdpbmRvdy5hbGVydCA9IGFzeW5jIChtc2cpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuYWxlcnQobXNnKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kYWwoY29uZmlnOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG1vZGFsUmVmID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihOZ3hOZW9Nb2RhbENvbXBvbmVudCwge1xuICAgICAgYmFja2Ryb3A6ICdzdGF0aWMnLFxuICAgICAga2V5Ym9hcmQ6IGZhbHNlLFxuICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICB3aW5kb3dDbGFzczogJ25lb1dpbmRvdydcbiAgICB9KTtcblxuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNvbmZpZyA9ICh0aGlzLm1lcmdlRGVlcChtb2RhbFJlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maWcsIGNvbmZpZykpO1xuICAgIG1vZGFsUmVmLmNvbXBvbmVudEluc3RhbmNlLmNoYW5nZVJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHJldHVybiBhd2FpdCBtb2RhbFJlZi5yZXN1bHQ7XG4gIH1cblxuXG4gIC8qKlxuICAqIFNob3cgbWVzc2FnZS4gQ2FuIGJlIHVzZSBhcyB3aW5kb3cuYWxlcnRcbiAgKi9cbiAgcHVibGljIGFzeW5jIGFsZXJ0KG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgdGl0bGU6IHtcbiAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICBidXR0b246IHtcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGF3YWl0IHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU2hvdyBzdWNjc2Vzc2Z1bGwgIG1lc3NhZ2VcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWNjZXNzKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCoUJ1ZW4gdHJhYmFqbyEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAqXG4gICogV2FybmluZyBtZXNzYWdlXG4gICovXG4gIHB1YmxpYyBhc3luYyB3YXJuaW5nKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSBmYWxzZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFDdWlkYWRvISdcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICB0eXBlOiAnd2FybmluZycsXG4gICAgICBidXR0b246IHtcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAqXG4gKiBFcnJvciBtZXNzYWdlXG4gKi9cbiAgcHVibGljIGFzeW5jIGVycm9yKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCoUVycm9yISdcbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBtc2csXG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBJbmZvcm1hdGlvbiBtZXNzYWdlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaW5mbyhtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiAnwqFJbmZvcm1hY2nDs24gaW1wb3J0YW50ZSEnXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogbXNnLFxuICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGFjY2VwdDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTaG93IGRlY2lzc2lvbiBtb2RhbCB3aXRoIHF1ZXN0aW9uIGFuZCB0d28gb3B0aW9ucyBmb3IgYWNjZXB0IG9yIHJlamVjdC5cbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgcHVibGljIGFzeW5jIGRlY2lzaW9uKHF1ZXN0aW9uTXNnOiBzdHJpbmcsIHN1Y2Nlc3NNc2c/OiBzdHJpbmcsIGNhbmNlbE1zZz86IHN0cmluZywgYXV0b2ZvY3VzID0gQWxlcnRCdXR0b24uQ2FuY2VsKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuICAgIGNvbnN0IGJ1dHRvbkFjY2VwdEZvY3VzID0gYXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5BY2NlcHQ7XG4gICAgY29uc3QgYnV0dG9uQ2FuY2VsRm9jdXMgPSBhdXRvZm9jdXMgPT09IEFsZXJ0QnV0dG9uLkNhbmNlbDtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIHRleHQ6ICfCv0VzdMOhIHNlZ3Vybz8nXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogcXVlc3Rpb25Nc2csXG4gICAgICB0eXBlOiAncXVlc3Rpb24nLFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25BY2NlcHRGb2N1c1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpXG4gICAgICAudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHZhbHVlLkJ1dHRvblJlc3BvbnNlID09PSBBbGVydEJ1dHRvbi5BY2NlcHQpIHtcbiAgICAgICAgICBpZiAoc3VjY2Vzc01zZyAmJiBzdWNjZXNzTXNnICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzKHN1Y2Nlc3NNc2cpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2FuY2VsTXNnKSB7XG4gICAgICAgICAgICB0aGlzLmluZm8oY2FuY2VsTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcblxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIElucHV0IHRleHQgbWVzc2FnZVxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICBwdWJsaWMgYXN5bmMgaW5wdXQodGl0bGU6IHN0cmluZywgcGxhY2Vob2xkZXI6IHN0cmluZywgc3VjY2Vzc01zZz86IHN0cmluZywgYXV0b2ZvY3VzID0gdHJ1ZSwgYnV0dG9uQXV0b2ZvY3VzOiBBbGVydEJ1dHRvbiA9IEFsZXJ0QnV0dG9uLkFjY2VwdCk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBidXR0b25BY2NlcHRGb2N1cyA9IGJ1dHRvbkF1dG9mb2N1cyA9PT0gQWxlcnRCdXR0b24uQWNjZXB0O1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzID0gYnV0dG9uQXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiB0aXRsZVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6ICcnLFxuICAgICAgaW5wdXQ6IHtcbiAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgIHZpc2liaWxpdHk6IHRydWUsXG4gICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzXG4gICAgICB9LFxuICAgICAgYnV0dG9uOiB7XG4gICAgICAgIGFjY2VwY3Q6IHtcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkFjY2VwdEZvY3VzXG4gICAgICAgIH0sXG4gICAgICAgIGNhbmNlbDoge1xuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKVxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZS5CdXR0b25SZXNwb25zZSA9PT0gQWxlcnRCdXR0b24uQWNjZXB0KSB7XG4gICAgICAgICAgaWYgKHN1Y2Nlc3NNc2cpIHtcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcyhzdWNjZXNzTXNnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9KTtcblxuXG5cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcbiAgcHVibGljIGFzeW5jIHllc05vQ2FuY2VsKHRpdGxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgYnV0dG9uRm9jdXM6IEFsZXJ0QnV0dG9uKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tKHRpdGxlLCBtZXNzYWdlLCAoQWxlcnRCdXR0b24uWWVzIHwgQWxlcnRCdXR0b24uTm8gfCBBbGVydEJ1dHRvbi5DYW5jZWwpLCBidXR0b25Gb2N1cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGN1c3RvbSh0aXRsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGJ1dHRvbnM6IEFsZXJ0QnV0dG9uLCBidXR0b25Gb2N1czogQWxlcnRCdXR0b24pOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgYnV0dG9uQWNjZXB0OiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5BY2NlcHQpID4gMDtcbiAgICBjb25zdCBidXR0b25ZZXM6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLlllcykgPiAwO1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbDogYm9vbGVhbiA9IChidXR0b25zICYgQWxlcnRCdXR0b24uQ2FuY2VsKSA+IDA7XG4gICAgY29uc3QgYnV0dG9uTm86IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLk5vKSA+IDA7XG4gICAgY29uc3QgYnV0dG9uUmV0cnk6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLlJldHJ5KSA+IDA7XG5cbiAgICBjb25zdCBidXR0b25BY2NlcHRGb2N1czogYm9vbGVhbiA9IGJ1dHRvbkZvY3VzID09PSBBbGVydEJ1dHRvbi5BY2NlcHQ7XG4gICAgY29uc3QgYnV0dG9uWWVzRm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uWWVzO1xuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLkNhbmNlbDtcbiAgICBjb25zdCBidXR0b25Ob0ZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLk5vO1xuICAgIGNvbnN0IGJ1dHRvblJldHJ5Rm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uUmV0cnk7XG5cbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0aXRsZToge1xuICAgICAgICB0ZXh0OiB0aXRsZVxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBidXR0b246IHtcbiAgICAgICAgeWVzOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uWWVzLFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uWWVzRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgbm86IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBidXR0b25ObyxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbk5vRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgcmV0cnk6IHtcbiAgICAgICAgICB2aXNpYmlsaXR5OiBidXR0b25SZXRyeSxcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvblJldHJ5Rm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgY2FuY2VsOiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uQ2FuY2VsLFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcbiAgICAgICAgfSxcbiAgICAgICAgYWNjZXB0OiB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uQWNjZXB0LFxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQWNjZXB0Rm9jdXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cblxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpO1xuICB9XG5cblxuXG4gIHByaXZhdGUgaXNPYmplY3QoaXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpO1xuICB9XG5cbiAgLy8gdGhpcyB3aWxsIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uIG9uIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgcHJpdmF0ZSBtZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKTogYW55IHtcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7IHJldHVybiB0YXJnZXQ7IH1cbiAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG5cbiAgICBpZiAodGhpcy5pc09iamVjdCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3Qoc291cmNlKSkge1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgICAgIGlmICghdGFyZ2V0W2tleV0pIHsgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pOyB9XG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZURlZXAodGFyZ2V0LCAuLi5zb3VyY2VzKTtcbiAgfVxuXG5cbn1cbiJdfQ==