UNPKG

@fababracx/ngx-console-logger

Version:

Logging library for Angular

145 lines 26.1 kB
import { ngxConsoleLoggerConfigDefault, ngxConsoleLoggerConfigDefaultPrefixMinPad } from '../config/ngx-console-logger-config'; export class NgxConsoleLogger { // eslint-disable-next-line @typescript-eslint/no-empty-function static fnConsoleLoggerNull(_message, ..._optionalParams) { } static init(ngxConsoleLoggerConfig = ngxConsoleLoggerConfigDefault, activatePerfsLogs = false, defaultPrefixMinPad = ngxConsoleLoggerConfigDefaultPrefixMinPad) { NgxConsoleLogger.config = ngxConsoleLoggerConfig; NgxConsoleLogger.prefixMinPad = defaultPrefixMinPad || NgxConsoleLogger.prefixMinPad; if (NgxConsoleLogger.config) { // Init all keys Object.keys(ngxConsoleLoggerConfig).forEach(key => { const configData = NgxConsoleLogger.config?.[key] || []; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); }); // deactivate or activate perfs logs NgxConsoleLogger.deactivatePerfLogs(); if (activatePerfsLogs) { NgxConsoleLogger.activatePerfLogs(); } } } static initLog(key, configData) { if (!!NgxConsoleLogger[key] && (!NgxConsoleLogger.config || !NgxConsoleLogger.config[key])) { NgxConsoleLogger.config = !NgxConsoleLogger.config ? {} : NgxConsoleLogger.config; NgxConsoleLogger.config[key] = configData; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); } } static activateLog(key) { if (!!NgxConsoleLogger.config && Object.keys(NgxConsoleLogger.config).find(k => key === k)) { const configData = NgxConsoleLogger.config?.[key] || []; const { logPrefix, logColor } = NgxConsoleLogger.getConsoleData(key, configData) || {}; NgxConsoleLogger[key] = NgxConsoleLogger.initConsole(logPrefix, logColor); } } static activateLogs(...keys) { keys.forEach(key => NgxConsoleLogger.activateLog(key)); } static activatePerfLogs() { NgxConsoleLogger.activateLogs('perf', 'perfCD', 'perfComponent', 'perfDom'); } static deactivateLog(key) { if (!!NgxConsoleLogger.config && Object.keys(NgxConsoleLogger.config).find(k => key === k)) { NgxConsoleLogger[key] = NgxConsoleLogger.fnConsoleLoggerNull; } } static deactivateLogs(...keys) { keys.forEach(key => NgxConsoleLogger.deactivateLog(key)); } static deactivatePerfLogs() { NgxConsoleLogger.deactivateLogs('perf', 'perfCD', 'perfComponent', 'perfDom'); } static getConsoleData(key, configData) { let logPrefix = key; let logColor; if (configData instanceof Array) { if (configData.length >= 2) { logPrefix = configData[1]; logColor = configData[0]; } else { console.error(`Bad configuration for key ${logPrefix}`); } } else { logColor = configData; } return { logPrefix, logColor }; } static initConsole(logPrefix, logColor) { if (!logPrefix || !logColor) { return console.log.bind(console); } // Capitalize prefix const logPrefixCapitalized = NgxConsoleLogger.prepareLogPrefix(logPrefix); const ua = window.navigator.userAgent; // Check if ie const msie = ua?.indexOf('MSIE '); if (msie > 0) { return console.info.bind(console, `${logPrefixCapitalized}:`); } else { return console.info.bind(console, `%c${logPrefixCapitalized}:`, `color: ${logColor}`); } } static prepareLogPrefix(logPrefix) { let logPrefixCapitalized = `${logPrefix.charAt(0).toUpperCase()}${logPrefix.slice(1)}`; // padEnd does not exits in IE11 // <=> logPrefixCapitalized.padEnd(NgxConsoleLogger.prefixLength, ' ') if (logPrefixCapitalized.length < NgxConsoleLogger.prefixMinPad) { while (logPrefixCapitalized.length < NgxConsoleLogger.prefixMinPad) { // Add space logPrefixCapitalized = `${logPrefixCapitalized} `; } } return logPrefixCapitalized; } } NgxConsoleLogger.prefixMinPad = ngxConsoleLoggerConfigDefaultPrefixMinPad; NgxConsoleLogger.config = {}; NgxConsoleLogger.debug = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.info = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.warn = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.error = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnChanges = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnInit = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngDoCheck = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ngOnDestroy = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.create = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createComponent = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createDirective = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createService = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createPipe = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createGuard = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.createResolver = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perf = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfComponent = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfCD = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.perfDom = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.network = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkRequest = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkResponse = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkError = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.networkCreate = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.resolve = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.guard = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.validator = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.pipe = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.callback = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.state = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.action = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.select = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.errorState = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.effect = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.tu = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.ti = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.te2e = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.pink = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.red = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.orange = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.green = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.blue = NgxConsoleLogger.fnConsoleLoggerNull; NgxConsoleLogger.violet = NgxConsoleLogger.fnConsoleLoggerNull; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNvbnNvbGUtbG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbnNvbGUtbG9nZ2VyL3NyYy9saWIvbW9kZWxzL25neC1jb25zb2xlLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUseUNBQXlDLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUcvSCxNQUFNLE9BQU8sZ0JBQWdCO0lBd0QzQixnRUFBZ0U7SUFDaEUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQWMsRUFBRSxHQUFHLGVBQXNCLElBQUcsQ0FBQztJQUV4RSxNQUFNLENBQUMsSUFBSSxDQUNULHlCQUFrRCw2QkFBNkIsRUFDL0UsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixzQkFBOEIseUNBQXlDO1FBRXZFLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQztRQUNqRCxnQkFBZ0IsQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLElBQUksZ0JBQWdCLENBQUMsWUFBWSxDQUFDO1FBRXJGLElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQzNCLGdCQUFnQjtZQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNoRCxNQUFNLFVBQVUsR0FBc0IsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBb0MsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDNUcsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdkYsZ0JBQWdCLENBQUMsR0FBb0MsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDN0csQ0FBQyxDQUFD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Z0JBQWdCLENBQUMsbUJBQW1CLENBQUM7QUFDOUMsdUJBQU0sR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUM5QywyQkFBVSxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO0FBQ2xELHVCQUFNLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7QUFFOUMsbUJBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUMxQyxtQkFBRSxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO0FBQzFDLHFCQUFJLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7QUFFNUMscUJBQUksR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUM1QyxvQkFBRyxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO0FBQzNDLHVCQUFNLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7QUFDOUMsc0JBQUssR0FBRyxnQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQztBQUM3QyxxQkFBSSxHQUFHLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDO0FBQzVDLHVCQUFNLEdBQUcsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuZ3hDb25zb2xlTG9nZ2VyQ29uZmlnRGVmYXVsdCwgbmd4Q29uc29sZUxvZ2dlckNvbmZpZ0RlZmF1bHRQcmVmaXhNaW5QYWQgfSBmcm9tICcuLi9jb25maWcvbmd4LWNvbnNvbGUtbG9nZ2VyLWNvbmZpZyc7XHJcbmltcG9ydCB7IElOZ3hDb25zb2xlTG9nZ2VyQ29uZmlnIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLW5neC1jb25zb2xlLWxvZ2dlci1jb25maWcnO1xyXG5cclxuZXhwb3J0IGNsYXNzIE5neENvbnNvbGVMb2dnZXIge1xyXG4gIHN0YXRpYyBwcmVmaXhNaW5QYWQgPSBuZ3hDb25zb2xlTG9nZ2VyQ29uZmlnRGVmYXVsdFByZWZpeE1pblBhZDtcclxuICBzdGF0aWMgY29uZmlnOiBJTmd4Q29uc29sZUxvZ2dlckNvbmZpZyA9IHt9O1xyXG5cclxuICBzdGF0aWMgZGVidWcgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGluZm8gPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIHdhcm4gPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGVycm9yID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICBzdGF0aWMgbmdPbkNoYW5nZXMgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIG5nT25Jbml0ID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBuZ0RvQ2hlY2sgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIG5nT25EZXN0cm95ID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICBzdGF0aWMgY3JlYXRlID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBjcmVhdGVDb21wb25lbnQgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGNyZWF0ZURpcmVjdGl2ZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgY3JlYXRlU2VydmljZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgY3JlYXRlUGlwZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgY3JlYXRlR3VhcmQgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGNyZWF0ZVJlc29sdmVyID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICBzdGF0aWMgcGVyZiA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgcGVyZkNvbXBvbmVudCA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgcGVyZkNEID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBwZXJmRG9tID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICBzdGF0aWMgbmV0d29yayA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgbmV0d29ya1JlcXVlc3QgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIG5ldHdvcmtSZXNwb25zZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgbmV0d29ya0Vycm9yID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBuZXR3b3JrQ3JlYXRlID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICBzdGF0aWMgcmVzb2x2ZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgZ3VhcmQgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIHZhbGlkYXRvciA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgcGlwZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgY2FsbGJhY2sgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcblxyXG4gIHN0YXRpYyBzdGF0ZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgYWN0aW9uID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBzZWxlY3QgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGVycm9yU3RhdGUgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIGVmZmVjdCA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuXHJcbiAgc3RhdGljIHR1ID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyB0aSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgdGUyZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuXHJcbiAgc3RhdGljIHBpbmsgPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgc3RhdGljIHJlZCA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgb3JhbmdlID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG4gIHN0YXRpYyBncmVlbiA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgYmx1ZSA9IE5neENvbnNvbGVMb2dnZXIuZm5Db25zb2xlTG9nZ2VyTnVsbDtcclxuICBzdGF0aWMgdmlvbGV0ID0gTmd4Q29uc29sZUxvZ2dlci5mbkNvbnNvbGVMb2dnZXJOdWxsO1xyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgc3RhdGljIGZuQ29uc29sZUxvZ2dlck51bGwoX21lc3NhZ2U/OiBhbnksIC4uLl9vcHRpb25hbFBhcmFtczogYW55W10pIHt9XHJcblxyXG4gIHN0YXRpYyBpbml0KFxyXG4gICAgbmd4Q29uc29sZUxvZ2dlckNvbmZpZzogSU5neENvbnNvbGVMb2dnZXJDb25maWcgPSBuZ3hDb25zb2xlTG9nZ2VyQ29uZmlnRGVmYXVsdCxcclxuICAgIGFjdGl2YXRlUGVyZnNMb2dzID0gZmFsc2UsXHJcbiAgICBkZWZhdWx0UHJlZml4TWluUGFkOiBudW1iZXIgPSBuZ3hDb25zb2xlTG9nZ2VyQ29uZmlnRGVmYXVsdFByZWZpeE1pblBhZFxyXG4gICkge1xyXG4gICAgTmd4Q29uc29sZUxvZ2dlci5jb25maWcgPSBuZ3hDb25zb2xlTG9nZ2VyQ29uZmlnO1xyXG4gICAgTmd4Q29uc29sZUxvZ2dlci5wcmVmaXhNaW5QYWQgPSBkZWZhdWx0UHJlZml4TWluUGFkIHx8IE5neENvbnNvbGVMb2dnZXIucHJlZml4TWluUGFkO1xyXG5cclxuICAgIGlmIChOZ3hDb25zb2xlTG9nZ2VyLmNvbmZpZykge1xyXG4gICAgICAvLyBJbml0IGFsbCBrZXlzXHJcbiAgICAgIE9iamVjdC5rZXlzKG5neENvbnNvbGVMb2dnZXJDb25maWcpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICBjb25zdCBjb25maWdEYXRhOiBzdHJpbmcgfCBzdHJpbmdbXSA9IE5neENvbnNvbGVMb2dnZXIuY29uZmlnPy5ba2V5IGFzIGtleW9mIElOZ3hDb25zb2xlTG9nZ2VyQ29uZmlnXSB8fCBbXTtcclxuICAgICAgICBjb25zdCB7IGxvZ1ByZWZpeCwgbG9nQ29sb3IgfSA9IE5neENvbnNvbGVMb2dnZXIuZ2V0Q29uc29sZURhdGEoa2V5LCBjb25maWdEYXRhKSB8fCB7fTtcclxuICAgICAgICBOZ3hDb25zb2xlTG9nZ2VyW2tleSBhcyBrZXlvZiBJTmd4Q29uc29sZUxvZ2dlckNvbmZpZ10gPSBOZ3hDb25zb2xlTG9nZ2VyLmluaXRDb25zb2xlKGxvZ1ByZWZpeCwgbG9nQ29sb3IpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIGRlYWN0aXZhdGUgb3IgYWN0aXZhdGUgcGVyZnMgbG9nc1xyXG4gICAgICBOZ3hDb25zb2xlTG9nZ2VyLmRlYWN0aXZhdGVQZXJmTG9ncygpO1xyXG4gICAgICBpZiAoYWN0aXZhdGVQZXJmc0xvZ3MpIHtcclxuICAgICAgICBOZ3hDb25zb2xlTG9nZ2VyLmFjdGl2YXRlUGVyZkxvZ3MoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGluaXRMb2coa2V5OiBrZXlvZiBJTmd4Q29uc29sZUxvZ2dlckNvbmZpZywgY29uZmlnRGF0YTogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICAgIGlmICghIU5neENvbnNvbGVMb2dnZXJba2V5XSAmJiAoIU5neENvbnNvbGVMb2dnZXIuY29uZmlnIHx8ICFOZ3hDb25zb2xlTG9nZ2VyLmNvbmZpZ1trZXldKSkge1xyXG4gICAgICBOZ3hDb25zb2xlTG9nZ2VyLmNvbmZpZyA9ICFOZ3hDb25zb2xlTG9nZ2VyLmNvbmZpZyA/IHt9IDogTmd4Q29uc29sZUxvZ2dlci5jb25maWc7XHJcbiAgICAgIE5neENvbnNvbGVMb2dnZXIuY29uZmlnW2tleV0gPSBjb25maWdEYXRhO1xyXG4gICAgICBjb25zdCB7IGxvZ1ByZWZpeCwgbG9nQ29sb3IgfSA9IE5neENvbnNvbGVMb2dnZXIuZ2V0Q29uc29sZURhdGEoa2V5LCBjb25maWdEYXRhKSB8fCB7fTtcclxuICAgICAgTmd4Q29uc29sZUxvZ2dlcltrZXldID0gTmd4Q29uc29sZUxvZ2dlci5pbml0Q29uc29sZShsb2dQcmVmaXgsIGxvZ0NvbG9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGFjdGl2YXRlTG9nKGtleToga2V5b2YgSU5neENvbnNvbGVMb2dnZXJDb25maWcpIHtcclxuICAgIGlmICghIU5neENvbnNvbGVMb2dnZXIuY29uZmlnICYmIE9iamVjdC5rZXlzKE5neENvbnNvbGVMb2dnZXIuY29uZmlnKS5maW5kKGsgPT4ga2V5ID09PSBrKSkge1xyXG4gICAgICBjb25zdCBjb25maWdEYXRhOiBzdHJpbmcgfCBzdHJpbmdbXSA9IE5neENvbnNvbGVMb2dnZXIuY29uZmlnPy5ba2V5XSB8fCBbXTtcclxuICAgICAgY29uc3QgeyBsb2dQcmVmaXgsIGxvZ0NvbG9yIH0gPSBOZ3hDb25zb2xlTG9nZ2VyLmdldENvbnNvbGVEYXRhKGtleSwgY29uZmlnRGF0YSkgfHwge307XHJcbiAgICAgIE5neENvbnNvbGVMb2dnZXJba2V5XSA9IE5neENvbnNvbGVMb2dnZXIuaW5pdENvbnNvbGUobG9nUHJlZml4LCBsb2dDb2xvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgYWN0aXZhdGVMb2dzKC4uLmtleXM6IChrZXlvZiBJTmd4Q29uc29sZUxvZ2dlckNvbmZpZylbXSkge1xyXG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiBOZ3hDb25zb2xlTG9nZ2VyLmFjdGl2YXRlTG9nKGtleSkpO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGFjdGl2YXRlUGVyZkxvZ3MoKSB7XHJcbiAgICBOZ3hDb25zb2xlTG9nZ2VyLmFjdGl2YXRlTG9ncygncGVyZicsICdwZXJmQ0QnLCAncGVyZkNvbXBvbmVudCcsICdwZXJmRG9tJyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBkZWFjdGl2YXRlTG9nKGtleToga2V5b2YgSU5neENvbnNvbGVMb2dnZXJDb25maWcpIHtcclxuICAgIGlmICghIU5neENvbnNvbGVMb2dnZXIuY29uZmlnICYmIE9iamVjdC5rZXlzKE5neENvbnNvbGVMb2dnZXIuY29uZmlnKS5maW5kKGsgPT4ga2V5ID09PSBrKSkge1xyXG4gICAgICBOZ3hDb25zb2xlTG9nZ2VyW2tleV0gPSBOZ3hDb25zb2xlTG9nZ2VyLmZuQ29uc29sZUxvZ2dlck51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZGVhY3RpdmF0ZUxvZ3MoLi4ua2V5czogKGtleW9mIElOZ3hDb25zb2xlTG9nZ2VyQ29uZmlnKVtdKSB7XHJcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IE5neENvbnNvbGVMb2dnZXIuZGVhY3RpdmF0ZUxvZyhrZXkpKTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBkZWFjdGl2YXRlUGVyZkxvZ3MoKSB7XHJcbiAgICBOZ3hDb25zb2xlTG9nZ2VyLmRlYWN0aXZhdGVMb2dzKCdwZXJmJywgJ3BlcmZDRCcsICdwZXJmQ29tcG9uZW50JywgJ3BlcmZEb20nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIGdldENvbnNvbGVEYXRhKGtleTogc3RyaW5nLCBjb25maWdEYXRhOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHsgbG9nUHJlZml4OiBzdHJpbmc7IGxvZ0NvbG9yOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XHJcbiAgICBsZXQgbG9nUHJlZml4ID0ga2V5O1xyXG4gICAgbGV0IGxvZ0NvbG9yITogc3RyaW5nO1xyXG4gICAgaWYgKGNvbmZpZ0RhdGEgaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICBpZiAoY29uZmlnRGF0YS5sZW5ndGggPj0gMikge1xyXG4gICAgICAgIGxvZ1ByZWZpeCA9IGNvbmZpZ0RhdGFbMV07XHJcbiAgICAgICAgbG9nQ29sb3IgPSBjb25maWdEYXRhWzBdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEJhZCBjb25maWd1cmF0aW9uIGZvciBrZXkgJHtsb2dQcmVmaXh9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxvZ0NvbG9yID0gY29uZmlnRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBsb2dQcmVmaXgsIGxvZ0NvbG9yIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHN0YXRpYyBpbml0Q29uc29sZShsb2dQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZCwgbG9nQ29sb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCB7XHJcbiAgICBpZiAoIWxvZ1ByZWZpeCB8fCAhbG9nQ29sb3IpIHtcclxuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7XHJcbiAgICB9XHJcbiAgICAvLyBDYXBpdGFsaXplIHByZWZpeFxyXG4gICAgY29uc3QgbG9nUHJlZml4Q2FwaXRhbGl6ZWQgPSBOZ3hDb25zb2xlTG9nZ2VyLnByZXBhcmVMb2dQcmVmaXgobG9nUHJlZml4KTtcclxuICAgIGNvbnN0IHVhID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7XHJcbiAgICAvLyBDaGVjayBpZiBpZVxyXG4gICAgY29uc3QgbXNpZSA9IHVhPy5pbmRleE9mKCdNU0lFICcpO1xyXG4gICAgaWYgKG1zaWUgPiAwKSB7XHJcbiAgICAgIHJldHVybiBjb25zb2xlLmluZm8uYmluZChjb25zb2xlLCBgJHtsb2dQcmVmaXhDYXBpdGFsaXplZH06YCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gY29uc29sZS5pbmZvLmJpbmQoY29uc29sZSwgYCVjJHtsb2dQcmVmaXhDYXBpdGFsaXplZH06YCwgYGNvbG9yOiAke2xvZ0NvbG9yfWApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcHJlcGFyZUxvZ1ByZWZpeChsb2dQcmVmaXg6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgbG9nUHJlZml4Q2FwaXRhbGl6ZWQgPSBgJHtsb2dQcmVmaXguY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtsb2dQcmVmaXguc2xpY2UoMSl9YDtcclxuICAgIC8vIHBhZEVuZCBkb2VzIG5vdCBleGl0cyBpbiBJRTExXHJcbiAgICAvLyA8PT4gbG9nUHJlZml4Q2FwaXRhbGl6ZWQucGFkRW5kKE5neENvbnNvbGVMb2dnZXIucHJlZml4TGVuZ3RoLCAnICcpXHJcbiAgICBpZiAobG9nUHJlZml4Q2FwaXRhbGl6ZWQubGVuZ3RoIDwgTmd4Q29uc29sZUxvZ2dlci5wcmVmaXhNaW5QYWQpIHtcclxuICAgICAgd2hpbGUgKGxvZ1ByZWZpeENhcGl0YWxpemVkLmxlbmd0aCA8IE5neENvbnNvbGVMb2dnZXIucHJlZml4TWluUGFkKSB7XHJcbiAgICAgICAgLy8gQWRkIHNwYWNlXHJcbiAgICAgICAgbG9nUHJlZml4Q2FwaXRhbGl6ZWQgPSBgJHtsb2dQcmVmaXhDYXBpdGFsaXplZH0gYDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGxvZ1ByZWZpeENhcGl0YWxpemVkO1xyXG4gIH1cclxufVxyXG4iXX0=