1 | ;
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const path_1 = require("path");
|
7 | const debug_1 = __importDefault(require("debug"));
|
8 | const json5_1 = __importDefault(require("json5"));
|
9 | const lodash_1 = require("lodash");
|
10 | const promisified_functions_1 = require("../utils/promisified-functions");
|
11 | const option_1 = __importDefault(require("./option"));
|
12 | const option_source_1 = __importDefault(require("./option-source"));
|
13 | const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd"));
|
14 | const render_template_1 = __importDefault(require("../utils/render-template"));
|
15 | const warning_message_1 = __importDefault(require("../notifications/warning-message"));
|
16 | const log_1 = __importDefault(require("../cli/log"));
|
17 | const DEBUG_LOGGER = debug_1.default('testcafe:configuration');
|
18 | class Configuration {
|
19 | constructor(configurationFileName) {
|
20 | this._options = {};
|
21 | this._filePath = Configuration._resolveFilePath(configurationFileName);
|
22 | this._overriddenOptions = [];
|
23 | }
|
24 | static _fromObj(obj) {
|
25 | const result = Object.create(null);
|
26 | Object.entries(obj).forEach(([key, value]) => {
|
27 | const option = new option_1.default(key, value);
|
28 | result[key] = option;
|
29 | });
|
30 | return result;
|
31 | }
|
32 | static _showConsoleWarning(message) {
|
33 | log_1.default.write(message);
|
34 | }
|
35 | static _showWarningForError(error, warningTemplate, ...args) {
|
36 | const message = render_template_1.default(warningTemplate, ...args);
|
37 | Configuration._showConsoleWarning(message);
|
38 | DEBUG_LOGGER(message);
|
39 | DEBUG_LOGGER(error);
|
40 | }
|
41 | static _resolveFilePath(path) {
|
42 | if (!path)
|
43 | return null;
|
44 | return path_1.isAbsolute(path) ? path : resolve_path_relatively_cwd_1.default(path);
|
45 | }
|
46 | async init() {
|
47 | this._overriddenOptions = [];
|
48 | }
|
49 | mergeOptions(options) {
|
50 | Object.entries(options).map(([key, value]) => {
|
51 | const option = this._ensureOption(key, value, option_source_1.default.Input);
|
52 | if (value === void 0)
|
53 | return;
|
54 | this._setOptionValue(option, value);
|
55 | });
|
56 | }
|
57 | mergeDeep(option, source) {
|
58 | lodash_1.mergeWith(option.value, source, (targetValue, sourceValue, property) => {
|
59 | this._addOverriddenOptionIfNecessary(targetValue, sourceValue, option.source, `${option.name}.${property}`);
|
60 | return sourceValue !== void 0 ? sourceValue : targetValue;
|
61 | });
|
62 | }
|
63 | getOption(key) {
|
64 | if (!key)
|
65 | return void 0;
|
66 | const option = this._options[key];
|
67 | if (!option)
|
68 | return void 0;
|
69 | return option.value;
|
70 | }
|
71 | getOptions() {
|
72 | const result = Object.create(null);
|
73 | Object.entries(this._options).forEach(([name, option]) => {
|
74 | result[name] = option.value;
|
75 | });
|
76 | return result;
|
77 | }
|
78 | clone() {
|
79 | return lodash_1.cloneDeep(this);
|
80 | }
|
81 | get filePath() {
|
82 | return this._filePath;
|
83 | }
|
84 | async _load() {
|
85 | if (!this.filePath)
|
86 | return null;
|
87 | if (!await this._isConfigurationFileExists())
|
88 | return null;
|
89 | const configurationFileContent = await this._readConfigurationFileContent();
|
90 | if (!configurationFileContent)
|
91 | return null;
|
92 | return this._parseConfigurationFileContent(configurationFileContent);
|
93 | }
|
94 | async _isConfigurationFileExists() {
|
95 | try {
|
96 | await promisified_functions_1.stat(this.filePath);
|
97 | return true;
|
98 | }
|
99 | catch (error) {
|
100 | DEBUG_LOGGER(render_template_1.default(warning_message_1.default.cannotFindConfigurationFile, this.filePath, error.stack));
|
101 | return false;
|
102 | }
|
103 | }
|
104 | async _readConfigurationFileContent() {
|
105 | try {
|
106 | return await promisified_functions_1.readFile(this.filePath);
|
107 | }
|
108 | catch (error) {
|
109 | Configuration._showWarningForError(error, warning_message_1.default.cannotReadConfigFile);
|
110 | }
|
111 | return null;
|
112 | }
|
113 | _parseConfigurationFileContent(configurationFileContent) {
|
114 | try {
|
115 | return json5_1.default.parse(configurationFileContent.toString());
|
116 | }
|
117 | catch (error) {
|
118 | Configuration._showWarningForError(error, warning_message_1.default.cannotParseConfigFile, this._filePath);
|
119 | }
|
120 | return null;
|
121 | }
|
122 | _ensureArrayOption(name) {
|
123 | const options = this._options[name];
|
124 | if (!options)
|
125 | return;
|
126 | // NOTE: a hack to fix lodash type definitions
|
127 | // @ts-ignore
|
128 | options.value = lodash_1.castArray(options.value);
|
129 | }
|
130 | _ensureOption(name, value, source) {
|
131 | let option = null;
|
132 | if (name in this._options)
|
133 | option = this._options[name];
|
134 | else {
|
135 | option = new option_1.default(name, value, source);
|
136 | this._options[name] = option;
|
137 | }
|
138 | return option;
|
139 | }
|
140 | _ensureOptionWithValue(name, defaultValue, source) {
|
141 | const option = this._ensureOption(name, defaultValue, source);
|
142 | if (option.value !== void 0)
|
143 | return;
|
144 | option.value = defaultValue;
|
145 | option.source = source;
|
146 | }
|
147 | _addOverriddenOptionIfNecessary(value1, value2, source, optionName) {
|
148 | if (value1 === void 0 || value2 === void 0 || value1 === value2 || source !== option_source_1.default.Configuration)
|
149 | return;
|
150 | this._overriddenOptions.push(optionName);
|
151 | }
|
152 | _setOptionValue(option, value) {
|
153 | if (lodash_1.isPlainObject(option.value) && lodash_1.isPlainObject(value))
|
154 | this.mergeDeep(option, value);
|
155 | else {
|
156 | this._addOverriddenOptionIfNecessary(option.value, value, option.source, option.name);
|
157 | option.value = value;
|
158 | }
|
159 | option.source = option_source_1.default.Input;
|
160 | }
|
161 | }
|
162 | exports.default = Configuration;
|
163 | module.exports = exports.default;
|
164 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0JBQWtDO0FBQ2xDLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsbUNBQXdFO0FBQ3hFLDBFQUFnRTtBQUNoRSxzREFBOEI7QUFDOUIsb0VBQTJDO0FBQzNDLHVHQUE0RTtBQUM1RSwrRUFBc0Q7QUFDdEQsdUZBQWdFO0FBQ2hFLHFEQUE2QjtBQUc3QixNQUFNLFlBQVksR0FBRyxlQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUVyRCxNQUFxQixhQUFhO0lBSzlCLFlBQW9CLHFCQUFvQztRQUNwRCxJQUFJLENBQUMsUUFBUSxHQUFJLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVTLE1BQU0sQ0FBQyxRQUFRLENBQUUsR0FBVztRQUNsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRW5DLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGdCQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRVMsTUFBTSxDQUFDLG1CQUFtQixDQUFFLE9BQWU7UUFDakQsYUFBRyxD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QUFtQixFQUFFLE1BQW9CLEVBQUUsVUFBa0I7UUFDekgsSUFBSSxNQUFNLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLHVCQUFZLENBQUMsYUFBYTtZQUNwRyxPQUFPO1FBRVgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRVMsZUFBZSxDQUFFLE1BQWMsRUFBRSxLQUFrQjtRQUN6RCxJQUFJLHNCQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLHNCQUFhLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQWUsQ0FBQyxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXRGLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyx1QkFBWSxDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0NBQ0o7QUF4TUQsZ0NBd01DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNBYnNvbHV0ZSB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBjYXN0QXJyYXksIGNsb25lRGVlcCwgaXNQbGFpbk9iamVjdCwgbWVyZ2VXaXRoIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IHN0YXQsIHJlYWRGaWxlIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzaWZpZWQtZnVuY3Rpb25zJztcbmltcG9ydCBPcHRpb24gZnJvbSAnLi9vcHRpb24nO1xuaW1wb3J0IE9wdGlvblNvdXJjZSBmcm9tICcuL29wdGlvbi1zb3VyY2UnO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuaW1wb3J0IHJlbmRlclRlbXBsYXRlIGZyb20gJy4uL3V0aWxzL3JlbmRlci10ZW1wbGF0ZSc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFUyBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbWVzc2FnZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL2NsaS9sb2cnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IERFQlVHX0xPR0dFUiA9IGRlYnVnKCd0ZXN0Y2FmZTpjb25maWd1cmF0aW9uJyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbmZpZ3VyYXRpb24ge1xuICAgIHByb3RlY3RlZCBfb3B0aW9uczogRGljdGlvbmFyeTxPcHRpb24+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZmlsZVBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgcHJvdGVjdGVkIF9vdmVycmlkZGVuT3B0aW9uczogc3RyaW5nW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKGNvbmZpZ3VyYXRpb25GaWxlTmFtZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9vcHRpb25zICA9IHt9O1xuICAgICAgICB0aGlzLl9maWxlUGF0aCA9IENvbmZpZ3VyYXRpb24uX3Jlc29sdmVGaWxlUGF0aChjb25maWd1cmF0aW9uRmlsZU5hbWUpO1xuXG4gICAgICAgIHRoaXMuX292ZXJyaWRkZW5PcHRpb25zID0gW107XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfZnJvbU9iaiAob2JqOiBvYmplY3QpOiBEaWN0aW9uYXJ5PE9wdGlvbj4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG9iaikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSBuZXcgT3B0aW9uKGtleSwgdmFsdWUpO1xuXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IG9wdGlvbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF9zaG93Q29uc29sZVdhcm5pbmcgKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsb2cud3JpdGUobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3Nob3dXYXJuaW5nRm9yRXJyb3IgKGVycm9yOiBFcnJvciwgd2FybmluZ1RlbXBsYXRlOiBzdHJpbmcsIC4uLmFyZ3M6IFRlbXBsYXRlQXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZW5kZXJUZW1wbGF0ZSh3YXJuaW5nVGVtcGxhdGUsIC4uLmFyZ3MpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24uX3Nob3dDb25zb2xlV2FybmluZyhtZXNzYWdlKTtcblxuICAgICAgICBERUJVR19MT0dHRVIobWVzc2FnZSk7XG4gICAgICAgIERFQlVHX0xPR0dFUihlcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgX3Jlc29sdmVGaWxlUGF0aCAocGF0aDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAoIXBhdGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gaXNBYnNvbHV0ZShwYXRoKSA/IHBhdGggOiByZXNvbHZlUGF0aFJlbGF0aXZlbHlDd2QocGF0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXQgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZU9wdGlvbnMgKG9wdGlvbnM6IG9iamVjdCk6IHZvaWQge1xuICAgICAgICBPYmplY3QuZW50cmllcyhvcHRpb25zKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5fZW5zdXJlT3B0aW9uKGtleSwgdmFsdWUsIE9wdGlvblNvdXJjZS5JbnB1dCk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdm9pZCAwKVxuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5fc2V0T3B0aW9uVmFsdWUob3B0aW9uLCB2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBtZXJnZURlZXAgKG9wdGlvbjogT3B0aW9uLCBzb3VyY2U6IG9iamVjdCk6IHZvaWQge1xuICAgICAgICBtZXJnZVdpdGgob3B0aW9uLnZhbHVlLCBzb3VyY2UsICh0YXJnZXRWYWx1ZTogT3B0aW9uVmFsdWUsIHNvdXJjZVZhbHVlOiBPcHRpb25WYWx1ZSwgcHJvcGVydHk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fYWRkT3ZlcnJpZGRlbk9wdGlvbklmTmVjZXNzYXJ5KHRhcmdldFZhbHVlLCBzb3VyY2VWYWx1ZSwgb3B0aW9uLnNvdXJjZSwgYCR7b3B0aW9uLm5hbWV9LiR7cHJvcGVydHl9YCk7XG5cbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VWYWx1ZSAhPT0gdm9pZCAwID8gc291cmNlVmFsdWUgOiB0YXJnZXRWYWx1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbiAoa2V5OiBzdHJpbmcpOiBPcHRpb25WYWx1ZSB7XG4gICAgICAgIGlmICgha2V5KVxuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcblxuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9vcHRpb25zW2tleV07XG5cbiAgICAgICAgaWYgKCFvcHRpb24pXG4gICAgICAgICAgICByZXR1cm4gdm9pZCAwO1xuXG4gICAgICAgIHJldHVybiBvcHRpb24udmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE9wdGlvbnMgKCk6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLl9vcHRpb25zKS5mb3JFYWNoKChbbmFtZSwgb3B0aW9uXSkgPT4ge1xuICAgICAgICAgICAgcmVzdWx0W25hbWVdID0gb3B0aW9uLnZhbHVlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9uZSAoKTogQ29uZmlndXJhdGlvbiB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlUGF0aCAoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWxlUGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2xvYWQgKCk6IFByb21pc2U8bnVsbCB8IG9iamVjdD4ge1xuICAgICAgICBpZiAoIXRoaXMuZmlsZVBhdGgpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIWF3YWl0IHRoaXMuX2lzQ29uZmlndXJhdGlvbkZpbGVFeGlzdHMoKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudCA9IGF3YWl0IHRoaXMuX3JlYWRDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQoKTtcblxuICAgICAgICBpZiAoIWNvbmZpZ3VyYXRpb25GaWxlQ29udGVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJzZUNvbmZpZ3VyYXRpb25GaWxlQ29udGVudChjb25maWd1cmF0aW9uRmlsZUNvbnRlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBfaXNDb25maWd1cmF0aW9uRmlsZUV4aXN0cyAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBzdGF0KHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIERFQlVHX0xPR0dFUihyZW5kZXJUZW1wbGF0ZShXQVJOSU5HX01FU1NBR0VTLmNhbm5vdEZpbmRDb25maWd1cmF0aW9uRmlsZSwgdGhpcy5maWxlUGF0aCwgZXJyb3Iuc3RhY2spKTtcblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9yZWFkQ29uZmlndXJhdGlvbkZpbGVDb250ZW50ICgpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZWFkRmlsZSh0aGlzLmZpbGVQYXRoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uX3Nob3dXYXJuaW5nRm9yRXJyb3IoZXJyb3IsIFdBUk5JTkdfTUVTU0FHRVMuY2Fubm90UmVhZENvbmZpZ0ZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcGFyc2VDb25maWd1cmF0aW9uRmlsZUNvbnRlbnQgKGNvbmZpZ3VyYXRpb25GaWxlQ29udGVudDogQnVmZmVyKTogb2JqZWN0IHwgbnVsbCB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTjUucGFyc2UoY29uZmlndXJhdGlvbkZpbGVDb250ZW50LnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd1dhcm5pbmdGb3JFcnJvcihlcnJvciwgV0FSTklOR19NRVNTQUdFUy5jYW5ub3RQYXJzZUNvbmZpZ0ZpbGUsIHRoaXMuX2ZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZW5zdXJlQXJyYXlPcHRpb24gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fb3B0aW9uc1tuYW1lXTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gTk9URTogYSBoYWNrIHRvIGZpeCBsb2Rhc2ggdHlwZSBkZWZpbml0aW9uc1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdGlvbnMudmFsdWUgPSBjYXN0QXJyYXkob3B0aW9ucy52YWx1ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9lbnN1cmVPcHRpb24gKG5hbWU6IHN0cmluZywgdmFsdWU6IE9wdGlvblZhbHVlLCBzb3VyY2U6IE9wdGlvblNvdXJjZSk6IE9wdGlvbiB7XG4gICAgICAgIGxldCBvcHRpb24gPSBudWxsO1xuXG4gICAgICAgIGlmIChuYW1lIGluIHRoaXMuX29wdGlvbnMpXG4gICAgICAgICAgICBvcHRpb24gPSB0aGlzLl9vcHRpb25zW25hbWVdO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBPcHRpb24obmFtZSwgdmFsdWUsIHNvdXJjZSk7XG5cbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNbbmFtZV0gPSBvcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9uO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfZW5zdXJlT3B0aW9uV2l0aFZhbHVlIChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogT3B0aW9uVmFsdWUsIHNvdXJjZTogT3B0aW9uU291cmNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUsIHNvdXJjZSk7XG5cbiAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSAhPT0gdm9pZCAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIG9wdGlvbi52YWx1ZSAgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgIG9wdGlvbi5zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIF9hZGRPdmVycmlkZGVuT3B0aW9uSWZOZWNlc3NhcnkgKHZhbHVlMTogT3B0aW9uVmFsdWUsIHZhbHVlMjogT3B0aW9uVmFsdWUsIHNvdXJjZTogT3B0aW9uU291cmNlLCBvcHRpb25OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlMSA9PT0gdm9pZCAwIHx8IHZhbHVlMiA9PT0gdm9pZCAwIHx8IHZhbHVlMSA9PT0gdmFsdWUyIHx8IHNvdXJjZSAhPT0gT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5fb3ZlcnJpZGRlbk9wdGlvbnMucHVzaChvcHRpb25OYW1lKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3NldE9wdGlvblZhbHVlIChvcHRpb246IE9wdGlvbiwgdmFsdWU6IE9wdGlvblZhbHVlKTogdm9pZCB7XG4gICAgICAgIGlmIChpc1BsYWluT2JqZWN0KG9wdGlvbi52YWx1ZSkgJiYgaXNQbGFpbk9iamVjdCh2YWx1ZSkpXG4gICAgICAgICAgICB0aGlzLm1lcmdlRGVlcChvcHRpb24sIHZhbHVlIGFzIG9iamVjdCk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fYWRkT3ZlcnJpZGRlbk9wdGlvbklmTmVjZXNzYXJ5KG9wdGlvbi52YWx1ZSwgdmFsdWUsIG9wdGlvbi5zb3VyY2UsIG9wdGlvbi5uYW1lKTtcblxuICAgICAgICAgICAgb3B0aW9uLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb24uc291cmNlID0gT3B0aW9uU291cmNlLklucHV0O1xuICAgIH1cbn1cbiJdfQ== |
\ | No newline at end of file |