yds-tool 1.0.9 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/bin/main.js +85 -83
  2. package/package.json +1 -1
  3. package/src/main.ts +93 -95
package/bin/main.js CHANGED
@@ -64,7 +64,7 @@ const execCmd = (command, cwd) => __awaiter(void 0, void 0, void 0, function* ()
64
64
  stdio: [0, 1, 2],
65
65
  env
66
66
  });
67
- logger.info(`执行命令 ${command} 耗时 \x1B[34m <${Date.now() - start}ms>]`);
67
+ logger.info(`执行命令 ${command} 耗时 \x1B[34m <${Date.now() - start}ms>`);
68
68
  });
69
69
  const platform = os.platform();
70
70
  if (platform !== 'win32') {
@@ -141,6 +141,7 @@ class Main {
141
141
  }`);
142
142
  configFileCreated = true;
143
143
  }
144
+ logger.info(`<<<<<<<<<<<<<<检测git安装开始>>>>>>>>>>>>>>>>>`);
144
145
  const gitExists = yield vweb_core_1.util.cmd.exists('git');
145
146
  logger.info(`检查是否安装了git >> ${gitExists ? '已安装' : '未安装'}`);
146
147
  const gitHome = `${dir}/git-for-windows`;
@@ -149,120 +150,116 @@ class Main {
149
150
  logger.info(`下载git 安装包 ${gitZipName}`);
150
151
  const gitZipFile = `${dir}/${gitZipName}`;
151
152
  if (fs.existsSync(gitZipFile)) {
152
- logger.info(`删除已存在安装包 ${gitZipFile}`);
153
- fs.rmSync(gitZipFile);
153
+ yield execCmd(`${wget} ${RS_URL}/${gitZipName} -O "${gitZipFile}"`);
154
+ logger.info(`解压安装包 ${gitZipFile}`);
155
+ yield execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
154
156
  }
155
- yield execCmd(`${wget} ${RS_URL}/${gitZipName} -O "${gitZipFile}"`);
156
- logger.info(`解压安装包 ${gitZipFile}`);
157
- yield execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
158
- logger.info(`配置git环境变量`);
159
- yield execCmd(`setx PATH "%PATH%;${gitHome}\\bin;"`);
160
- fs.rmSync(gitZipFile);
161
157
  logger.info(`git 安装完成`);
162
158
  }
159
+ logger.info(`<<<<<<<<<<<<<<检测git安装结束>>>>>>>>>>>>>>>>>`);
160
+ logger.info(`<<<<<<<<<<<<<<检测java安装开始>>>>>>>>>>>>>>>>>`);
163
161
  const javaExists = yield vweb_core_1.util.cmd.exists('java');
164
162
  logger.info(`检查是否安装了java >> ${javaExists ? '已安装' : '未安装'}`);
163
+ let javaHome = env.JAVA_HOME;
165
164
  if (!javaExists) {
166
- logger.info('未找到java,准备安装java,开始下载jdk');
167
- const jdkZipName = 'jdk-8u471-windows-x64.zip';
168
- yield execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
169
- logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`);
170
- yield execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
171
- logger.info(`配置java环境变量`);
172
- let javaHome = `${dir}/jdk1.8.0_471`;
173
- yield execCmd(`setx JAVA_HOME "${javaHome}"`);
174
- yield execCmd(`setx CLASS_PATH ".;%JAVA_HOME%\\lib;"`);
175
- yield execCmd(`setx PATH "%PATH%;%JAVA_HOME%\\bin;"`);
176
- env.JAVA_HOME = javaHome;
177
- env.CLASS_PATH = ".;%JAVA_HOME%\\lib;";
178
- env.PATH = "%PATH%;%JAVA_HOME%\\bin;";
179
- logger.info(`java 安装完成 请重启终端`);
180
- }
181
- logger.info(`检查java版本`);
182
- const javaHome = env.JAVA_HOME;
165
+ javaHome = `${dir}/jdk1.8.0_471`;
166
+ if (!fs.existsSync(javaHome)) {
167
+ logger.info('未找到java,准备安装java,开始下载jdk');
168
+ const jdkZipName = 'jdk-8u471-windows-x64.zip';
169
+ if (!fs.existsSync(`${dir}/${jdkZipName}`)) {
170
+ logger.info(`下载jdk 安装包 ${jdkZipName}`);
171
+ yield execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
172
+ logger.info(`下载jdk 安装包 ${dir}/${jdkZipName} 已完成`);
173
+ }
174
+ logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`);
175
+ yield execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
176
+ logger.info(`jdk安装完成`);
177
+ }
178
+ }
183
179
  yield execCmd(`"${javaHome}/bin/java" -version`);
184
- if (javaHome) {
185
- let certsFilename = 'lib/security/cacerts';
186
- let certsFile = `${javaHome}/${certsFilename}`;
187
- if (!fs.existsSync(certsFile)) {
188
- certsFile = `${javaHome}/jre/${certsFilename}`;
180
+ logger.info(`<<<<<<<<<<<<<<检测java安装结束>>>>>>>>>>>>>>>>>`);
181
+ logger.info(`<<<<<<<<<<<<<<导入java证书开始>>>>>>>>>>>>>>>>>`);
182
+ let certsFilename = 'lib/security/cacerts';
183
+ let certsFile = `${javaHome}/${certsFilename}`;
184
+ if (!fs.existsSync(certsFile)) {
185
+ certsFile = `${javaHome}/jre/${certsFilename}`;
186
+ }
187
+ logger.info(`检查java证书目录 ${certsFile}`);
188
+ if (fs.existsSync(certsFile)) {
189
+ const keytoolCmd = `"${javaHome}/bin/keytool"`;
190
+ try {
191
+ yield execCmd(`${keytoolCmd} -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`);
192
+ logger.info(`yyrd.crt 证书已存在`);
189
193
  }
190
- logger.info(`检查java证书目录 ${certsFile}`);
191
- if (fs.existsSync(certsFile)) {
192
- const keytoolCmd = `"${javaHome}/bin/keytool"`;
193
- try {
194
- yield execCmd(`${keytoolCmd} -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`);
195
- logger.info(`yyrd.crt 证书已存在`);
196
- }
197
- catch (e) {
198
- logger.info(`导入 yyrd.crt 证书到java ${certsFile}`);
199
- yield execCmd(`${keytoolCmd} -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
200
- logger.info(`yyrd.crt 证书导入完成`);
201
- }
194
+ catch (e) {
195
+ logger.info(`导入 yyrd.crt 证书到java ${certsFile}`);
196
+ yield execCmd(`${keytoolCmd} -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
197
+ logger.info(`yyrd.crt 证书导入完成`);
202
198
  }
203
199
  }
204
- const mavenHome = `${dir}/maven-3.8.6`;
200
+ logger.info(`<<<<<<<<<<<<<<导入java证书结束>>>>>>>>>>>>>>>>>`);
201
+ logger.info(`<<<<<<<<<<<<<<检测maven安装开始>>>>>>>>>>>>>>>>>`);
205
202
  const mavenExists = yield vweb_core_1.util.cmd.exists('mvn');
203
+ const mavenHome = `${dir}/maven-3.8.6`;
206
204
  logger.info(`检查是否安装了maven >> ${mavenExists ? '已安装' : '未安装'}`);
207
205
  if (!mavenExists) {
208
- const mavenZipName = 'maven-3.8.6.zip';
209
- logger.info(`下载maven 安装包 ${mavenZipName}`);
210
- const mavenZipFile = `${dir}/${mavenZipName}`;
211
- if (fs.existsSync(mavenZipFile)) {
212
- logger.info(`删除已存在安装包 ${mavenZipFile}`);
213
- fs.rmSync(mavenZipFile);
214
- }
215
- yield execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
216
- logger.info(`解压安装包 ${mavenZipFile}`);
217
- yield execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
218
- fs.rmSync(mavenZipFile);
219
- try {
220
- let mvnPath = path.resolve(`${mavenHome}/bin`);
221
- yield execCmd(`setx PATH "%PATH%;${mvnPath}"`);
222
- logger.info(`✅ 成功!Maven路径【${mvnPath}】已添加到系统PATH环境变量`);
223
- }
224
- catch (err) {
225
- console.error('❌ 添加失败:', err.message);
206
+ if (!fs.existsSync(mavenHome)) {
207
+ const mavenZipName = 'maven-3.8.6.zip';
208
+ logger.info(`安装maven ${mavenZipName}`);
209
+ const mavenZipFile = `${dir}/${mavenZipName}`;
210
+ if (!fs.existsSync(mavenZipFile)) {
211
+ logger.info(`下载maven 安装包 ${mavenZipFile}`);
212
+ yield execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
213
+ logger.info(`下载maven 安装包 ${mavenZipFile} 已完成`);
214
+ }
215
+ logger.info(`解压安装包 ${mavenZipFile}`);
216
+ yield execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
217
+ logger.info(`maven 安装完成`);
226
218
  }
227
- logger.info(`maven 安装完成`);
228
219
  }
229
- logger.info(`初始化node环境`);
220
+ else if (!fs.existsSync(`${dir}/settings.xml`)) {
221
+ logger.info(`下载settings.xml`);
222
+ yield execCmd(`${wget} ${RS_URL}/settings.xml`);
223
+ logger.info(`下载settings.xml完成`);
224
+ }
225
+ logger.info(`<<<<<<<<<<<<<<检测maven安装完成>>>>>>>>>>>>>>>>>`);
226
+ logger.info(`<<<<<<<<<<<<<<初始化node环境 >>>>>>>>>>>>>>>>>`);
230
227
  yield execCmd('npm install -g typescript --registry=https://registry.npmmirror.com');
231
- logger.info(`初始化node环境完成`);
232
- logger.info(`检测code是否存在`);
228
+ logger.info(`<<<<<<<<<<<<<<初始化node环境完成>>>>>>>>>>>>>>>>>`);
229
+ logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`);
233
230
  const codeDir = `${dir}/yds-1.0.3`;
234
231
  if (!fs.existsSync(codeDir)) {
235
232
  const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip';
236
- logger.info(`下载code IDE 安装包 ${codeZipName}`);
233
+ logger.info(`安装YDS IDE ${codeZipName}`);
237
234
  const codeZipFile = `${dir}/${codeZipName}`;
238
- if (fs.existsSync(codeZipFile)) {
239
- logger.info(`删除已存在安装包 ${codeZipFile}`);
240
- fs.rmSync(codeZipFile);
235
+ if (!fs.existsSync(codeZipFile)) {
236
+ logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
237
+ yield execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
238
+ logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
241
239
  }
242
- yield execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
243
- logger.info(`解压安装包 ${codeZipFile}`);
244
- fs.mkdirSync(codeDir, { recursive: true });
245
240
  yield execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
246
- fs.rmSync(codeZipFile);
247
241
  yield new Promise((resolve) => setTimeout(resolve, 5000));
248
- logger.info(`code IDE 安装完成`);
249
242
  }
250
- logger.info(`初始化YDS IDE 全局配置`);
243
+ logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
244
+ logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置>>>>>>>>>>>>>>>>>`);
251
245
  const settingsJson = `${codeDir}/Code/data/user-data/User/settings.json`;
252
246
  let settingsJsonObj = {};
253
247
  if (fs.existsSync(settingsJson)) {
254
248
  settingsJsonObj = JSON.parse(fs.readFileSync(settingsJson).toString('utf-8'));
255
249
  }
256
- let settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
257
- if (!fs.existsSync(settingXml) && !fs.existsSync(`${dir}/settings.xml`)) {
258
- yield execCmd(`${wget} ${RS_URL}/settings.xml`);
259
- settingXml = path.resolve(`${dir}/settings.xml`);
250
+ if (!javaExists) {
251
+ settingsJsonObj["java.configuration.runtimes"] = [{ "name": "JavaSE-1.8", "path": javaHome }];
252
+ }
253
+ let settingXml = path.resolve(`${dir}/settings.xml`);
254
+ if (!fs.existsSync(settingXml)) {
255
+ settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
256
+ settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
260
257
  }
261
258
  settingsJsonObj["java.configuration.maven.globalSettings"] = settingXml;
262
259
  settingsJsonObj["java.configuration.maven.userSettings"] = settingXml;
263
260
  settingsJsonObj["maven.settingsFile"] = settingXml;
264
261
  fs.writeFileSync(settingsJson, JSON.stringify(settingsJsonObj, null, 4));
265
- logger.info(`初始化YDS IDE 全局配置完成`);
262
+ logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置完成>>>>>>>>>>>>>>>>>`);
266
263
  const sshDir = path.resolve(process.env.USERPROFILE, '.ssh');
267
264
  if (!fs.existsSync(sshDir)) {
268
265
  fs.mkdirSync(sshDir);
@@ -314,12 +311,17 @@ class Main {
314
311
  logger.error(`未找到git命令 ${gitCmd}, 请先执行 init 初始化制盘环境`);
315
312
  process.exit(1);
316
313
  }
314
+ gitCmd = `"${gitCmd}"`;
317
315
  }
318
316
  let settingXml = path.resolve(`${dir}/settings.xml`);
319
317
  let mvnCmd = 'mvn';
320
- let mvnExists = yield vweb_core_1.util.cmd.exists(mvnCmd);
321
318
  let mavenHome = `${dir}/maven-3.8.6`;
322
319
  if (!fs.existsSync(mavenHome)) {
320
+ let mvnExists = yield vweb_core_1.util.cmd.exists(mvnCmd);
321
+ if (!mvnExists) {
322
+ logger.error(`未找到mvn命令 ${mvnCmd}, 请先执行 init 初始化制盘环境`);
323
+ process.exit(1);
324
+ }
323
325
  if (!fs.existsSync(settingXml)) {
324
326
  logger.warn(`未找到maven配置文件 ${settingXml}, 下载settings.xml文件`);
325
327
  yield execCmd(`${wget} ${RS_URL}/settings.xml`, dir);
@@ -514,4 +516,4 @@ class Main {
514
516
  }
515
517
  }
516
518
  exports.default = Main;
517
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQWtDO0FBQ2xDLGlEQUFtQztBQUNuQyx5Q0FBOEM7QUFDOUMsZ0RBQWtDO0FBQ2xDLGtFQUFvRDtBQUNwRCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLG1DQUFpQztBQUVqQyxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBVyx5QkFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV0RCxNQUFNLEdBQUcscUJBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDakIsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHLENBQU8sT0FBZSxFQUFFLEdBQVksRUFBRSxFQUFFO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELElBQUksS0FBSyxHQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUM1QixHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU87UUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHO0tBQ04sQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLE9BQU8saUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FB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SUFBSSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFBLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRCxtQkFBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDL0IsQ0FBQztDQUNKO0FBdmRELHVCQXVkQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7cHJvZ3JhbX0gZnJvbSBcImNvbW1hbmRlclwiO1xyXG5pbXBvcnQgKiBhcyBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XHJcbmltcG9ydCB7TG9nZ2VyRmFjdG9yeSwgdXRpbH0gZnJvbSBcInZ3ZWItY29yZVwiO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcclxuaW1wb3J0ICogYXMgY2hpbGRfcHJvY2VzcyBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XHJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJub2RlOmZzXCI7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gJ25vZGU6b3MnO1xyXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ2NyeXB0bydcclxuXHJcbmNvbnN0IGRvbWFpbktleSA9ICdwLWhjYy1pMDAwLXAwMGEtaHJjcGUnO1xyXG5jb25zdCBwa2cgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKTtcclxuY29uc3QgUlNfVVJMID0gJ2h0dHBzOi8vZGZzLnpoaXBlci5jb20vdjNyNic7XHJcblxyXG5jb25zdCBsb2dnZXI6IExvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKCdZRFMnKTtcclxuXHJcbmNvbnN0IGVudiA9IHtcclxuICAgIC4uLnByb2Nlc3MuZW52XHJcbn1cclxuXHJcbmNvbnN0IGV4ZWNDbWQgPSBhc3luYyAoY29tbWFuZDogc3RyaW5nLCBjd2Q/OiBzdHJpbmcpID0+IHtcclxuICAgIGxvZ2dlci5pbmZvKGDmiafooYzlkb3ku6QgJHtjb21tYW5kfSAke2N3ZCA/IGDvvIzmiafooYznm67lvZXkuLoke2N3ZH1gIDonJ31gKTtcclxuICAgIGxldCBzdGFydCAgPSBEYXRlLm5vdygpO1xyXG4gICAgY2hpbGRfcHJvY2Vzcy5leGVjU3luYyhjb21tYW5kLCB7XHJcbiAgICAgICAgY3dkLCBlbmNvZGluZzogJ3V0Zi04JyxcclxuICAgICAgICB0aW1lb3V0OiAwLCAvLyDorr7kuLrkuI3ov4fmnJ/vvIzkuIvovb3pgJ/luqbov4fmhaLkvJrlr7zoh7TotoXml7ZcclxuICAgICAgICBzdGRpbzogWzAsIDEsIDJdLFxyXG4gICAgICAgIGVudlxyXG4gICAgfSk7XHJcbiAgICBsb2dnZXIuaW5mbyhg5omn6KGM5ZG95LukICR7Y29tbWFuZH0g6ICX5pe2IFxceDFCWzM0bSA8JHtEYXRlLm5vdygpIC0gc3RhcnR9bXM+XWApXHJcbn1cclxuXHJcbmNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKVxyXG5pZiAocGxhdGZvcm0gIT09ICd3aW4zMicpIHtcclxuICAgIGxvZ2dlci5lcnJvcign5b2T5YmN5bel5YW35LuF5pSv5oyBd2luZG93c+ezu+e7nycpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xyXG59XHJcblxyXG5jb25zdCBpc0FkbWluID0gKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyDlsJ3or5XmiafooYzkuIDkuKrlj6rmnInnrqHnkIblkZjmiY3og73ov5DooYznmoTlkb3ku6RcclxuICAgICAgICAvLyDkvb/nlKggPm51bCAyPiYxIOadpeaKkeWItui+k+WHulxyXG4gICAgICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ25ldCBzZXNzaW9uID5udWwgMj4mMScpO1xyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyDmiJDlip/miafooYxcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8g5omn6KGM5aSx6LSl77yM5p2D6ZmQ5LiN6LazXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCB3Z2V0ID0gcGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL3dnZXQuZXhlJyk7XHJcbmxldCB6aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vemlwLmV4ZScpO1xyXG5sZXQgdW56aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vdW56aXAuZXhlJyk7XHJcblxyXG5wcm9ncmFtLm5hbWUoXCJ5ZHNcIilcclxuICAgIC51c2FnZShcIltjb21tYW5kXSBbb3B0aW9uc11cIilcclxuICAgIC5kZXNjcmlwdGlvbihcInlkcyDliLbnm5jlt6Xlhbcg5aaC5p6c5ZG95Luk5Y+C5pWw5Lit5a2Y5Zyo56m65qC8IOS9v+eUqOWPjOW8leWPt1xcXCJcXFwi5YyF6KO5XCIpXHJcbiAgICAudmVyc2lvbihgeWRzICR7cGtnLnZlcnNpb259YCk7XHJcblxyXG50eXBlIE1pY3JvU2VydmljZSA9ICdocmNwZScgfCAnZmVjb2RlJztcclxuXHJcbnR5cGUgR2l0ID0ge1xyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBicmFuY2g6IHN0cmluZ1xyXG59XHJcblxyXG50eXBlIFlkc0NvbmZpZyA9IHtcclxuICAgIGhvc3RzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8TWljcm9TZXJ2aWNlLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPE1pY3JvU2VydmljZSwgc3RyaW5nIHwgR2l0PlxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBjb25mRWcgPSBge1xyXG4gICAgaG9zdHM/OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8J2hyY3BlJyB8ICdmZWNvZGUnLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPCdocmNwZScgfCAnZmVjb2RlJywgc3RyaW5nIHwgeyB1cmw6IHN0cmluZywgYnJhbmNoOiBzdHJpbmcgfT5cclxuICAgIH1cclxufWBcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW4ge1xyXG5cclxuICAgIHN0YXJ0dXAoKSB7XHJcbiAgICAgICAgcHJvZ3JhbVxyXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYW4gW3dvcmtkaXJdJylcclxuICAgICAgICAgICAgLnVzYWdlKCdjbGVhbiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+a4heeQhuWItuebmOW3peS9nOebruW9lSwgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOa4heeQhuWItuebmOW3peS9nOebruW9lSAke2Rpcn1gKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoZGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU3RhdCA9IGZzLnN0YXRTeW5jKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnJtU3luYyhmaWxlLCB7cmVjdXJzaXZlOiBmaWxlU3RhdC5pc0RpcmVjdG9yeSgpfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yi255uY5bel5L2c55uu5b2V5riF55CG5a6M5oiQYCk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtXHJcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbml0IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC51c2FnZSgnaW5pdCBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+WIneWni+WMlllEU+WItuebmOeOr+Wigywgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIneWni+WMlllEU+WItuebmOeOr+WigyDlt6XkvZznm67lvZXvvJoke2Rpcn1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZShkaXIsICd5ZHMuanNvbicpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGVDcmVhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55Sf5oiQ6YWN572u5paH5Lu2IHlkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdGaWxlLCBgI+ivt+agueaNruivtOaYjuS/ruaUuemFjee9ruaWh+S7tuW5tuWIoOmZpOaJgOacieazqOmHiuivtOaYjuWQjuS/neWtmFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJob3N0c1wiOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIuWmguaenOS9v+eUqOS6hnlkcy5iYXTliJ3lp4vnjq/looPvvIzlt7Lnu4/mt7vliqDkuoYgMTkyLjE2OC41MC40MCByZXBvLnl5cmQuY29tIDE5Mi4xNjguNTAuNDEgYmlwNS56aGlwZXIuY29tIDE5Mi4xNjguNTAuNDIgYmlwMy56aGlwZXIuY29tIGhvc3Rz6YWN572u6aG55Y+v5Lul5Yig6ZmkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1hdmVu5LuT5bqT56eB5pyN5a+55bqU55qEaG9zdOaYoOWwhFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpc3blvIDlj5Hnjq/looPlr7nlupTnmoRob3N05pig5bCEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJnaXRcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJocmNwZVwiOiBcIuWQjuerr+acjeWKoeWvueW6lOeahGdpdOWcsOWdgFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHlr7nlupRnaXTlnLDlnYBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGFsb2dzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5a6i5oi35Luj56CB77yM55So5LqO5ZCv5Yqo5ZG95Luk55qEY2F0YWxvZ+WPguaVsFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZWVyXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhyY3BlXCI6IFwi5ZCO56uv5pyN5Yqh5YiG5pSvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHliIbmlK9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVDcmVhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBnaXRFeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMoJ2dpdCcpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpeaYr+WQpuWuieijheS6hmdpdCA+PiAke2dpdEV4aXN0cyA/ICflt7Llronoo4UnIDogJ+acquWuieijhSd9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnaXRIb21lID0gYCR7ZGlyfS9naXQtZm9yLXdpbmRvd3NgXHJcbiAgICAgICAgICAgICAgICBpZiAoIWdpdEV4aXN0cyAmJiAhZnMuZXhpc3RzU3luYyhnaXRIb21lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpdFppcE5hbWUgPSAnZ2l0LWZvci13aW5kb3dzLnppcCdcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29Z2l0IOWuieijheWMhSAke2dpdFppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2l0WmlwRmlsZSA9IGAke2Rpcn0vJHtnaXRaaXBOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5a2Y5Zyo5a6J6KOF5YyFIOWmguaenOacieWFiOWIoOmZpFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdFppcEZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliKDpmaTlt7LlrZjlnKjlronoo4XljIUgJHtnaXRaaXBGaWxlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMoZ2l0WmlwRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9LyR7Z2l0WmlwTmFtZX0gLU8gXCIke2dpdFppcEZpbGV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg6Kej5Y6L5a6J6KOF5YyFICR7Z2l0WmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7Z2l0WmlwRmlsZX1cIiAtZCBcIiR7ZGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOmFjee9rmdpdOeOr+Wig+WPmOmHj2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoIGBzZXR4IFBBVEggXCIlUEFUSCU7JHtnaXRIb21lfVxcXFxiaW47XCJgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGdpdFppcEZpbGUpXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGdpdCDlronoo4XlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBqYXZhRXhpc3RzID0gYXdhaXQgdXRpbC5jbWQuZXhpc3RzKCdqYXZhJyk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5qOA5p+l5piv5ZCm5a6J6KOF5LqGamF2YSA+PiAke2phdmFFeGlzdHMgPyAn5bey5a6J6KOFJyA6ICfmnKrlronoo4UnfWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFqYXZhRXhpc3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+acquaJvuWIsGphdmHvvIzlh4blpIflronoo4VqYXZh77yM5byA5aeL5LiL6L29amRrJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgamRrWmlwTmFtZSA9ICdqZGstOHU0NzEtd2luZG93cy14NjQuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9LyR7amRrWmlwTmFtZX0gLU8gXCIke2Rpcn0vJHtqZGtaaXBOYW1lfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi2pkayDlronoo4XljIUgJHtkaXJ9LyR7amRrWmlwTmFtZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7ZGlyfS8ke2pka1ppcE5hbWV9XCJgLCBkaXIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDphY3nva5qYXZh546v5aKD5Y+Y6YePYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGphdmFIb21lID0gYCR7ZGlyfS9qZGsxLjguMF80NzFgO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYHNldHggSkFWQV9IT01FIFwiJHtqYXZhSG9tZX1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYHNldHggQ0xBU1NfUEFUSCBcIi47JUpBVkFfSE9NRSVcXFxcbGliO1wiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZCggYHNldHggUEFUSCBcIiVQQVRIJTslSkFWQV9IT01FJVxcXFxiaW47XCJgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgZW52LkpBVkFfSE9NRSA9IGphdmFIb21lO1xyXG4gICAgICAgICAgICAgICAgICAgIGVudi5DTEFTU19QQVRIID0gXCIuOyVKQVZBX0hPTUUlXFxcXGxpYjtcIjtcclxuICAgICAgICAgICAgICAgICAgICBlbnYuUEFUSCA9IFwiJVBBVEglOyVKQVZBX0hPTUUlXFxcXGJpbjtcIjtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgamF2YSDlronoo4XlrozmiJAg6K+36YeN5ZCv57uI56uvYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpWphdmHniYjmnKxgKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGphdmFIb21lID0gZW52LkpBVkFfSE9NRTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7amF2YUhvbWV9L2Jpbi9qYXZhXCIgLXZlcnNpb25gKTtcclxuICAgICAgICAgICAgICAgIC8vIOWvvOWFpeivgeS5puWIsGphdmEg5aaC5p6camF2YeaYrzEuOOeJiOacrCDpnIDopoHlr7zlhaXliLAgSkFWQV9IT01FL2pyZS9saWIvc2VjdXJpdHkvY2FjZXJ0cyDlpoLmnpzmmK8xMeeJiOacrCDpnIDopoHlr7zlhaXliLAgSkFWQV9IT01FL2xpYi9zZWN1cml0eS9jYWNlcnRzXHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGphdmFIb21lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNlcnRzRmlsZW5hbWUgPSAnbGliL3NlY3VyaXR5L2NhY2VydHMnO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGUgPSBgJHtqYXZhSG9tZX0vJHtjZXJ0c0ZpbGVuYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNlcnRzRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2VydHNGaWxlID0gYCR7amF2YUhvbWV9L2pyZS8ke2NlcnRzRmlsZW5hbWV9YDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpWphdmHor4Hkuabnm67lvZUgJHtjZXJ0c0ZpbGV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY2VydHNGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXl0b29sQ21kID0gYFwiJHtqYXZhSG9tZX0vYmluL2tleXRvb2xcImA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIpOaWreivgeS5puaYr+WQpuW3sue7j+WvvOWFpVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtrZXl0b29sQ21kfSAtbGlzdCAtdiAta2V5c3RvcmUgXCIke2NlcnRzRmlsZX1cIiAtc3RvcmVwYXNzIGNoYW5nZWl0IC0tYWxpYXMgeXlyZGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgeXlyZC5jcnQg6K+B5Lmm5bey5a2Y5ZyoYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOivgeS5puS4jeWtmOWcqFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWvvOWFpSB5eXJkLmNydCDor4HkuabliLBqYXZhICR7Y2VydHNGaWxlfWApOyAvLyAke2Rpcn0veXlyZC5jcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7a2V5dG9vbENtZH0gLWltcG9ydGNlcnQgLWZpbGUgXCIke3BhdGguam9pbihfX2Rpcm5hbWUsICcuLi95eXJkLmNydCcpfVwiIC1rZXlzdG9yZSBcIiR7Y2VydHNGaWxlfVwiIC1zdG9yZXBhc3MgY2hhbmdlaXQgLW5vcHJvbXB0IC0tYWxpYXMgeXlyZGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYHl5cmQuY3J0IOivgeS5puWvvOWFpeWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuSG9tZSA9IGAke2Rpcn0vbWF2ZW4tMy44LjZgO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF2ZW5FeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMoJ212bicpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpeaYr+WQpuWuieijheS6hm1hdmVuID4+ICR7bWF2ZW5FeGlzdHMgPyAn5bey5a6J6KOFJyA6ICfmnKrlronoo4UnfWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXZlbkV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuWmlwTmFtZSA9ICdtYXZlbi0zLjguNi56aXAnXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vW1hdmVuIOWuieijheWMhSAke21hdmVuWmlwTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXZlblppcEZpbGUgPSBgJHtkaXJ9LyR7bWF2ZW5aaXBOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5a2Y5Zyo5a6J6KOF5YyFIOWmguaenOacieWFiOWIoOmZpFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKG1hdmVuWmlwRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIoOmZpOW3suWtmOWcqOWuieijheWMhSAke21hdmVuWmlwRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKG1hdmVuWmlwRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9LyR7bWF2ZW5aaXBOYW1lfSAtTyBcIiR7bWF2ZW5aaXBGaWxlfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi+WuieijheWMhSAke21hdmVuWmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7bWF2ZW5aaXBGaWxlfVwiIC1kIFwiJHtkaXJ9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMobWF2ZW5aaXBGaWxlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5re75YqgbWF2ZW4g546v5aKD5Y+Y6YePXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2luZG93c+aguOW/g+WRveS7pO+8muawuOS5hei/veWKoOi3r+W+hOWIsOOAkOeUqOaIt+eOr+Wig+WPmOmHj1BBVEjjgJHvvIzmsLjkuYXnlJ/mlYhcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG12blBhdGggPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9iaW5gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZCggYHNldHggUEFUSCBcIiVQQVRIJTske212blBhdGh9XCJgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDinIUg5oiQ5Yqf77yBTWF2ZW7ot6/lvoTjgJAke212blBhdGh944CR5bey5re75Yqg5Yiw57O757ufUEFUSOeOr+Wig+WPmOmHj2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCfinYwg5re75Yqg5aSx6LSl77yaJywgZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYG1hdmVuIOWuieijheWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliJ3lp4vljJZub2Rl546v5aKDYCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKCducG0gaW5zdGFsbCAtZyB0eXBlc2NyaXB0IC0tcmVnaXN0cnk9aHR0cHM6Ly9yZWdpc3RyeS5ucG1taXJyb3IuY29tJyk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yid5aeL5YyWbm9kZeeOr+Wig+WujOaIkGApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4DmtYtjb2Rl5piv5ZCm5a2Y5ZyoYClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVEaXIgPSBgJHtkaXJ9L3lkcy0xLjAuM2A7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29kZURpcikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlWmlwTmFtZSA9ICd5ZHMtMS4wLjMtamRrLTgtd2luZG93cy14ODZfNjQuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1jb2RlIElERSDlronoo4XljIUgJHtjb2RlWmlwTmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlWmlwRmlsZSA9IGAke2Rpcn0vJHtjb2RlWmlwTmFtZX1gO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOajgOafpeaYr+WQpuW3sue7j+WtmOWcqOWuieijheWMhSDlpoLmnpzmnInlhYjliKDpmaRcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhjb2RlWmlwRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIoOmZpOW3suWtmOWcqOWuieijheWMhSAke2NvZGVaaXBGaWxlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMoY29kZVppcEZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyDkuIvovb3lronoo4XljIXlubbovpPlh7rml6Xlv5dcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9IGh0dHBzOi8veW9uY29tbXVuaXR5LnlvbnlvdWNsb3VkLmNvbS9ZRFNEb3dubG9hZC9XaW5kb3cveDY0LyR7Y29kZVppcE5hbWV9IC1PIFwiJHtjb2RlWmlwRmlsZX1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDop6Pljovlronoo4XljIUgJHtjb2RlWmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhjb2RlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke2NvZGVaaXBGaWxlfVwiIC1kIFwiJHtjb2RlRGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGNvZGVaaXBGaWxlKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKVxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBjb2RlIElERSDlronoo4XlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliJ3lp4vljJZZRFMgSURFIOWFqOWxgOmFjee9rmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBgJHtjb2RlRGlyfS9Db2RlL2RhdGEvdXNlci1kYXRhL1VzZXIvc2V0dGluZ3MuanNvbmA7XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ3NKc29uT2JqID0ge307XHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXR0aW5nc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoc2V0dGluZ3NKc29uKS50b1N0cmluZygndXRmLTgnKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ1htbCA9IHBhdGgucmVzb2x2ZShgJHttYXZlbkhvbWV9L2NvbmYvc2V0dGluZ3MueG1sYCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2V0dGluZ1htbCkgJiYgIWZzLmV4aXN0c1N5bmMoYCR7ZGlyfS9zZXR0aW5ncy54bWxgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdYbWwgPSBwYXRoLnJlc29sdmUoYCR7ZGlyfS9zZXR0aW5ncy54bWxgKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLm1hdmVuLmdsb2JhbFNldHRpbmdzXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialtcImphdmEuY29uZmlndXJhdGlvbi5tYXZlbi51c2VyU2V0dGluZ3NcIl0gPSBzZXR0aW5nWG1sO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wibWF2ZW4uc2V0dGluZ3NGaWxlXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NKc29uLCBKU09OLnN0cmluZ2lmeShzZXR0aW5nc0pzb25PYmosIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliJ3lp4vljJZZRFMgSURFIOWFqOWxgOmFjee9ruWujOaIkGApO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIOajgOafpeW9k+WJjeeUqOaIt+ebruW9leS4iy5zc2jmmK/lkKblrZjlnKggaWRfZWQyNTUxOS5wdWIg5a+G6ZKl5paH5Lu277yM5aaC5p6c5rKh5pyJ5YiZ5pS+5YiwLnNzaCDnm67lvZXkuItcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNzaERpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5VU0VSUFJPRklMRSwgJy5zc2gnKTtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzc2hEaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMubWtkaXJTeW5jKHNzaERpcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYCR7c3NoRGlyfS9pZF9lZDI1NTE5LnB1YmApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLt+i0neWvhumSpeaWh+S7tmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vaWRfZWQyNTUxOS5wdWInKSwgYCR7c3NoRGlyfS9pZF9lZDI1NTE5LnB1YmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNvcHlGaWxlU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vaWRfZWQyNTUxOScpLCBgJHtzc2hEaXJ9L2lkX2VkMjU1MTlgKTtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5ou36LSd5a+G6ZKl5paH5Lu25a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ0ZpbGVDcmVhdGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOmFjee9ruaWh+S7tnlkcy5qc29u5bey57uP55Sf5oiQ77yM6K+35L2/55So57yW6L6R5Zmo5a+56YWN572u5YaF5a656L+b6KGM5L+u5pS5YClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliJ3lp4vljJZZRFPliLbnm5jnjq/looPlrozmiJDvvIzlpoLmnpzmmK/pppbmrKHmiafooYzor7flhbPpl63lvZPliY3nqpflj6PvvIzlubbph43mlrDmiZPlvIBgKVxyXG4gICAgICAgICAgICB9KS5ob29rKCdwb3N0QWN0aW9uJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWmguaenOaJp+ihjOi/h+eoi+S4reWHuueOsOaKpemUmeivt+WFs+mXreW9k+WJjee7iOerr++8jOmHjeWQr+e7iOerr+WQjuaJp+ihjCB5ZHMgaW5pdCDnm7TliLDml6DmiqXplJnlhoXlrrnkuLrmraJgKVxyXG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMClcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcHJvZ3JhbVxyXG4gICAgICAgICAgICAuY29tbWFuZCgnc3RhcnQgPGNhdGFsb2c+IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC51c2FnZSgnc3RhcnQgPGNhdGFsb2c+IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC5vcHRpb24oJy1mLCAtLWZpbGUgPGZpbGU+JywgJ+mFjee9ruaWh+S7ticpXHJcbiAgICAgICAgICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBg6YWN572u5paH5Lu25YaF5a6556S65L6L77yaJHtjb25mRWd9YClcclxuICAgICAgICAgICAgLmRlc2NyaXB0aW9uKCflkK/liqjliLbnm5jnjq/looPvvIxjYXRhbG9n6KGo56S66ZyA6KaB5Yi255uY55qE5qih5Z2X77yM5a+55bqU6YWN572u5paH5Lu25LitY2F0YWxvZ3PnmoRrZXnlgLzvvIznlKjkuo7mjIflrprpnIDopoHlh7rnm5jnmoTkv6Hmga/vvIx3b3JrZGly6KGo56S65Yi255uY5bel5L2c55uu5b2V77yM5aaC5p6c5LiN5oyH5a6a5YiZ5L2/55So5b2T5YmN55uu5b2VJylcclxuICAgICAgICAgICAgLmFjdGlvbihhc3luYyAoY2F0YWxvZzogc3RyaW5nLCB3b3JrZGlyOiBzdHJpbmcgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSksIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIGZpbGU6IHN0cmluZ1xyXG4gICAgICAgICAgICB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUod29ya2Rpcik7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5pyq5oyH5a6a6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICBsZXQgeWRzSnNvbjogc3RyaW5nO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHlkc0pzb24gPSBwYXRoLnJlc29sdmUob3B0aW9ucy5maWxlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyDor7vlj5bphY3nva7mlofku7ZcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoeWRzSnNvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDmnKrmib7liLDphY3nva7mlofku7YgJHt5ZHNKc29ufWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB5ZHNKc29uID0gcGF0aC5yZXNvbHZlKGAke2Rpcn0veWRzLmpzb25gKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyDor7vlj5bphY3nva7mlofku7ZcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoeWRzSnNvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDor7fpgJrov4flj4LmlbAgLWYg5oyH5a6a6ZyA6KaB5L2/55So55qE6YWN572u5paH5Lu25oiW6ICF5Zyo5b2T5YmN55uu5b2V5LiL5Yib5bu6eWRzLmpzb27mlofku7bvvIzlhoXlrrnlj4LogIMke2NvbmZFZ31gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5byA5aeL5Yi255uYICR7Y2F0YWxvZ30g5bel5L2c55uu5b2V77yaJHtkaXJ9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+ajgOa1i+WItuebmOeOr+Wig+ajgOa1i2ApO1xyXG4gICAgICAgICAgICAgICAgbGV0IGdpdENtZCA9ICdnaXQnO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2l0RXhpc3RzID0gYXdhaXQgdXRpbC5jbWQuZXhpc3RzKGdpdENtZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdpdEV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGdpdENtZCA9IGAke2Rpcn0vZ2l0LWZvci13aW5kb3dzL2Jpbi9naXQuZXhlYDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZ2l0Q21kKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOacquaJvuWIsGdpdOWRveS7pCAke2dpdENtZH0sIOivt+WFiOaJp+ihjCBpbml0IOWIneWni+WMluWItuebmOeOr+Wig2ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHNldHRpbmdYbWwgPSBwYXRoLnJlc29sdmUoYCR7ZGlyfS9zZXR0aW5ncy54bWxgKTtcclxuICAgICAgICAgICAgICAgIGxldCBtdm5DbWQgPSAnbXZuJztcclxuICAgICAgICAgICAgICAgIGxldCBtdm5FeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMobXZuQ21kKTtcclxuICAgICAgICAgICAgICAgIGxldCBtYXZlbkhvbWUgPSBgJHtkaXJ9L21hdmVuLTMuOC42YDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhtYXZlbkhvbWUpKSB7IC8vIOS9v+eUqOWFqOWxgG1hdmVuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5rKh5pyJc2V0dGluZ3Mg5LiL6L29XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNldHRpbmdYbWwpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGDmnKrmib7liLBtYXZlbumFjee9ruaWh+S7tiAke3NldHRpbmdYbWx9LCDkuIvovb1zZXR0aW5ncy54bWzmlofku7ZgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vc2V0dGluZ3MueG1sYCwgZGlyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG12bkNtZCA9IGBcIiR7bWF2ZW5Ib21lfS9iaW4vbXZuLmNtZFwiYDtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nWG1sID0gYCR7bWF2ZW5Ib21lfS9jb25mL3NldHRpbmdzLnhtbGA7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGlkZVBhdGggPSBgJHtkaXJ9L3lkcy0xLjAuM2BcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhpZGVQYXRoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg5pyq5om+5YiwSURFICR7aWRlUGF0aH0sIOivt+WFiOaJp+ihjCBpbml0IOWIneWni+WMluWItuebmOeOr+Wig2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDliLbnm5jnjq/looPmo4DmtYvlrozmiJBgKVxyXG4gICAgICAgICAgICAgICAgbGV0IHlkc0pzb25TdHIgPSBmcy5yZWFkRmlsZVN5bmMoeWRzSnNvbikudG9TdHJpbmcoJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgICAgICAvLyDmm7/mjaLmiYDmnIkjIOW8gOWktOeahOazqOmHiuivtOaYjuihjFxyXG4gICAgICAgICAgICAgICAgeWRzSnNvblN0ciA9IHlkc0pzb25TdHIucmVwbGFjZSgvXiMuKi9nbSwgJycpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIOajgOa1i+mFjee9ruaWh+S7tuaYr+WQpuWujOaVtFxyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZzogWWRzQ29uZmlnO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDb25maWdFcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IOagvOW8j+mUmeivryDlj4LogIPnpLrkvovvvJoke2NvbmZFZ31gKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoeWRzSnNvblN0cik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcuY2F0YWxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tDb25maWdFcnJvcigpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uZmlnRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZ2l0ID0gY29uZmlnLmdpdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGFsb2dDb25maWcgPSBjb25maWcuY2F0YWxvZ3NbY2F0YWxvZ107XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhdGFsb2dDb25maWcgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSDmib7kuI3liLAgY2F0YWxvZ3MuJHtjYXRhbG9nfSDlhYjlhbPphY3nva5gKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNhdGFsb2dDb25maWcuaHJjcGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBjYXRhbG9nQ29uZmlnLmZlY29kZSA9PT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IGNhdGFsb2dzLiR7Y2F0YWxvZ30uaHJjcGUg5oiWIGNhdGFsb2dzLiR7Y2F0YWxvZ30uZmVjb2RlIOWtl+autee8uuWksWApO1xyXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lc3BhY2UgPSBgJHtkaXJ9LyR7Y2F0YWxvZ31gO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG5hbWVzcGFjZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yib5bu655uu5b2VICR7bmFtZXNwYWNlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7bmFtZXNwYWNlfSDlt7LlrZjlnKhgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBocmNwZVVybCA9IHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAnc3RyaW5nJyA/IGdpdD8uaHJjcGUgOiBjYXRhbG9nQ29uZmlnLmhyY3BlLnVybDtcclxuICAgICAgICAgICAgICAgIGlmICghaHJjcGVVcmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IGNhdGFsb2dzLiR7Y2F0YWxvZ30g5ZCO56uv5pyN5YqhIOacquaMh+WumuS7k+W6k+WcsOWdgO+8jOivt+mAmui/hyBnaXQuaHJjcGUg5oiW6ICFIGNhdGFsb2dzLiR7Y2F0YWxvZ30uaHJjcGUudXJsIOaMh+WumuS7k+W6k+WcsOWdgGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+aLieWPluWQjuerr+acjeWKoeS7k+W6kyAke2hyY3BlVXJsfWApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7bmFtZXNwYWNlfS8uZ2l0YCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7bmFtZXNwYWNlfSDlt7LlrZjlnKjvvIzlvIDlp4vmm7TmlrDku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7Z2l0Q21kfVwiIHB1bGxgLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7bmFtZXNwYWNlfSDkuI3lrZjlnKjvvIzlvIDlp4vliJvlu7rku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmNoID0gdHlwZW9mIGNhdGFsb2dDb25maWcuaHJjcGUgPT09ICdzdHJpbmcnID8gY2F0YWxvZ0NvbmZpZy5ocmNwZSA6IGNhdGFsb2dDb25maWcuaHJjcGUuYnJhbmNoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJhbmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDlkI7nq6/mnI3liqEg5pyq5oyH5a6a5YiG5pSv77yM6K+36YCa6L+HIGdpdC5ocmNwZSDmiJbogIUgY2F0YWxvZ3MuJHtjYXRhbG9nfS5ocmNwZS5icmFuY2gg6YWN572u5YiG5pSvYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2dpdENtZH1cIiBjbG9uZSAtYiAke2JyYW5jaH0gJHtocmNwZVVybH0gJHtuYW1lc3BhY2V9YCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi4nlj5blkI7nq6/mnI3liqHku5PlupPlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIGxldCBib29zdHJhcFBvbVhtbCA9IGAke25hbWVzcGFjZX0vJHtkb21haW5LZXl9LWJlL2Rldi0ke2RvbWFpbktleX0tYm9vdHN0cmFwL3BvbS54bWxgO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOabv+aNouaWh+S7tiAke2Jvb3N0cmFwUG9tWG1sfSDkuK3nmoRST09U5Li6ZG9tYWluS2V577yM5ZCm5YiZ5Lya5a+86Ie05Yi255uY5aSx6LSl77yM5peg5rOV5om+5Yiw5Yi25ZOBYCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib29zdHJhcFBvbVhtbFN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhib29zdHJhcFBvbVhtbCkudG9TdHJpbmcoJ3V0Zi04Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9vc3RyYXBQb21YbWxTdHJpbmcuaW5jbHVkZXMoJ1JPT1QnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYm9vc3RyYXBQb21YbWwsIGJvb3N0cmFwUG9tWG1sU3RyaW5nLnJlcGxhY2UoL1JPT1QvZywgZG9tYWluS2V5KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5ob3N0cyAmJiBjb25maWcuaG9zdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWtmOWcqGhvc3Rz6YWN572u77yM5qOA5rWL57O757ufaG9zdHPphY3nva7mlofku7bmmK/lkKblt7Lnu4/phY3nva5gKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdHNGaWxlID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LldJTkRJUiwgJ1N5c3RlbTMyJywgJ2RyaXZlcnMnLCAnZXRjJywgJ2hvc3RzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaG9zdExpc3QgPSBmcy5yZWFkRmlsZVN5bmMoaG9zdHNGaWxlKS50b1N0cmluZygndXRmLTgnKS5zcGxpdCgnXFxuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcGVuZEhvc3RzID0gWy4uLmNvbmZpZy5ob3N0c11cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBob3N0SXRlbSBvZiBob3N0TGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoLyMvLnRlc3QoaG9zdEl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBhcHBlbmRIb3N0IG9mIGNvbmZpZy5ob3N0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2lwLCBkb21haW5dID0gYXBwZW5kSG9zdC5zcGxpdCgnICcpLmZpbHRlcihpdGVtID0+IGl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdEl0ZW0uaW5jbHVkZXMoaXApICYmIGhvc3RJdGVtLmluY2x1ZGVzKGRvbWFpbikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg57O757ufaG9zdHPphY3nva7mlofku7blt7LlrZjlnKggJHthcHBlbmRIb3N0fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEhvc3RzLnJlbW92ZShhcHBlbmRIb3N0KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyDor7vlj5bns7vnu59ob3N0c+mFjee9ruaWh+S7tlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBlbmRIb3N0cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWRtaW4oKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuYXBwZW5kRmlsZVN5bmMoaG9zdHNGaWxlLCBgXFxuJHthcHBlbmRIb3N0cy5qb2luKCdcXG4nKX1cXG5gLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6ICd1dGYtOCdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOW9k+WJjemdnueuoeeQhuWRmOWQr+WKqOaXoOazleabtOaUuWhvc3Rz5paH5Lu277yM6K+35L2/55So566h55CG5ZGY5ZCv5Yqo5oiW6ICF5omL5Yqo5re75YqgICR7YXBwZW5kSG9zdHMuam9pbignXFxuJyl9IOWIsOaWh+S7tiAke2hvc3RzRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgaG9zdHMg6YWN572u5qOA5rWL5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WIneWni+WMlumhueebrm1hdmVu546v5aKDJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbXZuQ29uZmlnRGlyID0gYCR7bmFtZXNwYWNlfS8ubXZuYDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhtdm5Db25maWdEaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHttdm5DbWR9IC1OIGlvLnRha2FyaTptYXZlbjp3cmFwcGVyIC1EbWF2ZW49My44LjZgLCBuYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy8g5YaZ5YWlbWF2ZW7phY3nva7liLAgLm12bi9tYXZlbi5jb25maWdcclxuICAgICAgICAgICAgICAgIGxldCBjb25maWdGaWxlID0gYCR7bXZuQ29uZmlnRGlyfS9tYXZlbi5jb25maWdgO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMoY29uZmlnRmlsZSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYCR7bXZuQ29uZmlnRGlyfS9tYXZlbi5jb25maWdgLCBgLXNcXG4ke3NldHRpbmdYbWx9XFxuLURtYXZlbi53YWdvbi5odHRwLnNzbC5pbnNlY3VyZT10cnVlXFxuLURtYXZlbi53YWdvbi5odHRwLnNzbC5hbGxvd2FsbD10cnVlYCk7XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5b2T5YmNbWF2ZW7kv6Hmga9gKVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHttdm5DbWR9IC0tdmVyc2lvbmAsIG5hbWVzcGFjZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+mhueebrm1hdmVu5riF55CGJylcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7bXZuQ21kfSBjbGVhbiAtRHNraXBUZXN0c2AsIGAke25hbWVzcGFjZX0vJHtkb21haW5LZXl9LWJlYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WkhOeQhuWJjeerr+aehOW7uu+8jOWinuWKoOaehOW7uuaWh+S7ticpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZlRGlyID0gYCR7bmFtZXNwYWNlfS8ke2RvbWFpbktleX0tZmVgO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZlQnVpbGRKcyA9IGAke2ZlRGlyfS9idWlsZC5qc2A7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmVCdWlsZEpzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLmNwU3luYyhwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vZmUtYnVpbGQuanMnKSwgZmVCdWlsZEpzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBmZVBhY2thZ2VKc29uID0gYCR7ZmVEaXJ9L3BhY2thZ2UuanNvbmA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGZlUGFja2FnZUpzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlU3RyaW5nLmluY2x1ZGVzKCdidWlsZC5qcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVQYWNrYWdlSnNvbn1gKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZVN0cmluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZUpzb24uc2NyaXB0c1snYnVpbGQ6ZXh0ZW5kJ10gKz0gJyAmJiBub2RlIGJ1aWxkLmpzJztcclxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZlUGFja2FnZUpzb24sIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCA0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVQYWNrYWdlSnNvbn3lrozmiJBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGZlY29kZVVybCA9IHR5cGVvZiBjYXRhbG9nQ29uZmlnLmZlY29kZSA9PT0gJ3N0cmluZycgPyBnaXQ/LmZlY29kZSA6IGNhdGFsb2dDb25maWcuZmVjb2RlLnVybDtcclxuICAgICAgICAgICAgICAgIGlmICghZmVjb2RlVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOWQjuerr+acjeWKoSDmnKrmjIflrprku5PlupPlnLDlnYDvvIzor7fpgJrov4cgZ2l0LmZlY29kZSDmiJbogIUgY2F0YWxvZ3MuJHtjYXRhbG9nfS5mZWNvZGUudXJsIOaMh+WumuS7k+W6k+WcsOWdgGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+aLieWPluaKpeWRiuacjeWKoeS7k+W6kyAke2ZlY29kZVVybH1gKTtcclxuICAgICAgICAgICAgICAgIGxldCByZXBvcnROYW1lc3BhY2UgPSBgJHtuYW1lc3BhY2V9L3lvbmJpcC15aXN2LWl6cDEtZGV2LWZlY29kZWA7XHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtyZXBvcnROYW1lc3BhY2V9Ly5naXRgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnm67lvZUgJHtyZXBvcnROYW1lc3BhY2V9IOW3suWtmOWcqO+8jOW8gOWni+abtOaWsOS7k+W6k2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtnaXRDbWR9XCIgcHVsbGAsIHJlcG9ydE5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnm67lvZUgJHtyZXBvcnROYW1lc3BhY2V9IOS4jeWtmOWcqO+8jOW8gOWni+WIm+W7uuS7k+W6k2ApO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuY2ggPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICdzdHJpbmcnID8gY2F0YWxvZ0NvbmZpZy5mZWNvZGUgOiBjYXRhbG9nQ29uZmlnLmZlY29kZS5icmFuY2g7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmFuY2gpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOaKpeWRiuacjeWKoeacquaMh+WumuWIhuaUr++8jOivt+mAmui/hyBnaXQuZmVjb2RlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZS5icmFuY2gg6YWN572u5YiG5pSvYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2dpdENtZH1cIiBjbG9uZSAtYiAke2JyYW5jaH0gJHtmZWNvZGVVcmx9ICR7cmVwb3J0TmFtZXNwYWNlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLieWPluaKpeWRiuacjeWKoeS7k+W6k+WujOaIkGApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCflpITnkIbmiqXlkYrmnoTlu7rvvIzlop7liqDmnoTlu7rmlofku7YnKTtcclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVCdWlsZEpzID0gYCR7cmVwb3J0TmFtZXNwYWNlfS9idWlsZC5qc2A7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmVjb2RlQnVpbGRKcykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL2ZlY29kZS1idWlsZC5qcycpLCBmZWNvZGVCdWlsZEpzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVQYWNrYWdlSnNvbiA9IGAke3JlcG9ydE5hbWVzcGFjZX0vcGFja2FnZS5qc29uYDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZlY29kZVBhY2thZ2VTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZmVjb2RlUGFja2FnZUpzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmZWNvZGVQYWNrYWdlU3RyaW5nLmluY2x1ZGVzKCdidWlsZC5qcycpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVjb2RlUGFja2FnZUpzb259YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZlY29kZVBhY2thZ2VTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbJ2J1aWxkJ10gKz0gJyAmJiBub2RlIGJ1aWxkLmpzJztcclxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSnNvbi5kb21haW5LZXkgPSBkb21haW5LZXk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yig6Zmk5q2k5L6d6LWWIOS8muWvvOiHtG5wbSBpIOWksei0pVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMuemxpYlxyXG4gICAgICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoZmVjb2RlUGFja2FnZUpzb24sIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCA0KSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS/ruaUuSR7ZmVjb2RlUGFja2FnZUpzb2595a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWuieijheaKpeWRiuacjeWKoeS+nei1lmApO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZCgnbnBtIGknLCByZXBvcnROYW1lc3BhY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDnlJ/miJB2ZXJzaW9uLmpzb24g5paH5Lu2YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSByYW5kb21VVUlEKCkudG9TdHJpbmcoKVxyXG4gICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhgJHtyZXBvcnROYW1lc3BhY2V9L3ZlcnNpb24uanNvbmAsIGB7XCJ2ZXJzaW9uXCI6IFwiJHt1dWlkfVwifWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCfliJ3lp4vljJbpobnnm67njq/looPotYTmupAnKTtcclxuICAgICAgICAgICAgICAgIC8vIOWmguaenCBuYW1lc3BhY2UvKGRpc2t8ZGlza3MpIOWmguaenOWtmOWcqCDot7Pov4dcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vZGlza2ApIHx8IGZzLmV4aXN0c1N5bmMoYCR7bmFtZXNwYWNlfS9kaXNrc2ApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW3suWtmOWcqO+8jOi3s+i/h+eOr+Wig+i1hOa6kOaWh+S7tuS4i+i9vWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2Rmcy56aGlwZXIuY29tL3YzcjYvZW52LnppcFxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vkuIvovb3pobnnm67njq/looPotYTmupDmlofku7ZgKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBnaXRaaXBGaWxlID0gYCR7bmFtZXNwYWNlfS9lbnYuemlwYDtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9ICR7UlNfVVJMfS9lbnYuemlwIC1PIFwiJHtnaXRaaXBGaWxlfVwiYCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDop6PljovotYTmupDmlofku7bljIUgJHtnaXRaaXBGaWxlfWApXHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke3VuemlwfVwiIFwiJHtnaXRaaXBGaWxlfVwiYCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ybVN5bmMoZ2l0WmlwRmlsZSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5ZCv5YqoSURFJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7aWRlUGF0aH0vQ29kZS9iaW4vY29kZVwiIC0tbm8tc2FuZGJveCAtLWxvZyBkZWJ1ZyAtLWdvdG8gXCIke2lkZVBhdGh9L0NvZGUvZGF0YS91c2VyLWRhdGEvVXNlci9zZXR0aW5ncy5qc29uXCIgXCIke25hbWVzcGFjZX1cImApO1xyXG4gICAgICAgICAgICAgICAgLy8g6ZyA6KaB562J5b6FSURF5ZCv5Yqo5a6M5oiQ5ZCO5YWz6ZetXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMzAwMCkpXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5bey5ZCv5YqoSURF77yM54K55Ye75bem5L6n6I+c5Y2V6YCJ5oup4oCcWURT4oCd77yM6K+35oyJ54Wn5paH5qGj6K+05piO6L+b6KGM5Yi255uY5pON5L2cJyk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcclxuICAgIH1cclxufVxyXG4iXX0=
519
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEseUNBQWtDO0FBQ2xDLGlEQUFtQztBQUNuQyx5Q0FBOEM7QUFDOUMsZ0RBQWtDO0FBQ2xDLGtFQUFvRDtBQUNwRCw0Q0FBOEI7QUFDOUIsNENBQThCO0FBQzlCLG1DQUFpQztBQUVqQyxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUMxQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQztBQUU3QyxNQUFNLE1BQU0sR0FBVyx5QkFBYSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV0RCxNQUFNLEdBQUcscUJBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FDakIsQ0FBQTtBQUVELE1BQU0sT0FBTyxHQUFHLENBQU8sT0FBZSxFQUFFLEdBQVksRUFBRSxFQUFFO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELElBQUksS0FBSyxHQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN4QixhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUM1QixHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU87UUFDdEIsT0FBTyxFQUFFLENBQUM7UUFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixHQUFHO0tBQ04sQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLE9BQU8saUJBQWlCLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FB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LEdBQUcsQ0FBQyxDQUFDO1lBRS9JLE1BQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7WUFDdkQsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFakQsbUJBQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQy9CLENBQUM7Q0FDSjtBQXJkRCx1QkFxZEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Byb2dyYW19IGZyb20gXCJjb21tYW5kZXJcIjtcclxuaW1wb3J0ICogYXMgcHJvY2VzcyBmcm9tIFwicHJvY2Vzc1wiO1xyXG5pbXBvcnQge0xvZ2dlckZhY3RvcnksIHV0aWx9IGZyb20gXCJ2d2ViLWNvcmVcIjtcclxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XHJcbmltcG9ydCAqIGFzIGNoaWxkX3Byb2Nlc3MgZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xyXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tICdub2RlOm9zJztcclxuaW1wb3J0IHtyYW5kb21VVUlEfSBmcm9tICdjcnlwdG8nXHJcblxyXG5jb25zdCBkb21haW5LZXkgPSAncC1oY2MtaTAwMC1wMDBhLWhyY3BlJztcclxuY29uc3QgcGtnID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XHJcbmNvbnN0IFJTX1VSTCA9ICdodHRwczovL2Rmcy56aGlwZXIuY29tL3YzcjYnO1xyXG5cclxuY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcignWURTJyk7XHJcblxyXG5jb25zdCBlbnYgPSB7XHJcbiAgICAuLi5wcm9jZXNzLmVudlxyXG59XHJcblxyXG5jb25zdCBleGVjQ21kID0gYXN5bmMgKGNvbW1hbmQ6IHN0cmluZywgY3dkPzogc3RyaW5nKSA9PiB7XHJcbiAgICBsb2dnZXIuaW5mbyhg5omn6KGM5ZG95LukICR7Y29tbWFuZH0gJHtjd2QgPyBg77yM5omn6KGM55uu5b2V5Li6JHtjd2R9YCA6Jyd9YCk7XHJcbiAgICBsZXQgc3RhcnQgID0gRGF0ZS5ub3coKTtcclxuICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoY29tbWFuZCwge1xyXG4gICAgICAgIGN3ZCwgZW5jb2Rpbmc6ICd1dGYtOCcsXHJcbiAgICAgICAgdGltZW91dDogMCwgLy8g6K6+5Li65LiN6L+H5pyf77yM5LiL6L296YCf5bqm6L+H5oWi5Lya5a+86Ie06LaF5pe2XHJcbiAgICAgICAgc3RkaW86IFswLCAxLCAyXSxcclxuICAgICAgICBlbnZcclxuICAgIH0pO1xyXG4gICAgbG9nZ2VyLmluZm8oYOaJp+ihjOWRveS7pCAke2NvbW1hbmR9IOiAl+aXtiBcXHgxQlszNG0gPCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zPmApXHJcbn1cclxuXHJcbmNvbnN0IHBsYXRmb3JtID0gb3MucGxhdGZvcm0oKVxyXG5pZiAocGxhdGZvcm0gIT09ICd3aW4zMicpIHtcclxuICAgIGxvZ2dlci5lcnJvcign5b2T5YmN5bel5YW35LuF5pSv5oyBd2luZG93c+ezu+e7nycpO1xyXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xyXG59XHJcblxyXG5jb25zdCBpc0FkbWluID0gKCkgPT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICAvLyDlsJ3or5XmiafooYzkuIDkuKrlj6rmnInnrqHnkIblkZjmiY3og73ov5DooYznmoTlkb3ku6RcclxuICAgICAgICAvLyDkvb/nlKggPm51bCAyPiYxIOadpeaKkeWItui+k+WHulxyXG4gICAgICAgIGNoaWxkX3Byb2Nlc3MuZXhlY1N5bmMoJ25ldCBzZXNzaW9uID5udWwgMj4mMScpO1xyXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyDmiJDlip/miafooYxcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8g5omn6KGM5aSx6LSl77yM5p2D6ZmQ5LiN6LazXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCB3Z2V0ID0gcGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL3dnZXQuZXhlJyk7XHJcbmxldCB6aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vemlwLmV4ZScpO1xyXG5sZXQgdW56aXAgPSBwYXRoLmpvaW4oX19kaXJuYW1lICwnLi4vdW56aXAuZXhlJyk7XHJcblxyXG5wcm9ncmFtLm5hbWUoXCJ5ZHNcIilcclxuICAgIC51c2FnZShcIltjb21tYW5kXSBbb3B0aW9uc11cIilcclxuICAgIC5kZXNjcmlwdGlvbihcInlkcyDliLbnm5jlt6Xlhbcg5aaC5p6c5ZG95Luk5Y+C5pWw5Lit5a2Y5Zyo56m65qC8IOS9v+eUqOWPjOW8leWPt1xcXCJcXFwi5YyF6KO5XCIpXHJcbiAgICAudmVyc2lvbihgeWRzICR7cGtnLnZlcnNpb259YCk7XHJcblxyXG50eXBlIE1pY3JvU2VydmljZSA9ICdocmNwZScgfCAnZmVjb2RlJztcclxuXHJcbnR5cGUgR2l0ID0ge1xyXG4gICAgdXJsOiBzdHJpbmcsXHJcbiAgICBicmFuY2g6IHN0cmluZ1xyXG59XHJcblxyXG50eXBlIFlkc0NvbmZpZyA9IHtcclxuICAgIGhvc3RzOiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8TWljcm9TZXJ2aWNlLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPE1pY3JvU2VydmljZSwgc3RyaW5nIHwgR2l0PlxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBjb25mRWcgPSBge1xyXG4gICAgaG9zdHM/OiBBcnJheTxzdHJpbmc+O1xyXG4gICAgZ2l0OiBSZWNvcmQ8J2hyY3BlJyB8ICdmZWNvZGUnLCBzdHJpbmc+O1xyXG4gICAgY2F0YWxvZ3M6IHtcclxuICAgICAgICBbY2F0YWxvZzogc3RyaW5nXTogUmVjb3JkPCdocmNwZScgfCAnZmVjb2RlJywgc3RyaW5nIHwgeyB1cmw6IHN0cmluZywgYnJhbmNoOiBzdHJpbmcgfT5cclxuICAgIH1cclxufWBcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1haW4ge1xyXG5cclxuICAgIHN0YXJ0dXAoKSB7XHJcbiAgICAgICAgcHJvZ3JhbVxyXG4gICAgICAgICAgICAuY29tbWFuZCgnY2xlYW4gW3dvcmtkaXJdJylcclxuICAgICAgICAgICAgLnVzYWdlKCdjbGVhbiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+a4heeQhuWItuebmOW3peS9nOebruW9lSwgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOa4heeQhuWItuebmOW3peS9nOebruW9lSAke2Rpcn1gKTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGZpbGUgb2YgZnMucmVhZGRpclN5bmMoZGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlU3RhdCA9IGZzLnN0YXRTeW5jKGZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLnJtU3luYyhmaWxlLCB7cmVjdXJzaXZlOiBmaWxlU3RhdC5pc0RpcmVjdG9yeSgpfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yi255uY5bel5L2c55uu5b2V5riF55CG5a6M5oiQYCk7XHJcbiAgICAgICAgICAgIH0pLmhvb2soJ3Bvc3RBY3Rpb24nLCAoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xyXG5cclxuICAgICAgICBwcm9ncmFtXHJcbiAgICAgICAgICAgIC5jb21tYW5kKCdpbml0IFt3b3JrZGlyXScpXHJcbiAgICAgICAgICAgIC51c2FnZSgnaW5pdCBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAuZGVzY3JpcHRpb24oJ+WIneWni+WMlllEU+WItuebmOeOr+Wigywgd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKHdvcmtkaXI6IHN0cmluZyA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIneWni+WMlllEU+WItuebmOeOr+WigyDlt6XkvZznm67lvZXvvJoke2Rpcn1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZSA9IHBhdGgucmVzb2x2ZShkaXIsICd5ZHMuanNvbicpO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGVDcmVhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55Sf5oiQ6YWN572u5paH5Lu2IHlkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25maWdGaWxlLCBgI+ivt+agueaNruivtOaYjuS/ruaUuemFjee9ruaWh+S7tuW5tuWIoOmZpOaJgOacieazqOmHiuivtOaYjuWQjuS/neWtmFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJob3N0c1wiOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIuWmguaenOS9v+eUqOS6hnlkcy5iYXTliJ3lp4vnjq/looPvvIzlt7Lnu4/mt7vliqDkuoYgMTkyLjE2OC41MC40MCByZXBvLnl5cmQuY29tIDE5Mi4xNjguNTAuNDEgYmlwNS56aGlwZXIuY29tIDE5Mi4xNjguNTAuNDIgYmlwMy56aGlwZXIuY29tIGhvc3Rz6YWN572u6aG55Y+v5Lul5Yig6ZmkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1hdmVu5LuT5bqT56eB5pyN5a+55bqU55qEaG9zdOaYoOWwhFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJpc3blvIDlj5Hnjq/looPlr7nlupTnmoRob3N05pig5bCEXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJnaXRcIjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJocmNwZVwiOiBcIuWQjuerr+acjeWKoeWvueW6lOeahGdpdOWcsOWdgFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHlr7nlupRnaXTlnLDlnYBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGFsb2dzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICMg5a6i5oi35Luj56CB77yM55So5LqO5ZCv5Yqo5ZG95Luk55qEY2F0YWxvZ+WPguaVsFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJnZWVyXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImhyY3BlXCI6IFwi5ZCO56uv5pyN5Yqh5YiG5pSvXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJmZWNvZGVcIjogXCLmiqXlkYrmnI3liqHliIbmlK9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVDcmVhdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzmo4DmtYtnaXTlronoo4XlvIDlp4s+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBnaXRFeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMoJ2dpdCcpO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOajgOafpeaYr+WQpuWuieijheS6hmdpdCA+PiAke2dpdEV4aXN0cyA/ICflt7Llronoo4UnIDogJ+acquWuieijhSd9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBnaXRIb21lID0gYCR7ZGlyfS9naXQtZm9yLXdpbmRvd3NgXHJcbiAgICAgICAgICAgICAgICBpZiAoIWdpdEV4aXN0cyAmJiAhZnMuZXhpc3RzU3luYyhnaXRIb21lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdpdFppcE5hbWUgPSAnZ2l0LWZvci13aW5kb3dzLnppcCdcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29Z2l0IOWuieijheWMhSAke2dpdFppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2l0WmlwRmlsZSA9IGAke2Rpcn0vJHtnaXRaaXBOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5a2Y5Zyo5a6J6KOF5YyFIOWmguaenOacieWFiOWIoOmZpFxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGdpdFppcEZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke3dnZXR9ICR7UlNfVVJMfS8ke2dpdFppcE5hbWV9IC1PIFwiJHtnaXRaaXBGaWxlfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDop6Pljovlronoo4XljIUgJHtnaXRaaXBGaWxlfWApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7Z2l0WmlwRmlsZX1cIiAtZCBcIiR7ZGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBnaXQg5a6J6KOF5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzmo4DmtYtnaXTlronoo4Xnu5PmnZ8+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLamF2YeWuieijheW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IGphdmFFeGlzdHMgPSBhd2FpdCB1dGlsLmNtZC5leGlzdHMoJ2phdmEnKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4Dmn6XmmK/lkKblronoo4XkuoZqYXZhID4+ICR7amF2YUV4aXN0cyA/ICflt7Llronoo4UnIDogJ+acquWuieijhSd9YCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgamF2YUhvbWUgPSBlbnYuSkFWQV9IT01FO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFqYXZhRXhpc3RzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgamF2YUhvbWUgPSBgJHtkaXJ9L2pkazEuOC4wXzQ3MWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIWZzLmV4aXN0c1N5bmMoamF2YUhvbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCfmnKrmib7liLBqYXZh77yM5YeG5aSH5a6J6KOFamF2Ye+8jOW8gOWni+S4i+i9vWpkaycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqZGtaaXBOYW1lID0gJ2pkay04dTQ3MS13aW5kb3dzLXg2NC56aXAnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhgJHtkaXJ9LyR7amRrWmlwTmFtZX1gKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vWpkayDlronoo4XljIUgJHtqZGtaaXBOYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vJHtqZGtaaXBOYW1lfSAtTyBcIiR7ZGlyfS8ke2pka1ppcE5hbWV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1qZGsg5a6J6KOF5YyFICR7ZGlyfS8ke2pka1ppcE5hbWV9IOW3suWujOaIkGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi2pkayDlronoo4XljIUgJHtkaXJ9LyR7amRrWmlwTmFtZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke2Rpcn0vJHtqZGtaaXBOYW1lfVwiYCwgZGlyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGpka+WuieijheWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtqYXZhSG9tZX0vYmluL2phdmFcIiAtdmVyc2lvbmApO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLamF2YeWuieijhee7k+adnz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDlr7zlhaXor4HkuabliLBqYXZhIOWmguaenGphdmHmmK8xLjjniYjmnKwg6ZyA6KaB5a+85YWl5YiwIEpBVkFfSE9NRS9qcmUvbGliL3NlY3VyaXR5L2NhY2VydHMg5aaC5p6c5pivMTHniYjmnKwg6ZyA6KaB5a+85YWl5YiwIEpBVkFfSE9NRS9saWIvc2VjdXJpdHkvY2FjZXJ0c1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85a+85YWlamF2YeivgeS5puW8gOWniz4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGVuYW1lID0gJ2xpYi9zZWN1cml0eS9jYWNlcnRzJztcclxuICAgICAgICAgICAgICAgIGxldCBjZXJ0c0ZpbGUgPSBgJHtqYXZhSG9tZX0vJHtjZXJ0c0ZpbGVuYW1lfWA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2VydHNGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNlcnRzRmlsZSA9IGAke2phdmFIb21lfS9qcmUvJHtjZXJ0c0ZpbGVuYW1lfWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5qOA5p+lamF2YeivgeS5puebruW9lSAke2NlcnRzRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNlcnRzRmlsZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXl0b29sQ21kID0gYFwiJHtqYXZhSG9tZX0vYmluL2tleXRvb2xcImA7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g5Yik5pat6K+B5Lmm5piv5ZCm5bey57uP5a+85YWlXHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHtrZXl0b29sQ21kfSAtbGlzdCAtdiAta2V5c3RvcmUgXCIke2NlcnRzRmlsZX1cIiAtc3RvcmVwYXNzIGNoYW5nZWl0IC0tYWxpYXMgeXlyZGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGB5eXJkLmNydCDor4Hkuablt7LlrZjlnKhgKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIOivgeS5puS4jeWtmOWcqFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a+85YWlIHl5cmQuY3J0IOivgeS5puWIsGphdmEgJHtjZXJ0c0ZpbGV9YCk7IC8vICR7ZGlyfS95eXJkLmNydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke2tleXRvb2xDbWR9IC1pbXBvcnRjZXJ0IC1maWxlIFwiJHtwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4veXlyZC5jcnQnKX1cIiAta2V5c3RvcmUgXCIke2NlcnRzRmlsZX1cIiAtc3RvcmVwYXNzIGNoYW5nZWl0IC1ub3Byb21wdCAtLWFsaWFzIHl5cmRgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYHl5cmQuY3J0IOivgeS5puWvvOWFpeWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWvvOWFpWphdmHor4Hkuabnu5PmnZ8+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLbWF2ZW7lronoo4XlvIDlp4s+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXZlbkV4aXN0cyA9IGF3YWl0IHV0aWwuY21kLmV4aXN0cygnbXZuJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtYXZlbkhvbWUgPSBgJHtkaXJ9L21hdmVuLTMuOC42YDtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmo4Dmn6XmmK/lkKblronoo4XkuoZtYXZlbiA+PiAke21hdmVuRXhpc3RzID8gJ+W3suWuieijhScgOiAn5pyq5a6J6KOFJ31gKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF2ZW5FeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWF2ZW5Ib21lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXZlblppcE5hbWUgPSAnbWF2ZW4tMy44LjYuemlwJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a6J6KOFbWF2ZW4gJHttYXZlblppcE5hbWV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdmVuWmlwRmlsZSA9IGAke2Rpcn0vJHttYXZlblppcE5hbWV9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5a2Y5Zyo5a6J6KOF5YyFIOWmguaenOacieWFiOWIoOmZpFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobWF2ZW5aaXBGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vW1hdmVuIOWuieijheWMhSAke21hdmVuWmlwRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOS4i+i9veWuieijheWMheW5tui+k+WHuuaXpeW/l1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vJHttYXZlblppcE5hbWV9IC1PIFwiJHttYXZlblppcEZpbGV9XCJgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1tYXZlbiDlronoo4XljIUgJHttYXZlblppcEZpbGV9IOW3suWujOaIkGApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOino+WOi+WuieijheWMhSAke21hdmVuWmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7dW56aXB9XCIgXCIke21hdmVuWmlwRmlsZX1cIiAtZCBcIiR7ZGlyfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBtYXZlbiDlronoo4XlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmcy5leGlzdHNTeW5jKGAke2Rpcn0vc2V0dGluZ3MueG1sYCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29c2V0dGluZ3MueG1sYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vc2V0dGluZ3MueG1sYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOS4i+i9vXNldHRpbmdzLnhtbOWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85qOA5rWLbWF2ZW7lronoo4XlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw85Yid5aeL5YyWbm9kZeeOr+WigyAgPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoJ25wbSBpbnN0YWxsIC1nIHR5cGVzY3JpcHQgLS1yZWdpc3RyeT1odHRwczovL3JlZ2lzdHJ5Lm5wbW1pcnJvci5jb20nKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlm5vZGXnjq/looPlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POajgOa1i1lEUyBJREXlronoo4U+Pj4+Pj4+Pj4+Pj4+Pj4+PmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlRGlyID0gYCR7ZGlyfS95ZHMtMS4wLjNgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvZGVEaXIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZVppcE5hbWUgPSAneWRzLTEuMC4zLWpkay04LXdpbmRvd3MteDg2XzY0LnppcCdcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5a6J6KOFWURTIElERSAke2NvZGVaaXBOYW1lfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVaaXBGaWxlID0gYCR7ZGlyfS8ke2NvZGVaaXBOYW1lfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGNvZGVaaXBGaWxlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5LiL6L29WURTIElERSDlronoo4XljIUgJHtjb2RlWmlwRmlsZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8g5LiL6L295a6J6KOF5YyF5bm26L6T5Ye65pel5b+XXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gaHR0cHM6Ly95b25jb21tdW5pdHkueW9ueW91Y2xvdWQuY29tL1lEU0Rvd25sb2FkL1dpbmRvdy94NjQvJHtjb2RlWmlwTmFtZX0gLU8gXCIke2NvZGVaaXBGaWxlfVwiYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkuIvovb1ZRFMgSURFIOWuieijheWMhSAke2NvZGVaaXBGaWxlfSDlt7LlrozmiJBgKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke3VuemlwfVwiIFwiJHtjb2RlWmlwRmlsZX1cIiAtZCBcIiR7Y29kZURpcn1cImApO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMDApKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYDw8PDw8PDw8PDw8PDw8WURTIElERSDlronoo4XlrozmiJA+Pj4+Pj4+Pj4+Pj4+Pj4+PmApO1xyXG5cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgPDw8PDw8PDw8PDw8PDzliJ3lp4vljJZZRFMgSURFIOWFqOWxgOmFjee9rj4+Pj4+Pj4+Pj4+Pj4+Pj4+YClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzSnNvbiA9IGAke2NvZGVEaXJ9L0NvZGUvZGF0YS91c2VyLWRhdGEvVXNlci9zZXR0aW5ncy5qc29uYDtcclxuICAgICAgICAgICAgICAgIGxldCBzZXR0aW5nc0pzb25PYmogPSB7fTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHNldHRpbmdzSnNvbikpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nc0pzb25PYmogPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhzZXR0aW5nc0pzb24pLnRvU3RyaW5nKCd1dGYtOCcpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghamF2YUV4aXN0cykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOaJi+WKqOS4i+i9veeahGphdmEg6ZyA6KaB6YWN572uc2V0dGluZ3Mg5ZCm5YiZeWRz5peg5rOV5ZCv5YqoXHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLnJ1bnRpbWVzXCJdPVt7XCJuYW1lXCI6IFwiSmF2YVNFLTEuOFwiLFwicGF0aFwiOiBqYXZhSG9tZX1dXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ1htbCA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHNldHRpbmdYbWwpKSB7IC8vIOWmguaenOWtmOWcqOWFqOWxgOWRveS7pOWImeS9v+eUqOeahOaYr+agueebruW9leS4i+eahHNldHRpbmdzLnhtbCDlkKbliJnkvb/nlKjmoLnnm67lvZXkuIttYXZlbueahHNldHRpbmdzLnhtbFxyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdYbWwgPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9jb25mL3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialsnbWF2ZW4uZXhlY3V0YWJsZS5wYXRoJ10gPSBwYXRoLnJlc29sdmUoYCR7bWF2ZW5Ib21lfS9iaW4vbXZuLmNtZGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wiamF2YS5jb25maWd1cmF0aW9uLm1hdmVuLmdsb2JhbFNldHRpbmdzXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzSnNvbk9ialtcImphdmEuY29uZmlndXJhdGlvbi5tYXZlbi51c2VyU2V0dGluZ3NcIl0gPSBzZXR0aW5nWG1sO1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NKc29uT2JqW1wibWF2ZW4uc2V0dGluZ3NGaWxlXCJdID0gc2V0dGluZ1htbDtcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoc2V0dGluZ3NKc29uLCBKU09OLnN0cmluZ2lmeShzZXR0aW5nc0pzb25PYmosIG51bGwsIDQpKTtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGA8PDw8PDw8PDw8PDw8POWIneWni+WMlllEUyBJREUg5YWo5bGA6YWN572u5a6M5oiQPj4+Pj4+Pj4+Pj4+Pj4+Pj5gKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4Dmn6XlvZPliY3nlKjmiLfnm67lvZXkuIsuc3No5piv5ZCm5a2Y5ZyoIGlkX2VkMjU1MTkucHViIOWvhumSpeaWh+S7tu+8jOWmguaenOayoeacieWImeaUvuWIsC5zc2gg55uu5b2V5LiLXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzc2hEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUsICcuc3NoJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3NoRGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZzLm1rZGlyU3luYyhzc2hEaXIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi7fotJ3lr4bpkqXmlofku7ZgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTkucHViJyksIGAke3NzaERpcn0vaWRfZWQyNTUxOS5wdWJgKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jb3B5RmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uL2lkX2VkMjU1MTknKSwgYCR7c3NoRGlyfS9pZF9lZDI1NTE5YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOaLt+i0neWvhumSpeaWh+S7tuWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWdGaWxlQ3JlYXRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDphY3nva7mlofku7Z5ZHMuanNvbuW3sue7j+eUn+aIkO+8jOivt+S9v+eUqOe8lui+keWZqOWvuemFjee9ruWGheWuuei/m+ihjOS/ruaUuWApXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yid5aeL5YyWWURT5Yi255uY546v5aKD5a6M5oiQ77yM5aaC5p6c5piv6aaW5qyh5omn6KGM6K+35YWz6Zet5b2T5YmN56qX5Y+j77yM5bm26YeN5paw5omT5byAYClcclxuICAgICAgICAgICAgfSkuaG9vaygncG9zdEFjdGlvbicsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlpoLmnpzmiafooYzov4fnqIvkuK3lh7rnjrDmiqXplJnor7flhbPpl63lvZPliY3nu4jnq6/vvIzph43lkK/nu4jnq6/lkI7miafooYwgeWRzIGluaXQg55u05Yiw5peg5oql6ZSZ5YaF5a655Li65q2iYClcclxuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHByb2dyYW1cclxuICAgICAgICAgICAgLmNvbW1hbmQoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAudXNhZ2UoJ3N0YXJ0IDxjYXRhbG9nPiBbd29ya2Rpcl0nKVxyXG4gICAgICAgICAgICAub3B0aW9uKCctZiwgLS1maWxlIDxmaWxlPicsICfphY3nva7mlofku7YnKVxyXG4gICAgICAgICAgICAuYWRkSGVscFRleHQoJ2FmdGVyJywgYOmFjee9ruaWh+S7tuWGheWuueekuuS+i++8miR7Y29uZkVnfWApXHJcbiAgICAgICAgICAgIC5kZXNjcmlwdGlvbign5ZCv5Yqo5Yi255uY546v5aKD77yMY2F0YWxvZ+ihqOekuumcgOimgeWItuebmOeahOaooeWdl++8jOWvueW6lOmFjee9ruaWh+S7tuS4rWNhdGFsb2dz55qEa2V55YC877yM55So5LqO5oyH5a6a6ZyA6KaB5Ye655uY55qE5L+h5oGv77yMd29ya2RpcuihqOekuuWItuebmOW3peS9nOebruW9le+8jOWmguaenOS4jeaMh+WumuWImeS9v+eUqOW9k+WJjeebruW9lScpXHJcbiAgICAgICAgICAgIC5hY3Rpb24oYXN5bmMgKGNhdGFsb2c6IHN0cmluZywgd29ya2Rpcjogc3RyaW5nID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkpLCBvcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBmaWxlOiBzdHJpbmdcclxuICAgICAgICAgICAgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKHdvcmtkaXIpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIOWmguaenOacquaMh+WumumFjee9ruaWh+S7tlxyXG4gICAgICAgICAgICAgICAgbGV0IHlkc0pzb246IHN0cmluZztcclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICB5ZHNKc29uID0gcGF0aC5yZXNvbHZlKG9wdGlvbnMuZmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg5pyq5om+5Yiw6YWN572u5paH5Lu2ICR7eWRzSnNvbn1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgeWRzSnNvbiA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3lkcy5qc29uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W6YWN572u5paH5Lu2XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHlkc0pzb24pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6K+36YCa6L+H5Y+C5pWwIC1mIOaMh+WumumcgOimgeS9v+eUqOeahOmFjee9ruaWh+S7tuaIluiAheWcqOW9k+WJjeebruW9leS4i+WIm+W7unlkcy5qc29u5paH5Lu277yM5YaF5a655Y+C6ICDJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW8gOWni+WItuebmCAke2NhdGFsb2d9IOW3peS9nOebruW9le+8miR7ZGlyfWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmo4DmtYvliLbnm5jnjq/looPmo4DmtYtgKTtcclxuICAgICAgICAgICAgICAgIGxldCBnaXRDbWQgPSAnZ2l0JztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdEV4aXN0cyA9IGF3YWl0IHV0aWwuY21kLmV4aXN0cyhnaXRDbWQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFnaXRFeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBnaXRDbWQgPSBgJHtkaXJ9L2dpdC1mb3Itd2luZG93cy9iaW4vZ2l0LmV4ZWA7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGdpdENtZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDmnKrmib7liLBnaXTlkb3ku6QgJHtnaXRDbWR9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGdpdENtZCA9IGBcIiR7Z2l0Q21kfVwiYDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0dGluZ1htbCA9IHBhdGgucmVzb2x2ZShgJHtkaXJ9L3NldHRpbmdzLnhtbGApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG12bkNtZCA9ICdtdm4nO1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hdmVuSG9tZSA9IGAke2Rpcn0vbWF2ZW4tMy44LjZgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKG1hdmVuSG9tZSkpIHsgLy8g5L2/55So5YWo5bGAbWF2ZW5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXZuRXhpc3RzID0gYXdhaXQgdXRpbC5jbWQuZXhpc3RzKG12bkNtZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtdm5FeGlzdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDmnKrmib7liLBtdm7lkb3ku6QgJHttdm5DbWR9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIOayoeaciXNldHRpbmdzIOS4i+i9vVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzZXR0aW5nWG1sKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2Fybihg5pyq5om+5YiwbWF2ZW7phY3nva7mlofku7YgJHtzZXR0aW5nWG1sfSwg5LiL6L29c2V0dGluZ3MueG1s5paH5Lu2YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7d2dldH0gJHtSU19VUkx9L3NldHRpbmdzLnhtbGAsIGRpcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBtdm5DbWQgPSBgXCIke21hdmVuSG9tZX0vYmluL212bi5jbWRcImA7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ1htbCA9IGAke21hdmVuSG9tZX0vY29uZi9zZXR0aW5ncy54bWxgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBpZGVQYXRoID0gYCR7ZGlyfS95ZHMtMS4wLjNgXHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoaWRlUGF0aCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOacquaJvuWIsElERSAke2lkZVBhdGh9LCDor7flhYjmiafooYwgaW5pdCDliJ3lp4vljJbliLbnm5jnjq/looNgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5Yi255uY546v5aKD5qOA5rWL5a6M5oiQYClcclxuICAgICAgICAgICAgICAgIGxldCB5ZHNKc29uU3RyID0gZnMucmVhZEZpbGVTeW5jKHlkc0pzb24pLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgLy8g5pu/5o2i5omA5pyJIyDlvIDlpLTnmoTms6jph4ror7TmmI7ooYxcclxuICAgICAgICAgICAgICAgIHlkc0pzb25TdHIgPSB5ZHNKc29uU3RyLnJlcGxhY2UoL14jLiovZ20sICcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyDmo4DmtYvphY3nva7mlofku7bmmK/lkKblrozmlbRcclxuICAgICAgICAgICAgICAgIGxldCBjb25maWc6IFlkc0NvbmZpZztcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ29uZmlnRXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSDmoLzlvI/plJnor68g5Y+C6ICD56S65L6L77yaJHtjb25mRWd9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKHlkc0pzb25TdHIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLmNhdGFsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQ29uZmlnRXJyb3IoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjaGVja0NvbmZpZ0Vycm9yKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGdpdCA9IGNvbmZpZy5naXQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYXRhbG9nQ29uZmlnID0gY29uZmlnLmNhdGFsb2dzW2NhdGFsb2ddO1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0g5om+5LiN5YiwIGNhdGFsb2dzLiR7Y2F0YWxvZ30g5YWI5YWz6YWN572uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlIOaIliBjYXRhbG9ncy4ke2NhdGFsb2d9LmZlY29kZSDlrZfmrrXnvLrlpLFgKTtcclxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlID0gYCR7ZGlyfS8ke2NhdGFsb2d9YDtcclxuICAgICAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhuYW1lc3BhY2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOWIm+W7uuebruW9lSAke25hbWVzcGFjZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICBmcy5ta2RpclN5bmMobmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5ZyoYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgaHJjcGVVcmwgPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5ocmNwZSA9PT0gJ3N0cmluZycgPyBnaXQ/LmhyY3BlIDogY2F0YWxvZ0NvbmZpZy5ocmNwZS51cmw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWhyY3BlVXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDphY3nva7mlofku7YgJHt5ZHNKc29ufSBjYXRhbG9ncy4ke2NhdGFsb2d9IOWQjuerr+acjeWKoSDmnKrmjIflrprku5PlupPlnLDlnYDvvIzor7fpgJrov4cgZ2l0LmhyY3BlIOaIluiAhSBjYXRhbG9ncy4ke2NhdGFsb2d9LmhyY3BlLnVybCDmjIflrprku5PlupPlnLDlnYBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmi4nlj5blkI7nq6/mnI3liqHku5PlupMgJHtocmNwZVVybH1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vLmdpdGApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5bey5a2Y5Zyo77yM5byA5aeL5pu05paw5LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2dpdENtZH1cIiBwdWxsYCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOebruW9lSAke25hbWVzcGFjZX0g5LiN5a2Y5Zyo77yM5byA5aeL5Yib5bu65LuT5bqTYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5jaCA9IHR5cGVvZiBjYXRhbG9nQ29uZmlnLmhyY3BlID09PSAnc3RyaW5nJyA/IGNhdGFsb2dDb25maWcuaHJjcGUgOiBjYXRhbG9nQ29uZmlnLmhyY3BlLmJyYW5jaDtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyYW5jaCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYOmFjee9ruaWh+S7tiAke3lkc0pzb259IGNhdGFsb2dzLiR7Y2F0YWxvZ30g5ZCO56uv5pyN5YqhIOacquaMh+WumuWIhuaUr++8jOivt+mAmui/hyBnaXQuaHJjcGUg5oiW6ICFIGNhdGFsb2dzLiR7Y2F0YWxvZ30uaHJjcGUuYnJhbmNoIOmFjee9ruWIhuaUr2ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtnaXRDbWR9XCIgY2xvbmUgLWIgJHticmFuY2h9ICR7aHJjcGVVcmx9ICR7bmFtZXNwYWNlfWAsIG5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5ouJ5Y+W5ZCO56uv5pyN5Yqh5LuT5bqT5a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgYm9vc3RyYXBQb21YbWwgPSBgJHtuYW1lc3BhY2V9LyR7ZG9tYWluS2V5fS1iZS9kZXYtJHtkb21haW5LZXl9LWJvb3RzdHJhcC9wb20ueG1sYDtcclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmm7/mjaLmlofku7YgJHtib29zdHJhcFBvbVhtbH0g5Lit55qEUk9PVOS4umRvbWFpbktlee+8jOWQpuWImeS8muWvvOiHtOWItuebmOWksei0pe+8jOaXoOazleaJvuWIsOWItuWTgWApO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9vc3RyYXBQb21YbWxTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoYm9vc3RyYXBQb21YbWwpLnRvU3RyaW5nKCd1dGYtOCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGJvb3N0cmFwUG9tWG1sU3RyaW5nLmluY2x1ZGVzKCdST09UJykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGJvb3N0cmFwUG9tWG1sLCBib29zdHJhcFBvbVhtbFN0cmluZy5yZXBsYWNlKC9ST09UL2csIGRvbWFpbktleSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjb25maWcuaG9zdHMgJiYgY29uZmlnLmhvc3RzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlrZjlnKhob3N0c+mFjee9ru+8jOajgOa1i+ezu+e7n2hvc3Rz6YWN572u5paH5Lu25piv5ZCm5bey57uP6YWN572uYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3RzRmlsZSA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5XSU5ESVIsICdTeXN0ZW0zMicsICdkcml2ZXJzJywgJ2V0YycsICdob3N0cycpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RMaXN0ID0gZnMucmVhZEZpbGVTeW5jKGhvc3RzRmlsZSkudG9TdHJpbmcoJ3V0Zi04Jykuc3BsaXQoJ1xcbicpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHBlbmRIb3N0cyA9IFsuLi5jb25maWcuaG9zdHNdXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaG9zdEl0ZW0gb2YgaG9zdExpc3QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC8jLy50ZXN0KGhvc3RJdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYXBwZW5kSG9zdCBvZiBjb25maWcuaG9zdHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtpcCwgZG9tYWluXSA9IGFwcGVuZEhvc3Quc3BsaXQoJyAnKS5maWx0ZXIoaXRlbSA9PiBpdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RJdGVtLmluY2x1ZGVzKGlwKSAmJiBob3N0SXRlbS5pbmNsdWRlcyhkb21haW4pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOezu+e7n2hvc3Rz6YWN572u5paH5Lu25bey5a2Y5ZyoICR7YXBwZW5kSG9zdH1gKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRIb3N0cy5yZW1vdmUoYXBwZW5kSG9zdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8g6K+75Y+W57O757ufaG9zdHPphY3nva7mlofku7ZcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwZW5kSG9zdHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FkbWluKCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKGhvc3RzRmlsZSwgYFxcbiR7YXBwZW5kSG9zdHMuam9pbignXFxuJyl9XFxuYCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiAndXRmLTgnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGDlvZPliY3pnZ7nrqHnkIblkZjlkK/liqjml6Dms5Xmm7TmlLlob3N0c+aWh+S7tu+8jOivt+S9v+eUqOeuoeeQhuWRmOWQr+WKqOaIluiAheaJi+WKqOa3u+WKoCAke2FwcGVuZEhvc3RzLmpvaW4oJ1xcbicpfSDliLDmlofku7YgJHtob3N0c0ZpbGV9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYGhvc3RzIOmFjee9ruajgOa1i+WujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCfliJ3lp4vljJbpobnnm65tYXZlbueOr+WigycpO1xyXG4gICAgICAgICAgICAgICAgbGV0IG12bkNvbmZpZ0RpciA9IGAke25hbWVzcGFjZX0vLm12bmA7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobXZuQ29uZmlnRGlyKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7bXZuQ21kfSAtTiBpby50YWthcmk6bWF2ZW46d3JhcHBlciAtRG1hdmVuPTMuOC42YCwgbmFtZXNwYWNlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIOWGmeWFpW1hdmVu6YWN572u5YiwIC5tdm4vbWF2ZW4uY29uZmlnXHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnRmlsZSA9IGAke212bkNvbmZpZ0Rpcn0vbWF2ZW4uY29uZmlnYDtcclxuICAgICAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGNvbmZpZ0ZpbGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGAke212bkNvbmZpZ0Rpcn0vbWF2ZW4uY29uZmlnYCwgYC1zXFxuJHtzZXR0aW5nWG1sfVxcbi1EbWF2ZW4ud2Fnb24uaHR0cC5zc2wuaW5zZWN1cmU9dHJ1ZVxcbi1EbWF2ZW4ud2Fnb24uaHR0cC5zc2wuYWxsb3dhbGw9dHJ1ZWApO1xyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYOW9k+WJjW1hdmVu5L+h5oGvYClcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYCR7bXZuQ21kfSAtLXZlcnNpb25gLCBuYW1lc3BhY2UpO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCfpobnnm65tYXZlbua4heeQhicpXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGAke212bkNtZH0gY2xlYW4gLURza2lwVGVzdHNgLCBgJHtuYW1lc3BhY2V9LyR7ZG9tYWluS2V5fS1iZWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCflpITnkIbliY3nq6/mnoTlu7rvvIzlop7liqDmnoTlu7rmlofku7YnKTtcclxuICAgICAgICAgICAgICAgIGxldCBmZURpciA9IGAke25hbWVzcGFjZX0vJHtkb21haW5LZXl9LWZlYDtcclxuICAgICAgICAgICAgICAgIGxldCBmZUJ1aWxkSnMgPSBgJHtmZURpcn0vYnVpbGQuanNgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZlQnVpbGRKcykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmcy5jcFN5bmMocGF0aC5qb2luKF9fZGlybmFtZSAsJy4uL2ZlLWJ1aWxkLmpzJyksIGZlQnVpbGRKcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVQYWNrYWdlSnNvbiA9IGAke2ZlRGlyfS9wYWNrYWdlLmpzb25gO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZVN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhmZVBhY2thZ2VKc29uKS50b1N0cmluZygndXRmLTgnKTtcclxuICAgICAgICAgICAgICAgIGlmICghcGFja2FnZVN0cmluZy5pbmNsdWRlcygnYnVpbGQuanMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlUGFja2FnZUpzb259YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VTdHJpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIHBhY2thZ2VKc29uLnNjcmlwdHNbJ2J1aWxkOmV4dGVuZCddICs9ICcgJiYgbm9kZSBidWlsZC5qcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhmZVBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgNCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlUGFja2FnZUpzb2595a6M5oiQYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBmZWNvZGVVcmwgPSB0eXBlb2YgY2F0YWxvZ0NvbmZpZy5mZWNvZGUgPT09ICdzdHJpbmcnID8gZ2l0Py5mZWNvZGUgOiBjYXRhbG9nQ29uZmlnLmZlY29kZS51cmw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWZlY29kZVVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDlkI7nq6/mnI3liqEg5pyq5oyH5a6a5LuT5bqT5Zyw5Z2A77yM6K+36YCa6L+HIGdpdC5mZWNvZGUg5oiW6ICFIGNhdGFsb2dzLiR7Y2F0YWxvZ30uZmVjb2RlLnVybCDmjIflrprku5PlupPlnLDlnYBgKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlvIDlp4vmi4nlj5bmiqXlkYrmnI3liqHku5PlupMgJHtmZWNvZGVVcmx9YCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgcmVwb3J0TmFtZXNwYWNlID0gYCR7bmFtZXNwYWNlfS95b25iaXAteWlzdi1penAxLWRldi1mZWNvZGVgO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoYCR7cmVwb3J0TmFtZXNwYWNlfS8uZ2l0YCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7cmVwb3J0TmFtZXNwYWNlfSDlt7LlrZjlnKjvvIzlvIDlp4vmm7TmlrDku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBleGVjQ21kKGBcIiR7Z2l0Q21kfVwiIHB1bGxgLCByZXBvcnROYW1lc3BhY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55uu5b2VICR7cmVwb3J0TmFtZXNwYWNlfSDkuI3lrZjlnKjvvIzlvIDlp4vliJvlu7rku5PlupNgKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmNoID0gdHlwZW9mIGNhdGFsb2dDb25maWcuZmVjb2RlID09PSAnc3RyaW5nJyA/IGNhdGFsb2dDb25maWcuZmVjb2RlIDogY2F0YWxvZ0NvbmZpZy5mZWNvZGUuYnJhbmNoO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJhbmNoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihg6YWN572u5paH5Lu2ICR7eWRzSnNvbn0gY2F0YWxvZ3MuJHtjYXRhbG9nfSDmiqXlkYrmnI3liqHmnKrmjIflrprliIbmlK/vvIzor7fpgJrov4cgZ2l0LmZlY29kZSDmiJbogIUgY2F0YWxvZ3MuJHtjYXRhbG9nfS5mZWNvZGUuYnJhbmNoIOmFjee9ruWIhuaUr2ApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHtnaXRDbWR9XCIgY2xvbmUgLWIgJHticmFuY2h9ICR7ZmVjb2RlVXJsfSAke3JlcG9ydE5hbWVzcGFjZX1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDmi4nlj5bmiqXlkYrmnI3liqHku5PlupPlrozmiJBgKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5aSE55CG5oql5ZGK5p6E5bu677yM5aKe5Yqg5p6E5bu65paH5Lu2Jyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVjb2RlQnVpbGRKcyA9IGAke3JlcG9ydE5hbWVzcGFjZX0vYnVpbGQuanNgO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGZlY29kZUJ1aWxkSnMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMuY3BTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUgLCcuLi9mZWNvZGUtYnVpbGQuanMnKSwgZmVjb2RlQnVpbGRKcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZmVjb2RlUGFja2FnZUpzb24gPSBgJHtyZXBvcnROYW1lc3BhY2V9L3BhY2thZ2UuanNvbmA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmZWNvZGVQYWNrYWdlU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGZlY29kZVBhY2thZ2VKc29uKS50b1N0cmluZygndXRmLTgnKTtcclxuICAgICAgICAgICAgICAgIGlmICghZmVjb2RlUGFja2FnZVN0cmluZy5pbmNsdWRlcygnYnVpbGQuanMnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlY29kZVBhY2thZ2VKc29ufWApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmZWNvZGVQYWNrYWdlU3RyaW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlSnNvbi5zY3JpcHRzWydidWlsZCddICs9ICcgJiYgbm9kZSBidWlsZC5qcyc7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFja2FnZUpzb24uZG9tYWluS2V5ID0gZG9tYWluS2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIOWIoOmZpOatpOS+nei1liDkvJrlr7zoh7RucG0gaSDlpLHotKVcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzLnpsaWJcclxuICAgICAgICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKGZlY29kZVBhY2thZ2VKc29uLCBKU09OLnN0cmluZ2lmeShwYWNrYWdlSnNvbiwgbnVsbCwgNCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDkv67mlLkke2ZlY29kZVBhY2thZ2VKc29ufeWujOaIkGApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlronoo4XmiqXlkYrmnI3liqHkvp3otZZgKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoJ25wbSBpJywgcmVwb3J0TmFtZXNwYWNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg55Sf5oiQdmVyc2lvbi5qc29uIOaWh+S7tmApXHJcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gcmFuZG9tVVVJRCgpLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoYCR7cmVwb3J0TmFtZXNwYWNlfS92ZXJzaW9uLmpzb25gLCBge1widmVyc2lvblwiOiBcIiR7dXVpZH1cIn1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygn5Yid5aeL5YyW6aG555uu546v5aKD6LWE5rqQJyk7XHJcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpwgbmFtZXNwYWNlLyhkaXNrfGRpc2tzKSDlpoLmnpzlrZjlnKgg6Lez6L+HXHJcbiAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhgJHtuYW1lc3BhY2V9L2Rpc2tgKSB8fCBmcy5leGlzdHNTeW5jKGAke25hbWVzcGFjZX0vZGlza3NgKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGDlt7LlrZjlnKjvvIzot7Pov4fnjq/looPotYTmupDmlofku7bkuIvovb1gKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZnMuemhpcGVyLmNvbS92M3I2L2Vudi56aXBcclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg5byA5aeL5LiL6L296aG555uu546v5aKD6LWE5rqQ5paH5Lu2YClcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2l0WmlwRmlsZSA9IGAke25hbWVzcGFjZX0vZW52LnppcGA7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgJHt3Z2V0fSAke1JTX1VSTH0vZW52LnppcCAtTyBcIiR7Z2l0WmlwRmlsZX1cImApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhg6Kej5Y6L6LWE5rqQ5paH5Lu25YyFICR7Z2l0WmlwRmlsZX1gKVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV4ZWNDbWQoYFwiJHt1bnppcH1cIiBcIiR7Z2l0WmlwRmlsZX1cImAsIG5hbWVzcGFjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZnMucm1TeW5jKGdpdFppcEZpbGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+WQr+WKqElERScpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY0NtZChgXCIke2lkZVBhdGh9L0NvZGUvYmluL2NvZGVcIiAtLW5vLXNhbmRib3ggLS1sb2cgZGVidWcgLS1nb3RvIFwiJHtpZGVQYXRofS9Db2RlL2RhdGEvdXNlci1kYXRhL1VzZXIvc2V0dGluZ3MuanNvblwiIFwiJHtuYW1lc3BhY2V9XCJgKTtcclxuICAgICAgICAgICAgICAgIC8vIOmcgOimgeetieW+hUlEReWQr+WKqOWujOaIkOWQjuWFs+mXrVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDMwMDApKVxyXG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ+W3suWQr+WKqElERe+8jOeCueWHu+W3puS+p+iPnOWNlemAieaLqeKAnFlEU+KAne+8jOivt+aMieeFp+aWh+aho+ivtOaYjui/m+ihjOWItuebmOaTjeS9nCcpO1xyXG4gICAgICAgICAgICB9KS5ob29rKCdwb3N0QWN0aW9uJywgKCkgPT4gcHJvY2Vzcy5leGl0KDApKTtcclxuXHJcbiAgICAgICAgcHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpXHJcbiAgICB9XHJcbn1cclxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yds-tool",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "isv本地制盘工具",
5
5
  "main": "./bin/index.js",
6
6
  "bin": {
package/src/main.ts CHANGED
@@ -26,7 +26,7 @@ const execCmd = async (command: string, cwd?: string) => {
26
26
  stdio: [0, 1, 2],
27
27
  env
28
28
  });
29
- logger.info(`执行命令 ${command} 耗时 \x1B[34m <${Date.now() - start}ms>]`)
29
+ logger.info(`执行命令 ${command} 耗时 \x1B[34m <${Date.now() - start}ms>`)
30
30
  }
31
31
 
32
32
  const platform = os.platform()
@@ -129,6 +129,7 @@ export default class Main {
129
129
  configFileCreated = true;
130
130
  }
131
131
 
132
+ logger.info(`<<<<<<<<<<<<<<检测git安装开始>>>>>>>>>>>>>>>>>`)
132
133
  const gitExists = await util.cmd.exists('git');
133
134
  logger.info(`检查是否安装了git >> ${gitExists ? '已安装' : '未安装'}`);
134
135
  const gitHome = `${dir}/git-for-windows`
@@ -138,137 +139,129 @@ export default class Main {
138
139
  const gitZipFile = `${dir}/${gitZipName}`;
139
140
  // 检查是否已经存在安装包 如果有先删除
140
141
  if (fs.existsSync(gitZipFile)) {
141
- logger.info(`删除已存在安装包 ${gitZipFile}`);
142
- fs.rmSync(gitZipFile);
142
+ // 下载安装包并输出日志
143
+ await execCmd(`${wget} ${RS_URL}/${gitZipName} -O "${gitZipFile}"`);
144
+ logger.info(`解压安装包 ${gitZipFile}`)
145
+ await execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
143
146
  }
144
- // 下载安装包并输出日志
145
- await execCmd(`${wget} ${RS_URL}/${gitZipName} -O "${gitZipFile}"`);
146
- logger.info(`解压安装包 ${gitZipFile}`)
147
- await execCmd(`"${unzip}" "${gitZipFile}" -d "${dir}"`);
148
- logger.info(`配置git环境变量`);
149
- await execCmd( `setx PATH "%PATH%;${gitHome}\\bin;"` );
150
- fs.rmSync(gitZipFile)
151
147
  logger.info(`git 安装完成`);
152
148
  }
149
+ logger.info(`<<<<<<<<<<<<<<检测git安装结束>>>>>>>>>>>>>>>>>`)
153
150
 
151
+ logger.info(`<<<<<<<<<<<<<<检测java安装开始>>>>>>>>>>>>>>>>>`)
154
152
  const javaExists = await util.cmd.exists('java');
155
153
  logger.info(`检查是否安装了java >> ${javaExists ? '已安装' : '未安装'}`);
154
+ let javaHome = env.JAVA_HOME;
156
155
  if (!javaExists) {
157
- logger.info('未找到java,准备安装java,开始下载jdk');
158
- const jdkZipName = 'jdk-8u471-windows-x64.zip'
159
- await execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
160
- logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`)
161
- await execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
162
- logger.info(`配置java环境变量`);
163
- let javaHome = `${dir}/jdk1.8.0_471`;
164
- await execCmd(`setx JAVA_HOME "${javaHome}"`);
165
- await execCmd(`setx CLASS_PATH ".;%JAVA_HOME%\\lib;"`);
166
- await execCmd( `setx PATH "%PATH%;%JAVA_HOME%\\bin;"` );
167
- env.JAVA_HOME = javaHome;
168
- env.CLASS_PATH = ".;%JAVA_HOME%\\lib;";
169
- env.PATH = "%PATH%;%JAVA_HOME%\\bin;";
170
- logger.info(`java 安装完成 请重启终端`);
171
- }
172
-
173
- logger.info(`检查java版本`);
174
- const javaHome = env.JAVA_HOME;
175
-
156
+ javaHome = `${dir}/jdk1.8.0_471`;
157
+ if(!fs.existsSync(javaHome)) {
158
+ logger.info('未找到java,准备安装java,开始下载jdk');
159
+ const jdkZipName = 'jdk-8u471-windows-x64.zip'
160
+ if (!fs.existsSync(`${dir}/${jdkZipName}`)) {
161
+ logger.info(`下载jdk 安装包 ${jdkZipName}`);
162
+ await execCmd(`${wget} ${RS_URL}/${jdkZipName} -O "${dir}/${jdkZipName}"`);
163
+ logger.info(`下载jdk 安装包 ${dir}/${jdkZipName} 已完成`)
164
+ }
165
+ logger.info(`解压jdk 安装包 ${dir}/${jdkZipName}`)
166
+ await execCmd(`"${unzip}" "${dir}/${jdkZipName}"`, dir);
167
+ logger.info(`jdk安装完成`);
168
+ }
169
+ }
176
170
  await execCmd(`"${javaHome}/bin/java" -version`);
177
- // 导入证书到java 如果java是1.8版本 需要导入到 JAVA_HOME/jre/lib/security/cacerts 如果是11版本 需要导入到 JAVA_HOME/lib/security/cacerts
171
+ logger.info(`<<<<<<<<<<<<<<检测java安装结束>>>>>>>>>>>>>>>>>`)
178
172
 
179
- if (javaHome) {
180
- let certsFilename = 'lib/security/cacerts';
181
- let certsFile = `${javaHome}/${certsFilename}`;
182
- if (!fs.existsSync(certsFile)) {
183
- certsFile = `${javaHome}/jre/${certsFilename}`;
184
- }
185
- logger.info(`检查java证书目录 ${certsFile}`);
186
- if (fs.existsSync(certsFile)) {
187
- const keytoolCmd = `"${javaHome}/bin/keytool"`;
188
- // 判断证书是否已经导入
189
- try {
190
- await execCmd(`${keytoolCmd} -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`)
191
- logger.info(`yyrd.crt 证书已存在`);
192
- } catch (e) {
193
- // 证书不存在
194
- logger.info(`导入 yyrd.crt 证书到java ${certsFile}`); // ${dir}/yyrd.crt
195
- await execCmd(`${keytoolCmd} -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
196
- logger.info(`yyrd.crt 证书导入完成`);
197
- }
173
+ // 导入证书到java 如果java是1.8版本 需要导入到 JAVA_HOME/jre/lib/security/cacerts 如果是11版本 需要导入到 JAVA_HOME/lib/security/cacerts
174
+ logger.info(`<<<<<<<<<<<<<<导入java证书开始>>>>>>>>>>>>>>>>>`)
175
+ let certsFilename = 'lib/security/cacerts';
176
+ let certsFile = `${javaHome}/${certsFilename}`;
177
+ if (!fs.existsSync(certsFile)) {
178
+ certsFile = `${javaHome}/jre/${certsFilename}`;
179
+ }
180
+ logger.info(`检查java证书目录 ${certsFile}`);
181
+ if (fs.existsSync(certsFile)) {
182
+ const keytoolCmd = `"${javaHome}/bin/keytool"`;
183
+ // 判断证书是否已经导入
184
+ try {
185
+ await execCmd(`${keytoolCmd} -list -v -keystore "${certsFile}" -storepass changeit --alias yyrd`)
186
+ logger.info(`yyrd.crt 证书已存在`);
187
+ } catch (e) {
188
+ // 证书不存在
189
+ logger.info(`导入 yyrd.crt 证书到java ${certsFile}`); // ${dir}/yyrd.crt
190
+ await execCmd(`${keytoolCmd} -importcert -file "${path.join(__dirname, '../yyrd.crt')}" -keystore "${certsFile}" -storepass changeit -noprompt --alias yyrd`);
191
+ logger.info(`yyrd.crt 证书导入完成`);
198
192
  }
199
193
  }
194
+ logger.info(`<<<<<<<<<<<<<<导入java证书结束>>>>>>>>>>>>>>>>>`)
200
195
 
201
- const mavenHome = `${dir}/maven-3.8.6`;
196
+ logger.info(`<<<<<<<<<<<<<<检测maven安装开始>>>>>>>>>>>>>>>>>`)
202
197
  const mavenExists = await util.cmd.exists('mvn');
198
+ const mavenHome = `${dir}/maven-3.8.6`;
203
199
  logger.info(`检查是否安装了maven >> ${mavenExists ? '已安装' : '未安装'}`);
204
200
  if (!mavenExists) {
205
- const mavenZipName = 'maven-3.8.6.zip'
206
- logger.info(`下载maven 安装包 ${mavenZipName}`);
207
- const mavenZipFile = `${dir}/${mavenZipName}`;
208
- // 检查是否已经存在安装包 如果有先删除
209
- if (fs.existsSync(mavenZipFile)) {
210
- logger.info(`删除已存在安装包 ${mavenZipFile}`);
211
- fs.rmSync(mavenZipFile);
212
- }
213
- // 下载安装包并输出日志
214
- await execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
215
- logger.info(`解压安装包 ${mavenZipFile}`)
216
- await execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
217
- fs.rmSync(mavenZipFile);
218
-
219
- // 添加maven 环境变量
220
- try {
221
- // Windows核心命令:永久追加路径到【用户环境变量PATH】,永久生效
222
- let mvnPath = path.resolve(`${mavenHome}/bin`);
223
- await execCmd( `setx PATH "%PATH%;${mvnPath}"` );
224
- logger.info(`✅ 成功!Maven路径【${mvnPath}】已添加到系统PATH环境变量`);
225
- } catch (err) {
226
- console.error('❌ 添加失败:', err.message);
201
+ if (!fs.existsSync(mavenHome)) {
202
+ const mavenZipName = 'maven-3.8.6.zip'
203
+ logger.info(`安装maven ${mavenZipName}`);
204
+ const mavenZipFile = `${dir}/${mavenZipName}`;
205
+ // 检查是否已经存在安装包 如果有先删除
206
+ if (!fs.existsSync(mavenZipFile)) {
207
+ logger.info(`下载maven 安装包 ${mavenZipFile}`);
208
+ // 下载安装包并输出日志
209
+ await execCmd(`${wget} ${RS_URL}/${mavenZipName} -O "${mavenZipFile}"`);
210
+ logger.info(`下载maven 安装包 ${mavenZipFile} 已完成`)
211
+ }
212
+ logger.info(`解压安装包 ${mavenZipFile}`)
213
+ await execCmd(`"${unzip}" "${mavenZipFile}" -d "${dir}"`);
214
+ logger.info(`maven 安装完成`);
227
215
  }
228
-
229
- logger.info(`maven 安装完成`);
216
+ } else if (!fs.existsSync(`${dir}/settings.xml`)) {
217
+ logger.info(`下载settings.xml`);
218
+ await execCmd(`${wget} ${RS_URL}/settings.xml`);
219
+ logger.info(`下载settings.xml完成`);
230
220
  }
221
+ logger.info(`<<<<<<<<<<<<<<检测maven安装完成>>>>>>>>>>>>>>>>>`)
231
222
 
232
- logger.info(`初始化node环境`);
223
+ logger.info(`<<<<<<<<<<<<<<初始化node环境 >>>>>>>>>>>>>>>>>`);
233
224
  await execCmd('npm install -g typescript --registry=https://registry.npmmirror.com');
234
- logger.info(`初始化node环境完成`);
225
+ logger.info(`<<<<<<<<<<<<<<初始化node环境完成>>>>>>>>>>>>>>>>>`);
235
226
 
236
- logger.info(`检测code是否存在`)
227
+ logger.info(`<<<<<<<<<<<<<<检测YDS IDE安装>>>>>>>>>>>>>>>>>`)
237
228
  const codeDir = `${dir}/yds-1.0.3`;
238
229
  if (!fs.existsSync(codeDir)) {
239
230
  const codeZipName = 'yds-1.0.3-jdk-8-windows-x86_64.zip'
240
- logger.info(`下载code IDE 安装包 ${codeZipName}`);
231
+ logger.info(`安装YDS IDE ${codeZipName}`);
241
232
  const codeZipFile = `${dir}/${codeZipName}`;
242
- // 检查是否已经存在安装包 如果有先删除
243
- if (fs.existsSync(codeZipFile)) {
244
- logger.info(`删除已存在安装包 ${codeZipFile}`);
245
- fs.rmSync(codeZipFile);
233
+ if (!fs.existsSync(codeZipFile)) {
234
+ logger.info(`下载YDS IDE 安装包 ${codeZipFile}`);
235
+ // 下载安装包并输出日志
236
+ await execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
237
+ logger.info(`下载YDS IDE 安装包 ${codeZipFile} 已完成`);
246
238
  }
247
- // 下载安装包并输出日志
248
- await execCmd(`${wget} https://yoncommunity.yonyoucloud.com/YDSDownload/Window/x64/${codeZipName} -O "${codeZipFile}"`);
249
- logger.info(`解压安装包 ${codeZipFile}`)
250
- fs.mkdirSync(codeDir, { recursive: true });
251
239
  await execCmd(`"${unzip}" "${codeZipFile}" -d "${codeDir}"`);
252
- fs.rmSync(codeZipFile)
253
240
  await new Promise((resolve) => setTimeout(resolve, 5000))
254
- logger.info(`code IDE 安装完成`);
255
241
  }
256
- logger.info(`初始化YDS IDE 全局配置`)
242
+ logger.info(`<<<<<<<<<<<<<<YDS IDE 安装完成>>>>>>>>>>>>>>>>>`);
243
+
244
+
245
+ logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置>>>>>>>>>>>>>>>>>`)
257
246
  const settingsJson = `${codeDir}/Code/data/user-data/User/settings.json`;
258
247
  let settingsJsonObj = {};
259
248
  if (fs.existsSync(settingsJson)) {
260
249
  settingsJsonObj = JSON.parse(fs.readFileSync(settingsJson).toString('utf-8'));
261
250
  }
262
- let settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
263
- if (!fs.existsSync(settingXml) && !fs.existsSync(`${dir}/settings.xml`)) {
264
- await execCmd(`${wget} ${RS_URL}/settings.xml`);
265
- settingXml = path.resolve(`${dir}/settings.xml`)
251
+ if (!javaExists) {
252
+ // 手动下载的java 需要配置settings 否则yds无法启动
253
+ settingsJsonObj["java.configuration.runtimes"]=[{"name": "JavaSE-1.8","path": javaHome}]
254
+ }
255
+ let settingXml = path.resolve(`${dir}/settings.xml`);
256
+ if (!fs.existsSync(settingXml)) { // 如果存在全局命令则使用的是根目录下的settings.xml 否则使用根目录下maven的settings.xml
257
+ settingXml = path.resolve(`${mavenHome}/conf/settings.xml`);
258
+ settingsJsonObj['maven.executable.path'] = path.resolve(`${mavenHome}/bin/mvn.cmd`);
266
259
  }
267
260
  settingsJsonObj["java.configuration.maven.globalSettings"] = settingXml;
268
261
  settingsJsonObj["java.configuration.maven.userSettings"] = settingXml;
269
262
  settingsJsonObj["maven.settingsFile"] = settingXml;
270
263
  fs.writeFileSync(settingsJson, JSON.stringify(settingsJsonObj, null, 4));
271
- logger.info(`初始化YDS IDE 全局配置完成`);
264
+ logger.info(`<<<<<<<<<<<<<<初始化YDS IDE 全局配置完成>>>>>>>>>>>>>>>>>`);
272
265
 
273
266
  // 检查当前用户目录下.ssh是否存在 id_ed25519.pub 密钥文件,如果没有则放到.ssh 目录下
274
267
  const sshDir = path.resolve(process.env.USERPROFILE, '.ssh');
@@ -331,13 +324,18 @@ export default class Main {
331
324
  logger.error(`未找到git命令 ${gitCmd}, 请先执行 init 初始化制盘环境`);
332
325
  process.exit(1)
333
326
  }
327
+ gitCmd = `"${gitCmd}"`;
334
328
  }
335
329
 
336
330
  let settingXml = path.resolve(`${dir}/settings.xml`);
337
331
  let mvnCmd = 'mvn';
338
- let mvnExists = await util.cmd.exists(mvnCmd);
339
332
  let mavenHome = `${dir}/maven-3.8.6`;
340
333
  if (!fs.existsSync(mavenHome)) { // 使用全局maven
334
+ let mvnExists = await util.cmd.exists(mvnCmd);
335
+ if (!mvnExists) {
336
+ logger.error(`未找到mvn命令 ${mvnCmd}, 请先执行 init 初始化制盘环境`);
337
+ process.exit(1)
338
+ }
341
339
  // 没有settings 下载
342
340
  if (!fs.existsSync(settingXml)) {
343
341
  logger.warn(`未找到maven配置文件 ${settingXml}, 下载settings.xml文件`);