@neocomplexx/ngx-neo-modal-mat
Version:
391 lines • 37.9 kB
JavaScript
import { __awaiter, __generator, __read, __spread } from "tslib";
import { Injectable } from '@angular/core';
import { NgxNeoModalMatComponent, AlertButton } from './ngx-neo-modal-mat.component';
import { MatDialog } from '@angular/material/dialog';
import { TranslateService } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "@ngx-translate/core";
var NgxNeoModalMatService = /** @class */ (function () {
function NgxNeoModalMatService(dialog, translate) {
var _this = this;
this.dialog = dialog;
this.translate = translate;
this.originalAlert = window.alert;
window.alert = function (msg) { return __awaiter(_this, void 0, void 0, function () {
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.alert(msg)];
case 1:
_a.sent();
return [2 /*return*/];
}
});
}); };
}
NgxNeoModalMatService.prototype.openModal = function (config) {
return __awaiter(this, void 0, void 0, function () {
var dialogRef;
return __generator(this, function (_a) {
dialogRef = this.dialog.open(NgxNeoModalMatComponent, {
data: { config: config }
});
return [2 /*return*/, dialogRef.afterClosed().toPromise()];
});
});
};
/**
* Show message. Can be use as window.alert
*/
NgxNeoModalMatService.prototype.alert = function (msg, autofocus) {
if (autofocus === void 0) { autofocus = false; }
return __awaiter(this, void 0, void 0, function () {
var config;
return __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
*/
NgxNeoModalMatService.prototype.success = function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return __awaiter(this, void 0, void 0, function () {
var title, config;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.translate.get('SUCCESSTITLE').toPromise()];
case 1:
title = _a.sent();
config = {
title: {
text: title
},
message: msg,
type: 'success',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
}
});
});
};
/**
*
* Warning message
*/
NgxNeoModalMatService.prototype.warning = function (msg, autofocus) {
if (autofocus === void 0) { autofocus = false; }
return __awaiter(this, void 0, void 0, function () {
var title, config;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.translate.get('WARNTITLE').toPromise()];
case 1:
title = _a.sent();
config = {
title: {
text: title
},
message: msg,
type: 'warning',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
}
});
});
};
/**
*
* Error message
*/
NgxNeoModalMatService.prototype.error = function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return __awaiter(this, void 0, void 0, function () {
var title, config;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.translate.get('ERRORTITLE').toPromise()];
case 1:
title = _a.sent();
config = {
title: {
text: title
},
message: msg,
type: 'error',
button: {
cancel: {
visibility: false
},
accept: {
autofocus: autofocus,
}
}
};
return [2 /*return*/, this.openModal(config)];
}
});
});
};
/**
*
* Information message
*/
NgxNeoModalMatService.prototype.info = function (msg, autofocus) {
if (autofocus === void 0) { autofocus = true; }
return __awaiter(this, void 0, void 0, function () {
var title, config;
return __generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, this.translate.get('INFOTITLE').toPromise()];
case 1:
title = _a.sent();
config = {
title: {
text: title
},
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
NgxNeoModalMatService.prototype.decision = function (questionMsg, successMsg, cancelMsg, autofocus) {
if (autofocus === void 0) { autofocus = AlertButton.Cancel; }
return __awaiter(this, void 0, void 0, function () {
var buttonAcceptFocus, buttonCancelFocus, title, config;
var _this = this;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
buttonAcceptFocus = autofocus === AlertButton.Accept;
buttonCancelFocus = autofocus === AlertButton.Cancel;
return [4 /*yield*/, this.translate.get('DECISIONTITLE').toPromise()];
case 1:
title = _a.sent();
config = {
title: {
text: title
},
message: questionMsg,
type: 'question',
button: {
cancel: {
autofocus: buttonCancelFocus
},
accept: {
autofocus: buttonAcceptFocus
}
}
};
return [2 /*return*/, this.openModal(config)
.then(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
NgxNeoModalMatService.prototype.input = function (title, placeholder, successMsg, autofocus, buttonAutofocus) {
if (autofocus === void 0) { autofocus = true; }
if (buttonAutofocus === void 0) { buttonAutofocus = AlertButton.Accept; }
return __awaiter(this, void 0, void 0, function () {
var buttonAcceptFocus, buttonCancelFocus, config;
var _this = this;
return __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(function (value) {
if (value.ButtonResponse === AlertButton.Accept) {
if (successMsg) {
_this.success(successMsg);
}
}
return Promise.resolve(value);
})];
});
});
};
// tslint:disable:no-bitwise
NgxNeoModalMatService.prototype.yesNoCancel = function (title, message, buttonFocus) {
return __awaiter(this, void 0, void 0, function () {
return __generator(this, function (_a) {
return [2 /*return*/, this.custom(title, message, (AlertButton.Yes | AlertButton.No | AlertButton.Cancel), buttonFocus)];
});
});
};
NgxNeoModalMatService.prototype.custom = function (title, message, buttons, buttonFocus) {
return __awaiter(this, void 0, void 0, function () {
var buttonAccept, buttonYes, buttonCancel, buttonNo, buttonRetry, buttonAcceptFocus, buttonYesFocus, buttonCancelFocus, buttonNoFocus, buttonRetryFocus, config;
return __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)];
});
});
};
NgxNeoModalMatService.prototype.isObject = function (item) {
return (item && typeof item === 'object' && !Array.isArray(item));
};
// this will lead to infinite recursion on circular references
NgxNeoModalMatService.prototype.mergeDeep = 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;
}
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, __spread([target], sources));
};
/** @nocollapse */ NgxNeoModalMatService.ɵfac = function NgxNeoModalMatService_Factory(t) { return new (t || NgxNeoModalMatService)(i0.ɵɵinject(i1.MatDialog), i0.ɵɵinject(i2.TranslateService)); };
/** @nocollapse */ NgxNeoModalMatService.ɵprov = i0.ɵɵdefineInjectable({ token: NgxNeoModalMatService, factory: NgxNeoModalMatService.ɵfac, providedIn: 'root' });
return NgxNeoModalMatService;
}());
export { NgxNeoModalMatService };
/*@__PURE__*/ (function () { i0.ɵsetClassMetadata(NgxNeoModalMatService, [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], function () { return [{ type: i1.MatDialog }, { type: i2.TranslateService }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LW5lby1tb2RhbC1tYXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BuZW9jb21wbGV4eC9uZ3gtbmVvLW1vZGFsLW1hdC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtbmVvLW1vZGFsLW1hdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBZSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRyxPQUFPLEVBQUUsU0FBUyxFQUFpQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7O0FBRXZEO0lBUUUsK0JBQW1CLE1BQWlCLEVBQVUsU0FBMkI7UUFBekUsaUJBS0M7UUFMa0IsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLENBQUMsS0FBSyxHQUFHLFVBQU8sR0FBRzs7OzRCQUN2QixxQkFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFBOzt3QkFBckIsU0FBcUIsQ0FBQzs7OzthQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVhLHlDQUFTLEdBQXZCLFVBQXdCLE1BQVc7Ozs7Z0JBRTNCLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDMUQsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtpQkFDekIsQ0FBQyxDQUFDO2dCQUVILHNCQUFPLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBQzs7O0tBRTVDO0lBR0Q7O01BRUU7SUFDVyxxQ0FBSyxHQUFsQixVQUFtQixHQUFXLEVBQUUsU0FBaUI7UUFBakIs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IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5neE5lb01vZGFsTWF0Q29tcG9uZW50LCBBbGVydFJlc3VsdCwgQWxlcnRCdXR0b24gfSBmcm9tICcuL25neC1uZW8tbW9kYWwtbWF0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hOZW9Nb2RhbE1hdFNlcnZpY2Uge1xyXG4gIHRlbXBsYXRlOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBvcmlnaW5hbEFsZXJ0OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIHRoaXMub3JpZ2luYWxBbGVydCA9IHdpbmRvdy5hbGVydDtcclxuICAgIHdpbmRvdy5hbGVydCA9IGFzeW5jIChtc2cpID0+IHtcclxuICAgICAgYXdhaXQgdGhpcy5hbGVydChtc2cpO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb3Blbk1vZGFsKGNvbmZpZzogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuXHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE5neE5lb01vZGFsTWF0Q29tcG9uZW50LCB7XHJcbiAgICAgIGRhdGE6IHsgY29uZmlnOiBjb25maWcgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnRvUHJvbWlzZSgpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAqIFNob3cgbWVzc2FnZS4gQ2FuIGJlIHVzZSBhcyB3aW5kb3cuYWxlcnRcclxuICAqL1xyXG4gIHB1YmxpYyBhc3luYyBhbGVydChtc2c6IHN0cmluZywgYXV0b2ZvY3VzID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIHRpdGxlOiB7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcclxuICAgICAgfSxcclxuICAgICAgbWVzc2FnZTogbXNnLFxyXG4gICAgICBidXR0b246IHtcclxuICAgICAgICBjYW5jZWw6IHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY2NlcHQ6IHtcclxuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGF3YWl0IHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIFNob3cgc3VjY3Nlc3NmdWxsICBtZXNzYWdlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIHN1Y2Nlc3MobXNnOiBzdHJpbmcsIGF1dG9mb2N1cyA9IHRydWUpOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XHJcbiAgICBjb25zdCB0aXRsZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlLmdldCgnU1VDQ0VTU1RJVExFJykudG9Qcm9taXNlKCk7XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIHRpdGxlOiB7XHJcbiAgICAgICAgdGV4dDogdGl0bGVcclxuICAgICAgfSxcclxuICAgICAgbWVzc2FnZTogbXNnLFxyXG4gICAgICB0eXBlOiAnc3VjY2VzcycsXHJcbiAgICAgIGJ1dHRvbjoge1xyXG4gICAgICAgIGNhbmNlbDoge1xyXG4gICAgICAgICAgdmlzaWJpbGl0eTogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFjY2VwdDoge1xyXG4gICAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXMsXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqXHJcbiAgKiBXYXJuaW5nIG1lc3NhZ2VcclxuICAqL1xyXG4gIHB1YmxpYyBhc3luYyB3YXJuaW5nKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSBmYWxzZSk6IFByb21pc2U8QWxlcnRSZXN1bHQ+IHtcclxuICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuZ2V0KCdXQVJOVElUTEUnKS50b1Byb21pc2UoKTtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgdGl0bGU6IHtcclxuICAgICAgICB0ZXh0OiB0aXRsZVxyXG4gICAgICB9LFxyXG4gICAgICBtZXNzYWdlOiBtc2csXHJcbiAgICAgIHR5cGU6ICd3YXJuaW5nJyxcclxuICAgICAgYnV0dG9uOiB7XHJcbiAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICB2aXNpYmlsaXR5OiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWNjZXB0OiB7XHJcbiAgICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1cyxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICpcclxuICogRXJyb3IgbWVzc2FnZVxyXG4gKi9cclxuICBwdWJsaWMgYXN5bmMgZXJyb3IobXNnOiBzdHJpbmcsIGF1dG9mb2N1cyA9IHRydWUpOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XHJcbiAgICBjb25zdCB0aXRsZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlLmdldCgnRVJST1JUSVRMRScpLnRvUHJvbWlzZSgpO1xyXG4gICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICB0aXRsZToge1xyXG4gICAgICAgIHRleHQ6IHRpdGxlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1lc3NhZ2U6IG1zZyxcclxuICAgICAgdHlwZTogJ2Vycm9yJyxcclxuICAgICAgYnV0dG9uOiB7XHJcbiAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICB2aXNpYmlsaXR5OiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgYWNjZXB0OiB7XHJcbiAgICAgICAgICBhdXRvZm9jdXM6IGF1dG9mb2N1cyxcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5vcGVuTW9kYWwoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogSW5mb3JtYXRpb24gbWVzc2FnZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBpbmZvKG1zZzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xyXG4gICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0lORk9USVRMRScpLnRvUHJvbWlzZSgpO1xyXG4gICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICB0aXRsZToge1xyXG4gICAgICAgIHRleHQ6IHRpdGxlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1lc3NhZ2U6IG1zZyxcclxuICAgICAgdHlwZTogJ2luZm8nLFxyXG4gICAgICBidXR0b246IHtcclxuICAgICAgICBjYW5jZWw6IHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY2NlcHQ6IHtcclxuICAgICAgICAgIGF1dG9mb2N1czogYXV0b2ZvY3VzLFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICpcclxuICAgKiBTaG93IGRlY2lzc2lvbiBtb2RhbCB3aXRoIHF1ZXN0aW9uIGFuZCB0d28gb3B0aW9ucyBmb3IgYWNjZXB0IG9yIHJlamVjdC5cclxuICAgKi9cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgcHVibGljIGFzeW5jIGRlY2lzaW9uKHF1ZXN0aW9uTXNnOiBzdHJpbmcsIHN1Y2Nlc3NNc2c/OiBzdHJpbmcsIGNhbmNlbE1zZz86IHN0cmluZywgYXV0b2ZvY3VzID0gQWxlcnRCdXR0b24uQ2FuY2VsKTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xyXG4gICAgY29uc3QgYnV0dG9uQWNjZXB0Rm9jdXMgPSBhdXRvZm9jdXMgPT09IEFsZXJ0QnV0dG9uLkFjY2VwdDtcclxuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzID0gYXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XHJcblxyXG4gICAgY29uc3QgdGl0bGUgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQoJ0RFQ0lTSU9OVElUTEUnKS50b1Byb21pc2UoKTtcclxuICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgdGl0bGU6IHtcclxuICAgICAgICB0ZXh0OiB0aXRsZVxyXG4gICAgICB9LFxyXG4gICAgICBtZXNzYWdlOiBxdWVzdGlvbk1zZyxcclxuICAgICAgdHlwZTogJ3F1ZXN0aW9uJyxcclxuICAgICAgYnV0dG9uOiB7XHJcbiAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkNhbmNlbEZvY3VzXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhY2NlcHQ6IHtcclxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQWNjZXB0Rm9jdXNcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZylcclxuICAgICAgLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgaWYgKHZhbHVlLkJ1dHRvblJlc3BvbnNlID09PSBBbGVydEJ1dHRvbi5BY2NlcHQpIHtcclxuICAgICAgICAgIGlmIChzdWNjZXNzTXNnICYmIHN1Y2Nlc3NNc2cgIT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VjY2VzcyhzdWNjZXNzTXNnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKGNhbmNlbE1zZykge1xyXG4gICAgICAgICAgICB0aGlzLmluZm8oY2FuY2VsTXNnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2YWx1ZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogSW5wdXQgdGV4dCBtZXNzYWdlXHJcbiAgICovXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gIHB1YmxpYyBhc3luYyBpbnB1dCh0aXRsZTogc3RyaW5nLCBwbGFjZWhvbGRlcjogc3RyaW5nLCBzdWNjZXNzTXNnPzogc3RyaW5nLCBhdXRvZm9jdXMgPSB0cnVlLCBidXR0b25BdXRvZm9jdXM6IEFsZXJ0QnV0dG9uID0gQWxlcnRCdXR0b24uQWNjZXB0KTogUHJvbWlzZTxBbGVydFJlc3VsdD4ge1xyXG4gICAgY29uc3QgYnV0dG9uQWNjZXB0Rm9jdXMgPSBidXR0b25BdXRvZm9jdXMgPT09IEFsZXJ0QnV0dG9uLkFjY2VwdDtcclxuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzID0gYnV0dG9uQXV0b2ZvY3VzID09PSBBbGVydEJ1dHRvbi5DYW5jZWw7XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0ge1xyXG4gICAgICB0aXRsZToge1xyXG4gICAgICAgIHRleHQ6IHRpdGxlXHJcbiAgICAgIH0sXHJcbiAgICAgIG1lc3NhZ2U6ICcnLFxyXG4gICAgICBpbnB1dDoge1xyXG4gICAgICAgIHBsYWNlaG9sZGVyLFxyXG4gICAgICAgIHZpc2liaWxpdHk6IHRydWUsXHJcbiAgICAgICAgYXV0b2ZvY3VzOiBhdXRvZm9jdXNcclxuICAgICAgfSxcclxuICAgICAgYnV0dG9uOiB7XHJcbiAgICAgICAgYWNjZXBjdDoge1xyXG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25BY2NlcHRGb2N1c1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2FuY2VsOiB7XHJcbiAgICAgICAgICBhdXRvZm9jdXM6IGJ1dHRvbkNhbmNlbEZvY3VzXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiB0aGlzLm9wZW5Nb2RhbChjb25maWcpXHJcbiAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZS5CdXR0b25SZXNwb25zZSA9PT0gQWxlcnRCdXR0b24uQWNjZXB0KSB7XHJcbiAgICAgICAgICBpZiAoc3VjY2Vzc01zZykge1xyXG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3Moc3VjY2Vzc01zZyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpO1xyXG4gICAgICB9KTtcclxuXHJcblxyXG5cclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2VcclxuICBwdWJsaWMgYXN5bmMgeWVzTm9DYW5jZWwodGl0bGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBidXR0b25Gb2N1czogQWxlcnRCdXR0b24pOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tKHRpdGxlLCBtZXNzYWdlLCAoQWxlcnRCdXR0b24uWWVzIHwgQWxlcnRCdXR0b24uTm8gfCBBbGVydEJ1dHRvbi5DYW5jZWwpLCBidXR0b25Gb2N1cyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGN1c3RvbSh0aXRsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGJ1dHRvbnM6IEFsZXJ0QnV0dG9uLCBidXR0b25Gb2N1czogQWxlcnRCdXR0b24pOiBQcm9taXNlPEFsZXJ0UmVzdWx0PiB7XHJcbiAgICBjb25zdCBidXR0b25BY2NlcHQ6IGJvb2xlYW4gPSAoYnV0dG9ucyAmIEFsZXJ0QnV0dG9uLkFjY2VwdCkgPiAwO1xyXG4gICAgY29uc3QgYnV0dG9uWWVzOiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5ZZXMpID4gMDtcclxuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbDogYm9vbGVhbiA9IChidXR0b25zICYgQWxlcnRCdXR0b24uQ2FuY2VsKSA+IDA7XHJcbiAgICBjb25zdCBidXR0b25ObzogYm9vbGVhbiA9IChidXR0b25zICYgQWxlcnRCdXR0b24uTm8pID4gMDtcclxuICAgIGNvbnN0IGJ1dHRvblJldHJ5OiBib29sZWFuID0gKGJ1dHRvbnMgJiBBbGVydEJ1dHRvbi5SZXRyeSkgPiAwO1xyXG5cclxuICAgIGNvbnN0IGJ1dHRvbkFjY2VwdEZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLkFjY2VwdDtcclxuICAgIGNvbnN0IGJ1dHRvblllc0ZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLlllcztcclxuICAgIGNvbnN0IGJ1dHRvbkNhbmNlbEZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLkNhbmNlbDtcclxuICAgIGNvbnN0IGJ1dHRvbk5vRm9jdXM6IGJvb2xlYW4gPSBidXR0b25Gb2N1cyA9PT0gQWxlcnRCdXR0b24uTm87XHJcbiAgICBjb25zdCBidXR0b25SZXRyeUZvY3VzOiBib29sZWFuID0gYnV0dG9uRm9jdXMgPT09IEFsZXJ0QnV0dG9uLlJldHJ5O1xyXG5cclxuICAgIGNvbnN0IGNvbmZpZyA9IHtcclxuICAgICAgdGl0bGU6IHtcclxuICAgICAgICB0ZXh0OiB0aXRsZVxyXG4gICAgICB9LFxyXG4gICAgICBtZXNzYWdlLFxyXG4gICAgICBidXR0b246IHtcclxuICAgICAgICB5ZXM6IHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvblllcyxcclxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uWWVzRm9jdXNcclxuICAgICAgICB9LFxyXG4gICAgICAgIG5vOiB7XHJcbiAgICAgICAgICB2aXNpYmlsaXR5OiBidXR0b25ObyxcclxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uTm9Gb2N1c1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcmV0cnk6IHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvblJldHJ5LFxyXG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25SZXRyeUZvY3VzXHJcbiAgICAgICAgfSxcclxuICAgICAgICBjYW5jZWw6IHtcclxuICAgICAgICAgIHZpc2liaWxpdHk6IGJ1dHRvbkNhbmNlbCxcclxuICAgICAgICAgIGF1dG9mb2N1czogYnV0dG9uQ2FuY2VsRm9jdXNcclxuICAgICAgICB9LFxyXG4gICAgICAgIGFjY2VwdDoge1xyXG4gICAgICAgICAgdmlzaWJpbGl0eTogYnV0dG9uQWNjZXB0LFxyXG4gICAgICAgICAgYXV0b2ZvY3VzOiBidXR0b25BY2NlcHRGb2N1c1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfTtcclxuXHJcblxyXG4gICAgcmV0dXJuIHRoaXMub3Blbk1vZGFsKGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIHByaXZhdGUgaXNPYmplY3QoaXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKSk7XHJcbiAgfVxyXG5cclxuICAvLyB0aGlzIHdpbGwgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24gb24gY2lyY3VsYXIgcmVmZXJlbmNlc1xyXG4gIHByaXZhdGUgbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk6IGFueSB7XHJcbiAgICBpZiAoIXNvdXJjZXMubGVuZ3RoKSB7IHJldHVybiB0YXJnZXQ7IH1cclxuICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc09iamVjdCh0YXJnZXQpICYmIHRoaXMuaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAodGhpcy5pc09iamVjdChzb3VyY2Vba2V5XSkpIHtcclxuICAgICAgICAgIGlmICghdGFyZ2V0W2tleV0pIHsgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pOyB9XHJcbiAgICAgICAgICB0aGlzLm1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRhcmdldCwgeyBba2V5XTogc291cmNlW2tleV0gfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIl19