Website : rimsha.abasa.com
backdoor
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
var
/
canvas
/
node_modules
/
testcafe
/
lib
/
configuration
/
Filename :
configuration-base.js
back
Copy
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const debug_1 = __importDefault(require("debug")); const json5_1 = __importDefault(require("json5")); const lodash_1 = require("lodash"); const promisified_functions_1 = require("../utils/promisified-functions"); const option_1 = __importDefault(require("./option")); const option_source_1 = __importDefault(require("./option-source")); const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd")); const render_template_1 = __importDefault(require("../utils/render-template")); const warning_message_1 = __importDefault(require("../notifications/warning-message")); const log_1 = __importDefault(require("../cli/log")); const DEBUG_LOGGER = debug_1.default('testcafe:configuration'); class Configuration { constructor(configurationFileName) { this._options = {}; this._filePath = Configuration._resolveFilePath(configurationFileName); this._overriddenOptions = []; } static _fromObj(obj) { const result = Object.create(null); Object.entries(obj).forEach(([key, value]) => { const option = new option_1.default(key, value); result[key] = option; }); return result; } static _showConsoleWarning(message) { log_1.default.write(message); } static _showWarningForError(error, warningTemplate, ...args) { const message = render_template_1.default(warningTemplate, ...args); Configuration._showConsoleWarning(message); DEBUG_LOGGER(message); DEBUG_LOGGER(error); } static _resolveFilePath(path) { if (!path) return null; return path_1.isAbsolute(path) ? path : resolve_path_relatively_cwd_1.default(path); } async init() { this._overriddenOptions = []; } mergeOptions(options) { Object.entries(options).map(([key, value]) => { const option = this._ensureOption(key, value, option_source_1.default.Input); if (value === void 0) return; this._setOptionValue(option, value); }); } mergeDeep(option, source) { lodash_1.mergeWith(option.value, source, (targetValue, sourceValue, property) => { this._addOverriddenOptionIfNecessary(targetValue, sourceValue, option.source, `${option.name}.${property}`); return sourceValue !== void 0 ? sourceValue : targetValue; }); } getOption(key) { if (!key) return void 0; const option = this._options[key]; if (!option) return void 0; return option.value; } getOptions(predicate) { const result = Object.create(null); let includeInResult = true; Object.entries(this._options).forEach(([name, option]) => { includeInResult = predicate ? predicate(name, option) : true; if (includeInResult) result[name] = option.value; }); return result; } clone() { return lodash_1.cloneDeep(this); } get filePath() { return this._filePath; } async _load() { if (!this.filePath) return null; if (!await this._isConfigurationFileExists()) return null; const configurationFileContent = await this._readConfigurationFileContent(); if (!configurationFileContent) return null; return this._parseConfigurationFileContent(configurationFileContent); } async _isConfigurationFileExists() { try { await promisified_functions_1.stat(this.filePath); return true; } catch (error) { DEBUG_LOGGER(render_template_1.default(warning_message_1.default.cannotFindConfigurationFile, this.filePath, error.stack)); return false; } } async _readConfigurationFileContent() { try { return await promisified_functions_1.readFile(this.filePath); } catch (error) { Configuration._showWarningForError(error, warning_message_1.default.cannotReadConfigFile); } return null; } _parseConfigurationFileContent(configurationFileContent) { try { return json5_1.default.parse(configurationFileContent.toString()); } catch (error) { Configuration._showWarningForError(error, warning_message_1.default.cannotParseConfigFile, this._filePath); } return null; } _ensureArrayOption(name) { const options = this._options[name]; if (!options) return; // NOTE: a hack to fix lodash type definitions // @ts-ignore options.value = lodash_1.castArray(options.value); } _ensureOption(name, value, source) { let option = null; if (name in this._options) option = this._options[name]; else { option = new option_1.default(name, value, source); this._options[name] = option; } return option; } _ensureOptionWithValue(name, defaultValue, source) { const option = this._ensureOption(name, defaultValue, source); if (option.value !== void 0) return; option.value = defaultValue; option.source = source; } _addOverriddenOptionIfNecessary(value1, value2, source, optionName) { if (value1 === void 0 || value2 === void 0 || value1 === value2 || source !== option_source_1.default.Configuration) return; this._overriddenOptions.push(optionName); } _setOptionValue(option, value) { if (lodash_1.isPlainObject(option.value) && lodash_1.isPlainObject(value)) this.mergeDeep(option, value); else { this._addOverriddenOptionIfNecessary(option.value, value, option.source, option.name); option.value = value; } option.source = option_source_1.default.Input; } } exports.default = Configuration; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQWtDO0FBQ2xDLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsbUNBS2dCO0FBRWhCLDBFQUFnRTtBQUNoRSxzREFBOEI7QUFDOUIsb0VBQTJDO0FBQzNDLHVHQUE0RTtBQUM1RSwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHFEQUE2QjtBQUc3QixNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUVyRCxNQUFxQixhQUFhO0lBSzlCLFlBQW9CLHFCQUFvQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVTLE1BQU0sQ0FBQyxRQUFRLENBQUUsR0FBVztRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsTUFBTSxDQUFDLG1CQUFtQixDQUFFLE9BQWU7UUFDakQsYUFBRyxD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QU0sQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDO1lBQ3ZCLE9BQU87UUFFWCxNQUFNLENBQUMsS0FBSyxHQUFJLFlBQVksQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUMzQixDQUFDO0lBRVMsK0JBQStCLENBQUUsTUFBbUIsRUFBRSxNQUFtQixFQUFFLE1BQW9CLEVBQUUsVUFBa0I7UUFDekgsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLHVCQUFZLENBQUMsYUFBYTtZQUNwRyxPQUFPO1FBRVgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsZUFBZSxDQUFFLE1BQWMsRUFBRSxLQUFrQjtRQUN6RCxJQUFJLHNCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLHNCQUFhLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQWUsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRGLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyx1QkFBWSxDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUE1TUQsZ0NBNE1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBYnNvbHV0ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQge1xuICAgIGNhc3RBcnJheSxcbiAgICBjbG9uZURlZXAsXG4gICAgaXNQbGFpbk9iamVjdCxcbiAgICBtZXJnZVdpdGhcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgc3RhdCwgcmVhZEZpbGUgfSBmcm9tICcuLi91dGlscy9wcm9taXNpZmllZC1mdW5jdGlvbnMnO1xuaW1wb3J0IE9wdGlvbiBmcm9tICcuL29wdGlvbic7XG5pbXBvcnQgT3B0aW9uU291cmNlIGZyb20gJy4vb3B0aW9uLXNvdXJjZSc7XG5pbXBvcnQgcmVzb2x2ZVBhdGhSZWxhdGl2ZWx5Q3dkIGZyb20gJy4uL3V0aWxzL3Jlc29sdmUtcGF0aC1yZWxhdGl2ZWx5LWN3ZCc7XG5pbXBvcnQgcmVuZGVyVGVtcGxhdGUgZnJvbSAnLi4vdXRpbHMvcmVuZGVyLXRlbXBsYXRlJztcbmltcG9ydCBXQVJOSU5HX01FU1NBR0VTIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vY2xpL2xvZyc7XG5pbXBvcnQgeyBEaWN0aW9uYXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuY29uc3QgREVCVUdfTE9HR0VSID0gZGVidWcoJ3Rlc3RjYWZlOmNvbmZpZ3VyYXRpb24nKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29uZmlndXJhdGlvbiB7XG4gICAgcHJvdGVjdGVkIF9vcHRpb25zOiBEaWN0aW9uYXJ5PE9wdGlvbj47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maWxlUGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm90ZWN0ZWQgX292ZXJyaWRkZW5PcHRpb25zOiBzdHJpbmdbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoY29uZmlndXJhdGlvbkZpbGVOYW1lOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgID0ge307XG4gICAgICAgIHRoaXMuX2ZpbGVQYXRoID0gQ29uZmlndXJhdGlvbi5fcmVzb2x2ZUZpbGVQYXRoKGNvbmZpZ3VyYXRpb25GaWxlTmFtZSk7XG5cbiAgICAgICAgdGhpcy5fb3ZlcnJpZGRlbk9wdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9mcm9tT2JqIChvYmo6IG9iamVjdCk6IERpY3Rpb25hcnk8T3B0aW9uPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgT2JqZWN0LmVudHJpZXMob2JqKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IG5ldyBPcHRpb24oa2V5LCB2YWx1ZSk7XG5cbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gb3B0aW9uO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzdGF0aWMgX3Nob3dDb25zb2xlV2FybmluZyAobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxvZy53cml0ZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfc2hvd1dhcm5pbmdGb3JFcnJvciAoZXJyb3I6IEVycm9yLCB3YXJuaW5nVGVtcGxhdGU6IHN0cmluZywgLi4uYXJnczogVGVtcGxhdGVBcmd1bWVudHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlbmRlclRlbXBsYXRlKHdhcm5pbmdUZW1wbGF0ZSwgLi4uYXJncyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd0NvbnNvbGVXYXJuaW5nKG1lc3NhZ2UpO1xuXG4gICAgICAgIERFQlVHX0xPR0dFUihtZXNzYWdlKTtcbiAgICAgICAgREVCVUdfTE9HR0VSKGVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBfcmVzb2x2ZUZpbGVQYXRoIChwYXRoOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICghcGF0aClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBpc0Fic29sdXRlKHBhdGgpID8gcGF0aCA6IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZChwYXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaW5pdCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuX292ZXJyaWRkZW5PcHRpb25zID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIG1lcmdlT3B0aW9ucyAob3B0aW9uczogb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9lbnN1cmVPcHRpb24oa2V5LCB2YWx1ZSwgT3B0aW9uU291cmNlLklucHV0KTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXRPcHRpb25WYWx1ZShvcHRpb24sIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG1lcmdlRGVlcCAob3B0aW9uOiBPcHRpb24sIHNvdXJjZTogb2JqZWN0KTogdm9pZCB7XG4gICAgICAgIG1lcmdlV2l0aChvcHRpb24udmFsdWUsIHNvdXJjZSwgKHRhcmdldFZhbHVlOiBPcHRpb25WYWx1ZSwgc291cmNlVmFsdWU6IE9wdGlvblZhbHVlLCBwcm9wZXJ0eTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9hZGRPdmVycmlkZGVuT3B0aW9uSWZOZWNlc3NhcnkodGFyZ2V0VmFsdWUsIHNvdXJjZVZhbHVlLCBvcHRpb24uc291cmNlLCBgJHtvcHRpb24ubmFtZX0uJHtwcm9wZXJ0eX1gKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZVZhbHVlICE9PSB2b2lkIDAgPyBzb3VyY2VWYWx1ZSA6IHRhcmdldFZhbHVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3B0aW9uIChrZXk6IHN0cmluZyk6IE9wdGlvblZhbHVlIHtcbiAgICAgICAgaWYgKCFrZXkpXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX29wdGlvbnNba2V5XTtcblxuICAgICAgICBpZiAoIW9wdGlvbilcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3B0aW9ucyAocHJlZGljYXRlPzogKG5hbWU6IHN0cmluZywgb3B0aW9uOiBPcHRpb24pID0+IGJvb2xlYW4pOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBsZXQgaW5jbHVkZUluUmVzdWx0ID0gdHJ1ZTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLl9vcHRpb25zKS5mb3JFYWNoKChbbmFtZSwgb3B0aW9uXSkgPT4ge1xuICAgICAgICAgICAgaW5jbHVkZUluUmVzdWx0ID0gcHJlZGljYXRlID8gcHJlZGljYXRlKG5hbWUsIG9wdGlvbikgOiB0cnVlO1xuXG4gICAgICAgICAgICBpZiAoaW5jbHVkZUluUmVzdWx0KVxuICAgICAgICAgICAgICAgIHJlc3VsdFtuYW1lXSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvbmUgKCk6IENvbmZpZ3VyYXRpb24ge1xuICAgICAgICByZXR1cm4gY2xvbmVEZWVwKHRoaXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZmlsZVBhdGggKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZVBhdGg7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9sb2FkICgpOiBQcm9taXNlPG51bGwgfCBvYmplY3Q+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVQYXRoKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFhd2FpdCB0aGlzLl9pc0NvbmZpZ3VyYXRpb25GaWxlRXhpc3RzKCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQgPSBhd2FpdCB0aGlzLl9yZWFkQ29uZmlndXJhdGlvbkZpbGVDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQoY29uZmlndXJhdGlvbkZpbGVDb250ZW50KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgX2lzQ29uZmlndXJhdGlvbkZpbGVFeGlzdHMgKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgc3RhdCh0aGlzLmZpbGVQYXRoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBERUJVR19MT0dHRVIocmVuZGVyVGVtcGxhdGUoV0FSTklOR19NRVNTQUdFUy5jYW5ub3RGaW5kQ29uZmlndXJhdGlvbkZpbGUsIHRoaXMuZmlsZVBhdGgsIGVycm9yLnN0YWNrKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfcmVhZENvbmZpZ3VyYXRpb25GaWxlQ29udGVudCAoKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVhZEZpbGUodGhpcy5maWxlUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLl9zaG93V2FybmluZ0ZvckVycm9yKGVycm9yLCBXQVJOSU5HX01FU1NBR0VTLmNhbm5vdFJlYWRDb25maWdGaWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BhcnNlQ29uZmlndXJhdGlvbkZpbGVDb250ZW50IChjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQ6IEJ1ZmZlcik6IG9iamVjdCB8IG51bGwge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT041LnBhcnNlKGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudC50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uX3Nob3dXYXJuaW5nRm9yRXJyb3IoZXJyb3IsIFdBUk5JTkdfTUVTU0FHRVMuY2Fubm90UGFyc2VDb25maWdGaWxlLCB0aGlzLl9maWxlUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Vuc3VyZUFycmF5T3B0aW9uIChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbbmFtZV07XG5cbiAgICAgICAgaWYgKCFvcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIE5PVEU6IGEgaGFjayB0byBmaXggbG9kYXNoIHR5cGUgZGVmaW5pdGlvbnNcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBvcHRpb25zLnZhbHVlID0gY2FzdEFycmF5KG9wdGlvbnMudmFsdWUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZW5zdXJlT3B0aW9uIChuYW1lOiBzdHJpbmcsIHZhbHVlOiBPcHRpb25WYWx1ZSwgc291cmNlOiBPcHRpb25Tb3VyY2UpOiBPcHRpb24ge1xuICAgICAgICBsZXQgb3B0aW9uID0gbnVsbDtcblxuICAgICAgICBpZiAobmFtZSBpbiB0aGlzLl9vcHRpb25zKVxuICAgICAgICAgICAgb3B0aW9uID0gdGhpcy5fb3B0aW9uc1tuYW1lXTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb24gPSBuZXcgT3B0aW9uKG5hbWUsIHZhbHVlLCBzb3VyY2UpO1xuXG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zW25hbWVdID0gb3B0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbjtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZSAobmFtZTogc3RyaW5nLCBkZWZhdWx0VmFsdWU6IE9wdGlvblZhbHVlLCBzb3VyY2U6IE9wdGlvblNvdXJjZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9lbnN1cmVPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlLCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChvcHRpb24udmFsdWUgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBvcHRpb24udmFsdWUgID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICBvcHRpb24uc291cmNlID0gc291cmNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYWRkT3ZlcnJpZGRlbk9wdGlvbklmTmVjZXNzYXJ5ICh2YWx1ZTE6IE9wdGlvblZhbHVlLCB2YWx1ZTI6IE9wdGlvblZhbHVlLCBzb3VyY2U6IE9wdGlvblNvdXJjZSwgb3B0aW9uTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZTEgPT09IHZvaWQgMCB8fCB2YWx1ZTIgPT09IHZvaWQgMCB8fCB2YWx1ZTEgPT09IHZhbHVlMiB8fCBzb3VyY2UgIT09IE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX292ZXJyaWRkZW5PcHRpb25zLnB1c2gob3B0aW9uTmFtZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9zZXRPcHRpb25WYWx1ZSAob3B0aW9uOiBPcHRpb24sIHZhbHVlOiBPcHRpb25WYWx1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoaXNQbGFpbk9iamVjdChvcHRpb24udmFsdWUpICYmIGlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgICAgICAgdGhpcy5tZXJnZURlZXAob3B0aW9uLCB2YWx1ZSBhcyBvYmplY3QpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2FkZE92ZXJyaWRkZW5PcHRpb25JZk5lY2Vzc2FyeShvcHRpb24udmFsdWUsIHZhbHVlLCBvcHRpb24uc291cmNlLCBvcHRpb24ubmFtZSk7XG5cbiAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9uLnNvdXJjZSA9IE9wdGlvblNvdXJjZS5JbnB1dDtcbiAgICB9XG59XG4iXX0=