@tsclean/core
Version:
Plugin for API Rest Full development, based on Clean Architecture, IoC and Dependency Injection.
255 lines • 29.2 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __param = (this && this.__param) || function (paramIndex, decorator) {
return function (target, key) { decorator(target, key, paramIndex); }
};
var Logger_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Logger = void 0;
const decorators_1 = require("../decorators");
const utils_1 = require("../utils");
const console_logger_service_1 = require("./console-logger.service");
const is_log_level_enabled_util_1 = require("./utils/is-log-level-enabled.util");
const DEFAULT_LOGGER = new console_logger_service_1.ConsoleLogger();
const dateTimeFormatter = new Intl.DateTimeFormat(undefined, {
year: 'numeric',
hour: 'numeric',
minute: 'numeric',
second: 'numeric',
day: '2-digit',
month: '2-digit',
});
let Logger = Logger_1 = class Logger {
constructor(context, options = {}) {
this.context = context;
this.options = options;
}
get localInstance() {
if (Logger_1.staticInstanceRef === DEFAULT_LOGGER) {
return this.registerLocalInstanceRef();
}
else if (Logger_1.staticInstanceRef instanceof Logger_1) {
const prototype = Object.getPrototypeOf(Logger_1.staticInstanceRef);
if (prototype.constructor === Logger_1) {
return this.registerLocalInstanceRef();
}
}
return Logger_1.staticInstanceRef;
}
error(message, ...optionalParams) {
var _a;
optionalParams = this.context
? (optionalParams.length ? optionalParams : [undefined]).concat(this.context)
: optionalParams;
(_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.error(message, ...optionalParams);
}
log(message, ...optionalParams) {
var _a;
optionalParams = this.context
? optionalParams.concat(this.context)
: optionalParams;
(_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.log(message, ...optionalParams);
}
warn(message, ...optionalParams) {
var _a;
optionalParams = this.context
? optionalParams.concat(this.context)
: optionalParams;
(_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.warn(message, ...optionalParams);
}
debug(message, ...optionalParams) {
var _a, _b;
optionalParams = this.context
? optionalParams.concat(this.context)
: optionalParams;
(_b = (_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
verbose(message, ...optionalParams) {
var _a, _b;
optionalParams = this.context
? optionalParams.concat(this.context)
: optionalParams;
(_b = (_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.verbose) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
fatal(message, ...optionalParams) {
var _a, _b;
optionalParams = this.context
? optionalParams.concat(this.context)
: optionalParams;
(_b = (_a = this.localInstance) === null || _a === void 0 ? void 0 : _a.fatal) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
static error(message, ...optionalParams) {
var _a;
(_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.error(message, ...optionalParams);
}
static log(message, ...optionalParams) {
var _a;
(_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.log(message, ...optionalParams);
}
static warn(message, ...optionalParams) {
var _a;
(_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.warn(message, ...optionalParams);
}
static debug(message, ...optionalParams) {
var _a, _b;
(_b = (_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.debug) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
static verbose(message, ...optionalParams) {
var _a, _b;
(_b = (_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.verbose) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
static fatal(message, ...optionalParams) {
var _a, _b;
(_b = (_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.fatal) === null || _b === void 0 ? void 0 : _b.call(_a, message, ...optionalParams);
}
static flush() {
this.isBufferAttached = false;
this.logBuffer.forEach(item => item.methodRef(...item.arguments));
this.logBuffer = [];
}
static attachBuffer() {
this.isBufferAttached = true;
}
static detachBuffer() {
this.isBufferAttached = false;
}
static getTimestamp() {
return dateTimeFormatter.format(Date.now());
}
static overrideLogger(logger) {
var _a;
if (Array.isArray(logger)) {
Logger_1.logLevels = logger;
return (_a = this.staticInstanceRef) === null || _a === void 0 ? void 0 : _a.setLogLevels(logger);
}
if ((0, utils_1.isObject)(logger)) {
if (logger instanceof Logger_1 && logger.constructor !== Logger_1) {
const errorMessage = `Using the "extends Logger" instruction is not allowed in Nest v9. Please, use "extends ConsoleLogger" instead.`;
this.staticInstanceRef.error(errorMessage);
throw new Error(errorMessage);
}
this.staticInstanceRef = logger;
}
else {
this.staticInstanceRef = undefined;
}
}
static isLevelEnabled(level) {
const logLevels = Logger_1.logLevels;
return (0, is_log_level_enabled_util_1.isLogLevelEnabled)(level, logLevels);
}
registerLocalInstanceRef() {
var _a;
if (this.localInstanceRef) {
return this.localInstanceRef;
}
this.localInstanceRef = new console_logger_service_1.ConsoleLogger(this.context, {
timestamp: (_a = this.options) === null || _a === void 0 ? void 0 : _a.timestamp,
logLevels: Logger_1.logLevels,
});
return this.localInstanceRef;
}
};
exports.Logger = Logger;
Logger.logBuffer = new Array();
Logger.staticInstanceRef = DEFAULT_LOGGER;
Logger.WrapBuffer = (target, propertyKey, descriptor) => {
const originalFn = descriptor.value;
descriptor.value = function (...args) {
if (Logger_1.isBufferAttached) {
Logger_1.logBuffer.push({
methodRef: originalFn.bind(this),
arguments: args,
});
return;
}
return originalFn.call(this, ...args);
};
};
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "error", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "log", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "warn", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "debug", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "verbose", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger.prototype, "fatal", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "error", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "log", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "warn", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "debug", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "verbose", null);
__decorate([
Logger.WrapBuffer,
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object, Object]),
__metadata("design:returntype", void 0)
], Logger, "fatal", null);
exports.Logger = Logger = Logger_1 = __decorate([
(0, decorators_1.Service)(),
__param(0, (0, decorators_1.Optional)()),
__param(1, (0, decorators_1.Optional)()),
__metadata("design:paramtypes", [String, Object])
], Logger);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvbG9nZ2VyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFnRDtBQUNoRCxvQ0FBa0M7QUFDbEMscUVBQXlEO0FBQ3pELGlGQUFzRTtBQW1CdEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxzQ0FBYSxFQUFFLENBQUM7QUFFM0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFO0lBQzNELElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLFNBQVM7SUFDZixNQUFNLEVBQUUsU0FBUztJQUNqQixNQUFNLEVBQUUsU0FBUztJQUNqQixHQUFHLEVBQUUsU0FBUztJQUNkLEtBQUssRUFBRSxTQUFTO0NBQ2pCLENBQUMsQ0FBQztBQUdJLElBQU0sTUFBTSxjQUFaLE1BQU0sTUFBTTtJQTZCakIsWUFDd0IsT0FBZ0IsRUFDaEIsVUFBbUMsRUFBRTtRQURyQyxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFlBQU8sR0FBUCxPQUFPLENBQThCO0lBQzFELENBQUM7SUFFSixJQUFJLGFBQWE7UUFDZixJQUFJLFFBQU0sQ0FBQyxpQkFBaUIsS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUNoRCxPQUFPLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLFFBQU0sQ0FBQyxpQkFBaUIsWUFBWSxRQUFNLEVBQUUsQ0FBQztZQUN0RCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ2xFLElBQUksU0FBUyxDQUFDLFdBQVcsS0FBSyxRQUFNLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUN6QyxDQUFDO1FBQ0gsQ0FBQztR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akI7QUFLRDtJQURDLE1BQU0sQ0FBQyxVQUFVOzs7O21DQU1qQjtBQVVNO0lBRE4sTUFBTSxDQUFDLFVBQVU7Ozs7eUJBR2pCO0FBS007SUFETixNQUFNLENBQUMsVUFBVTs7Ozt1QkFHakI7QUFLTTtJQUROLE1BQU0sQ0FBQyxVQUFVOzs7O3dCQUdqQjtBQUtNO0lBRE4sTUFBTSxDQUFDLFVBQVU7Ozs7eUJBR2pCO0FBS007SUFETixNQUFNLENBQUMsVUFBVTs7OzsyQkFHakI7QUFLTTtJQUROLE1BQU0sQ0FBQyxVQUFVOzs7O3lCQUdqQjtpQkExSlUsTUFBTTtJQURsQixJQUFBLG9CQUFPLEdBQUU7SUErQkwsV0FBQSxJQUFBLHFCQUFRLEdBQUUsQ0FBQTtJQUNWLFdBQUEsSUFBQSxxQkFBUSxHQUFFLENBQUE7O0dBL0JGLE1BQU0sQ0FnTmxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtPcHRpb25hbCwgU2VydmljZX0gZnJvbSAnLi4vZGVjb3JhdG9ycyc7XG5pbXBvcnQge2lzT2JqZWN0fSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2NvbnNvbGUtbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgaXNMb2dMZXZlbEVuYWJsZWQgfSBmcm9tICcuL3V0aWxzL2lzLWxvZy1sZXZlbC1lbmFibGVkLnV0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbCA9ICdsb2cnIHwgJ2Vycm9yJyB8ICd3YXJuJyB8ICdkZWJ1ZycgfCAndmVyYm9zZScgfCAnZmF0YWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlclNlcnZpY2Uge1xuICBsb2cobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiBhbnk7XG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogYW55O1xuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogYW55O1xuICBkZWJ1Zz8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiBhbnk7XG4gIHZlcmJvc2U/KG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKTogYW55O1xuICBmYXRhbD8obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pOiBhbnk7XG4gIHNldExvZ0xldmVscz8obGV2ZWxzOiBMb2dMZXZlbFtdKTogYW55O1xufVxuXG5pbnRlcmZhY2UgTG9nQnVmZmVyUmVjb3JkIHtcbiAgbWV0aG9kUmVmOiBGdW5jdGlvbjtcbiAgYXJndW1lbnRzOiB1bmtub3duW107XG59XG5cbmNvbnN0IERFRkFVTFRfTE9HR0VSID0gbmV3IENvbnNvbGVMb2dnZXIoKTtcblxuY29uc3QgZGF0ZVRpbWVGb3JtYXR0ZXIgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh1bmRlZmluZWQsIHtcbiAgeWVhcjogJ251bWVyaWMnLFxuICBob3VyOiAnbnVtZXJpYycsXG4gIG1pbnV0ZTogJ251bWVyaWMnLFxuICBzZWNvbmQ6ICdudW1lcmljJyxcbiAgZGF5OiAnMi1kaWdpdCcsXG4gIG1vbnRoOiAnMi1kaWdpdCcsXG59KTtcblxuQFNlcnZpY2UoKVxuZXhwb3J0IGNsYXNzIExvZ2dlciBpbXBsZW1lbnRzIExvZ2dlclNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgc3RhdGljIGxvZ0J1ZmZlciA9IG5ldyBBcnJheTxMb2dCdWZmZXJSZWNvcmQ+KCk7XG4gIHByb3RlY3RlZCBzdGF0aWMgc3RhdGljSW5zdGFuY2VSZWY/OiBMb2dnZXJTZXJ2aWNlID0gREVGQVVMVF9MT0dHRVI7XG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nTGV2ZWxzPzogTG9nTGV2ZWxbXTtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNCdWZmZXJBdHRhY2hlZDogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgbG9jYWxJbnN0YW5jZVJlZj86IExvZ2dlclNlcnZpY2U7XG5cbiAgcHJpdmF0ZSBzdGF0aWMgV3JhcEJ1ZmZlcjogTWV0aG9kRGVjb3JhdG9yID0gKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PixcbiAgKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxGbiA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgIGlmIChMb2dnZXIuaXNCdWZmZXJBdHRhY2hlZCkge1xuICAgICAgICBMb2dnZXIubG9nQnVmZmVyLnB1c2goe1xuICAgICAgICAgIG1ldGhvZFJlZjogb3JpZ2luYWxGbi5iaW5kKHRoaXMpLFxuICAgICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbEZuLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgfTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcigpO1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcpO1xuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiB7IHRpbWVzdGFtcD86IGJvb2xlYW4gfSk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBjb250ZXh0Pzogc3RyaW5nLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBvcHRpb25zOiB7IHRpbWVzdGFtcD86IGJvb2xlYW4gfSA9IHt9LFxuICApIHt9XG5cbiAgZ2V0IGxvY2FsSW5zdGFuY2UoKTogTG9nZ2VyU2VydmljZSB7XG4gICAgaWYgKExvZ2dlci5zdGF0aWNJbnN0YW5jZVJlZiA9PT0gREVGQVVMVF9MT0dHRVIpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyTG9jYWxJbnN0YW5jZVJlZigpO1xuICAgIH0gZWxzZSBpZiAoTG9nZ2VyLnN0YXRpY0luc3RhbmNlUmVmIGluc3RhbmNlb2YgTG9nZ2VyKSB7XG4gICAgICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTG9nZ2VyLnN0YXRpY0luc3RhbmNlUmVmKTtcbiAgICAgIGlmIChwcm90b3R5cGUuY29uc3RydWN0b3IgPT09IExvZ2dlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlckxvY2FsSW5zdGFuY2VSZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIExvZ2dlci5zdGF0aWNJbnN0YW5jZVJlZjtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IGFueSwgc3RhY2s/OiBzdHJpbmcsIGNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBlcnJvcihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBbLi4uYW55LCBzdHJpbmc/LCBzdHJpbmc/XSk6IHZvaWQ7XG4gIEBMb2dnZXIuV3JhcEJ1ZmZlclxuICBlcnJvcihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIG9wdGlvbmFsUGFyYW1zID0gdGhpcy5jb250ZXh0XG4gICAgICA/IChvcHRpb25hbFBhcmFtcy5sZW5ndGggPyBvcHRpb25hbFBhcmFtcyA6IFt1bmRlZmluZWRdKS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5jb250ZXh0LFxuICAgICAgICApXG4gICAgICA6IG9wdGlvbmFsUGFyYW1zO1xuXG4gICAgdGhpcy5sb2NhbEluc3RhbmNlPy5lcnJvcihtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBsb2cobWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IFsuLi5hbnksIHN0cmluZz9dKTogdm9pZDtcbiAgQExvZ2dlci5XcmFwQnVmZmVyXG4gIGxvZyhtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIG9wdGlvbmFsUGFyYW1zID0gdGhpcy5jb250ZXh0XG4gICAgICA/IG9wdGlvbmFsUGFyYW1zLmNvbmNhdCh0aGlzLmNvbnRleHQpXG4gICAgICA6IG9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9jYWxJbnN0YW5jZT8ubG9nKG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgd2FybihtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBbLi4uYW55LCBzdHJpbmc/XSk6IHZvaWQ7XG4gIEBMb2dnZXIuV3JhcEJ1ZmZlclxuICB3YXJuKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMgPSB0aGlzLmNvbnRleHRcbiAgICAgID8gb3B0aW9uYWxQYXJhbXMuY29uY2F0KHRoaXMuY29udGV4dClcbiAgICAgIDogb3B0aW9uYWxQYXJhbXM7XG4gICAgdGhpcy5sb2NhbEluc3RhbmNlPy53YXJuKG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgY29udGV4dD86IHN0cmluZyk6IHZvaWQ7XG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IFsuLi5hbnksIHN0cmluZz9dKTogdm9pZDtcbiAgQExvZ2dlci5XcmFwQnVmZmVyXG4gIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMgPSB0aGlzLmNvbnRleHRcbiAgICAgID8gb3B0aW9uYWxQYXJhbXMuY29uY2F0KHRoaXMuY29udGV4dClcbiAgICAgIDogb3B0aW9uYWxQYXJhbXM7XG4gICAgdGhpcy5sb2NhbEluc3RhbmNlPy5kZWJ1Zz8uKG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHZlcmJvc2UobWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgdmVyYm9zZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBbLi4uYW55LCBzdHJpbmc/XSk6IHZvaWQ7XG4gIEBMb2dnZXIuV3JhcEJ1ZmZlclxuICB2ZXJib3NlKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMgPSB0aGlzLmNvbnRleHRcbiAgICAgID8gb3B0aW9uYWxQYXJhbXMuY29uY2F0KHRoaXMuY29udGV4dClcbiAgICAgIDogb3B0aW9uYWxQYXJhbXM7XG4gICAgdGhpcy5sb2NhbEluc3RhbmNlPy52ZXJib3NlPy4obWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgZmF0YWwobWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgZmF0YWwobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogWy4uLmFueSwgc3RyaW5nP10pOiB2b2lkO1xuICBATG9nZ2VyLldyYXBCdWZmZXJcbiAgZmF0YWwobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICBvcHRpb25hbFBhcmFtcyA9IHRoaXMuY29udGV4dFxuICAgICAgPyBvcHRpb25hbFBhcmFtcy5jb25jYXQodGhpcy5jb250ZXh0KVxuICAgICAgOiBvcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvY2FsSW5zdGFuY2U/LmZhdGFsPy4obWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIGVycm9yKG1lc3NhZ2U6IGFueSwgc3RhY2tPckNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBzdGF0aWMgZXJyb3IobWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgc3RhdGljIGVycm9yKG1lc3NhZ2U6IGFueSwgc3RhY2s/OiBzdHJpbmcsIGNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBzdGF0aWMgZXJyb3IoXG4gICAgbWVzc2FnZTogYW55LFxuICAgIC4uLm9wdGlvbmFsUGFyYW1zOiBbLi4uYW55LCBzdHJpbmc/LCBzdHJpbmc/XVxuICApOiB2b2lkO1xuICBATG9nZ2VyLldyYXBCdWZmZXJcbiAgc3RhdGljIGVycm9yKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgdGhpcy5zdGF0aWNJbnN0YW5jZVJlZj8uZXJyb3IobWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIGxvZyhtZXNzYWdlOiBhbnksIGNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBzdGF0aWMgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IFsuLi5hbnksIHN0cmluZz9dKTogdm9pZDtcbiAgQExvZ2dlci5XcmFwQnVmZmVyXG4gIHN0YXRpYyBsb2cobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICB0aGlzLnN0YXRpY0luc3RhbmNlUmVmPy5sb2cobWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIHdhcm4obWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgc3RhdGljIHdhcm4obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogWy4uLmFueSwgc3RyaW5nP10pOiB2b2lkO1xuICBATG9nZ2VyLldyYXBCdWZmZXJcbiAgc3RhdGljIHdhcm4obWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pIHtcbiAgICB0aGlzLnN0YXRpY0luc3RhbmNlUmVmPy53YXJuKG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcbiAgfVxuXG4gIHN0YXRpYyBkZWJ1ZyhtZXNzYWdlOiBhbnksIGNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBzdGF0aWMgZGVidWcobWVzc2FnZTogYW55LCAuLi5vcHRpb25hbFBhcmFtczogWy4uLmFueSwgc3RyaW5nP10pOiB2b2lkO1xuICBATG9nZ2VyLldyYXBCdWZmZXJcbiAgc3RhdGljIGRlYnVnKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XG4gICAgdGhpcy5zdGF0aWNJbnN0YW5jZVJlZj8uZGVidWc/LihtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgdmVyYm9zZShtZXNzYWdlOiBhbnksIGNvbnRleHQ/OiBzdHJpbmcpOiB2b2lkO1xuICBzdGF0aWMgdmVyYm9zZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBbLi4uYW55LCBzdHJpbmc/XSk6IHZvaWQ7XG4gIEBMb2dnZXIuV3JhcEJ1ZmZlclxuICBzdGF0aWMgdmVyYm9zZShtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIHRoaXMuc3RhdGljSW5zdGFuY2VSZWY/LnZlcmJvc2U/LihtZXNzYWdlLCAuLi5vcHRpb25hbFBhcmFtcyk7XG4gIH1cblxuICBzdGF0aWMgZmF0YWwobWVzc2FnZTogYW55LCBjb250ZXh0Pzogc3RyaW5nKTogdm9pZDtcbiAgc3RhdGljIGZhdGFsKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IFsuLi5hbnksIHN0cmluZz9dKTogdm9pZDtcbiAgQExvZ2dlci5XcmFwQnVmZmVyXG4gIHN0YXRpYyBmYXRhbChtZXNzYWdlOiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xuICAgIHRoaXMuc3RhdGljSW5zdGFuY2VSZWY/LmZhdGFsPy4obWVzc2FnZSwgLi4ub3B0aW9uYWxQYXJhbXMpO1xuICB9XG5cbiAgc3RhdGljIGZsdXNoKCkge1xuICAgIHRoaXMuaXNCdWZmZXJBdHRhY2hlZCA9IGZhbHNlO1xuICAgIHRoaXMubG9nQnVmZmVyLmZvckVhY2goaXRlbSA9PlxuICAgICAgaXRlbS5tZXRob2RSZWYoLi4uKGl0ZW0uYXJndW1lbnRzIGFzIFtzdHJpbmddKSksXG4gICAgKTtcbiAgICB0aGlzLmxvZ0J1ZmZlciA9IFtdO1xuICB9XG5cbiAgc3RhdGljIGF0dGFjaEJ1ZmZlcigpIHtcbiAgICB0aGlzLmlzQnVmZmVyQXR0YWNoZWQgPSB0cnVlO1xuICB9XG5cbiAgc3RhdGljIGRldGFjaEJ1ZmZlcigpIHtcbiAgICB0aGlzLmlzQnVmZmVyQXR0YWNoZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRUaW1lc3RhbXAoKSB7XG4gICAgcmV0dXJuIGRhdGVUaW1lRm9ybWF0dGVyLmZvcm1hdChEYXRlLm5vdygpKTtcbiAgfVxuXG4gIHN0YXRpYyBvdmVycmlkZUxvZ2dlcihsb2dnZXI6IExvZ2dlclNlcnZpY2UgfCBMb2dMZXZlbFtdIHwgYm9vbGVhbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGxvZ2dlcikpIHtcbiAgICAgIExvZ2dlci5sb2dMZXZlbHMgPSBsb2dnZXI7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0aWNJbnN0YW5jZVJlZj8uc2V0TG9nTGV2ZWxzKGxvZ2dlcik7XG4gICAgfVxuICAgIGlmIChpc09iamVjdChsb2dnZXIpKSB7XG4gICAgICBpZiAobG9nZ2VyIGluc3RhbmNlb2YgTG9nZ2VyICYmIGxvZ2dlci5jb25zdHJ1Y3RvciAhPT0gTG9nZ2VyKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBVc2luZyB0aGUgXCJleHRlbmRzIExvZ2dlclwiIGluc3RydWN0aW9uIGlzIG5vdCBhbGxvd2VkIGluIE5lc3QgdjkuIFBsZWFzZSwgdXNlIFwiZXh0ZW5kcyBDb25zb2xlTG9nZ2VyXCIgaW5zdGVhZC5gO1xuICAgICAgICB0aGlzLnN0YXRpY0luc3RhbmNlUmVmLmVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0aWNJbnN0YW5jZVJlZiA9IGxvZ2dlciBhcyBMb2dnZXJTZXJ2aWNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRpY0luc3RhbmNlUmVmID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBpc0xldmVsRW5hYmxlZChsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2dMZXZlbHMgPSBMb2dnZXIubG9nTGV2ZWxzO1xuICAgIHJldHVybiBpc0xvZ0xldmVsRW5hYmxlZChsZXZlbCwgbG9nTGV2ZWxzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJMb2NhbEluc3RhbmNlUmVmKCkge1xuICAgIGlmICh0aGlzLmxvY2FsSW5zdGFuY2VSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsSW5zdGFuY2VSZWY7XG4gICAgfVxuICAgIHRoaXMubG9jYWxJbnN0YW5jZVJlZiA9IG5ldyBDb25zb2xlTG9nZ2VyKHRoaXMuY29udGV4dCwge1xuICAgICAgdGltZXN0YW1wOiB0aGlzLm9wdGlvbnM/LnRpbWVzdGFtcCxcbiAgICAgIGxvZ0xldmVsczogTG9nZ2VyLmxvZ0xldmVscyxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5sb2NhbEluc3RhbmNlUmVmO1xuICB9XG59XG4iXX0=