piclist 0.0.1

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 (58) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +25 -0
  3. package/.github/workflows/alpha.yml +22 -0
  4. package/.github/workflows/main.yml +22 -0
  5. package/.github/workflows/manually.yml +19 -0
  6. package/CHANGELOG.md +549 -0
  7. package/License +21 -0
  8. package/README.md +116 -0
  9. package/bin/picgo +22 -0
  10. package/dist/core/Lifecycle.d.ts +15 -0
  11. package/dist/core/PicGo.d.ts +49 -0
  12. package/dist/i18n/en.d.ts +2 -0
  13. package/dist/i18n/index.d.ts +18 -0
  14. package/dist/i18n/zh-CN.d.ts +91 -0
  15. package/dist/i18n/zh-TW.d.ts +2 -0
  16. package/dist/index.cjs.js +3807 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.esm.js +3769 -0
  19. package/dist/lib/Commander.d.ts +22 -0
  20. package/dist/lib/LifecyclePlugins.d.ts +17 -0
  21. package/dist/lib/Logger.d.ts +19 -0
  22. package/dist/lib/PluginHandler.d.ts +10 -0
  23. package/dist/lib/PluginLoader.d.ts +27 -0
  24. package/dist/lib/Request.d.ts +12 -0
  25. package/dist/plugins/commander/config.d.ts +3 -0
  26. package/dist/plugins/commander/i18n.d.ts +3 -0
  27. package/dist/plugins/commander/index.d.ts +3 -0
  28. package/dist/plugins/commander/init.d.ts +3 -0
  29. package/dist/plugins/commander/pluginHandler.d.ts +3 -0
  30. package/dist/plugins/commander/proxy.d.ts +3 -0
  31. package/dist/plugins/commander/setting.d.ts +5 -0
  32. package/dist/plugins/commander/upload.d.ts +3 -0
  33. package/dist/plugins/commander/use.d.ts +3 -0
  34. package/dist/plugins/transformer/base64.d.ts +5 -0
  35. package/dist/plugins/transformer/index.d.ts +3 -0
  36. package/dist/plugins/transformer/path.d.ts +5 -0
  37. package/dist/plugins/uploader/aliyun.d.ts +2 -0
  38. package/dist/plugins/uploader/github.d.ts +2 -0
  39. package/dist/plugins/uploader/imgur.d.ts +2 -0
  40. package/dist/plugins/uploader/index.d.ts +3 -0
  41. package/dist/plugins/uploader/qiniu.d.ts +2 -0
  42. package/dist/plugins/uploader/smms.d.ts +2 -0
  43. package/dist/plugins/uploader/tcyun.d.ts +8 -0
  44. package/dist/plugins/uploader/upyun.d.ts +2 -0
  45. package/dist/types/index.d.ts +537 -0
  46. package/dist/types/oldRequest.d.ts +19 -0
  47. package/dist/utils/common.d.ts +106 -0
  48. package/dist/utils/createContext.d.ts +6 -0
  49. package/dist/utils/db.d.ts +15 -0
  50. package/dist/utils/enum.d.ts +27 -0
  51. package/dist/utils/eventBus.d.ts +4 -0
  52. package/dist/utils/getClipboardImage.d.ts +4 -0
  53. package/dist/utils/initUtils.d.ts +26 -0
  54. package/dist/utils/interfaces.d.ts +203 -0
  55. package/dist/utils/static.d.ts +1 -0
  56. package/logo.png +0 -0
  57. package/package.json +133 -0
  58. package/rollup.config.js +87 -0
@@ -0,0 +1,3807 @@
1
+ /*
2
+ * picgo@0.0.1, https://github.com/PicGo/PicGo-Core
3
+ * (c) 2018-2023 PicGo Group
4
+ * Released under the MIT License.
5
+ */
6
+ 'use strict';
7
+
8
+ Object.defineProperty(exports, '__esModule', { value: true });
9
+
10
+ var fs = require('fs-extra');
11
+ var path = require('path');
12
+ var events = require('events');
13
+ var os = require('os');
14
+ var commander = require('commander');
15
+ var inquirer = require('inquirer');
16
+ var imageSize = require('image-size');
17
+ var url = require('url');
18
+ var chalk = require('chalk');
19
+ var match = require('minimatch');
20
+ var globby = require('globby');
21
+ var ejs = require('ejs');
22
+ var download = require('download-git-repo');
23
+ var rm = require('rimraf');
24
+ var dayjs = require('dayjs');
25
+ var util = require('util');
26
+ var crypto = require('crypto');
27
+ var mime = require('mime-types');
28
+ var qiniu = require('qiniu');
29
+ var MD5 = require('md5');
30
+ var resolve = require('resolve');
31
+ var lodash = require('lodash');
32
+ var child_process = require('child_process');
33
+ var isWsl = require('is-wsl');
34
+ var axios = require('axios');
35
+ var FormData = require('form-data');
36
+ var https = require('https');
37
+ var tunnel = require('tunnel');
38
+ var store = require('@picgo/store');
39
+ var spawn = require('cross-spawn');
40
+ var yaml = require('js-yaml');
41
+ var i18n$1 = require('@picgo/i18n');
42
+
43
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
44
+
45
+ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
46
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
47
+ var os__default = /*#__PURE__*/_interopDefaultLegacy(os);
48
+ var inquirer__default = /*#__PURE__*/_interopDefaultLegacy(inquirer);
49
+ var chalk__default = /*#__PURE__*/_interopDefaultLegacy(chalk);
50
+ var match__default = /*#__PURE__*/_interopDefaultLegacy(match);
51
+ var globby__default = /*#__PURE__*/_interopDefaultLegacy(globby);
52
+ var ejs__default = /*#__PURE__*/_interopDefaultLegacy(ejs);
53
+ var download__default = /*#__PURE__*/_interopDefaultLegacy(download);
54
+ var rm__default = /*#__PURE__*/_interopDefaultLegacy(rm);
55
+ var dayjs__default = /*#__PURE__*/_interopDefaultLegacy(dayjs);
56
+ var util__default = /*#__PURE__*/_interopDefaultLegacy(util);
57
+ var crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
58
+ var mime__default = /*#__PURE__*/_interopDefaultLegacy(mime);
59
+ var qiniu__default = /*#__PURE__*/_interopDefaultLegacy(qiniu);
60
+ var MD5__default = /*#__PURE__*/_interopDefaultLegacy(MD5);
61
+ var resolve__default = /*#__PURE__*/_interopDefaultLegacy(resolve);
62
+ var isWsl__default = /*#__PURE__*/_interopDefaultLegacy(isWsl);
63
+ var axios__default = /*#__PURE__*/_interopDefaultLegacy(axios);
64
+ var FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData);
65
+ var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
66
+ var tunnel__default = /*#__PURE__*/_interopDefaultLegacy(tunnel);
67
+ var spawn__default = /*#__PURE__*/_interopDefaultLegacy(spawn);
68
+ var yaml__default = /*#__PURE__*/_interopDefaultLegacy(yaml);
69
+
70
+ const pluginHandler = {
71
+ handle: (ctx) => {
72
+ // const pluginHandler = new PluginHandler(ctx)
73
+ const cmd = ctx.cmd;
74
+ cmd.program
75
+ .command('install <plugins...>')
76
+ .description('install picgo plugin')
77
+ .alias('add')
78
+ .option('-p, --proxy <proxy>', 'Add proxy for installing')
79
+ .option('-r, --registry <registry>', 'Choose a registry for installing')
80
+ .action((plugins, program) => {
81
+ const { proxy, registry } = program;
82
+ const options = {
83
+ proxy,
84
+ registry
85
+ };
86
+ ctx.pluginHandler.install(plugins, options).catch((e) => { ctx.log.error(e); });
87
+ });
88
+ cmd.program
89
+ .command('uninstall <plugins...>')
90
+ .alias('rm')
91
+ .description('uninstall picgo plugin')
92
+ .action((plugins) => {
93
+ ctx.pluginHandler.uninstall(plugins).catch((e) => { ctx.log.error(e); });
94
+ });
95
+ cmd.program
96
+ .command('update <plugins...>')
97
+ .description('update picgo plugin')
98
+ .option('-p, --proxy <proxy>', 'Add proxy for installing')
99
+ .option('-r, --registry <registry>', 'Choose a registry for installing')
100
+ .action((plugins, program) => {
101
+ const { proxy, registry } = program;
102
+ const options = {
103
+ proxy,
104
+ registry
105
+ };
106
+ ctx.pluginHandler.update(plugins, options).catch((e) => { ctx.log.error(e); });
107
+ });
108
+ }
109
+ };
110
+
111
+ const config$7 = {
112
+ handle: (ctx) => {
113
+ const cmd = ctx.cmd;
114
+ cmd.program
115
+ .option('-c, --config <path>', 'set config path');
116
+ // will handle in `bin/picgo`
117
+ }
118
+ };
119
+
120
+ const isUrl = (url) => (url.startsWith('http://') || url.startsWith('https://'));
121
+ const isUrlEncode = (url) => {
122
+ url = url || '';
123
+ try {
124
+ // the whole url encode or decode shold not use encodeURIComponent or decodeURIComponent
125
+ return url !== decodeURI(url);
126
+ }
127
+ catch (e) {
128
+ // if some error caught, try to let it go
129
+ return true;
130
+ }
131
+ };
132
+ const handleUrlEncode = (url) => {
133
+ if (!isUrlEncode(url)) {
134
+ url = encodeURI(url);
135
+ }
136
+ return url;
137
+ };
138
+ const getImageSize = (file) => {
139
+ try {
140
+ const { width = 0, height = 0 } = imageSize.imageSize(file);
141
+ return {
142
+ real: true,
143
+ width,
144
+ height
145
+ };
146
+ }
147
+ catch (e) {
148
+ // fallback to 200 * 200
149
+ return {
150
+ real: false,
151
+ width: 200,
152
+ height: 200
153
+ };
154
+ }
155
+ };
156
+ const getFSFile = async (filePath) => {
157
+ try {
158
+ return {
159
+ extname: path__default["default"].extname(filePath),
160
+ fileName: path__default["default"].basename(filePath),
161
+ buffer: await fs__default["default"].readFile(filePath),
162
+ success: true
163
+ };
164
+ }
165
+ catch (_a) {
166
+ return {
167
+ reason: `read file ${filePath} error`,
168
+ success: false
169
+ };
170
+ }
171
+ };
172
+ const getURLFile = async (url$1, ctx) => {
173
+ url$1 = handleUrlEncode(url$1);
174
+ let isImage = false;
175
+ let extname = '';
176
+ let timeoutId;
177
+ const requestFn = new Promise((resolve, reject) => {
178
+ (async () => {
179
+ var _a;
180
+ try {
181
+ const res = await ctx.request({
182
+ method: 'get',
183
+ url: url$1,
184
+ resolveWithFullResponse: true,
185
+ responseType: 'arraybuffer'
186
+ })
187
+ .then((resp) => {
188
+ const contentType = resp.headers['content-type'];
189
+ if (contentType === null || contentType === void 0 ? void 0 : contentType.includes('image')) {
190
+ isImage = true;
191
+ extname = `.${contentType.split('image/')[1]}`;
192
+ }
193
+ return resp.data;
194
+ });
195
+ clearTimeout(timeoutId);
196
+ if (isImage) {
197
+ const urlPath = new url.URL(url$1).pathname;
198
+ resolve({
199
+ buffer: res,
200
+ fileName: path__default["default"].basename(urlPath),
201
+ extname,
202
+ success: true
203
+ });
204
+ }
205
+ else {
206
+ resolve({
207
+ success: false,
208
+ reason: `${url$1} is not image`
209
+ });
210
+ }
211
+ }
212
+ catch (error) {
213
+ clearTimeout(timeoutId);
214
+ resolve({
215
+ success: false,
216
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
217
+ reason: `request ${url$1} error, ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : ''}`
218
+ });
219
+ }
220
+ })().catch(reject);
221
+ });
222
+ const timeoutPromise = new Promise((resolve) => {
223
+ timeoutId = setTimeout(() => {
224
+ resolve({
225
+ success: false,
226
+ reason: `request ${url$1} timeout`
227
+ });
228
+ }, 10000);
229
+ });
230
+ return Promise.race([requestFn, timeoutPromise]);
231
+ };
232
+ /**
233
+ * detect the input string's type
234
+ * for example
235
+ * 1. @xxx/picgo-plugin-xxx -> scope
236
+ * 2. picgo-plugin-xxx -> normal
237
+ * 3. xxx -> simple
238
+ * 4. not exists or is a path -> unknown
239
+ * @param name
240
+ */
241
+ const getPluginNameType = (name) => {
242
+ if (/^@[^/]+\/picgo-plugin-/.test(name)) {
243
+ return 'scope';
244
+ }
245
+ else if (name.startsWith('picgo-plugin-')) {
246
+ return 'normal';
247
+ }
248
+ else if (isSimpleName(name)) {
249
+ return 'simple';
250
+ }
251
+ return 'unknown';
252
+ };
253
+ /**
254
+ * detect the input string is a simple plugin name or not
255
+ * for example
256
+ * 1. xxx -> true
257
+ * 2. /Usr/xx/xxxx/picgo-plugin-xxx -> false
258
+ * @param name pluginNameOrPath
259
+ */
260
+ const isSimpleName = (nameOrPath) => {
261
+ if (path__default["default"].isAbsolute(nameOrPath)) {
262
+ return false;
263
+ }
264
+ const pluginPath = path__default["default"].join(process.cwd(), nameOrPath);
265
+ if (fs__default["default"].existsSync(pluginPath)) {
266
+ return false;
267
+ }
268
+ if (nameOrPath.includes('/') || nameOrPath.includes('\\')) {
269
+ return false;
270
+ }
271
+ return true;
272
+ };
273
+ /**
274
+ * complete plugin name to full name
275
+ * for example:
276
+ * 1. xxx -> picgo-plugin-xxx
277
+ * 2. picgo-plugin-xxx -> picgo-plugin-xxx
278
+ * @param name pluginSimpleName
279
+ * @param scope pluginScope
280
+ */
281
+ const handleCompletePluginName = (name, scope = '') => {
282
+ if (scope) {
283
+ return `@${scope}/picgo-plugin-${name}`;
284
+ }
285
+ else {
286
+ return `picgo-plugin-${name}`;
287
+ }
288
+ };
289
+ /**
290
+ * handle install/uninstall/update plugin name or path
291
+ * for example
292
+ * 1. picgo-plugin-xxx -> picgo-plugin-xxx
293
+ * 2. @xxx/picgo-plugin-xxx -> @xxx/picgo-plugin-xxx
294
+ * 3. xxx -> picgo-plugin-xxx
295
+ * 4. ./xxxx/picgo-plugin-xxx -> /absolutePath/.../xxxx/picgo-plugin-xxx
296
+ * 5. /absolutePath/.../picgo-plugin-xxx -> /absolutePath/.../picgo-plugin-xxx
297
+ * @param nameOrPath pluginName or pluginPath
298
+ */
299
+ const getProcessPluginName = (nameOrPath, logger = console) => {
300
+ const pluginNameType = getPluginNameType(nameOrPath);
301
+ switch (pluginNameType) {
302
+ case 'normal':
303
+ case 'scope':
304
+ return nameOrPath;
305
+ case 'simple':
306
+ return handleCompletePluginName(nameOrPath);
307
+ default: {
308
+ // now, the pluginNameType is unknow here
309
+ // 1. check if is an absolute path
310
+ let pluginPath = nameOrPath;
311
+ if (path__default["default"].isAbsolute(nameOrPath) && fs__default["default"].existsSync(nameOrPath)) {
312
+ return handleUnixStylePath(pluginPath);
313
+ }
314
+ // 2. check if is a relative path
315
+ pluginPath = path__default["default"].join(process.cwd(), nameOrPath);
316
+ if (fs__default["default"].existsSync(pluginPath)) {
317
+ return handleUnixStylePath(pluginPath);
318
+ }
319
+ // 3. invalid nameOrPath
320
+ logger.warn(`Can't find plugin ${nameOrPath}`);
321
+ return '';
322
+ }
323
+ }
324
+ };
325
+ /**
326
+ * get the normal plugin name
327
+ * for example:
328
+ * 1. picgo-plugin-xxx -> picgo-plugin-xxx
329
+ * 2. @xxx/picgo-plugin-xxx -> @xxx/picgo-plugin-xxx
330
+ * 3. ./xxxx/picgo-plugin-xxx -> picgo-plugin-xxx
331
+ * 4. /absolutePath/.../picgo-plugin-xxx -> picgo-plugin-xxx
332
+ * 5. an exception: [package.json's name] !== [folder name]
333
+ * then use [package.json's name], usually match the scope package.
334
+ * 6. if plugin name has version: picgo-plugin-xxx@x.x.x then remove the version
335
+ * @param nameOrPath
336
+ */
337
+ const getNormalPluginName = (nameOrPath, logger = console) => {
338
+ var _a;
339
+ const pluginNameType = getPluginNameType(nameOrPath);
340
+ switch (pluginNameType) {
341
+ case 'normal':
342
+ return removePluginVersion(nameOrPath);
343
+ case 'scope':
344
+ return removePluginVersion(nameOrPath, true);
345
+ case 'simple':
346
+ return removePluginVersion(handleCompletePluginName(nameOrPath));
347
+ default: {
348
+ // now, the nameOrPath must be path
349
+ // the nameOrPath here will be ensured with unix style
350
+ // we need to find the package.json's name cause npm using the name in package.json's name filed
351
+ if (!fs__default["default"].existsSync(nameOrPath)) {
352
+ logger.warn(`Can't find plugin: ${nameOrPath}`);
353
+ return '';
354
+ }
355
+ const packageJSONPath = path__default["default"].posix.join(nameOrPath, 'package.json');
356
+ if (!fs__default["default"].existsSync(packageJSONPath)) {
357
+ logger.warn(`Can't find plugin: ${nameOrPath}`);
358
+ return '';
359
+ }
360
+ else {
361
+ const pkg = fs__default["default"].readJSONSync(packageJSONPath) || {};
362
+ if (!((_a = pkg.name) === null || _a === void 0 ? void 0 : _a.includes('picgo-plugin-'))) {
363
+ logger.warn(`The plugin package.json's name filed is ${pkg.name || 'empty'}, need to include the prefix: picgo-plugin-`);
364
+ return '';
365
+ }
366
+ return pkg.name;
367
+ }
368
+ }
369
+ }
370
+ };
371
+ /**
372
+ * handle transform the path to unix style
373
+ * for example
374
+ * 1. C:\\xxx\\xxx -> C:/xxx/xxx
375
+ * 2. /xxx/xxx -> /xxx/xxx
376
+ * @param path
377
+ */
378
+ const handleUnixStylePath = (pathStr) => {
379
+ const pathArr = pathStr.split(path__default["default"].sep);
380
+ return pathArr.join('/');
381
+ };
382
+ /**
383
+ * remove plugin version when register plugin name
384
+ * 1. picgo-plugin-xxx@1.0.0 -> picgo-plugin-xxx
385
+ * 2. @xxx/picgo-plugin-xxx@1.0.0 -> @xxx/picgo-plugin-xxx
386
+ * @param nameOrPath
387
+ * @param scope
388
+ */
389
+ const removePluginVersion = (nameOrPath, scope = false) => {
390
+ if (!nameOrPath.includes('@')) {
391
+ return nameOrPath;
392
+ }
393
+ else {
394
+ let reg = /(.+\/)?(picgo-plugin-\w+)(@.+)*/;
395
+ // if is a scope pkg
396
+ if (scope) {
397
+ reg = /(.+\/)?(^@[^/]+\/picgo-plugin-\w+)(@.+)*/;
398
+ }
399
+ const matchArr = nameOrPath.match(reg);
400
+ if (!matchArr) {
401
+ console.warn('can not remove plugin version');
402
+ return nameOrPath;
403
+ }
404
+ else {
405
+ return matchArr[2];
406
+ }
407
+ }
408
+ };
409
+ /**
410
+ * the config black item list which won't be setted
411
+ * only can be got
412
+ */
413
+ const configBlackList = [];
414
+ /**
415
+ * check some config key is in blackList
416
+ * @param key
417
+ */
418
+ const isConfigKeyInBlackList = (key) => {
419
+ return configBlackList.some(blackItem => key.startsWith(blackItem));
420
+ };
421
+ /**
422
+ * check the input config is valid
423
+ * config must be object such as { xxx: 'xxx' }
424
+ * && can't be array
425
+ * @param config
426
+ * @returns
427
+ */
428
+ const isInputConfigValid = (config) => {
429
+ if (typeof config === 'object' &&
430
+ !Array.isArray(config) &&
431
+ Object.keys(config).length > 0) {
432
+ return true;
433
+ }
434
+ return false;
435
+ };
436
+ function safeParse(str) {
437
+ try {
438
+ return JSON.parse(str);
439
+ }
440
+ catch (error) {
441
+ return str;
442
+ }
443
+ }
444
+ // hold...
445
+ // export const configWhiteList: RegExp[] = [
446
+ // /^picBed/,
447
+ // /^picgoPlugins/,
448
+ // /^@[^/]+\/picgo-plugin-/,
449
+ // /debug/,
450
+ // /silent/,
451
+ // /configPath/,
452
+ // /^settings/,
453
+ // ]
454
+ // export const isConfigKeyInWhiteList = (key: string): boolean => {
455
+ // return configWhiteList.some(whiteItem => whiteItem.test(key))
456
+ // }
457
+ const forceNumber = (num = 0) => {
458
+ return isNaN(Number(num)) ? 0 : Number(num);
459
+ };
460
+ const isDev = () => {
461
+ return process.env.NODE_ENV === 'development';
462
+ };
463
+
464
+ const upload = {
465
+ handle: (ctx) => {
466
+ const cmd = ctx.cmd;
467
+ cmd.program
468
+ .command('upload')
469
+ .description('upload, go go go')
470
+ .arguments('[input...]')
471
+ .alias('u')
472
+ .action((input) => {
473
+ (async () => {
474
+ const inputList = input
475
+ .map((item) => {
476
+ return isUrl(item) ? item : path__default["default"].resolve(item);
477
+ })
478
+ .filter((item) => {
479
+ const exist = fs__default["default"].existsSync(item) || isUrl(item);
480
+ if (!exist) {
481
+ ctx.log.warn(`${item} does not exist.`);
482
+ }
483
+ return exist;
484
+ });
485
+ await ctx.upload(inputList);
486
+ })().catch((e) => { ctx.log.error(e); });
487
+ });
488
+ }
489
+ };
490
+
491
+ // handle modules config -> save to picgo config file
492
+ const handleConfig = async (ctx, prompts, module, name) => {
493
+ const answer = await ctx.cmd.inquirer.prompt(prompts);
494
+ const configName = module === 'uploader'
495
+ ? `picBed.${name}` : module === 'transformer'
496
+ ? `transformer.${name}` : name;
497
+ ctx.saveConfig({
498
+ [configName]: answer
499
+ });
500
+ };
501
+ const setting = {
502
+ handle: (ctx) => {
503
+ const cmd = ctx.cmd;
504
+ cmd.program
505
+ .command('set')
506
+ .alias('config')
507
+ .arguments('<module> [name]')
508
+ .description('configure config of picgo modules')
509
+ .action((module, name) => {
510
+ (async () => {
511
+ var _a, _b;
512
+ try {
513
+ // // load third-party plugins
514
+ // await ctx.pluginLoader.load()
515
+ // if a module is specific, then just set this option in config
516
+ switch (module) {
517
+ case 'uploader':
518
+ case 'transformer':
519
+ if (name) {
520
+ const item = ctx.helper[module].get(name);
521
+ if (!item) {
522
+ return ctx.log.error(`No ${module} named ${name}`);
523
+ }
524
+ if (item.config) {
525
+ await handleConfig(ctx, item.config(ctx), module, name);
526
+ }
527
+ }
528
+ else {
529
+ const prompts = [
530
+ {
531
+ type: 'list',
532
+ name: `${module}`,
533
+ choices: ctx.helper[module].getIdList(),
534
+ message: `Choose a(n) ${module}`
535
+ // default: ctx.getConfig('picBed.uploader') || ctx.getConfig('picBed.current')
536
+ }
537
+ ];
538
+ const answer = await ctx.cmd.inquirer.prompt(prompts);
539
+ const item = ctx.helper[module].get(answer[module]);
540
+ if (item === null || item === void 0 ? void 0 : item.config) {
541
+ await handleConfig(ctx, item.config(ctx), module, answer[module]);
542
+ }
543
+ }
544
+ break;
545
+ case 'plugin':
546
+ if (name) {
547
+ if (!name.includes('picgo-plugin-')) {
548
+ name = `picgo-plugin-${name}`;
549
+ }
550
+ if (Object.keys(ctx.getConfig('picgoPlugins')).includes(name)) {
551
+ if ((_a = ctx.pluginLoader.getPlugin(name)) === null || _a === void 0 ? void 0 : _a.config) {
552
+ await handleConfig(ctx, ctx.pluginLoader.getPlugin(name).config(ctx), 'plugin', name);
553
+ }
554
+ }
555
+ else {
556
+ return ctx.log.error(`No plugin named ${name}`);
557
+ }
558
+ }
559
+ else {
560
+ const prompts = [
561
+ {
562
+ type: 'list',
563
+ name: 'plugin',
564
+ choices: ctx.pluginLoader.getFullList(),
565
+ message: 'Choose a plugin'
566
+ }
567
+ ];
568
+ const answer = await ctx.cmd.inquirer.prompt(prompts);
569
+ if ((_b = ctx.pluginLoader.getPlugin(answer.plugin)) === null || _b === void 0 ? void 0 : _b.config) {
570
+ await handleConfig(ctx, ctx.pluginLoader.getPlugin(answer.plugin).config(ctx), 'plugin', answer.plugin);
571
+ }
572
+ }
573
+ break;
574
+ default:
575
+ ctx.log.warn(`No module named ${module}`);
576
+ return ctx.log.warn('Available modules are uploader|transformer|plugin');
577
+ }
578
+ const useModuleName = module === 'plugin' ? 'plugins' : module;
579
+ ctx.log.success('Configure config successfully!');
580
+ ctx.log.info(`If you want to use this config, please run 'picgo use ${useModuleName}'`);
581
+ }
582
+ catch (e) {
583
+ ctx.log.error(e);
584
+ if (process.argv.includes('--debug')) {
585
+ throw e;
586
+ }
587
+ }
588
+ })().catch((e) => { ctx.log.error(e); });
589
+ });
590
+ }
591
+ };
592
+
593
+ const use = {
594
+ handle: async (ctx) => {
595
+ const cmd = ctx.cmd;
596
+ cmd.program
597
+ .command('use')
598
+ .arguments('[module]')
599
+ .description('use modules of picgo')
600
+ .action((module) => {
601
+ (async () => {
602
+ try {
603
+ // // load third-party plugins
604
+ // await ctx.pluginLoader.load()
605
+ let prompts = [];
606
+ const config = {
607
+ uploader: {
608
+ type: 'list',
609
+ name: 'uploader',
610
+ message: 'Use an uploader',
611
+ choices: ctx.helper.uploader.getIdList(),
612
+ default: ctx.getConfig('picBed.uploader') || ctx.getConfig('picBed.current') || 'smms'
613
+ },
614
+ transformer: {
615
+ type: 'list',
616
+ name: 'transformer',
617
+ message: 'Use a transformer',
618
+ choices: ctx.helper.transformer.getIdList(),
619
+ default: ctx.getConfig('picBed.transformer') || 'path'
620
+ },
621
+ plugins: {
622
+ type: 'checkbox',
623
+ name: 'plugins',
624
+ message: 'Use plugins',
625
+ choices: ctx.pluginLoader.getFullList(),
626
+ default: Object.keys(ctx.getConfig('picgoPlugins')).filter((item) => ctx.getConfig(`picgoPlugins.${item}`))
627
+ }
628
+ };
629
+ // if an option is specific, then just set this option in config
630
+ if (module) {
631
+ if (config[module]) {
632
+ prompts.push(config[module]);
633
+ }
634
+ else {
635
+ ctx.log.warn(`No module named ${module}`);
636
+ return ctx.log.warn('Available modules are uploader|transformer|plugins');
637
+ }
638
+ }
639
+ else {
640
+ prompts = Object.keys(config).map((item) => config[item]);
641
+ }
642
+ const answer = await cmd.inquirer.prompt(prompts);
643
+ // handle for plugins option from Array to object
644
+ if (answer.plugins) {
645
+ const plugins = ctx.getConfig('picgoPlugins');
646
+ Object.keys(plugins).map((item) => {
647
+ if (answer.plugins.includes(item)) {
648
+ plugins[item] = true;
649
+ }
650
+ else {
651
+ plugins[item] = false;
652
+ }
653
+ });
654
+ // save config for plugins
655
+ ctx.saveConfig({
656
+ picgoPlugins: plugins
657
+ });
658
+ }
659
+ // save config for uploader & transformer
660
+ ctx.saveConfig({
661
+ 'picBed.current': answer.uploader || ctx.getConfig('picBed.current'),
662
+ 'picBed.uploader': answer.uploader || ctx.getConfig('picBed.current'),
663
+ 'picBed.transformer': answer.transformer || 'path'
664
+ });
665
+ ctx.log.success('Configure config successfully!');
666
+ }
667
+ catch (e) {
668
+ ctx.log.error(e);
669
+ if (process.argv.includes('--debug')) {
670
+ throw e;
671
+ }
672
+ }
673
+ })().catch((e) => { ctx.log.error(e); });
674
+ });
675
+ }
676
+ };
677
+
678
+ const proxy = {
679
+ handle: (ctx) => {
680
+ const cmd = ctx.cmd;
681
+ cmd.program
682
+ .option('-p, --proxy <url>', 'set proxy for uploading', (proxy) => {
683
+ ctx.setConfig({
684
+ 'picBed.proxy': proxy
685
+ });
686
+ });
687
+ }
688
+ };
689
+
690
+ /**
691
+ * Generate template files to destination files.
692
+ * @param {PicGo} ctx
693
+ * @param {IOptions} options
694
+ */
695
+ const generate = async (ctx, options) => {
696
+ try {
697
+ const opts = getOptions(options.tmp);
698
+ const source = path__default["default"].join(options.tmp, 'template');
699
+ let answers = {};
700
+ if (opts.prompts && opts.prompts.length > 0) {
701
+ answers = await ctx.cmd.inquirer.prompt(opts.prompts);
702
+ }
703
+ let _files = await globby__default["default"](['**/*'], { cwd: source, dot: true }); // get files' name array
704
+ _files = _files.filter((item) => {
705
+ let glob = '';
706
+ Object.keys(opts.filters).forEach((key) => {
707
+ if (match__default["default"](item, key, { dot: true })) {
708
+ glob = item;
709
+ }
710
+ });
711
+ if (glob) { // find a filter expression
712
+ return filters(ctx, opts.filters[glob], answers);
713
+ }
714
+ else {
715
+ return true;
716
+ }
717
+ });
718
+ if (_files.length === 0) {
719
+ return ctx.log.warn('Template files not found!');
720
+ }
721
+ const files = render(_files, source, answers);
722
+ writeFileTree(options.dest, files);
723
+ if (typeof opts.complete === 'function') {
724
+ opts.complete({ answers, options, files: _files, ctx });
725
+ }
726
+ if (opts.completeMessage) {
727
+ ctx.log.success(opts.completeMessage);
728
+ }
729
+ ctx.log.success('Done!');
730
+ }
731
+ catch (e) {
732
+ return ctx.log.error(e);
733
+ }
734
+ };
735
+ /**
736
+ * Return the filters' result
737
+ * @param ctx PicGo
738
+ * @param exp condition expression
739
+ * @param data options data
740
+ */
741
+ const filters = (ctx, exp, data) => {
742
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands, no-new-func, @typescript-eslint/no-implied-eval
743
+ const fn = new Function('data', 'with (data) { return ' + exp + '}');
744
+ try {
745
+ return fn(data);
746
+ }
747
+ catch (e) {
748
+ ctx.log.error(`Error when evaluating filter condition: ${JSON.stringify(exp)}`);
749
+ return false;
750
+ }
751
+ };
752
+ /**
753
+ * Get template options
754
+ * @param {string} templatePath
755
+ */
756
+ const getOptions = (templatePath) => {
757
+ const optionsPath = path__default["default"].join(templatePath, 'index.js');
758
+ if (fs__default["default"].existsSync(optionsPath)) {
759
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
760
+ const options = require(optionsPath);
761
+ return options;
762
+ }
763
+ else {
764
+ return {};
765
+ }
766
+ };
767
+ /**
768
+ * Render files to a virtual tree object
769
+ * @param {array} files
770
+ */
771
+ const render = (files, source, options) => {
772
+ const fileTree = {};
773
+ files.forEach((filePath) => {
774
+ const file = fs__default["default"].readFileSync(path__default["default"].join(source, filePath), 'utf8');
775
+ const content = ejs__default["default"].render(file, options);
776
+ if (Buffer.isBuffer(content) || /[^\s]/.test(content)) {
777
+ fileTree[filePath] = content;
778
+ }
779
+ });
780
+ return fileTree;
781
+ };
782
+ /**
783
+ * Write rendered files' content to real file
784
+ * @param {string} dir
785
+ * @param {object} files
786
+ */
787
+ const writeFileTree = (dir, files) => {
788
+ Object.keys(files).forEach((name) => {
789
+ const filePath = path__default["default"].join(dir, name);
790
+ fs__default["default"].ensureDirSync(path__default["default"].dirname(filePath));
791
+ fs__default["default"].writeFileSync(filePath, files[name]);
792
+ });
793
+ };
794
+
795
+ const run = (ctx, options) => {
796
+ // const name = options.inPlace ? path.relative('../', process.cwd()) : options.project
797
+ if (options.offline) { // offline mode
798
+ if (fs__default["default"].existsSync(options.template)) {
799
+ generate(ctx, options).catch((e) => { ctx.log.error(e); });
800
+ }
801
+ else {
802
+ ctx.log.error(`Local template ${options.template} not found`);
803
+ }
804
+ }
805
+ else { // online mode
806
+ options.template = !options.hasSlash
807
+ ? 'PicGo/picgo-template-' + options.template // official template
808
+ : options.template;
809
+ downloadAndGenerate(ctx, options);
810
+ }
811
+ };
812
+ /**
813
+ * download template & generate
814
+ * @param { PicGo } ctx
815
+ * @param { IOptions } options
816
+ */
817
+ const downloadAndGenerate = (ctx, options) => {
818
+ if (fs__default["default"].existsSync(options.tmp)) {
819
+ rm__default["default"].sync(options.tmp);
820
+ }
821
+ ctx.log.info('Template files are downloading...');
822
+ download__default["default"](options.template, options.tmp, { clone: options.clone }, (err) => {
823
+ if (err) {
824
+ return ctx.log.error(err);
825
+ }
826
+ ctx.log.success('Template files are downloaded!');
827
+ generate(ctx, options).catch((e) => { ctx.log.error(e); });
828
+ });
829
+ };
830
+ const init = {
831
+ handle: async (ctx) => {
832
+ const cmd = ctx.cmd;
833
+ cmd.program
834
+ .command('init')
835
+ .arguments('<template> [project]')
836
+ .option('--clone', 'use git clone')
837
+ .option('--offline', 'use cached template')
838
+ .description('create picgo plugin\'s development templates')
839
+ .action((template, project, program) => {
840
+ (async () => {
841
+ // Thanks to vue-cli init: https://github.com/vuejs/vue-cli/blob/master/bin/vue-init
842
+ try {
843
+ const hasSlash = template.includes('/');
844
+ const inPlace = !project || project === '.';
845
+ const dest = path__default["default"].resolve(project || '.');
846
+ const clone = program.clone || false;
847
+ const offline = program.offline || false;
848
+ const tmp = path__default["default"].join(os.homedir(), '.picgo/templates', template.replace(/[/:]/g, '-')); // for caching template
849
+ if (program.offline) {
850
+ template = tmp;
851
+ }
852
+ const options = {
853
+ template,
854
+ project,
855
+ hasSlash,
856
+ inPlace,
857
+ dest,
858
+ clone,
859
+ tmp,
860
+ offline
861
+ };
862
+ // check if project is empty or exist
863
+ if (inPlace || fs__default["default"].existsSync(dest)) {
864
+ await ctx.cmd.inquirer.prompt([
865
+ {
866
+ type: 'confirm',
867
+ message: inPlace
868
+ ? 'Generate project in current directory?'
869
+ : 'Target directory exists. Continue?',
870
+ name: 'ok'
871
+ }
872
+ ]).then((answer) => {
873
+ if (answer.ok) {
874
+ run(ctx, options);
875
+ }
876
+ });
877
+ }
878
+ else { // project is given
879
+ run(ctx, options);
880
+ }
881
+ }
882
+ catch (e) {
883
+ ctx.log.error(e);
884
+ if (process.argv.includes('--debug')) {
885
+ throw e;
886
+ }
887
+ }
888
+ })().catch((e) => { ctx.log.error(e); });
889
+ })
890
+ .on('--help', () => {
891
+ console.log();
892
+ console.log('Examples:');
893
+ console.log();
894
+ console.log(chalk__default["default"].gray(' # create a new project with an official template'));
895
+ console.log(' $ picgo init plugin my-project');
896
+ console.log();
897
+ console.log(chalk__default["default"].gray(' # create a new project straight from a github template'));
898
+ console.log(' $ picgo init username/repo my-project');
899
+ console.log();
900
+ });
901
+ }
902
+ };
903
+
904
+ const i18n = {
905
+ handle: (ctx) => {
906
+ const cmd = ctx.cmd;
907
+ cmd.program
908
+ .command('i18n')
909
+ .arguments('[lang]')
910
+ .description('change picgo language')
911
+ .action(async (lang = '') => {
912
+ const list = ctx.i18n.getLanguageList();
913
+ if (!lang) {
914
+ const prompts = [
915
+ {
916
+ type: 'list',
917
+ name: 'i18n',
918
+ choices: list,
919
+ message: 'Choose a language',
920
+ default: ctx.getConfig('settings.language') || 'zh-CN'
921
+ }
922
+ ];
923
+ const answer = await ctx.cmd.inquirer.prompt(prompts);
924
+ ctx.i18n.setLanguage(answer.i18n);
925
+ ctx.log.success(`Language set to ${answer.i18n}`);
926
+ return;
927
+ }
928
+ if (!list.includes(lang)) {
929
+ return ctx.log.warn('No such language');
930
+ }
931
+ ctx.i18n.setLanguage(lang);
932
+ ctx.log.success(`Language set to ${lang}`);
933
+ });
934
+ }
935
+ };
936
+
937
+ var commanders = (ctx) => {
938
+ ctx.cmd.register('pluginHandler', pluginHandler);
939
+ ctx.cmd.register('config', config$7);
940
+ ctx.cmd.register('setting', setting);
941
+ ctx.cmd.register('upload', upload);
942
+ ctx.cmd.register('use', use);
943
+ ctx.cmd.register('proxy', proxy);
944
+ ctx.cmd.register('init', init);
945
+ ctx.cmd.register('i18n', i18n);
946
+ };
947
+
948
+ class LifecyclePlugins {
949
+ constructor(name) {
950
+ this.name = name;
951
+ this.list = new Map();
952
+ this.pluginIdMap = new Map();
953
+ }
954
+ register(id, plugin) {
955
+ var _a;
956
+ if (!id)
957
+ throw new TypeError('id is required!');
958
+ if (typeof plugin.handle !== 'function')
959
+ throw new TypeError('plugin.handle must be a function!');
960
+ if (this.list.has(id))
961
+ throw new TypeError(`${this.name} duplicate id: ${id}!`);
962
+ this.list.set(id, plugin);
963
+ if (LifecyclePlugins.currentPlugin) {
964
+ if (this.pluginIdMap.has(LifecyclePlugins.currentPlugin)) {
965
+ (_a = this.pluginIdMap.get(LifecyclePlugins.currentPlugin)) === null || _a === void 0 ? void 0 : _a.push(id);
966
+ }
967
+ else {
968
+ this.pluginIdMap.set(LifecyclePlugins.currentPlugin, [id]);
969
+ }
970
+ }
971
+ }
972
+ unregister(pluginName) {
973
+ if (this.pluginIdMap.has(pluginName)) {
974
+ const pluginList = this.pluginIdMap.get(pluginName);
975
+ pluginList === null || pluginList === void 0 ? void 0 : pluginList.forEach((plugin) => {
976
+ this.list.delete(plugin);
977
+ });
978
+ }
979
+ }
980
+ getName() {
981
+ return this.name;
982
+ }
983
+ get(id) {
984
+ return this.list.get(id);
985
+ }
986
+ getList() {
987
+ return [...this.list.values()];
988
+ }
989
+ getIdList() {
990
+ return [...this.list.keys()];
991
+ }
992
+ }
993
+ const setCurrentPluginName = (name = null) => {
994
+ LifecyclePlugins.currentPlugin = name;
995
+ };
996
+ const getCurrentPluginName = () => {
997
+ return LifecyclePlugins.currentPlugin;
998
+ };
999
+
1000
+ /* eslint-disable @typescript-eslint/no-misused-promises */
1001
+ class Commander {
1002
+ constructor(ctx) {
1003
+ this.name = 'commander';
1004
+ this.list = new Map();
1005
+ this.pluginIdMap = new Map();
1006
+ this.program = new commander.Command();
1007
+ this.inquirer = inquirer__default["default"];
1008
+ this.ctx = ctx;
1009
+ }
1010
+ getName() {
1011
+ return this.name;
1012
+ }
1013
+ init() {
1014
+ this.program
1015
+ .version("0.0.1", '-v, --version')
1016
+ .option('-d, --debug', 'debug mode', () => {
1017
+ this.ctx.setConfig({
1018
+ debug: true
1019
+ });
1020
+ })
1021
+ .option('-s, --silent', 'silent mode', () => {
1022
+ this.ctx.setConfig({
1023
+ silent: true
1024
+ });
1025
+ })
1026
+ .on('command:*', () => {
1027
+ this.ctx.log.error(`Invalid command: ${this.program.args.join(' ')}\nSee --help for a list of available commands.`);
1028
+ process.exit(1);
1029
+ });
1030
+ // built-in commands
1031
+ commanders(this.ctx);
1032
+ }
1033
+ register(id, plugin) {
1034
+ var _a;
1035
+ if (!id)
1036
+ throw new TypeError('name is required!');
1037
+ if (typeof plugin.handle !== 'function')
1038
+ throw new TypeError('plugin.handle must be a function!');
1039
+ if (this.list.has(id))
1040
+ throw new TypeError(`${this.name} plugin duplicate id: ${id}!`);
1041
+ this.list.set(id, plugin);
1042
+ const currentPluginName = getCurrentPluginName();
1043
+ if (currentPluginName !== null) {
1044
+ if (this.pluginIdMap.has(currentPluginName)) {
1045
+ (_a = this.pluginIdMap.get(currentPluginName)) === null || _a === void 0 ? void 0 : _a.push(id);
1046
+ }
1047
+ else {
1048
+ this.pluginIdMap.set(currentPluginName, [id]);
1049
+ }
1050
+ }
1051
+ }
1052
+ unregister(pluginName) {
1053
+ if (this.pluginIdMap.has(pluginName)) {
1054
+ const pluginList = this.pluginIdMap.get(pluginName);
1055
+ pluginList === null || pluginList === void 0 ? void 0 : pluginList.forEach((plugin) => {
1056
+ this.list.delete(plugin);
1057
+ });
1058
+ }
1059
+ }
1060
+ loadCommands() {
1061
+ this.getList().forEach((item) => {
1062
+ try {
1063
+ item.handle(this.ctx);
1064
+ }
1065
+ catch (e) {
1066
+ this.ctx.log.error(e);
1067
+ }
1068
+ });
1069
+ }
1070
+ get(id) {
1071
+ return this.list.get(id);
1072
+ }
1073
+ getList() {
1074
+ return [...this.list.values()];
1075
+ }
1076
+ getIdList() {
1077
+ return [...this.list.keys()];
1078
+ }
1079
+ }
1080
+
1081
+ var ILogType;
1082
+ (function (ILogType) {
1083
+ ILogType["success"] = "success";
1084
+ ILogType["info"] = "info";
1085
+ ILogType["warn"] = "warn";
1086
+ ILogType["error"] = "error";
1087
+ })(ILogType || (ILogType = {}));
1088
+ /**
1089
+ * these events will be catched by users
1090
+ */
1091
+ var IBuildInEvent;
1092
+ (function (IBuildInEvent) {
1093
+ IBuildInEvent["UPLOAD_PROGRESS"] = "uploadProgress";
1094
+ IBuildInEvent["FAILED"] = "failed";
1095
+ IBuildInEvent["BEFORE_TRANSFORM"] = "beforeTransform";
1096
+ IBuildInEvent["BEFORE_UPLOAD"] = "beforeUpload";
1097
+ IBuildInEvent["AFTER_UPLOAD"] = "afterUpload";
1098
+ IBuildInEvent["FINISHED"] = "finished";
1099
+ IBuildInEvent["INSTALL"] = "install";
1100
+ IBuildInEvent["UNINSTALL"] = "uninstall";
1101
+ IBuildInEvent["UPDATE"] = "update";
1102
+ IBuildInEvent["NOTIFICATION"] = "notification";
1103
+ })(IBuildInEvent || (IBuildInEvent = {}));
1104
+ /**
1105
+ * these events will be catched only by picgo
1106
+ */
1107
+ var IBusEvent;
1108
+ (function (IBusEvent) {
1109
+ IBusEvent["CONFIG_CHANGE"] = "CONFIG_CHANGE";
1110
+ })(IBusEvent || (IBusEvent = {}));
1111
+
1112
+ class Logger {
1113
+ constructor(ctx) {
1114
+ this.level = {
1115
+ [ILogType.success]: 'green',
1116
+ [ILogType.info]: 'blue',
1117
+ [ILogType.warn]: 'yellow',
1118
+ [ILogType.error]: 'red'
1119
+ };
1120
+ this.ctx = ctx;
1121
+ }
1122
+ handleLog(type, ...msg) {
1123
+ // check config.silent
1124
+ if (!this.ctx.getConfig('silent')) {
1125
+ const logHeader = chalk__default["default"][this.level[type]](`[PicGo ${type.toUpperCase()}]:`);
1126
+ console.log(logHeader, ...msg);
1127
+ this.logLevel = this.ctx.getConfig('settings.logLevel');
1128
+ this.logPath = this.ctx.getConfig('settings.logPath') || path__default["default"].join(this.ctx.baseDir, './picgo.log');
1129
+ setTimeout(() => {
1130
+ // fix log file is too large, now the log file's default size is 10 MB
1131
+ try {
1132
+ const result = this.checkLogFileIsLarge(this.logPath);
1133
+ if (result.isLarge) {
1134
+ const warningMsg = `Log file is too large (> ${(result.logFileSizeLimit) / 1024 / 1024 || '10'} MB), recreate log file`;
1135
+ console.log(chalk__default["default"].yellow('[PicGo WARN]:'), warningMsg);
1136
+ this.recreateLogFile(this.logPath);
1137
+ msg.unshift(warningMsg);
1138
+ }
1139
+ this.handleWriteLog(this.logPath, type, ...msg);
1140
+ }
1141
+ catch (e) {
1142
+ // why???
1143
+ console.error('[PicGo Error] on checking log file size', e);
1144
+ }
1145
+ }, 0);
1146
+ }
1147
+ }
1148
+ checkLogFileIsLarge(logPath) {
1149
+ if (fs__default["default"].existsSync(logPath)) {
1150
+ const logFileSize = fs__default["default"].statSync(logPath).size;
1151
+ const logFileSizeLimit = forceNumber(this.ctx.getConfig('settings.logFileSizeLimit') || 10) * 1024 * 1024; // 10 MB default
1152
+ return {
1153
+ isLarge: logFileSize > logFileSizeLimit,
1154
+ logFileSize,
1155
+ logFileSizeLimit
1156
+ };
1157
+ }
1158
+ return {
1159
+ isLarge: false
1160
+ };
1161
+ }
1162
+ recreateLogFile(logPath) {
1163
+ if (fs__default["default"].existsSync(logPath)) {
1164
+ fs__default["default"].unlinkSync(logPath);
1165
+ fs__default["default"].createFileSync(logPath);
1166
+ }
1167
+ }
1168
+ handleWriteLog(logPath, type, ...msg) {
1169
+ try {
1170
+ if (this.checkLogLevel(type, this.logLevel)) {
1171
+ let log = `${dayjs__default["default"]().format('YYYY-MM-DD HH:mm:ss')} [PicGo ${type.toUpperCase()}] `;
1172
+ msg.forEach((item) => {
1173
+ if (item instanceof Error && type === 'error') {
1174
+ log += `\n------Error Stack Begin------\n${util__default["default"].format(item === null || item === void 0 ? void 0 : item.stack)}\n-------Error Stack End------- `;
1175
+ }
1176
+ else {
1177
+ if (typeof item === 'object') {
1178
+ item = JSON.stringify(item, null, 2);
1179
+ }
1180
+ log += `${item} `;
1181
+ }
1182
+ });
1183
+ log += '\n';
1184
+ // A synchronized approach to avoid log msg sequence errors
1185
+ fs__default["default"].appendFileSync(logPath, log);
1186
+ }
1187
+ }
1188
+ catch (e) {
1189
+ console.error('[PicGo Error] on writing log file', e);
1190
+ }
1191
+ }
1192
+ checkLogLevel(type, level) {
1193
+ if (level === undefined || level === 'all') {
1194
+ return true;
1195
+ }
1196
+ if (Array.isArray(level)) {
1197
+ return level.some((item) => (item === type || item === 'all'));
1198
+ }
1199
+ else {
1200
+ return type === level;
1201
+ }
1202
+ }
1203
+ success(...msg) {
1204
+ return this.handleLog(ILogType.success, ...msg);
1205
+ }
1206
+ info(...msg) {
1207
+ return this.handleLog(ILogType.info, ...msg);
1208
+ }
1209
+ error(...msg) {
1210
+ return this.handleLog(ILogType.error, ...msg);
1211
+ }
1212
+ warn(...msg) {
1213
+ return this.handleLog(ILogType.warn, ...msg);
1214
+ }
1215
+ debug(...msg) {
1216
+ if (isDev()) {
1217
+ this.handleLog(ILogType.info, ...msg);
1218
+ }
1219
+ }
1220
+ }
1221
+
1222
+ /**
1223
+ * create an unique context for each upload process
1224
+ * @param ctx
1225
+ */
1226
+ const createContext = (ctx) => {
1227
+ return {
1228
+ configPath: ctx.configPath,
1229
+ baseDir: ctx.baseDir,
1230
+ log: ctx.log,
1231
+ cmd: ctx.cmd,
1232
+ output: [],
1233
+ input: [],
1234
+ pluginLoader: ctx.pluginLoader,
1235
+ pluginHandler: ctx.pluginHandler,
1236
+ Request: ctx.Request,
1237
+ helper: ctx.helper,
1238
+ VERSION: ctx.VERSION,
1239
+ GUI_VERSION: ctx.GUI_VERSION,
1240
+ request: ctx.request,
1241
+ i18n: ctx.i18n,
1242
+ getConfig: ctx.getConfig.bind(ctx),
1243
+ saveConfig: ctx.saveConfig.bind(ctx),
1244
+ removeConfig: ctx.removeConfig.bind(ctx),
1245
+ setConfig: ctx.setConfig.bind(ctx),
1246
+ unsetConfig: ctx.unsetConfig.bind(ctx),
1247
+ upload: ctx.upload.bind(ctx),
1248
+ addListener: ctx.addListener.bind(ctx),
1249
+ on: ctx.on.bind(ctx),
1250
+ once: ctx.once.bind(ctx),
1251
+ removeListener: ctx.removeListener.bind(ctx),
1252
+ off: ctx.off.bind(ctx),
1253
+ removeAllListeners: ctx.removeAllListeners.bind(ctx),
1254
+ setMaxListeners: ctx.setMaxListeners.bind(ctx),
1255
+ getMaxListeners: ctx.getMaxListeners.bind(ctx),
1256
+ listeners: ctx.listeners.bind(ctx),
1257
+ rawListeners: ctx.rawListeners.bind(ctx),
1258
+ emit: ctx.emit.bind(ctx),
1259
+ listenerCount: ctx.listenerCount.bind(ctx),
1260
+ prependListener: ctx.prependListener.bind(ctx),
1261
+ prependOnceListener: ctx.prependOnceListener.bind(ctx),
1262
+ eventNames: ctx.eventNames.bind(ctx)
1263
+ };
1264
+ };
1265
+
1266
+ class Lifecycle extends events.EventEmitter {
1267
+ constructor(ctx) {
1268
+ super();
1269
+ this.ctx = ctx;
1270
+ }
1271
+ async start(input) {
1272
+ // ensure every upload process has an unique context
1273
+ const ctx = createContext(this.ctx);
1274
+ try {
1275
+ // images input
1276
+ if (!Array.isArray(input)) {
1277
+ throw new Error('Input must be an array.');
1278
+ }
1279
+ ctx.input = input;
1280
+ ctx.output = [];
1281
+ // lifecycle main
1282
+ await this.beforeTransform(ctx);
1283
+ await this.doTransform(ctx);
1284
+ await this.beforeUpload(ctx);
1285
+ await this.doUpload(ctx);
1286
+ await this.afterUpload(ctx);
1287
+ return ctx;
1288
+ }
1289
+ catch (e) {
1290
+ ctx.log.warn(IBuildInEvent.FAILED);
1291
+ ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, -1);
1292
+ ctx.emit(IBuildInEvent.FAILED, e);
1293
+ ctx.log.error(e);
1294
+ if (ctx.getConfig('debug')) {
1295
+ throw e;
1296
+ }
1297
+ return ctx;
1298
+ }
1299
+ }
1300
+ async beforeTransform(ctx) {
1301
+ ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 0);
1302
+ ctx.emit(IBuildInEvent.BEFORE_TRANSFORM, ctx);
1303
+ ctx.log.info('Before transform');
1304
+ await this.handlePlugins(ctx.helper.beforeTransformPlugins, ctx);
1305
+ return ctx;
1306
+ }
1307
+ async doTransform(ctx) {
1308
+ ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 30);
1309
+ const type = ctx.getConfig('picBed.transformer') || 'path';
1310
+ let currentTransformer = type;
1311
+ let transformer = ctx.helper.transformer.get(type);
1312
+ if (!transformer) {
1313
+ transformer = ctx.helper.transformer.get('path');
1314
+ currentTransformer = 'path';
1315
+ ctx.log.warn(`Can't find transformer - ${type}, switch to default transformer - path`);
1316
+ }
1317
+ ctx.log.info(`Transforming... Current transformer is [${currentTransformer}]`);
1318
+ await (transformer === null || transformer === void 0 ? void 0 : transformer.handle(ctx));
1319
+ return ctx;
1320
+ }
1321
+ async beforeUpload(ctx) {
1322
+ ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 60);
1323
+ ctx.log.info('Before upload');
1324
+ ctx.emit(IBuildInEvent.BEFORE_UPLOAD, ctx);
1325
+ await this.handlePlugins(ctx.helper.beforeUploadPlugins, ctx);
1326
+ return ctx;
1327
+ }
1328
+ async doUpload(ctx) {
1329
+ let type = ctx.getConfig('picBed.uploader') || ctx.getConfig('picBed.current') || 'smms';
1330
+ let uploader = ctx.helper.uploader.get(type);
1331
+ let currentTransformer = type;
1332
+ if (!uploader) {
1333
+ type = 'smms';
1334
+ currentTransformer = 'smms';
1335
+ uploader = ctx.helper.uploader.get('smms');
1336
+ ctx.log.warn(`Can't find uploader - ${type}, switch to default uploader - smms`);
1337
+ }
1338
+ ctx.log.info(`Uploading... Current uploader is [${currentTransformer}]`);
1339
+ await (uploader === null || uploader === void 0 ? void 0 : uploader.handle(ctx));
1340
+ for (const outputImg of ctx.output) {
1341
+ outputImg.type = type;
1342
+ }
1343
+ return ctx;
1344
+ }
1345
+ async afterUpload(ctx) {
1346
+ ctx.emit(IBuildInEvent.AFTER_UPLOAD, ctx);
1347
+ ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 100);
1348
+ await this.handlePlugins(ctx.helper.afterUploadPlugins, ctx);
1349
+ let msg = '';
1350
+ const length = ctx.output.length;
1351
+ for (let i = 0; i < length; i++) {
1352
+ if (typeof ctx.output[i].imgUrl !== 'undefined') {
1353
+ msg += handleUrlEncode(ctx.output[i].imgUrl);
1354
+ if (i !== length - 1) {
1355
+ msg += '\n';
1356
+ }
1357
+ }
1358
+ delete ctx.output[i].base64Image;
1359
+ delete ctx.output[i].buffer;
1360
+ }
1361
+ ctx.emit(IBuildInEvent.FINISHED, ctx);
1362
+ ctx.log.success(`\n${msg}`);
1363
+ return ctx;
1364
+ }
1365
+ async handlePlugins(lifeCyclePlugins, ctx) {
1366
+ const plugins = lifeCyclePlugins.getList();
1367
+ const pluginNames = lifeCyclePlugins.getIdList();
1368
+ const lifeCycleName = lifeCyclePlugins.getName();
1369
+ await Promise.all(plugins.map(async (plugin, index) => {
1370
+ try {
1371
+ ctx.log.info(`${lifeCycleName}: ${pluginNames[index]} running`);
1372
+ await plugin.handle(ctx);
1373
+ }
1374
+ catch (e) {
1375
+ ctx.log.error(`${lifeCycleName}: ${pluginNames[index]} error`);
1376
+ throw e;
1377
+ }
1378
+ }));
1379
+ return ctx;
1380
+ }
1381
+ }
1382
+
1383
+ const postOptions$6 = (fileName, image, apiToken, backupDomain = '') => {
1384
+ const domain = backupDomain || 'sm.ms';
1385
+ return {
1386
+ method: 'POST',
1387
+ url: `https://${domain}/api/v2/upload`,
1388
+ headers: {
1389
+ contentType: 'multipart/form-data',
1390
+ 'User-Agent': 'PicGo',
1391
+ Authorization: apiToken
1392
+ },
1393
+ formData: {
1394
+ smfile: {
1395
+ value: image,
1396
+ options: {
1397
+ filename: fileName
1398
+ }
1399
+ },
1400
+ ssl: 'true'
1401
+ }
1402
+ };
1403
+ };
1404
+ const handle$8 = async (ctx) => {
1405
+ const smmsConfig = ctx.getConfig('picBed.smms');
1406
+ if (!smmsConfig) {
1407
+ throw new Error('Can not find smms config!');
1408
+ }
1409
+ const imgList = ctx.output;
1410
+ for (const img of imgList) {
1411
+ if (img.fileName && img.buffer) {
1412
+ let image = img.buffer;
1413
+ if (!image && img.base64Image) {
1414
+ image = Buffer.from(img.base64Image, 'base64');
1415
+ }
1416
+ const postConfig = postOptions$6(img.fileName, image, smmsConfig === null || smmsConfig === void 0 ? void 0 : smmsConfig.token, smmsConfig === null || smmsConfig === void 0 ? void 0 : smmsConfig.backupDomain);
1417
+ try {
1418
+ const res = await ctx.request(postConfig);
1419
+ const body = JSON.parse(res);
1420
+ if (body.code === 'success') {
1421
+ delete img.base64Image;
1422
+ delete img.buffer;
1423
+ img.imgUrl = body.data.url;
1424
+ }
1425
+ else if (body.code === 'image_repeated' && typeof body.images === 'string') { // do extra check since this error return is not documented at https://doc.sm.ms/#api-Image-Upload
1426
+ delete img.base64Image;
1427
+ delete img.buffer;
1428
+ img.imgUrl = body.images;
1429
+ }
1430
+ else {
1431
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
1432
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
1433
+ body: body.message
1434
+ });
1435
+ throw new Error(body);
1436
+ }
1437
+ }
1438
+ catch (e) {
1439
+ ctx.log.error(e);
1440
+ throw new Error(e);
1441
+ }
1442
+ }
1443
+ }
1444
+ return ctx;
1445
+ };
1446
+ const config$6 = (ctx) => {
1447
+ const userConfig = ctx.getConfig('picBed.smms') || {};
1448
+ const config = [
1449
+ {
1450
+ name: 'token',
1451
+ message: 'api token',
1452
+ type: 'password',
1453
+ get alias() { return ctx.i18n.translate('PICBED_SMMS_TOKEN'); },
1454
+ default: userConfig.token || '',
1455
+ required: true
1456
+ },
1457
+ {
1458
+ name: 'backupDomain',
1459
+ type: 'input',
1460
+ get prefix() { return ctx.i18n.translate('PICBED_SMMS_BACKUP_DOMAIN'); },
1461
+ get message() {
1462
+ return ctx.i18n.translate('PICBED_SMMS_MESSAGE_BACKUP_DOMAIN');
1463
+ },
1464
+ get alias() { return ctx.i18n.translate('PICBED_SMMS_BACKUP_DOMAIN'); },
1465
+ default: userConfig.backupDomain || '',
1466
+ required: false
1467
+ }
1468
+ ];
1469
+ return config;
1470
+ };
1471
+ function register$6(ctx) {
1472
+ ctx.helper.uploader.register('smms', {
1473
+ get name() { return ctx.i18n.translate('PICBED_SMMS'); },
1474
+ handle: handle$8,
1475
+ config: config$6
1476
+ });
1477
+ }
1478
+
1479
+ const generateSignature$2 = (options, fileName) => {
1480
+ const secretId = options.secretId;
1481
+ const secretKey = options.secretKey;
1482
+ const appId = options.appId;
1483
+ const bucket = options.bucket;
1484
+ let signature;
1485
+ let signTime = '';
1486
+ if (!options.version || options.version === 'v4') {
1487
+ const random = Math.floor(Math.random() * 10000000000);
1488
+ const current = Math.floor(new Date().getTime() / 1000) - 1;
1489
+ const expired = current + 3600;
1490
+ const multiSignature = `a=${appId}&b=${bucket}&k=${secretId}&e=${expired}&t=${current}&r=${random}&f=`;
1491
+ const signHexKey = crypto__default["default"].createHmac('sha1', secretKey).update(multiSignature).digest();
1492
+ const tempString = Buffer.concat([signHexKey, Buffer.from(multiSignature)]);
1493
+ signature = Buffer.from(tempString).toString('base64');
1494
+ }
1495
+ else {
1496
+ // https://cloud.tencent.com/document/product/436/7778#signature
1497
+ const today = Math.floor(new Date().getTime() / 1000);
1498
+ const tomorrow = today + 86400;
1499
+ signTime = `${today};${tomorrow}`;
1500
+ const signKey = crypto__default["default"].createHmac('sha1', secretKey).update(signTime).digest('hex');
1501
+ const httpString = `put\n/${options.path}${fileName}\n\nhost=${options.bucket}.cos.${options.area}.myqcloud.com\n`;
1502
+ const sha1edHttpString = crypto__default["default"].createHash('sha1').update(httpString).digest('hex');
1503
+ const stringToSign = `sha1\n${signTime}\n${sha1edHttpString}\n`;
1504
+ signature = crypto__default["default"].createHmac('sha1', signKey).update(stringToSign).digest('hex');
1505
+ }
1506
+ return {
1507
+ signature,
1508
+ appId,
1509
+ bucket,
1510
+ signTime
1511
+ };
1512
+ };
1513
+ const postOptions$5 = (options, fileName, signature, image, version) => {
1514
+ const area = options.area;
1515
+ const path = options.path;
1516
+ if (!options.version || options.version === 'v4') {
1517
+ return {
1518
+ method: 'POST',
1519
+ url: `http://${area}.file.myqcloud.com/files/v2/${signature.appId}/${signature.bucket}/${encodeURI(path)}${fileName}`,
1520
+ headers: {
1521
+ Host: `${area}.file.myqcloud.com`,
1522
+ Authorization: signature.signature,
1523
+ contentType: 'multipart/form-data',
1524
+ userAgent: `PicGo;${version};null;null`
1525
+ },
1526
+ formData: {
1527
+ op: 'upload',
1528
+ filecontent: image
1529
+ },
1530
+ resolveWithFullResponse: true
1531
+ };
1532
+ }
1533
+ else {
1534
+ return {
1535
+ method: 'PUT',
1536
+ url: `http://${options.bucket}.cos.${options.area}.myqcloud.com/${encodeURIComponent(path)}${encodeURIComponent(fileName)}`,
1537
+ headers: {
1538
+ Host: `${options.bucket}.cos.${options.area}.myqcloud.com`,
1539
+ Authorization: `q-sign-algorithm=sha1&q-ak=${options.secretId}&q-sign-time=${signature.signTime}&q-key-time=${signature.signTime}&q-header-list=host&q-url-param-list=&q-signature=${signature.signature}`,
1540
+ contentType: mime__default["default"].lookup(fileName),
1541
+ userAgent: `PicGo;${version};null;null`
1542
+ },
1543
+ body: image,
1544
+ resolveWithFullResponse: true
1545
+ };
1546
+ }
1547
+ };
1548
+ const handle$7 = async (ctx) => {
1549
+ var _a, _b, _c;
1550
+ const tcYunOptions = ctx.getConfig('picBed.tcyun');
1551
+ if (!tcYunOptions) {
1552
+ throw new Error('Can\'t find tencent COS config');
1553
+ }
1554
+ try {
1555
+ const imgList = ctx.output;
1556
+ const customUrl = tcYunOptions.customUrl;
1557
+ const path = tcYunOptions.path;
1558
+ const useV4 = !tcYunOptions.version || tcYunOptions.version === 'v4';
1559
+ for (const img of imgList) {
1560
+ if (img.fileName && img.buffer) {
1561
+ const signature = generateSignature$2(tcYunOptions, img.fileName);
1562
+ if (!signature) {
1563
+ return false;
1564
+ }
1565
+ let image = img.buffer;
1566
+ if (!image && img.base64Image) {
1567
+ image = Buffer.from(img.base64Image, 'base64');
1568
+ }
1569
+ const options = postOptions$5(tcYunOptions, img.fileName, signature, image, ctx.GUI_VERSION || ctx.VERSION);
1570
+ const res = await ctx.request(options)
1571
+ .then((res) => res)
1572
+ .catch((err) => {
1573
+ return {
1574
+ statusCode: 400,
1575
+ body: {
1576
+ msg: ctx.i18n.translate('AUTH_FAILED'),
1577
+ err
1578
+ }
1579
+ };
1580
+ });
1581
+ let body;
1582
+ if (useV4 && typeof res === 'string') {
1583
+ body = JSON.parse(res);
1584
+ }
1585
+ else {
1586
+ body = res;
1587
+ }
1588
+ if (body.statusCode === 400) {
1589
+ if ((_a = body === null || body === void 0 ? void 0 : body.body) === null || _a === void 0 ? void 0 : _a.err) {
1590
+ throw body.body.err;
1591
+ }
1592
+ else {
1593
+ throw new Error(((_b = body === null || body === void 0 ? void 0 : body.body) === null || _b === void 0 ? void 0 : _b.msg) || ((_c = body === null || body === void 0 ? void 0 : body.body) === null || _c === void 0 ? void 0 : _c.message));
1594
+ }
1595
+ }
1596
+ const optionUrl = tcYunOptions.options || '';
1597
+ if (useV4 && body.message === 'SUCCESS') {
1598
+ delete img.base64Image;
1599
+ delete img.buffer;
1600
+ if (customUrl) {
1601
+ img.imgUrl = `${customUrl}/${path}${img.fileName}`;
1602
+ }
1603
+ else {
1604
+ img.imgUrl = `${body.data.source_url}${optionUrl}`;
1605
+ }
1606
+ }
1607
+ else if (!useV4 && body && body.statusCode === 200) {
1608
+ delete img.base64Image;
1609
+ delete img.buffer;
1610
+ if (customUrl) {
1611
+ img.imgUrl = `${customUrl}/${encodeURI(path)}${encodeURI(img.fileName)}${optionUrl}`;
1612
+ }
1613
+ else {
1614
+ img.imgUrl = `https://${tcYunOptions.bucket}.cos.${tcYunOptions.area}.myqcloud.com/${encodeURI(path)}${encodeURI(img.fileName)}${optionUrl}`;
1615
+ }
1616
+ }
1617
+ else {
1618
+ throw new Error(res.body.msg);
1619
+ }
1620
+ }
1621
+ }
1622
+ return ctx;
1623
+ }
1624
+ catch (err) {
1625
+ if (!tcYunOptions.version || tcYunOptions.version === 'v4') {
1626
+ try {
1627
+ const body = JSON.parse(err.error);
1628
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
1629
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
1630
+ body: ctx.i18n.translate('UPLOAD_FAILED_REASON', {
1631
+ code: body.code
1632
+ }),
1633
+ text: 'https://cloud.tencent.com/document/product/436/8432'
1634
+ });
1635
+ }
1636
+ catch (e) { }
1637
+ }
1638
+ throw err;
1639
+ }
1640
+ };
1641
+ const config$5 = (ctx) => {
1642
+ const userConfig = ctx.getConfig('picBed.tcyun') || {};
1643
+ const config = [
1644
+ {
1645
+ name: 'version',
1646
+ type: 'list',
1647
+ alias: ctx.i18n.translate('PICBED_TENCENTCLOUD_VERSION'),
1648
+ choices: ['v4', 'v5'],
1649
+ default: 'v5',
1650
+ required: false
1651
+ },
1652
+ {
1653
+ name: 'secretId',
1654
+ type: 'input',
1655
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_SECRETID'); },
1656
+ default: userConfig.secretId || '',
1657
+ required: true
1658
+ },
1659
+ {
1660
+ name: 'secretKey',
1661
+ type: 'password',
1662
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_SECRETKEY'); },
1663
+ default: userConfig.secretKey || '',
1664
+ required: true
1665
+ },
1666
+ {
1667
+ name: 'bucket',
1668
+ type: 'input',
1669
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_BUCKET'); },
1670
+ default: userConfig.bucket || '',
1671
+ required: true
1672
+ },
1673
+ {
1674
+ name: 'appId',
1675
+ type: 'input',
1676
+ get prefix() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_APPID'); },
1677
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_APPID'); },
1678
+ default: userConfig.appId || '',
1679
+ get message() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_MESSAGE_APPID'); },
1680
+ required: true
1681
+ },
1682
+ {
1683
+ name: 'area',
1684
+ type: 'input',
1685
+ get prefix() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_AREA'); },
1686
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_AREA'); },
1687
+ default: userConfig.area || '',
1688
+ get message() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_MESSAGE_AREA'); },
1689
+ required: true
1690
+ },
1691
+ {
1692
+ name: 'path',
1693
+ type: 'input',
1694
+ get prefix() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_PATH'); },
1695
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_PATH'); },
1696
+ default: userConfig.path || '',
1697
+ get message() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_MESSAGE_PATH'); },
1698
+ required: false
1699
+ },
1700
+ {
1701
+ name: 'customUrl',
1702
+ type: 'input',
1703
+ get prefix() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_CUSTOMURL'); },
1704
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_CUSTOMURL'); },
1705
+ default: userConfig.customUrl || '',
1706
+ get message() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL'); },
1707
+ required: false
1708
+ },
1709
+ {
1710
+ name: 'options',
1711
+ type: 'input',
1712
+ default: userConfig.options || '',
1713
+ get prefix() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_OPTIONS'); },
1714
+ get alias() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_OPTIONS'); },
1715
+ get message() { return ctx.i18n.translate('PICBED_TENCENTCLOUD_MESSAGE_OPTIONS'); },
1716
+ required: false
1717
+ }
1718
+ ];
1719
+ return config;
1720
+ };
1721
+ function register$5(ctx) {
1722
+ ctx.helper.uploader.register('tcyun', {
1723
+ get name() { return ctx.i18n.translate('PICBED_TENCENTCLOUD'); },
1724
+ handle: handle$7,
1725
+ config: config$5
1726
+ });
1727
+ }
1728
+
1729
+ const postOptions$4 = (fileName, options, data) => {
1730
+ const path = options.path || '';
1731
+ const { token, repo } = options;
1732
+ return {
1733
+ method: 'PUT',
1734
+ url: `https://api.github.com/repos/${repo}/contents/${encodeURI(path)}${encodeURI(fileName)}`,
1735
+ headers: {
1736
+ Authorization: `token ${token}`,
1737
+ 'User-Agent': 'PicGo',
1738
+ 'Content-Type': mime__default["default"].lookup(fileName)
1739
+ },
1740
+ body: data,
1741
+ json: true
1742
+ };
1743
+ };
1744
+ const handle$6 = async (ctx) => {
1745
+ const githubOptions = ctx.getConfig('picBed.github');
1746
+ if (!githubOptions) {
1747
+ throw new Error('Can\'t find github config');
1748
+ }
1749
+ try {
1750
+ const imgList = ctx.output;
1751
+ for (const img of imgList) {
1752
+ if (img.fileName && img.buffer) {
1753
+ const base64Image = img.base64Image || Buffer.from(img.buffer).toString('base64');
1754
+ const data = {
1755
+ message: 'Upload by PicGo',
1756
+ branch: githubOptions.branch,
1757
+ content: base64Image,
1758
+ path: githubOptions.path + encodeURI(img.fileName)
1759
+ };
1760
+ const postConfig = postOptions$4(img.fileName, githubOptions, data);
1761
+ const body = await ctx.request(postConfig);
1762
+ if (body) {
1763
+ delete img.base64Image;
1764
+ delete img.buffer;
1765
+ if (githubOptions.customUrl) {
1766
+ img.imgUrl = `${githubOptions.customUrl}/${githubOptions.path}${img.fileName}`;
1767
+ }
1768
+ else {
1769
+ img.imgUrl = body.content.download_url;
1770
+ }
1771
+ }
1772
+ else {
1773
+ throw new Error('Server error, please try again');
1774
+ }
1775
+ }
1776
+ }
1777
+ return ctx;
1778
+ }
1779
+ catch (err) {
1780
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
1781
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
1782
+ body: ctx.i18n.translate('CHECK_SETTINGS_AND_NETWORK')
1783
+ });
1784
+ throw err;
1785
+ }
1786
+ };
1787
+ const config$4 = (ctx) => {
1788
+ const userConfig = ctx.getConfig('picBed.github') || {};
1789
+ const config = [
1790
+ {
1791
+ name: 'repo',
1792
+ type: 'input',
1793
+ get prefix() { return ctx.i18n.translate('PICBED_GITHUB_REPO'); },
1794
+ get alias() { return ctx.i18n.translate('PICBED_GITHUB_REPO'); },
1795
+ get message() { return ctx.i18n.translate('PICBED_GITHUB_MESSAGE_REPO'); },
1796
+ default: userConfig.repo || '',
1797
+ required: true
1798
+ },
1799
+ {
1800
+ name: 'branch',
1801
+ type: 'input',
1802
+ get prefix() { return ctx.i18n.translate('PICBED_GITHUB_BRANCH'); },
1803
+ get alias() { return ctx.i18n.translate('PICBED_GITHUB_BRANCH'); },
1804
+ get message() { return ctx.i18n.translate('PICBED_GITHUB_MESSAGE_BRANCH'); },
1805
+ default: userConfig.branch || 'master',
1806
+ required: true
1807
+ },
1808
+ {
1809
+ name: 'token',
1810
+ type: 'password',
1811
+ get alias() { return ctx.i18n.translate('PICBED_GITHUB_TOKEN'); },
1812
+ default: userConfig.token || '',
1813
+ required: true
1814
+ },
1815
+ {
1816
+ name: 'path',
1817
+ type: 'input',
1818
+ get prefix() { return ctx.i18n.translate('PICBED_GITHUB_PATH'); },
1819
+ get alias() { return ctx.i18n.translate('PICBED_GITHUB_PATH'); },
1820
+ get message() { return ctx.i18n.translate('PICBED_GITHUB_MESSAGE_PATH'); },
1821
+ default: userConfig.path || '',
1822
+ required: false
1823
+ },
1824
+ {
1825
+ name: 'customUrl',
1826
+ type: 'input',
1827
+ get prefix() { return ctx.i18n.translate('PICBED_GITHUB_CUSTOMURL'); },
1828
+ get alias() { return ctx.i18n.translate('PICBED_GITHUB_CUSTOMURL'); },
1829
+ get message() { return ctx.i18n.translate('PICBED_GITHUB_MESSAGE_CUSTOMURL'); },
1830
+ default: userConfig.customUrl || '',
1831
+ required: false
1832
+ }
1833
+ ];
1834
+ return config;
1835
+ };
1836
+ function register$4(ctx) {
1837
+ ctx.helper.uploader.register('github', {
1838
+ get name() { return ctx.i18n.translate('PICBED_GITHUB'); },
1839
+ handle: handle$6,
1840
+ config: config$4
1841
+ });
1842
+ }
1843
+
1844
+ function postOptions$3(options, fileName, token, imgBase64) {
1845
+ const area = selectArea(options.area || 'z0');
1846
+ const path = options.path || '';
1847
+ const base64FileName = Buffer.from(path + fileName, 'utf-8').toString('base64').replace(/\+/g, '-').replace(/\//g, '_');
1848
+ return {
1849
+ method: 'POST',
1850
+ url: `http://upload${area}.qiniup.com/putb64/-1/key/${base64FileName}`,
1851
+ headers: {
1852
+ Authorization: `UpToken ${token}`,
1853
+ 'Content-Type': mime__default["default"].lookup(fileName) || 'application/octet-stream'
1854
+ },
1855
+ body: imgBase64
1856
+ };
1857
+ }
1858
+ function selectArea(area) {
1859
+ return area === 'z0' ? '' : '-' + area;
1860
+ }
1861
+ function getToken(qiniuOptions) {
1862
+ const accessKey = qiniuOptions.accessKey;
1863
+ const secretKey = qiniuOptions.secretKey;
1864
+ const mac = new qiniu__default["default"].auth.digest.Mac(accessKey, secretKey);
1865
+ const options = {
1866
+ scope: qiniuOptions.bucket
1867
+ };
1868
+ const putPolicy = new qiniu__default["default"].rs.PutPolicy(options);
1869
+ return putPolicy.uploadToken(mac);
1870
+ }
1871
+ const handle$5 = async (ctx) => {
1872
+ const qiniuOptions = ctx.getConfig('picBed.qiniu');
1873
+ if (!qiniuOptions) {
1874
+ throw new Error('Can\'t find qiniu config');
1875
+ }
1876
+ try {
1877
+ const imgList = ctx.output;
1878
+ for (const img of imgList) {
1879
+ if (img.fileName && img.buffer) {
1880
+ const base64Image = img.base64Image || Buffer.from(img.buffer).toString('base64');
1881
+ const options = postOptions$3(qiniuOptions, img.fileName, getToken(qiniuOptions), base64Image);
1882
+ const res = await ctx.request(options);
1883
+ const body = JSON.parse(res);
1884
+ if (body === null || body === void 0 ? void 0 : body.key) {
1885
+ delete img.base64Image;
1886
+ delete img.buffer;
1887
+ const baseUrl = qiniuOptions.url;
1888
+ const options = qiniuOptions.options;
1889
+ img.imgUrl = `${baseUrl}/${body.key}${options}`;
1890
+ }
1891
+ else {
1892
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
1893
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
1894
+ body: body.msg
1895
+ });
1896
+ ctx.log.error('qiniu error', body);
1897
+ throw new Error('Upload failed');
1898
+ }
1899
+ }
1900
+ }
1901
+ return ctx;
1902
+ }
1903
+ catch (err) {
1904
+ if (err.message !== 'Upload failed') {
1905
+ // err.response maybe undefined
1906
+ if (err.response) {
1907
+ const error = err.response.body;
1908
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
1909
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
1910
+ body: error.error
1911
+ });
1912
+ }
1913
+ }
1914
+ throw err;
1915
+ }
1916
+ };
1917
+ const config$3 = (ctx) => {
1918
+ const userConfig = ctx.getConfig('picBed.qiniu') || {};
1919
+ const config = [
1920
+ {
1921
+ name: 'accessKey',
1922
+ type: 'input',
1923
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_ACCESSKEY'); },
1924
+ default: userConfig.accessKey || '',
1925
+ required: true
1926
+ },
1927
+ {
1928
+ name: 'secretKey',
1929
+ type: 'password',
1930
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_SECRETKEY'); },
1931
+ default: userConfig.secretKey || '',
1932
+ required: true
1933
+ },
1934
+ {
1935
+ name: 'bucket',
1936
+ type: 'input',
1937
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_BUCKET'); },
1938
+ default: userConfig.bucket || '',
1939
+ required: true
1940
+ },
1941
+ {
1942
+ name: 'url',
1943
+ type: 'input',
1944
+ get prefix() { return ctx.i18n.translate('PICBED_QINIU_URL'); },
1945
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_URL'); },
1946
+ get message() { return ctx.i18n.translate('PICBED_QINIU_MESSAGE_URL'); },
1947
+ default: userConfig.url || '',
1948
+ required: true
1949
+ },
1950
+ {
1951
+ name: 'area',
1952
+ type: 'input',
1953
+ get prefix() { return ctx.i18n.translate('PICBED_QINIU_AREA'); },
1954
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_AREA'); },
1955
+ get message() { return ctx.i18n.translate('PICBED_QINIU_MESSAGE_AREA'); },
1956
+ default: userConfig.area || '',
1957
+ required: true
1958
+ },
1959
+ {
1960
+ name: 'options',
1961
+ type: 'input',
1962
+ get prefix() { return ctx.i18n.translate('PICBED_QINIU_OPTIONS'); },
1963
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_OPTIONS'); },
1964
+ get message() { return ctx.i18n.translate('PICBED_QINIU_MESSAGE_OPTIONS'); },
1965
+ default: userConfig.options || '',
1966
+ required: false
1967
+ },
1968
+ {
1969
+ name: 'path',
1970
+ type: 'input',
1971
+ get prefix() { return ctx.i18n.translate('PICBED_QINIU_PATH'); },
1972
+ get alias() { return ctx.i18n.translate('PICBED_QINIU_PATH'); },
1973
+ get message() { return ctx.i18n.translate('PICBED_QINIU_MESSAGE_PATH'); },
1974
+ default: userConfig.path || '',
1975
+ required: false
1976
+ }
1977
+ ];
1978
+ return config;
1979
+ };
1980
+ function register$3(ctx) {
1981
+ ctx.helper.uploader.register('qiniu', {
1982
+ get name() { return ctx.i18n.translate('PICBED_QINIU'); },
1983
+ handle: handle$5,
1984
+ config: config$3
1985
+ });
1986
+ }
1987
+
1988
+ const postOptions$2 = (options, fileName, imgBase64) => {
1989
+ const clientId = options.clientId;
1990
+ const obj = {
1991
+ method: 'POST',
1992
+ url: 'https://api.imgur.com/3/image',
1993
+ headers: {
1994
+ Authorization: `Client-ID ${clientId}`,
1995
+ 'content-type': 'multipart/form-data',
1996
+ Host: 'api.imgur.com',
1997
+ 'User-Agent': 'PicGo'
1998
+ },
1999
+ formData: {
2000
+ image: imgBase64,
2001
+ type: 'base64',
2002
+ name: fileName
2003
+ }
2004
+ };
2005
+ if (options.proxy) {
2006
+ obj.proxy = options.proxy;
2007
+ }
2008
+ return obj;
2009
+ };
2010
+ const handle$4 = async (ctx) => {
2011
+ var _a;
2012
+ const imgurOptions = ctx.getConfig('picBed.imgur');
2013
+ if (!imgurOptions) {
2014
+ throw new Error('Can\'t find imgur config');
2015
+ }
2016
+ try {
2017
+ const imgList = ctx.output;
2018
+ for (const img of imgList) {
2019
+ if (img.fileName && img.buffer) {
2020
+ const base64Image = img.base64Image || Buffer.from(img.buffer).toString('base64');
2021
+ const options = postOptions$2(imgurOptions, img.fileName, base64Image);
2022
+ const res = await ctx.request(options);
2023
+ const body = typeof res === 'string' ? JSON.parse(res) : res;
2024
+ if (body.success) {
2025
+ delete img.base64Image;
2026
+ delete img.buffer;
2027
+ img.imgUrl = body.data.link;
2028
+ }
2029
+ else {
2030
+ throw new Error('Server error, please try again');
2031
+ }
2032
+ }
2033
+ }
2034
+ return ctx;
2035
+ }
2036
+ catch (err) {
2037
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
2038
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
2039
+ body: ctx.i18n.translate('CHECK_SETTINGS_AND_NETWORK'),
2040
+ text: 'http://docs.imgur.com/api/errno/'
2041
+ });
2042
+ // @ts-expect-error
2043
+ throw ((_a = err === null || err === void 0 ? void 0 : err.response) === null || _a === void 0 ? void 0 : _a.data) || err;
2044
+ }
2045
+ };
2046
+ const config$2 = (ctx) => {
2047
+ const userConfig = ctx.getConfig('picBed.imgur') || {};
2048
+ const config = [
2049
+ {
2050
+ name: 'clientId',
2051
+ type: 'input',
2052
+ get alias() { return ctx.i18n.translate('PICBED_IMGUR_CLIENTID'); },
2053
+ default: userConfig.clientId || '',
2054
+ required: true
2055
+ },
2056
+ {
2057
+ name: 'proxy',
2058
+ type: 'input',
2059
+ get prefix() { return ctx.i18n.translate('PICBED_IMGUR_PROXY'); },
2060
+ get alias() { return ctx.i18n.translate('PICBED_IMGUR_PROXY'); },
2061
+ get message() { return ctx.i18n.translate('PICBED_IMGUR_MESSAGE_PROXY'); },
2062
+ default: userConfig.proxy || '',
2063
+ required: false
2064
+ }
2065
+ ];
2066
+ return config;
2067
+ };
2068
+ function register$2(ctx) {
2069
+ ctx.helper.uploader.register('imgur', {
2070
+ get name() { return ctx.i18n.translate('PICBED_IMGUR'); },
2071
+ handle: handle$4,
2072
+ config: config$2
2073
+ });
2074
+ }
2075
+
2076
+ // generate OSS signature
2077
+ const generateSignature$1 = (options, fileName) => {
2078
+ const date = new Date().toUTCString();
2079
+ const mimeType = mime__default["default"].lookup(fileName);
2080
+ if (!mimeType)
2081
+ throw Error(`No mime type found for file ${fileName}`);
2082
+ const signString = `PUT\n\n${mimeType}\n${date}\n/${options.bucket}/${options.path}${fileName}`;
2083
+ const signature = crypto__default["default"].createHmac('sha1', options.accessKeySecret).update(signString).digest('base64');
2084
+ return `OSS ${options.accessKeyId}:${signature}`;
2085
+ };
2086
+ const postOptions$1 = (options, fileName, signature, image) => {
2087
+ return {
2088
+ method: 'PUT',
2089
+ url: `https://${options.bucket}.${options.area}.aliyuncs.com/${encodeURI(options.path)}${encodeURI(fileName)}`,
2090
+ headers: {
2091
+ Host: `${options.bucket}.${options.area}.aliyuncs.com`,
2092
+ Authorization: signature,
2093
+ Date: new Date().toUTCString(),
2094
+ 'Content-Type': mime__default["default"].lookup(fileName)
2095
+ },
2096
+ body: image,
2097
+ resolveWithFullResponse: true
2098
+ };
2099
+ };
2100
+ const handle$3 = async (ctx) => {
2101
+ const aliYunOptions = ctx.getConfig('picBed.aliyun');
2102
+ if (!aliYunOptions) {
2103
+ throw new Error('Can\'t find aliYun OSS config');
2104
+ }
2105
+ try {
2106
+ const imgList = ctx.output;
2107
+ const customUrl = aliYunOptions.customUrl;
2108
+ const path = aliYunOptions.path;
2109
+ for (const img of imgList) {
2110
+ if (img.fileName && img.buffer) {
2111
+ const signature = generateSignature$1(aliYunOptions, img.fileName);
2112
+ let image = img.buffer;
2113
+ if (!image && img.base64Image) {
2114
+ image = Buffer.from(img.base64Image, 'base64');
2115
+ }
2116
+ const options = postOptions$1(aliYunOptions, img.fileName, signature, image);
2117
+ const body = await ctx.request(options);
2118
+ if (body.statusCode === 200) {
2119
+ delete img.base64Image;
2120
+ delete img.buffer;
2121
+ const optionUrl = aliYunOptions.options || '';
2122
+ if (customUrl) {
2123
+ img.imgUrl = `${customUrl}/${path}${img.fileName}${optionUrl}`;
2124
+ }
2125
+ else {
2126
+ img.imgUrl = `https://${aliYunOptions.bucket}.${aliYunOptions.area}.aliyuncs.com/${path}${img.fileName}${optionUrl}`;
2127
+ }
2128
+ }
2129
+ else {
2130
+ throw new Error('Upload failed');
2131
+ }
2132
+ }
2133
+ }
2134
+ return ctx;
2135
+ }
2136
+ catch (err) {
2137
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
2138
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
2139
+ body: ctx.i18n.translate('CHECK_SETTINGS')
2140
+ });
2141
+ throw err;
2142
+ }
2143
+ };
2144
+ const config$1 = (ctx) => {
2145
+ const userConfig = ctx.getConfig('picBed.aliyun') || {};
2146
+ const config = [
2147
+ {
2148
+ name: 'accessKeyId',
2149
+ type: 'input',
2150
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_ACCESSKEYID'); },
2151
+ default: userConfig.accessKeyId || '',
2152
+ required: true
2153
+ },
2154
+ {
2155
+ name: 'accessKeySecret',
2156
+ type: 'password',
2157
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_ACCESSKEYSECRET'); },
2158
+ default: userConfig.accessKeySecret || '',
2159
+ required: true
2160
+ },
2161
+ {
2162
+ name: 'bucket',
2163
+ type: 'input',
2164
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_BUCKET'); },
2165
+ default: userConfig.bucket || '',
2166
+ required: true
2167
+ },
2168
+ {
2169
+ name: 'area',
2170
+ type: 'input',
2171
+ get prefix() { return ctx.i18n.translate('PICBED_ALICLOUD_AREA'); },
2172
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_AREA'); },
2173
+ default: userConfig.area || '',
2174
+ get message() { return ctx.i18n.translate('PICBED_ALICLOUD_MESSAGE_AREA'); },
2175
+ required: true
2176
+ },
2177
+ {
2178
+ name: 'path',
2179
+ type: 'input',
2180
+ get prefix() { return ctx.i18n.translate('PICBED_ALICLOUD_PATH'); },
2181
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_PATH'); },
2182
+ get message() { return ctx.i18n.translate('PICBED_ALICLOUD_MESSAGE_PATH'); },
2183
+ default: userConfig.path || '',
2184
+ required: false
2185
+ },
2186
+ {
2187
+ name: 'customUrl',
2188
+ type: 'input',
2189
+ get prefix() { return ctx.i18n.translate('PICBED_ALICLOUD_CUSTOMURL'); },
2190
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_CUSTOMURL'); },
2191
+ get message() { return ctx.i18n.translate('PICBED_ALICLOUD_MESSAGE_CUSTOMURL'); },
2192
+ default: userConfig.customUrl || '',
2193
+ required: false
2194
+ },
2195
+ {
2196
+ name: 'options',
2197
+ type: 'input',
2198
+ get prefix() { return ctx.i18n.translate('PICBED_ALICLOUD_OPTIONS'); },
2199
+ get alias() { return ctx.i18n.translate('PICBED_ALICLOUD_OPTIONS'); },
2200
+ get message() { return ctx.i18n.translate('PICBED_ALICLOUD_MESSAGE_OPTIONS'); },
2201
+ default: userConfig.options || '',
2202
+ required: false
2203
+ }
2204
+ ];
2205
+ return config;
2206
+ };
2207
+ function register$1(ctx) {
2208
+ ctx.helper.uploader.register('aliyun', {
2209
+ get name() {
2210
+ return ctx.i18n.translate('PICBED_ALICLOUD');
2211
+ },
2212
+ handle: handle$3,
2213
+ config: config$1
2214
+ });
2215
+ }
2216
+
2217
+ // generate COS signature string
2218
+ const generateSignature = (options, fileName) => {
2219
+ const path = options.path || '';
2220
+ const operator = options.operator;
2221
+ const password = options.password;
2222
+ const md5Password = MD5__default["default"](password);
2223
+ const date = new Date().toUTCString();
2224
+ const uri = `/${options.bucket}/${encodeURI(path)}${encodeURI(fileName)}`;
2225
+ const value = `PUT&${uri}&${date}`;
2226
+ const sign = crypto__default["default"].createHmac('sha1', md5Password).update(value).digest('base64');
2227
+ return `UPYUN ${operator}:${sign}`;
2228
+ };
2229
+ const postOptions = (options, fileName, signature, image) => {
2230
+ const bucket = options.bucket;
2231
+ const path = options.path || '';
2232
+ return {
2233
+ method: 'PUT',
2234
+ url: `https://v0.api.upyun.com/${bucket}/${encodeURI(path)}${encodeURI(fileName)}`,
2235
+ headers: {
2236
+ Authorization: signature,
2237
+ Date: new Date().toUTCString(),
2238
+ 'Content-Type': mime__default["default"].lookup(fileName) || 'application/octet-stream'
2239
+ },
2240
+ body: image,
2241
+ resolveWithFullResponse: true
2242
+ };
2243
+ };
2244
+ const handle$2 = async (ctx) => {
2245
+ const upyunOptions = ctx.getConfig('picBed.upyun');
2246
+ if (!upyunOptions) {
2247
+ throw new Error('Can\'t find upYun config');
2248
+ }
2249
+ try {
2250
+ const imgList = ctx.output;
2251
+ const path = upyunOptions.path || '';
2252
+ for (const img of imgList) {
2253
+ if (img.fileName && img.buffer) {
2254
+ let image = img.buffer;
2255
+ if (!image && img.base64Image) {
2256
+ image = Buffer.from(img.base64Image, 'base64');
2257
+ }
2258
+ const signature = generateSignature(upyunOptions, img.fileName);
2259
+ const options = postOptions(upyunOptions, img.fileName, signature, image);
2260
+ const body = await ctx.request(options);
2261
+ if (body.statusCode === 200) {
2262
+ delete img.base64Image;
2263
+ delete img.buffer;
2264
+ img.imgUrl = `${upyunOptions.url}/${path}${img.fileName}${upyunOptions.options}`;
2265
+ }
2266
+ else {
2267
+ throw new Error('Upload failed');
2268
+ }
2269
+ }
2270
+ }
2271
+ return ctx;
2272
+ }
2273
+ catch (err) {
2274
+ if (err.message === 'Upload failed') {
2275
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
2276
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
2277
+ body: ctx.i18n.translate('CHECK_SETTINGS')
2278
+ });
2279
+ }
2280
+ else {
2281
+ const body = safeParse(err.error);
2282
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
2283
+ title: ctx.i18n.translate('UPLOAD_FAILED'),
2284
+ body: ctx.i18n.translate('UPLOAD_FAILED_REASON', {
2285
+ code: typeof body === 'object' ? body.code : body
2286
+ }),
2287
+ text: 'http://docs.upyun.com/api/errno/'
2288
+ });
2289
+ }
2290
+ throw err;
2291
+ }
2292
+ };
2293
+ const config = (ctx) => {
2294
+ const userConfig = ctx.getConfig('picBed.upyun') || {};
2295
+ const config = [
2296
+ {
2297
+ name: 'bucket',
2298
+ type: 'input',
2299
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_BUCKET'); },
2300
+ default: userConfig.bucket || '',
2301
+ required: true
2302
+ },
2303
+ {
2304
+ name: 'operator',
2305
+ type: 'input',
2306
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_OPERATOR'); },
2307
+ get prefix() {
2308
+ return ctx.i18n.translate('PICBED_UPYUN_OPERATOR');
2309
+ },
2310
+ get message() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_OPERATOR'); },
2311
+ default: userConfig.operator || '',
2312
+ required: true
2313
+ },
2314
+ {
2315
+ name: 'password',
2316
+ type: 'password',
2317
+ get prefix() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_PASSWORD'); },
2318
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_PASSWORD'); },
2319
+ get message() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_PASSWORD'); },
2320
+ default: userConfig.password || '',
2321
+ required: true
2322
+ },
2323
+ {
2324
+ name: 'url',
2325
+ type: 'input',
2326
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_URL'); },
2327
+ get message() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_URL'); },
2328
+ default: userConfig.url || '',
2329
+ required: true
2330
+ },
2331
+ {
2332
+ name: 'options',
2333
+ type: 'input',
2334
+ get prefix() { return ctx.i18n.translate('PICBED_UPYUN_OPTIONS'); },
2335
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_OPTIONS'); },
2336
+ get message() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_OPTIONS'); },
2337
+ default: userConfig.options || '',
2338
+ required: false
2339
+ },
2340
+ {
2341
+ name: 'path',
2342
+ type: 'input',
2343
+ get prefix() { return ctx.i18n.translate('PICBED_UPYUN_PATH'); },
2344
+ get alias() { return ctx.i18n.translate('PICBED_UPYUN_PATH'); },
2345
+ get message() { return ctx.i18n.translate('PICBED_UPYUN_MESSAGE_PATH'); },
2346
+ default: userConfig.path || '',
2347
+ required: false
2348
+ }
2349
+ ];
2350
+ return config;
2351
+ };
2352
+ function register(ctx) {
2353
+ ctx.helper.uploader.register('upyun', {
2354
+ get name() { return ctx.i18n.translate('PICBED_UPYUN'); },
2355
+ handle: handle$2,
2356
+ config
2357
+ });
2358
+ }
2359
+
2360
+ const buildInUploaders = () => {
2361
+ return {
2362
+ register(ctx) {
2363
+ register$1(ctx);
2364
+ register$5(ctx);
2365
+ register$6(ctx);
2366
+ register$4(ctx);
2367
+ register$3(ctx);
2368
+ register$2(ctx);
2369
+ register(ctx);
2370
+ }
2371
+ };
2372
+ };
2373
+
2374
+ const handle$1 = async (ctx) => {
2375
+ const results = ctx.output;
2376
+ await Promise.all(ctx.input.map(async (item, index) => {
2377
+ let info;
2378
+ if (isUrl(item)) {
2379
+ info = await getURLFile(item, ctx);
2380
+ }
2381
+ else {
2382
+ info = await getFSFile(item);
2383
+ }
2384
+ if (info.success && info.buffer) {
2385
+ const imgSize = getImgSize(ctx, info.buffer, item);
2386
+ results[index] = {
2387
+ buffer: info.buffer,
2388
+ fileName: info.fileName,
2389
+ width: imgSize.width,
2390
+ height: imgSize.height,
2391
+ extname: info.extname
2392
+ };
2393
+ }
2394
+ else {
2395
+ throw new Error(info.reason);
2396
+ }
2397
+ }));
2398
+ // remove empty item
2399
+ ctx.output = results.filter(item => item);
2400
+ return ctx;
2401
+ };
2402
+ const getImgSize = (ctx, file, path) => {
2403
+ const imageSize = getImageSize(file);
2404
+ if (!imageSize.real) {
2405
+ ctx.log.warn(`can't get ${path}'s image size`);
2406
+ ctx.log.warn('fallback to 200 * 200');
2407
+ }
2408
+ return imageSize;
2409
+ };
2410
+ var ImgFromPath = {
2411
+ handle: handle$1
2412
+ };
2413
+
2414
+ const handle = async (ctx) => {
2415
+ ctx.output.push(...ctx.input);
2416
+ return ctx;
2417
+ };
2418
+ var ImgFromBase64 = {
2419
+ handle
2420
+ };
2421
+
2422
+ const buildInTransformers = () => {
2423
+ return {
2424
+ register(ctx) {
2425
+ ctx.helper.transformer.register('path', ImgFromPath);
2426
+ ctx.helper.transformer.register('base64', ImgFromBase64);
2427
+ }
2428
+ };
2429
+ };
2430
+
2431
+ /**
2432
+ * Local plugin loader, file system is required
2433
+ */
2434
+ class PluginLoader {
2435
+ constructor(ctx) {
2436
+ this.list = [];
2437
+ this.fullList = new Set();
2438
+ this.pluginMap = new Map();
2439
+ this.ctx = ctx;
2440
+ this.init();
2441
+ }
2442
+ init() {
2443
+ const packagePath = path__default["default"].join(this.ctx.baseDir, 'package.json');
2444
+ if (!fs__default["default"].existsSync(packagePath)) {
2445
+ const pkg = {
2446
+ name: 'picgo-plugins',
2447
+ description: 'picgo-plugins',
2448
+ repository: 'https://github.com/PicGo/PicGo-Core',
2449
+ license: 'MIT'
2450
+ };
2451
+ fs__default["default"].writeFileSync(packagePath, JSON.stringify(pkg), 'utf8');
2452
+ }
2453
+ }
2454
+ // get plugin entry
2455
+ resolvePlugin(ctx, name) {
2456
+ try {
2457
+ return resolve__default["default"].sync(name, { basedir: ctx.baseDir });
2458
+ }
2459
+ catch (err) {
2460
+ return path__default["default"].join(ctx.baseDir, 'node_modules', name);
2461
+ }
2462
+ }
2463
+ // load all third party plugin
2464
+ load() {
2465
+ const packagePath = path__default["default"].join(this.ctx.baseDir, 'package.json');
2466
+ const pluginDir = path__default["default"].join(this.ctx.baseDir, 'node_modules/');
2467
+ // Thanks to hexo -> https://github.com/hexojs/hexo/blob/master/lib/hexo/load_plugins.js
2468
+ if (!fs__default["default"].existsSync(pluginDir)) {
2469
+ return false;
2470
+ }
2471
+ const json = fs__default["default"].readJSONSync(packagePath);
2472
+ const deps = Object.keys(json.dependencies || {});
2473
+ const devDeps = Object.keys(json.devDependencies || {});
2474
+ const modules = deps.concat(devDeps).filter((name) => {
2475
+ if (!/^picgo-plugin-|^@[^/]+\/picgo-plugin-/.test(name))
2476
+ return false;
2477
+ const path = this.resolvePlugin(this.ctx, name);
2478
+ return fs__default["default"].existsSync(path);
2479
+ });
2480
+ for (const module of modules) {
2481
+ this.registerPlugin(module);
2482
+ }
2483
+ return true;
2484
+ }
2485
+ registerPlugin(name, plugin) {
2486
+ if (!name || typeof name !== 'string') {
2487
+ this.ctx.log.warn('Please provide valid plugin');
2488
+ return;
2489
+ }
2490
+ this.fullList.add(name);
2491
+ try {
2492
+ // register local plugin
2493
+ if (!plugin) {
2494
+ if (this.ctx.getConfig(`picgoPlugins.${name}`) === true || (this.ctx.getConfig(`picgoPlugins.${name}`) === undefined)) {
2495
+ this.list.push(name);
2496
+ setCurrentPluginName(name);
2497
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
2498
+ this.getPlugin(name).register(this.ctx);
2499
+ const plugin = `picgoPlugins[${name}]`;
2500
+ this.ctx.saveConfig({
2501
+ [plugin]: true
2502
+ });
2503
+ }
2504
+ }
2505
+ else {
2506
+ // register provided plugin
2507
+ // && won't write config to files
2508
+ this.list.push(name);
2509
+ setCurrentPluginName(name);
2510
+ const pluginInterface = plugin(this.ctx);
2511
+ this.pluginMap.set(name, pluginInterface);
2512
+ pluginInterface.register(this.ctx);
2513
+ }
2514
+ }
2515
+ catch (e) {
2516
+ this.pluginMap.delete(name);
2517
+ this.list = this.list.filter((item) => item !== name);
2518
+ this.fullList.delete(name);
2519
+ this.ctx.log.error(e);
2520
+ this.ctx.emit(IBuildInEvent.NOTIFICATION, {
2521
+ title: `Plugin ${name} Load Error`,
2522
+ body: e
2523
+ });
2524
+ }
2525
+ }
2526
+ unregisterPlugin(name) {
2527
+ this.list = this.list.filter((item) => item !== name);
2528
+ this.fullList.delete(name);
2529
+ this.pluginMap.delete(name);
2530
+ setCurrentPluginName(name);
2531
+ this.ctx.helper.uploader.unregister(name);
2532
+ this.ctx.helper.transformer.unregister(name);
2533
+ this.ctx.helper.beforeTransformPlugins.unregister(name);
2534
+ this.ctx.helper.beforeUploadPlugins.unregister(name);
2535
+ this.ctx.helper.afterUploadPlugins.unregister(name);
2536
+ this.ctx.cmd.unregister(name);
2537
+ this.ctx.removeConfig('picgoPlugins', name);
2538
+ }
2539
+ // get plugin by name
2540
+ getPlugin(name) {
2541
+ if (this.pluginMap.has(name)) {
2542
+ return this.pluginMap.get(name);
2543
+ }
2544
+ const pluginDir = path__default["default"].join(this.ctx.baseDir, 'node_modules/');
2545
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
2546
+ const plugin = require(pluginDir + name)(this.ctx);
2547
+ this.pluginMap.set(name, plugin);
2548
+ return plugin;
2549
+ }
2550
+ /**
2551
+ * Get the list of enabled plugins
2552
+ */
2553
+ getList() {
2554
+ return this.list;
2555
+ }
2556
+ hasPlugin(name) {
2557
+ return this.fullList.has(name);
2558
+ }
2559
+ /**
2560
+ * Get the full list of plugins, whether it is enabled or not
2561
+ */
2562
+ getFullList() {
2563
+ return [...this.fullList];
2564
+ }
2565
+ }
2566
+
2567
+ var macClipboardScript = "-- From https://github.com/mushanshitiancai/vscode-paste-image\r\nproperty fileTypes : {{«class PNGf», \".png\"}}\r\n\r\non run argv\r\n\tif argv is {} then\r\n\t\treturn \"\"\r\n\tend if\r\n\r\n\tif ((clipboard info) as string) contains \"«class furl»\" then\r\n\t\treturn POSIX path of (the clipboard as «class furl»)\r\n\telse\r\n\t\tset imagePath to (item 1 of argv)\r\n\t\tset theType to getType()\r\n\r\n\t\tif theType is not missing value then\r\n\t\t\ttry\r\n\t\t\t\tset myFile to (open for access imagePath with write permission)\r\n\t\t\t\tset eof myFile to 0\r\n\t\t\t\twrite (the clipboard as (first item of theType)) to myFile\r\n\t\t\t\tclose access myFile\r\n\t\t\t\treturn (POSIX path of imagePath)\r\n\t\t\ton error\r\n\t\t\t\ttry\r\n\t\t\t\t\tclose access myFile\r\n\t\t\t\tend try\r\n\t\t\t\treturn \"no image\"\r\n\t\t\tend try\r\n\t\telse\r\n\t\t\treturn \"no image\"\r\n\t\tend if\r\n\tend if\r\nend run\r\n\r\non getType()\r\n\trepeat with aType in fileTypes\r\n\t\trepeat with theInfo in (clipboard info)\r\n\t\t\tif (first item of theInfo) is equal to (first item of aType) then return aType\r\n\t\tend repeat\r\n\tend repeat\r\n\treturn missing value\r\nend getType\r\n";
2568
+
2569
+ var windowsClipboardScript = "\r\nparam($imagePath)\r\n\r\n# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\n\r\nAdd-Type -Assembly PresentationCore\r\n$img = [Windows.Clipboard]::GetImage()\r\n\r\nif ($img -eq $null) {\r\n \"no image\"\r\n Exit 1\r\n}\r\n\r\nif (-not $imagePath) {\r\n \"no image\"\r\n Exit 1\r\n}\r\n\r\n$fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n$stream = [IO.File]::Open($imagePath, \"OpenOrCreate\")\r\n$encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n$encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n$encoder.Save($stream) | out-null\r\n$stream.Dispose() | out-null\r\n\r\n$imagePath\r\n";
2570
+
2571
+ var windows10ClipboardScript = "# Adapted from https://github.com/octan3/img-clipboard-dump/blob/master/dump-clipboard-png.ps1\r\nparam($imagePath)\r\n\r\n# https://github.com/PowerShell/PowerShell/issues/7233\r\n# fix the output encoding bug\r\n[console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\r\n\r\nAdd-Type -Assembly PresentationCore\r\nfunction main {\r\n $img = [Windows.Clipboard]::GetImage()\r\n\r\n if ($img -eq $null) {\r\n \"no image\"\r\n Exit 1\r\n }\r\n\r\n if (-not $imagePath) {\r\n \"no image\"\r\n Exit 1\r\n }\r\n\r\n $fcb = new-object Windows.Media.Imaging.FormatConvertedBitmap($img, [Windows.Media.PixelFormats]::Rgb24, $null, 0)\r\n $stream = [IO.File]::Open($imagePath, \"OpenOrCreate\")\r\n $encoder = New-Object Windows.Media.Imaging.PngBitmapEncoder\r\n $encoder.Frames.Add([Windows.Media.Imaging.BitmapFrame]::Create($fcb)) | out-null\r\n $encoder.Save($stream) | out-null\r\n $stream.Dispose() | out-null\r\n\r\n $imagePath\r\n # fix windows 10 native cmd crash bug when \"picgo upload\"\r\n # https://github.com/PicGo/PicGo-Core/issues/32\r\n Exit 1\r\n}\r\n\r\ntry {\r\n # For WIN10\r\n $file = Get-Clipboard -Format FileDropList\r\n if ($file -ne $null) {\r\n Convert-Path $file\r\n Exit 1\r\n }\r\n} catch {\r\n # For WIN7 WIN8 WIN10\r\n main\r\n}\r\n\r\nmain";
2572
+
2573
+ var linuxClipboardScript = "#!/bin/sh\r\n\r\nif [ -z \"$DISPLAY\" ]; then\r\n echo \"no support\" >&2\r\n exit 1\r\nfi\r\n\r\ncase \"$XDG_SESSION_TYPE\" in\r\nwayland)\r\n command -v wl-copy >/dev/null 2>&1 || {\r\n echo >&2 \"no wl-clipboard\"\r\n exit 1\r\n }\r\n filePath=$(wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z \"$filePath\" ]; then\r\n if\r\n wl-copy -t image/png image/png -o >\"$1\" 2>/dev/null\r\n then\r\n echo \"$1\"\r\n else\r\n rm -f \"$1\"\r\n echo \"no image\"\r\n fi\r\n else\r\n echo \"$filePath\"\r\n fi\r\n ;;\r\nx11 | tty)\r\n # require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)\r\n command -v xclip >/dev/null 2>&1 || {\r\n echo >&2 \"no xclip\"\r\n exit 1\r\n }\r\n # write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)\r\n filePath=$(xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-)\r\n if [ -z \"$filePath\" ]; then\r\n if\r\n xclip -selection clipboard -target image/png -o >\"$1\" 2>/dev/null\r\n then\r\n echo \"$1\"\r\n else\r\n rm -f \"$1\"\r\n echo \"no image\"\r\n fi\r\n else\r\n echo \"$filePath\"\r\n fi\r\n ;;\r\nesac\r\n";
2574
+
2575
+ var wslClipboardScript = "#!/bin/sh\r\n# grab the paths\r\nscriptPath=$(echo $0 | awk '{ print substr( $0, 1, length($0)-6 ) }')\"windows10.ps1\"\r\nimagePath=$(echo $1 | awk '{ print substr( $0, 1, length($0)-18 ) }')\r\nimageName=$(echo $1 | awk '{ print substr( $0, length($0)-17, length($0) ) }')\r\n\r\n# run the powershell script\r\nres=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)\"\\\\\"$imageName)\r\n\r\n# note that there is a return symbol in powershell result\r\nnoImage=$(echo \"no image\\r\")\r\n\r\n# check whether image exists\r\nif [ \"$res\" = \"$noImage\" ] ;then\r\n echo \"no image\"\r\nelse\r\n echo $(wslpath -u -a \"${res}\")\r\nfi\r\n";
2576
+
2577
+ const CLIPBOARD_IMAGE_FOLDER = 'picgo-clipboard-images';
2578
+
2579
+ const getCurrentPlatform = () => {
2580
+ const platform = process.platform;
2581
+ if (isWsl__default["default"]) {
2582
+ return 'wsl';
2583
+ }
2584
+ if (platform === 'win32') {
2585
+ const currentOS = os__default["default"].release().split('.')[0];
2586
+ if (currentOS === '10') {
2587
+ return 'win10';
2588
+ }
2589
+ else {
2590
+ return 'win32';
2591
+ }
2592
+ }
2593
+ else if (platform === 'darwin') {
2594
+ return 'darwin';
2595
+ }
2596
+ else {
2597
+ return 'linux';
2598
+ }
2599
+ };
2600
+ const platform2ScriptContent = {
2601
+ darwin: macClipboardScript,
2602
+ win32: windowsClipboardScript,
2603
+ win10: windows10ClipboardScript,
2604
+ linux: linuxClipboardScript,
2605
+ wsl: wslClipboardScript
2606
+ };
2607
+ /**
2608
+ * powershell will report error if file does not have a '.ps1' extension,
2609
+ * so we should keep the extension name consistent with corresponding shell
2610
+ */
2611
+ const platform2ScriptFilename = {
2612
+ darwin: 'mac.applescript',
2613
+ win32: 'windows.ps1',
2614
+ win10: 'windows10.ps1',
2615
+ linux: 'linux.sh',
2616
+ wsl: 'wsl.sh'
2617
+ };
2618
+ function createImageFolder(ctx) {
2619
+ const imagePath = path__default["default"].join(ctx.baseDir, CLIPBOARD_IMAGE_FOLDER);
2620
+ if (!fs__default["default"].existsSync(imagePath)) {
2621
+ fs__default["default"].mkdirSync(imagePath);
2622
+ }
2623
+ }
2624
+ // Thanks to vs-picgo: https://github.com/Spades-S/vs-picgo/blob/master/src/extension.ts
2625
+ const getClipboardImage = async (ctx) => {
2626
+ createImageFolder(ctx);
2627
+ // add an clipboard image folder to control the image cache file
2628
+ const imagePath = path__default["default"].join(ctx.baseDir, CLIPBOARD_IMAGE_FOLDER, `${dayjs__default["default"]().format('YYYYMMDDHHmmss')}.png`);
2629
+ return await new Promise((resolve, reject) => {
2630
+ const platform = getCurrentPlatform();
2631
+ const scriptPath = path__default["default"].join(ctx.baseDir, platform2ScriptFilename[platform]);
2632
+ // If the script does not exist yet, we need to write the content to the script file
2633
+ if (!fs__default["default"].existsSync(scriptPath)) {
2634
+ fs__default["default"].writeFileSync(scriptPath, platform2ScriptContent[platform], 'utf8');
2635
+ }
2636
+ let execution;
2637
+ if (platform === 'darwin') {
2638
+ execution = child_process.spawn('osascript', [scriptPath, imagePath]);
2639
+ }
2640
+ else if (platform === 'win32' || platform === 'win10') {
2641
+ execution = child_process.spawn('powershell', [
2642
+ '-noprofile',
2643
+ '-noninteractive',
2644
+ '-nologo',
2645
+ '-sta',
2646
+ '-executionpolicy', 'unrestricted',
2647
+ // fix windows 10 native cmd crash bug when "picgo upload"
2648
+ // https://github.com/PicGo/PicGo-Core/issues/32
2649
+ // '-windowstyle','hidden',
2650
+ // '-noexit',
2651
+ '-file', scriptPath,
2652
+ imagePath
2653
+ ]);
2654
+ }
2655
+ else {
2656
+ execution = child_process.spawn('sh', [scriptPath, imagePath]);
2657
+ }
2658
+ execution.stdout.on('data', (data) => {
2659
+ if (platform === 'linux') {
2660
+ if (data.toString().trim() === 'no xclip or wl-clipboard') {
2661
+ ctx.emit(IBuildInEvent.NOTIFICATION, {
2662
+ title: 'xclip or wl-clipboard not found',
2663
+ body: 'Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo'
2664
+ });
2665
+ return reject(new Error('Please install xclip(for x11) or wl-clipboard(for wayland) before run picgo'));
2666
+ }
2667
+ }
2668
+ const imgPath = data.toString().trim();
2669
+ // if the filePath is the real file in system
2670
+ // we should keep it instead of removing
2671
+ let shouldKeepAfterUploading = false;
2672
+ // in macOS if your copy the file in system, it's basename will not equal to our default basename
2673
+ if (path__default["default"].basename(imgPath) !== path__default["default"].basename(imagePath)) {
2674
+ // if the path is not generate by picgo
2675
+ // but the path exists, we should keep it
2676
+ if (fs__default["default"].existsSync(imgPath)) {
2677
+ shouldKeepAfterUploading = true;
2678
+ }
2679
+ }
2680
+ // if the imgPath is invalid
2681
+ if (imgPath !== 'no image' && !fs__default["default"].existsSync(imgPath)) {
2682
+ return reject(new Error(`Can't find ${imgPath}`));
2683
+ }
2684
+ resolve({
2685
+ imgPath,
2686
+ shouldKeepAfterUploading
2687
+ });
2688
+ });
2689
+ });
2690
+ };
2691
+
2692
+ const eventBus = new events.EventEmitter();
2693
+
2694
+ /* eslint-disable @typescript-eslint/explicit-function-return-type */
2695
+ const httpsAgent = new https__default["default"].Agent({
2696
+ maxVersion: 'TLSv1.2',
2697
+ minVersion: 'TLSv1.2'
2698
+ });
2699
+ // thanks for https://github.dev/request/request/blob/master/index.js
2700
+ function appendFormData(form, key, data) {
2701
+ if (typeof data === 'object' && 'value' in data && 'options' in data) {
2702
+ form.append(key, data.value, data.options);
2703
+ }
2704
+ else {
2705
+ form.append(key, data);
2706
+ }
2707
+ }
2708
+ function requestInterceptor(options) {
2709
+ var _a;
2710
+ let __isOldOptions = false;
2711
+ const opt = Object.assign(Object.assign({}, options), { url: options.url || '', headers: options.headers || {} });
2712
+ // user request config proxy
2713
+ if (options.proxy) {
2714
+ let proxyOptions = options.proxy;
2715
+ if (typeof proxyOptions === 'string') {
2716
+ try {
2717
+ proxyOptions = new url.URL(options.proxy);
2718
+ }
2719
+ catch (e) {
2720
+ proxyOptions = false;
2721
+ opt.proxy = false;
2722
+ console.error(e);
2723
+ }
2724
+ __isOldOptions = true;
2725
+ }
2726
+ if (proxyOptions) {
2727
+ if ((_a = options.url) === null || _a === void 0 ? void 0 : _a.startsWith('https://')) {
2728
+ opt.proxy = false;
2729
+ opt.httpsAgent = tunnel__default["default"].httpsOverHttp({
2730
+ proxy: {
2731
+ host: proxyOptions === null || proxyOptions === void 0 ? void 0 : proxyOptions.hostname,
2732
+ port: parseInt(proxyOptions === null || proxyOptions === void 0 ? void 0 : proxyOptions.port, 10)
2733
+ }
2734
+ });
2735
+ }
2736
+ else {
2737
+ opt.proxy = {
2738
+ host: proxyOptions.hostname,
2739
+ port: parseInt(proxyOptions.port, 10),
2740
+ protocol: 'http'
2741
+ };
2742
+ }
2743
+ }
2744
+ }
2745
+ if ('formData' in options) {
2746
+ const form = new FormData__default["default"]();
2747
+ for (const key in options.formData) {
2748
+ const data = options.formData[key];
2749
+ appendFormData(form, key, data);
2750
+ }
2751
+ opt.data = form;
2752
+ opt.headers = Object.assign(opt.headers || {}, form.getHeaders());
2753
+ __isOldOptions = true;
2754
+ // @ts-expect-error
2755
+ delete opt.formData;
2756
+ }
2757
+ if ('body' in options) {
2758
+ opt.data = options.body;
2759
+ __isOldOptions = true;
2760
+ // @ts-expect-error
2761
+ delete opt.body;
2762
+ }
2763
+ if ('qs' in options) {
2764
+ opt.params = options.qs;
2765
+ __isOldOptions = true;
2766
+ }
2767
+ opt.__isOldOptions = __isOldOptions;
2768
+ return opt;
2769
+ }
2770
+ function responseInterceptor(response) {
2771
+ return Object.assign(Object.assign({}, response), { statusCode: response.status, body: response.data });
2772
+ }
2773
+ function responseErrorHandler(error) {
2774
+ var _a, _b, _c, _d, _e, _f, _g;
2775
+ // if (error.response) {
2776
+ // // The request was made and the server responded with a status code
2777
+ // // that falls out of the range of 2xx
2778
+ // return Promise.reject(erro)
2779
+ // } else if (error.request) {
2780
+ // // The request was made but no response was received
2781
+ // // `error.request` is an instance of XMLHttpRequest in the browser and an instance of
2782
+ // // http.ClientRequest in node.js
2783
+ // return Promise.reject(error.request)
2784
+ // } else {
2785
+ // // Something happened in setting up the request that triggered an Error
2786
+ // return Promise.reject(error.message)
2787
+ // }
2788
+ const errorObj = {
2789
+ method: ((_b = (_a = error === null || error === void 0 ? void 0 : error.config) === null || _a === void 0 ? void 0 : _a.method) === null || _b === void 0 ? void 0 : _b.toUpperCase()) || '',
2790
+ url: ((_c = error === null || error === void 0 ? void 0 : error.config) === null || _c === void 0 ? void 0 : _c.url) || '',
2791
+ statusCode: ((_d = error === null || error === void 0 ? void 0 : error.response) === null || _d === void 0 ? void 0 : _d.status) || 0,
2792
+ message: (error === null || error === void 0 ? void 0 : error.message) || '',
2793
+ stack: (error === null || error === void 0 ? void 0 : error.stack) || {},
2794
+ response: {
2795
+ status: ((_e = error === null || error === void 0 ? void 0 : error.response) === null || _e === void 0 ? void 0 : _e.status) || 0,
2796
+ statusCode: ((_f = error === null || error === void 0 ? void 0 : error.response) === null || _f === void 0 ? void 0 : _f.status) || 0,
2797
+ body: ((_g = error === null || error === void 0 ? void 0 : error.response) === null || _g === void 0 ? void 0 : _g.data) || ''
2798
+ }
2799
+ };
2800
+ return Promise.reject(errorObj);
2801
+ }
2802
+ class Request {
2803
+ constructor(ctx) {
2804
+ this.proxy = '';
2805
+ this.options = {};
2806
+ this.ctx = ctx;
2807
+ this.init();
2808
+ eventBus.on(IBusEvent.CONFIG_CHANGE, (data) => {
2809
+ var _a;
2810
+ switch (data.configName) {
2811
+ case 'picBed':
2812
+ if ((_a = data.value) === null || _a === void 0 ? void 0 : _a.proxy) {
2813
+ this.proxy = data.value.proxy;
2814
+ }
2815
+ break;
2816
+ case 'picBed.proxy':
2817
+ this.proxy = data.value;
2818
+ break;
2819
+ }
2820
+ });
2821
+ }
2822
+ init() {
2823
+ const proxy = this.ctx.getConfig('picBed.proxy');
2824
+ if (proxy) {
2825
+ this.proxy = proxy;
2826
+ }
2827
+ }
2828
+ handleProxy() {
2829
+ if (this.proxy) {
2830
+ try {
2831
+ const proxyOptions = new url.URL(this.proxy);
2832
+ return {
2833
+ host: proxyOptions.hostname,
2834
+ port: parseInt(proxyOptions.port || '0', 10),
2835
+ protocol: proxyOptions.protocol
2836
+ };
2837
+ }
2838
+ catch (e) {
2839
+ }
2840
+ }
2841
+ return false;
2842
+ }
2843
+ // #64 dynamic get proxy value
2844
+ request(options) {
2845
+ var _a;
2846
+ this.options.proxy = this.handleProxy();
2847
+ this.options.headers = options.headers || {};
2848
+ this.options.maxBodyLength = Infinity;
2849
+ this.options.maxContentLength = Infinity;
2850
+ if (this.options.proxy && ((_a = options.url) === null || _a === void 0 ? void 0 : _a.startsWith('https://'))) {
2851
+ this.options.httpsAgent = tunnel__default["default"].httpsOverHttp({
2852
+ proxy: {
2853
+ host: this.options.proxy.host,
2854
+ port: this.options.proxy.port
2855
+ }
2856
+ });
2857
+ this.options.proxy = false;
2858
+ }
2859
+ else {
2860
+ this.options.httpsAgent = httpsAgent;
2861
+ }
2862
+ // !NOTICE this.options !== options
2863
+ // this.options is the default options
2864
+ const instance = axios__default["default"].create(this.options);
2865
+ instance.interceptors.response.use(responseInterceptor, responseErrorHandler);
2866
+ // compatible with old request options to new options
2867
+ const opt = requestInterceptor(options);
2868
+ instance.interceptors.request.use(function (obj) {
2869
+ var _a, _b, _c;
2870
+ // handle Content-Type
2871
+ let contentType = '';
2872
+ if ((_a = obj === null || obj === void 0 ? void 0 : obj.headers) === null || _a === void 0 ? void 0 : _a.contentType) {
2873
+ contentType = obj.headers.contentType;
2874
+ delete obj.headers.contentType;
2875
+ }
2876
+ else if ((_b = obj === null || obj === void 0 ? void 0 : obj.headers) === null || _b === void 0 ? void 0 : _b.ContentType) {
2877
+ contentType = obj.headers.ContentType;
2878
+ delete obj.headers.ContentType;
2879
+ }
2880
+ else if ((_c = obj === null || obj === void 0 ? void 0 : obj.headers) === null || _c === void 0 ? void 0 : _c['content-type']) {
2881
+ contentType = obj.headers['content-type'];
2882
+ delete obj.headers['content-type'];
2883
+ }
2884
+ if (contentType !== '' && obj.headers) {
2885
+ obj.headers['Content-Type'] = contentType;
2886
+ }
2887
+ return obj;
2888
+ });
2889
+ if ('resolveWithFullResponse' in options && options.resolveWithFullResponse) {
2890
+ return instance.request(opt);
2891
+ }
2892
+ else {
2893
+ return instance.request(opt).then(res => {
2894
+ // use old request option format
2895
+ if (opt.__isOldOptions) {
2896
+ if ('json' in options) {
2897
+ if (options.json) {
2898
+ return res.data;
2899
+ }
2900
+ }
2901
+ else {
2902
+ return JSON.stringify(res.data);
2903
+ }
2904
+ }
2905
+ else {
2906
+ return res.data;
2907
+ }
2908
+ });
2909
+ }
2910
+ }
2911
+ }
2912
+
2913
+ class DB {
2914
+ constructor(ctx) {
2915
+ this.ctx = ctx;
2916
+ this.db = new store.JSONStore(this.ctx.configPath);
2917
+ if (!this.db.has('picBed')) {
2918
+ try {
2919
+ this.db.set('picBed', {
2920
+ uploader: 'smms',
2921
+ current: 'smms'
2922
+ });
2923
+ }
2924
+ catch (e) {
2925
+ this.ctx.log.error(e);
2926
+ throw e;
2927
+ }
2928
+ }
2929
+ if (!this.db.has('picgoPlugins')) {
2930
+ try {
2931
+ this.db.set('picgoPlugins', {});
2932
+ }
2933
+ catch (e) {
2934
+ this.ctx.log.error(e);
2935
+ throw e;
2936
+ }
2937
+ }
2938
+ }
2939
+ read(flush) {
2940
+ return this.db.read(flush);
2941
+ }
2942
+ get(key = '') {
2943
+ this.read(true);
2944
+ return this.db.get(key);
2945
+ }
2946
+ set(key, value) {
2947
+ this.read(true);
2948
+ return this.db.set(key, value);
2949
+ }
2950
+ has(key) {
2951
+ this.read(true);
2952
+ return this.db.has(key);
2953
+ }
2954
+ unset(key, value) {
2955
+ this.read(true);
2956
+ return this.db.unset(key, value);
2957
+ }
2958
+ saveConfig(config) {
2959
+ Object.keys(config).forEach((name) => {
2960
+ this.set(name, config[name]);
2961
+ });
2962
+ }
2963
+ removeConfig(config) {
2964
+ Object.keys(config).forEach((name) => {
2965
+ this.unset(name, config[name]);
2966
+ });
2967
+ }
2968
+ }
2969
+ // const initConfig = (configPath: string): lowdb.LowdbSync<any> => {
2970
+ // }
2971
+ // const saveConfig = (configPath: string, config: any): void => {
2972
+ // const db = initConfig(configPath)
2973
+ // Object.keys(config).forEach((name: string) => {
2974
+ // db.read().set(name, config[name]).write()
2975
+ // })
2976
+ // }
2977
+ // export {
2978
+ // initConfig,
2979
+ // saveConfig
2980
+ // }
2981
+
2982
+ class PluginHandler {
2983
+ constructor(ctx) {
2984
+ this.ctx = ctx;
2985
+ }
2986
+ async install(plugins, options = {}, env) {
2987
+ const installedPlugins = [];
2988
+ const processPlugins = plugins
2989
+ .map((item) => handlePluginNameProcess(this.ctx, item))
2990
+ .filter((item) => {
2991
+ // detect if has already installed
2992
+ // or will cause error
2993
+ if (this.ctx.pluginLoader.hasPlugin(item.pkgName)) {
2994
+ installedPlugins.push(item.pkgName);
2995
+ this.ctx.log.success(`PicGo has already installed ${item.pkgName}`);
2996
+ return false;
2997
+ }
2998
+ // if something wrong, filter it out
2999
+ if (!item.success) {
3000
+ return false;
3001
+ }
3002
+ return true;
3003
+ });
3004
+ const fullNameList = processPlugins.map(item => item.fullName);
3005
+ const pkgNameList = processPlugins.map(item => item.pkgName);
3006
+ if (fullNameList.length > 0) {
3007
+ // install plugins must use fullNameList:
3008
+ // 1. install remote pacage
3009
+ // 2. install local pacage
3010
+ const result = await this.execCommand('install', fullNameList, this.ctx.baseDir, options, env);
3011
+ if (!result.code) {
3012
+ pkgNameList.forEach((pluginName) => {
3013
+ this.ctx.pluginLoader.registerPlugin(pluginName);
3014
+ });
3015
+ this.ctx.log.success(this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS'));
3016
+ this.ctx.emit('installSuccess', {
3017
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS'),
3018
+ body: [...pkgNameList, ...installedPlugins]
3019
+ });
3020
+ const res = {
3021
+ success: true,
3022
+ body: [...pkgNameList, ...installedPlugins]
3023
+ };
3024
+ return res;
3025
+ }
3026
+ else {
3027
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON', {
3028
+ code: `${result.code}`,
3029
+ data: result.data
3030
+ });
3031
+ this.ctx.log.error(err);
3032
+ this.ctx.emit('installFailed', {
3033
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED'),
3034
+ body: err
3035
+ });
3036
+ const res = {
3037
+ success: false,
3038
+ body: err
3039
+ };
3040
+ return res;
3041
+ }
3042
+ }
3043
+ else if (installedPlugins.length === 0) {
3044
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID');
3045
+ this.ctx.log.error(err);
3046
+ this.ctx.emit('installFailed', {
3047
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED'),
3048
+ body: err
3049
+ });
3050
+ const res = {
3051
+ success: false,
3052
+ body: err
3053
+ };
3054
+ return res;
3055
+ }
3056
+ else {
3057
+ this.ctx.log.success(this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS'));
3058
+ this.ctx.emit('installSuccess', {
3059
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS'),
3060
+ body: [...pkgNameList, ...installedPlugins]
3061
+ });
3062
+ const res = {
3063
+ success: true,
3064
+ body: [...pkgNameList, ...installedPlugins]
3065
+ };
3066
+ return res;
3067
+ }
3068
+ }
3069
+ async uninstall(plugins) {
3070
+ const processPlugins = plugins.map((item) => handlePluginNameProcess(this.ctx, item)).filter(item => item.success);
3071
+ const pkgNameList = processPlugins.map(item => item.pkgName);
3072
+ if (pkgNameList.length > 0) {
3073
+ // uninstall plugins must use pkgNameList:
3074
+ // npm uninstall will use the package.json's name
3075
+ const result = await this.execCommand('uninstall', pkgNameList, this.ctx.baseDir);
3076
+ if (!result.code) {
3077
+ pkgNameList.forEach((pluginName) => {
3078
+ this.ctx.pluginLoader.unregisterPlugin(pluginName);
3079
+ });
3080
+ this.ctx.log.success(this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS'));
3081
+ this.ctx.emit('uninstallSuccess', {
3082
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS'),
3083
+ body: pkgNameList
3084
+ });
3085
+ const res = {
3086
+ success: true,
3087
+ body: pkgNameList
3088
+ };
3089
+ return res;
3090
+ }
3091
+ else {
3092
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON', {
3093
+ code: `${result.code}`,
3094
+ data: result.data
3095
+ });
3096
+ this.ctx.log.error(err);
3097
+ this.ctx.emit('uninstallFailed', {
3098
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED'),
3099
+ body: err
3100
+ });
3101
+ const res = {
3102
+ success: false,
3103
+ body: err
3104
+ };
3105
+ return res;
3106
+ }
3107
+ }
3108
+ else {
3109
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID');
3110
+ this.ctx.log.error(err);
3111
+ this.ctx.emit('uninstallFailed', {
3112
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED'),
3113
+ body: err
3114
+ });
3115
+ const res = {
3116
+ success: false,
3117
+ body: err
3118
+ };
3119
+ return res;
3120
+ }
3121
+ }
3122
+ async update(plugins, options = {}, env) {
3123
+ const processPlugins = plugins.map((item) => handlePluginNameProcess(this.ctx, item)).filter(item => item.success);
3124
+ const pkgNameList = processPlugins.map(item => item.pkgName);
3125
+ if (pkgNameList.length > 0) {
3126
+ // update plugins must use pkgNameList:
3127
+ // npm update will use the package.json's name
3128
+ const result = await this.execCommand('update', pkgNameList, this.ctx.baseDir, options, env);
3129
+ if (!result.code) {
3130
+ this.ctx.log.success(this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS'));
3131
+ this.ctx.emit('updateSuccess', {
3132
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS'),
3133
+ body: pkgNameList
3134
+ });
3135
+ const res = {
3136
+ success: true,
3137
+ body: pkgNameList
3138
+ };
3139
+ return res;
3140
+ }
3141
+ else {
3142
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON', {
3143
+ code: `${result.code}`,
3144
+ data: result.data
3145
+ });
3146
+ this.ctx.log.error(err);
3147
+ this.ctx.emit('updateFailed', {
3148
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED'),
3149
+ body: err
3150
+ });
3151
+ const res = {
3152
+ success: false,
3153
+ body: err
3154
+ };
3155
+ return res;
3156
+ }
3157
+ }
3158
+ else {
3159
+ const err = this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID');
3160
+ this.ctx.log.error(err);
3161
+ this.ctx.emit('updateFailed', {
3162
+ title: this.ctx.i18n.translate('PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED'),
3163
+ body: err
3164
+ });
3165
+ const res = {
3166
+ success: false,
3167
+ body: err
3168
+ };
3169
+ return res;
3170
+ }
3171
+ }
3172
+ async execCommand(cmd, modules, where, options = {}, env = {}) {
3173
+ // options first
3174
+ const registry = options.registry || this.ctx.getConfig('settings.registry');
3175
+ const proxy = options.proxy || this.ctx.getConfig('settings.proxy');
3176
+ return await new Promise((resolve) => {
3177
+ var _a, _b;
3178
+ let args = [cmd].concat(modules).concat('--color=always').concat('--save');
3179
+ if (registry) {
3180
+ args = args.concat(`--registry=${registry}`);
3181
+ }
3182
+ if (proxy) {
3183
+ args = args.concat(`--proxy=${proxy}`);
3184
+ }
3185
+ try {
3186
+ const npm = spawn__default["default"]('npm', args, { cwd: where, env: Object.assign({}, process.env, env) });
3187
+ let output = '';
3188
+ (_a = npm.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
3189
+ output += data;
3190
+ }).pipe(process.stdout);
3191
+ (_b = npm.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
3192
+ output += data;
3193
+ }).pipe(process.stderr);
3194
+ npm.on('close', (code) => {
3195
+ if (!code) {
3196
+ resolve({ code: 0, data: output });
3197
+ }
3198
+ else {
3199
+ resolve({ code: code, data: output });
3200
+ }
3201
+ });
3202
+ // for users who haven't installed node.js
3203
+ npm.on('error', (err) => {
3204
+ this.ctx.log.error(err);
3205
+ this.ctx.log.error('NPM is not installed');
3206
+ this.ctx.emit(IBuildInEvent.FAILED, 'NPM is not installed');
3207
+ });
3208
+ }
3209
+ catch (e) {
3210
+ this.ctx.log.error(e);
3211
+ this.ctx.emit(IBuildInEvent.FAILED, e);
3212
+ }
3213
+ });
3214
+ }
3215
+ }
3216
+ /**
3217
+ * transform the input plugin name or path string to valid result
3218
+ * @param ctx
3219
+ * @param nameOrPath
3220
+ */
3221
+ const handlePluginNameProcess = (ctx, nameOrPath) => {
3222
+ const res = {
3223
+ success: false,
3224
+ fullName: '',
3225
+ pkgName: ''
3226
+ };
3227
+ const result = getProcessPluginName(nameOrPath, ctx.log);
3228
+ if (!result) {
3229
+ return res;
3230
+ }
3231
+ // first get result then do this process
3232
+ // or some error will log twice
3233
+ const pkgName = getNormalPluginName(result, ctx.log);
3234
+ if (!pkgName) {
3235
+ return res;
3236
+ }
3237
+ return {
3238
+ success: true,
3239
+ fullName: result,
3240
+ pkgName
3241
+ };
3242
+ };
3243
+
3244
+ /* eslint-disable no-template-curly-in-string */
3245
+ const ZH_CN = {
3246
+ UPLOAD_FAILED: '上传失败',
3247
+ CHECK_SETTINGS: '请检查你的配置项是否正确',
3248
+ CHECK_SETTINGS_AND_NETWORK: '请检查你的配置项以及网络',
3249
+ UPLOAD_FAILED_REASON: '错误码:${code},请打开浏览器粘贴地址查看相关原因',
3250
+ SERVER_ERROR: '服务端出错,请重试',
3251
+ AUTH_FAILED: '认证失败',
3252
+ // smms
3253
+ PICBED_SMMS: 'SM.MS',
3254
+ PICBED_SMMS_TOKEN: '设定Token',
3255
+ PICBED_SMMS_BACKUP_DOMAIN: '备用上传域名',
3256
+ PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: '例如 smms.app',
3257
+ // Ali-cloud
3258
+ PICBED_ALICLOUD: '阿里云OSS',
3259
+ PICBED_ALICLOUD_ACCESSKEYID: '设定KeyId',
3260
+ PICBED_ALICLOUD_ACCESSKEYSECRET: '设定KeySecret',
3261
+ PICBED_ALICLOUD_BUCKET: '设定Bucket',
3262
+ PICBED_ALICLOUD_AREA: '设定存储区域',
3263
+ PICBED_ALICLOUD_PATH: '设定存储路径',
3264
+ PICBED_ALICLOUD_CUSTOMURL: '设定自定义域名',
3265
+ PICBED_ALICLOUD_OPTIONS: '设定网址后缀',
3266
+ PICBED_ALICLOUD_MESSAGE_AREA: '例如:oss-cn-beijing',
3267
+ PICBED_ALICLOUD_MESSAGE_PATH: '例如:test/',
3268
+ PICBED_ALICLOUD_MESSAGE_OPTIONS: '例如:?x-oss-process=xxx',
3269
+ PICBED_ALICLOUD_MESSAGE_CUSTOMURL: '例如:https://test.com',
3270
+ // Tencent-cloud
3271
+ PICBED_TENCENTCLOUD: '腾讯云COS',
3272
+ PICBED_TENCENTCLOUD_VERSION: 'COS版本',
3273
+ PICBED_TENCENTCLOUD_SECRETID: '设定SecretId',
3274
+ PICBED_TENCENTCLOUD_SECRETKEY: '设定SecretKey',
3275
+ PICBED_TENCENTCLOUD_APPID: '设定AppId',
3276
+ PICBED_TENCENTCLOUD_BUCKET: '设定Bucket',
3277
+ PICBED_TENCENTCLOUD_AREA: '设定存储区域',
3278
+ PICBED_TENCENTCLOUD_PATH: '设定存储路径',
3279
+ PICBED_TENCENTCLOUD_OPTIONS: '设定网址后缀',
3280
+ PICBED_TENCENTCLOUD_CUSTOMURL: '设定自定义域名',
3281
+ PICBED_TENCENTCLOUD_MESSAGE_APPID: '例如:1234567890',
3282
+ PICBED_TENCENTCLOUD_MESSAGE_AREA: '例如:ap-beijing',
3283
+ PICBED_TENCENTCLOUD_MESSAGE_PATH: '例如:test/',
3284
+ PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: '例如:https://test.com',
3285
+ PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: '例如:?imageMogr2',
3286
+ // GitHub
3287
+ PICBED_GITHUB: 'GitHub',
3288
+ PICBED_GITHUB_TOKEN: '设定Token',
3289
+ PICBED_GITHUB_REPO: '设定仓库名',
3290
+ PICBED_GITHUB_PATH: '设定存储路径',
3291
+ PICBED_GITHUB_BRANCH: '设定分支名',
3292
+ PICBED_GITHUB_CUSTOMURL: '设定自定义域名',
3293
+ PICBED_GITHUB_MESSAGE_REPO: '格式:username/repo',
3294
+ PICBED_GITHUB_MESSAGE_BRANCH: '例如:main',
3295
+ PICBED_GITHUB_MESSAGE_PATH: '例如:test/',
3296
+ PICBED_GITHUB_MESSAGE_CUSTOMURL: '例如:https://test.com',
3297
+ // qiniu
3298
+ PICBED_QINIU: '七牛云',
3299
+ PICBED_QINIU_ACCESSKEY: '设定AccessKey',
3300
+ PICBED_QINIU_SECRETKEY: '设定SecretKey',
3301
+ PICBED_QINIU_BUCKET: '设定Bucket',
3302
+ PICBED_QINIU_PATH: '设定存储路径',
3303
+ PICBED_QINIU_URL: '设定访问网址',
3304
+ PICBED_QINIU_OPTIONS: '设定网址后缀',
3305
+ PICBED_QINIU_AREA: '设定存储区域',
3306
+ PICBED_QINIU_MESSAGE_PATH: '例如:test/',
3307
+ PICBED_QINIU_MESSAGE_AREA: '例如:z0',
3308
+ PICBED_QINIU_MESSAGE_OPTIONS: '例如:?imageslim',
3309
+ PICBED_QINIU_MESSAGE_URL: '例如:https://xxx.yyy.glb.clouddn.com',
3310
+ // imgur
3311
+ PICBED_IMGUR: 'Imgur',
3312
+ PICBED_IMGUR_CLIENTID: '设定ClientId',
3313
+ PICBED_IMGUR_PROXY: '设定代理',
3314
+ PICBED_IMGUR_MESSAGE_PROXY: '例如:http://127.0.0.1:1080',
3315
+ // upyun
3316
+ PICBED_UPYUN: '又拍云',
3317
+ PICBED_UPYUN_BUCKET: '设定Bucket',
3318
+ PICBED_UPYUN_OPERATOR: '设定操作员',
3319
+ PICBED_UPYUN_PASSWORD: '设定操作员密码',
3320
+ PICBED_UPYUN_PATH: '设定存储路径',
3321
+ PICBED_UPYUN_URL: '设定加速域名',
3322
+ PICBED_UPYUN_OPTIONS: '设定网址后缀',
3323
+ PICBED_UPYUN_MESSAGE_OPERATOR: '例如:me',
3324
+ PICBED_UPYUN_MESSAGE_PASSWORD: '输入操作员密码',
3325
+ PICBED_UPYUN_MESSAGE_URL: '例如:http://xxx.test.upcdn.net',
3326
+ PICBED_UPYUN_MESSAGE_OPTIONS: '例如:!imgslim',
3327
+ PICBED_UPYUN_MESSAGE_PATH: '例如:test/',
3328
+ // Plugin Handler
3329
+ PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: '插件安装成功',
3330
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: '插件安装失败',
3331
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: '插件安装失败,失败码为${code},错误日志为 \n ${data}',
3332
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: '插件安装失败,请输入合法插件名或合法安装路径',
3333
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: '插件卸载成功',
3334
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: '插件卸载失败',
3335
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: '插件卸载失败,失败码为${code},错误日志为 \n ${data}',
3336
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: '插件卸载失败,请输入合法插件名',
3337
+ PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: '插件更新成功',
3338
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: '插件更新失败',
3339
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: '插件更新失败,失败码为${code},错误日志为 \n ${data}',
3340
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: '插件更新失败,请输入合法插件名'
3341
+ };
3342
+
3343
+ /* eslint-disable no-template-curly-in-string */
3344
+ const EN = {
3345
+ UPLOAD_FAILED: 'Upload failed',
3346
+ CHECK_SETTINGS: 'Please check your settings',
3347
+ CHECK_SETTINGS_AND_NETWORK: 'Please check your settings and network',
3348
+ UPLOAD_FAILED_REASON: 'Error code: ${code}, please open the browser and paste the address to see the reason',
3349
+ SERVER_ERROR: 'Server error, please try again later',
3350
+ AUTH_FAILED: 'Authentication failed',
3351
+ // smms
3352
+ PICBED_SMMS: 'SM.MS',
3353
+ PICBED_SMMS_TOKEN: 'Set Token',
3354
+ PICBED_SMMS_BACKUP_DOMAIN: 'Set Backup Upload Domain',
3355
+ PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: 'Ex. smms.app',
3356
+ // Ali-cloud
3357
+ PICBED_ALICLOUD: 'Ali Cloud',
3358
+ PICBED_ALICLOUD_ACCESSKEYID: 'Set KeyId',
3359
+ PICBED_ALICLOUD_ACCESSKEYSECRET: 'Set KeySecret',
3360
+ PICBED_ALICLOUD_BUCKET: 'Set Bucket',
3361
+ PICBED_ALICLOUD_AREA: 'Set Area',
3362
+ PICBED_ALICLOUD_PATH: 'Set Path',
3363
+ PICBED_ALICLOUD_CUSTOMURL: 'Set Custom URL',
3364
+ PICBED_ALICLOUD_OPTIONS: 'Set URL Suffix',
3365
+ PICBED_ALICLOUD_MESSAGE_AREA: 'Ex. oss-cn-beijing',
3366
+ PICBED_ALICLOUD_MESSAGE_PATH: 'Ex. test/',
3367
+ PICBED_ALICLOUD_MESSAGE_OPTIONS: 'Ex. ?x-oss-process=xxx',
3368
+ PICBED_ALICLOUD_MESSAGE_CUSTOMURL: 'Ex. https://test.com',
3369
+ // Tencent-cloud
3370
+ PICBED_TENCENTCLOUD: 'Tencent Cloud',
3371
+ PICBED_TENCENTCLOUD_VERSION: 'Choose COS version',
3372
+ PICBED_TENCENTCLOUD_SECRETID: 'Set SecretId',
3373
+ PICBED_TENCENTCLOUD_SECRETKEY: 'Set SecretKey',
3374
+ PICBED_TENCENTCLOUD_APPID: 'Set AppId',
3375
+ PICBED_TENCENTCLOUD_BUCKET: 'Set Bucket',
3376
+ PICBED_TENCENTCLOUD_AREA: 'Set Area',
3377
+ PICBED_TENCENTCLOUD_PATH: 'Set Path',
3378
+ PICBED_TENCENTCLOUD_OPTIONS: 'Set URL Suffix',
3379
+ PICBED_TENCENTCLOUD_CUSTOMURL: 'Set Custom URL',
3380
+ PICBED_TENCENTCLOUD_MESSAGE_APPID: 'Ex. 1234567890',
3381
+ PICBED_TENCENTCLOUD_MESSAGE_AREA: 'Ex. ap-beijing',
3382
+ PICBED_TENCENTCLOUD_MESSAGE_PATH: 'Ex. test/',
3383
+ PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: 'Ex. http://test.com',
3384
+ PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: 'Ex. ?imageMogr2',
3385
+ // GitHub
3386
+ PICBED_GITHUB: 'GitHub',
3387
+ PICBED_GITHUB_TOKEN: 'Set Token',
3388
+ PICBED_GITHUB_REPO: 'Set Repo Name',
3389
+ PICBED_GITHUB_PATH: 'Set Path',
3390
+ PICBED_GITHUB_BRANCH: 'Set Branch',
3391
+ PICBED_GITHUB_CUSTOMURL: 'Set Custom URL',
3392
+ PICBED_GITHUB_MESSAGE_REPO: 'Ex. username/repo',
3393
+ PICBED_GITHUB_MESSAGE_BRANCH: 'Ex. main',
3394
+ PICBED_GITHUB_MESSAGE_PATH: 'Ex. test/',
3395
+ PICBED_GITHUB_MESSAGE_CUSTOMURL: 'Ex. https://test.com',
3396
+ // qiniu
3397
+ PICBED_QINIU: 'Qiniu',
3398
+ PICBED_QINIU_ACCESSKEY: 'Set AccessKey',
3399
+ PICBED_QINIU_SECRETKEY: 'Set SecretKey',
3400
+ PICBED_QINIU_BUCKET: 'Set Bucket',
3401
+ PICBED_QINIU_PATH: 'Set Path',
3402
+ PICBED_QINIU_URL: 'Set URL',
3403
+ PICBED_QINIU_OPTIONS: 'Set URL Suffix',
3404
+ PICBED_QINIU_AREA: 'Set Area',
3405
+ PICBED_QINIU_MESSAGE_PATH: 'Ex. test/',
3406
+ PICBED_QINIU_MESSAGE_AREA: 'Ex. z0',
3407
+ PICBED_QINIU_MESSAGE_OPTIONS: 'Ex. ?imageslim',
3408
+ PICBED_QINIU_MESSAGE_URL: 'Ex. https://xxx.yyy.glb.clouddn.com',
3409
+ // imgur
3410
+ PICBED_IMGUR: 'Imgur',
3411
+ PICBED_IMGUR_CLIENTID: 'Set ClientId',
3412
+ PICBED_IMGUR_PROXY: 'Set Proxy',
3413
+ PICBED_IMGUR_MESSAGE_PROXY: 'Ex. http://127.0.0.1:1080',
3414
+ // upyun
3415
+ PICBED_UPYUN: 'Upyun',
3416
+ PICBED_UPYUN_BUCKET: 'Set Bucket',
3417
+ PICBED_UPYUN_OPERATOR: 'Set Operator',
3418
+ PICBED_UPYUN_PASSWORD: 'Set Operator Password',
3419
+ PICBED_UPYUN_PATH: 'Set Path',
3420
+ PICBED_UPYUN_URL: 'Set URL',
3421
+ PICBED_UPYUN_OPTIONS: 'Set URL Suffix',
3422
+ PICBED_UPYUN_MESSAGE_OPERATOR: 'Ex. me',
3423
+ PICBED_UPYUN_MESSAGE_PASSWORD: 'Please type the operator password',
3424
+ PICBED_UPYUN_MESSAGE_URL: 'Ex. http://xxx.test.upcdn.net',
3425
+ PICBED_UPYUN_MESSAGE_OPTIONS: 'Ex. !imgslim',
3426
+ PICBED_UPYUN_MESSAGE_PATH: 'Ex. test/',
3427
+ // Plugin Handler
3428
+ PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: 'Plugin installed successfully',
3429
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: 'Plugin installation failed',
3430
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: 'Plugin installation failed, error code is ${code}, error log is \n ${data}',
3431
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: 'Plugin installation failed, please enter a valid plugin name or valid installation path',
3432
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: 'Plugin uninstalled successfully',
3433
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: 'Plugin uninstall failed',
3434
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: 'Plugin uninstall failed, error code is ${code}, error log is \n ${data}',
3435
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: 'Plugin uninstall failed, please enter a valid plugin name',
3436
+ PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: 'Plugin updated successfully',
3437
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: 'Plugin update failed',
3438
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: 'Plugin update failed, error code is ${code}, error log is \n ${data}',
3439
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: 'Plugin update failed, please enter a valid plugin name'
3440
+ };
3441
+
3442
+ /* eslint-disable no-template-curly-in-string */
3443
+ const ZH_TW = {
3444
+ UPLOAD_FAILED: '上傳失敗',
3445
+ CHECK_SETTINGS: '請檢查你的設定是否正確',
3446
+ CHECK_SETTINGS_AND_NETWORK: '請檢查你的設定及網路',
3447
+ UPLOAD_FAILED_REASON: '錯誤碼:${code},請打開瀏覽器貼上地址查看相關原因',
3448
+ SERVER_ERROR: '伺服器出錯,請重試',
3449
+ AUTH_FAILED: '認證失敗',
3450
+ // smms
3451
+ PICBED_SMMS: 'SM.MS',
3452
+ PICBED_SMMS_TOKEN: '設定Token',
3453
+ PICBED_SMMS_BACKUP_DOMAIN: '備用上傳網址',
3454
+ PICBED_SMMS_MESSAGE_BACKUP_DOMAIN: '例如 smms.app',
3455
+ // Ali-cloud
3456
+ PICBED_ALICLOUD: '阿里云OSS',
3457
+ PICBED_ALICLOUD_ACCESSKEYID: '設定KeyId',
3458
+ PICBED_ALICLOUD_ACCESSKEYSECRET: '設定KeySecret',
3459
+ PICBED_ALICLOUD_BUCKET: '設定Bucket',
3460
+ PICBED_ALICLOUD_AREA: '設定儲存區域',
3461
+ PICBED_ALICLOUD_PATH: '設定儲存路徑',
3462
+ PICBED_ALICLOUD_CUSTOMURL: '設定自訂網址',
3463
+ PICBED_ALICLOUD_OPTIONS: '設定網址後綴',
3464
+ PICBED_ALICLOUD_MESSAGE_AREA: '例如:oss-cn-beijing',
3465
+ PICBED_ALICLOUD_MESSAGE_PATH: '例如:test/',
3466
+ PICBED_ALICLOUD_MESSAGE_OPTIONS: '例如:?x-oss-process=xxx',
3467
+ PICBED_ALICLOUD_MESSAGE_CUSTOMURL: '例如:https://test.com',
3468
+ // Tencent-cloud
3469
+ PICBED_TENCENTCLOUD: '騰訊云COS',
3470
+ PICBED_TENCENTCLOUD_VERSION: 'COS版本',
3471
+ PICBED_TENCENTCLOUD_SECRETID: '設定SecretId',
3472
+ PICBED_TENCENTCLOUD_SECRETKEY: '設定SecretKey',
3473
+ PICBED_TENCENTCLOUD_APPID: '設定AppId',
3474
+ PICBED_TENCENTCLOUD_BUCKET: '設定Bucket',
3475
+ PICBED_TENCENTCLOUD_AREA: '設定儲存區域',
3476
+ PICBED_TENCENTCLOUD_PATH: '設定儲存路徑',
3477
+ PICBED_TENCENTCLOUD_OPTIONS: '設定網址後綴',
3478
+ PICBED_TENCENTCLOUD_CUSTOMURL: '設定自訂網址',
3479
+ PICBED_TENCENTCLOUD_MESSAGE_APPID: '例如:1234567890',
3480
+ PICBED_TENCENTCLOUD_MESSAGE_AREA: '例如:ap-beijing',
3481
+ PICBED_TENCENTCLOUD_MESSAGE_PATH: '例如:test/',
3482
+ PICBED_TENCENTCLOUD_MESSAGE_CUSTOMURL: '例如:https://test.com',
3483
+ PICBED_TENCENTCLOUD_MESSAGE_OPTIONS: '例如:?imageMogr2',
3484
+ // GitHub
3485
+ PICBED_GITHUB: 'GitHub',
3486
+ PICBED_GITHUB_TOKEN: '設定Token',
3487
+ PICBED_GITHUB_REPO: '設定倉庫名稱',
3488
+ PICBED_GITHUB_PATH: '設定儲存路徑',
3489
+ PICBED_GITHUB_BRANCH: '設定分支名稱',
3490
+ PICBED_GITHUB_CUSTOMURL: '設定自訂網址',
3491
+ PICBED_GITHUB_MESSAGE_REPO: '格式:username/repo',
3492
+ PICBED_GITHUB_MESSAGE_BRANCH: '例如:main',
3493
+ PICBED_GITHUB_MESSAGE_PATH: '例如:test/',
3494
+ PICBED_GITHUB_MESSAGE_CUSTOMURL: '例如:https://test.com',
3495
+ // qiniu
3496
+ PICBED_QINIU: '七牛云',
3497
+ PICBED_QINIU_ACCESSKEY: '設定AccessKey',
3498
+ PICBED_QINIU_SECRETKEY: '設定SecretKey',
3499
+ PICBED_QINIU_BUCKET: '設定Bucket',
3500
+ PICBED_QINIU_PATH: '設定儲存路徑',
3501
+ PICBED_QINIU_URL: '設定訪問網址',
3502
+ PICBED_QINIU_OPTIONS: '設定網址後綴',
3503
+ PICBED_QINIU_AREA: '設定儲存區域',
3504
+ PICBED_QINIU_MESSAGE_PATH: '例如:test/',
3505
+ PICBED_QINIU_MESSAGE_AREA: '例如:z0',
3506
+ PICBED_QINIU_MESSAGE_OPTIONS: '例如:?imageslim',
3507
+ PICBED_QINIU_MESSAGE_URL: '例如:https://xxx.yyy.glb.clouddn.com',
3508
+ // imgur
3509
+ PICBED_IMGUR: 'Imgur',
3510
+ PICBED_IMGUR_CLIENTID: '設定ClientId',
3511
+ PICBED_IMGUR_PROXY: '設定PROXY',
3512
+ PICBED_IMGUR_MESSAGE_PROXY: '例如:http://127.0.0.1:1080',
3513
+ // upyun
3514
+ PICBED_UPYUN: '又拍云',
3515
+ PICBED_UPYUN_BUCKET: '設定Bucket',
3516
+ PICBED_UPYUN_OPERATOR: '設定操作員',
3517
+ PICBED_UPYUN_PASSWORD: '設定操作員密碼',
3518
+ PICBED_UPYUN_PATH: '設定儲存路徑',
3519
+ PICBED_UPYUN_URL: '設定加速網址',
3520
+ PICBED_UPYUN_OPTIONS: '設定網址後綴',
3521
+ PICBED_UPYUN_MESSAGE_OPERATOR: '例如:me',
3522
+ PICBED_UPYUN_MESSAGE_PASSWORD: '輸入操作員密碼',
3523
+ PICBED_UPYUN_MESSAGE_URL: '例如:http://xxx.test.upcdn.net',
3524
+ PICBED_UPYUN_MESSAGE_OPTIONS: '例如:!imgslim',
3525
+ PICBED_UPYUN_MESSAGE_PATH: '例如:test/',
3526
+ // Plugin Handler
3527
+ PLUGIN_HANDLER_PLUGIN_INSTALL_SUCCESS: '插件安裝成功',
3528
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED: '插件安裝失敗',
3529
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_REASON: '插件安裝失敗,失敗碼為${code},錯誤紀錄為 \n ${data}',
3530
+ PLUGIN_HANDLER_PLUGIN_INSTALL_FAILED_PATH: '插件安裝失敗,請輸入正確的插件名稱或正確的安裝路徑',
3531
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_SUCCESS: '插件卸載成功',
3532
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED: '插件卸載失敗',
3533
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_REASON: '插件卸載失敗,失敗碼為${code},錯誤紀錄為 \n ${data}',
3534
+ PLUGIN_HANDLER_PLUGIN_UNINSTALL_FAILED_VALID: '插件卸載失敗,請輸入正確的插件名稱',
3535
+ PLUGIN_HANDLER_PLUGIN_UPDATE_SUCCESS: '插件更新成功',
3536
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED: '插件更新失敗',
3537
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_REASON: '插件更新失敗,失敗碼為${code},錯誤紀錄為 \n ${data}',
3538
+ PLUGIN_HANDLER_PLUGIN_UPDATE_FAILED_VALID: '插件更新失敗,請輸入正確的插件名稱'
3539
+ };
3540
+
3541
+ const languageList = {
3542
+ 'zh-CN': ZH_CN,
3543
+ 'zh-TW': ZH_TW,
3544
+ en: EN
3545
+ };
3546
+ class I18nManager {
3547
+ constructor(ctx) {
3548
+ this.ctx = ctx;
3549
+ this.objectAdapter = new i18n$1.ObjectAdapter(languageList);
3550
+ let language = this.ctx.getConfig('settings.language') || 'zh-CN';
3551
+ if (!languageList[language]) {
3552
+ language = 'zh-CN'; // use default
3553
+ }
3554
+ this.i18n = new i18n$1.I18n({
3555
+ adapter: this.objectAdapter,
3556
+ defaultLanguage: language
3557
+ });
3558
+ this.loadOutterI18n();
3559
+ }
3560
+ loadOutterI18n() {
3561
+ const i18nFolder = this.getOutterI18nFolder();
3562
+ const files = fs__default["default"].readdirSync(i18nFolder, {
3563
+ withFileTypes: true
3564
+ });
3565
+ files.forEach(file => {
3566
+ if (file.isFile() && file.name.endsWith('.yml')) {
3567
+ const i18nFilePath = path__default["default"].join(i18nFolder, file.name);
3568
+ const i18nFile = fs__default["default"].readFileSync(i18nFilePath, 'utf8');
3569
+ try {
3570
+ const i18nFileObj = yaml__default["default"].load(i18nFile);
3571
+ languageList[file.name.replace(/\.yml$/, '')] = i18nFileObj;
3572
+ }
3573
+ catch (e) {
3574
+ console.error(e);
3575
+ }
3576
+ }
3577
+ });
3578
+ }
3579
+ getOutterI18nFolder() {
3580
+ const i18nFolder = path__default["default"].join(this.ctx.baseDir, 'i18n-cli');
3581
+ if (!fs__default["default"].pathExistsSync(i18nFolder)) {
3582
+ fs__default["default"].ensureDirSync(i18nFolder);
3583
+ }
3584
+ return i18nFolder;
3585
+ }
3586
+ translate(key, args) {
3587
+ return this.i18n.translate(key, args) || key;
3588
+ }
3589
+ setLanguage(language) {
3590
+ this.i18n.setLanguage(language);
3591
+ this.ctx.saveConfig({
3592
+ 'settings.language': language
3593
+ });
3594
+ }
3595
+ addLocale(language, locales) {
3596
+ const originLocales = this.objectAdapter.getLocale(language);
3597
+ if (!originLocales) {
3598
+ return false;
3599
+ }
3600
+ const newLocales = lodash.merge(originLocales, locales);
3601
+ this.objectAdapter.setLocale(language, newLocales);
3602
+ return true;
3603
+ }
3604
+ addLanguage(language, locales) {
3605
+ const originLocales = this.objectAdapter.getLocale(language);
3606
+ if (originLocales) {
3607
+ return false;
3608
+ }
3609
+ this.objectAdapter.setLocale(language, locales);
3610
+ languageList[language] = locales;
3611
+ return true;
3612
+ }
3613
+ getLanguageList() {
3614
+ return Object.keys(languageList);
3615
+ }
3616
+ }
3617
+
3618
+ class PicGo extends events.EventEmitter {
3619
+ constructor(configPath = '') {
3620
+ super();
3621
+ this.VERSION = "0.0.1";
3622
+ this.configPath = configPath;
3623
+ this.output = [];
3624
+ this.input = [];
3625
+ this.helper = {
3626
+ transformer: new LifecyclePlugins('transformer'),
3627
+ uploader: new LifecyclePlugins('uploader'),
3628
+ beforeTransformPlugins: new LifecyclePlugins('beforeTransformPlugins'),
3629
+ beforeUploadPlugins: new LifecyclePlugins('beforeUploadPlugins'),
3630
+ afterUploadPlugins: new LifecyclePlugins('afterUploadPlugins')
3631
+ };
3632
+ this.initConfigPath();
3633
+ this.log = new Logger(this);
3634
+ this.cmd = new Commander(this);
3635
+ this.pluginHandler = new PluginHandler(this);
3636
+ this.initConfig();
3637
+ this.init();
3638
+ }
3639
+ get pluginLoader() {
3640
+ return this._pluginLoader;
3641
+ }
3642
+ initConfigPath() {
3643
+ if (this.configPath === '') {
3644
+ this.configPath = os.homedir() + '/.picgo/config.json';
3645
+ }
3646
+ if (path__default["default"].extname(this.configPath).toUpperCase() !== '.JSON') {
3647
+ this.configPath = '';
3648
+ throw Error('The configuration file only supports JSON format.');
3649
+ }
3650
+ this.baseDir = path__default["default"].dirname(this.configPath);
3651
+ const exist = fs__default["default"].pathExistsSync(this.configPath);
3652
+ if (!exist) {
3653
+ fs__default["default"].ensureFileSync(`${this.configPath}`);
3654
+ }
3655
+ }
3656
+ initConfig() {
3657
+ this.db = new DB(this);
3658
+ this._config = this.db.read(true);
3659
+ }
3660
+ init() {
3661
+ try {
3662
+ // init 18n at first
3663
+ this.i18n = new I18nManager(this);
3664
+ this.Request = new Request(this);
3665
+ this._pluginLoader = new PluginLoader(this);
3666
+ // load self plugins
3667
+ setCurrentPluginName('picgo');
3668
+ buildInUploaders(this).register(this);
3669
+ buildInTransformers(this).register(this);
3670
+ setCurrentPluginName('');
3671
+ // load third-party plugins
3672
+ this._pluginLoader.load();
3673
+ this.lifecycle = new Lifecycle(this);
3674
+ }
3675
+ catch (e) {
3676
+ this.emit(IBuildInEvent.UPLOAD_PROGRESS, -1);
3677
+ this.log.error(e);
3678
+ throw e;
3679
+ }
3680
+ }
3681
+ /**
3682
+ * easily mannually load a plugin
3683
+ * if provide plugin name, will register plugin by name
3684
+ * or just instantiate a plugin
3685
+ */
3686
+ use(plugin, name) {
3687
+ if (name) {
3688
+ this.pluginLoader.registerPlugin(name, plugin);
3689
+ return this.pluginLoader.getPlugin(name);
3690
+ }
3691
+ else {
3692
+ const pluginInstance = plugin(this);
3693
+ return pluginInstance;
3694
+ }
3695
+ }
3696
+ registerCommands() {
3697
+ if (this.configPath !== '') {
3698
+ this.cmd.init();
3699
+ this.cmd.loadCommands();
3700
+ }
3701
+ }
3702
+ getConfig(name) {
3703
+ if (!name) {
3704
+ return this._config;
3705
+ }
3706
+ else {
3707
+ return lodash.get(this._config, name);
3708
+ }
3709
+ }
3710
+ saveConfig(config) {
3711
+ if (!isInputConfigValid(config)) {
3712
+ this.log.warn('the format of config is invalid, please provide object');
3713
+ return;
3714
+ }
3715
+ this.setConfig(config);
3716
+ this.db.saveConfig(config);
3717
+ }
3718
+ removeConfig(key, propName) {
3719
+ if (!key || !propName)
3720
+ return;
3721
+ if (isConfigKeyInBlackList(key)) {
3722
+ this.log.warn(`the config.${key} can't be removed`);
3723
+ return;
3724
+ }
3725
+ this.unsetConfig(key, propName);
3726
+ this.db.unset(key, propName);
3727
+ }
3728
+ setConfig(config) {
3729
+ if (!isInputConfigValid(config)) {
3730
+ this.log.warn('the format of config is invalid, please provide object');
3731
+ return;
3732
+ }
3733
+ Object.keys(config).forEach((name) => {
3734
+ if (isConfigKeyInBlackList(name)) {
3735
+ this.log.warn(`the config.${name} can't be modified`);
3736
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
3737
+ delete config[name];
3738
+ }
3739
+ lodash.set(this._config, name, config[name]);
3740
+ eventBus.emit(IBusEvent.CONFIG_CHANGE, {
3741
+ configName: name,
3742
+ value: config[name]
3743
+ });
3744
+ });
3745
+ }
3746
+ unsetConfig(key, propName) {
3747
+ if (!key || !propName)
3748
+ return;
3749
+ if (isConfigKeyInBlackList(key)) {
3750
+ this.log.warn(`the config.${key} can't be unset`);
3751
+ return;
3752
+ }
3753
+ lodash.unset(this.getConfig(key), propName);
3754
+ }
3755
+ get request() {
3756
+ return this.Request.request.bind(this.Request);
3757
+ }
3758
+ async upload(input) {
3759
+ if (this.configPath === '') {
3760
+ this.log.error('The configuration file only supports JSON format.');
3761
+ return [];
3762
+ }
3763
+ // upload from clipboard
3764
+ if (input === undefined || input.length === 0) {
3765
+ try {
3766
+ const { imgPath, shouldKeepAfterUploading } = await getClipboardImage(this);
3767
+ if (imgPath === 'no image') {
3768
+ throw new Error('image not found in clipboard');
3769
+ }
3770
+ else {
3771
+ this.once(IBuildInEvent.FAILED, () => {
3772
+ if (!shouldKeepAfterUploading) {
3773
+ // 删除 picgo 生成的图片文件,例如 `~/.picgo/20200621205720.png`
3774
+ fs__default["default"].remove(imgPath).catch((e) => { this.log.error(e); });
3775
+ }
3776
+ });
3777
+ this.once('finished', () => {
3778
+ if (!shouldKeepAfterUploading) {
3779
+ fs__default["default"].remove(imgPath).catch((e) => { this.log.error(e); });
3780
+ }
3781
+ });
3782
+ const { output } = await this.lifecycle.start([imgPath]);
3783
+ return output;
3784
+ }
3785
+ }
3786
+ catch (e) {
3787
+ this.emit(IBuildInEvent.FAILED, e);
3788
+ throw e;
3789
+ }
3790
+ }
3791
+ else {
3792
+ // upload from path
3793
+ const { output } = await this.lifecycle.start(input);
3794
+ return output;
3795
+ }
3796
+ }
3797
+ }
3798
+
3799
+ exports.Commander = Commander;
3800
+ exports.Lifecycle = Lifecycle;
3801
+ exports.LifecyclePlugins = LifecyclePlugins;
3802
+ exports.Logger = Logger;
3803
+ exports.PicGo = PicGo;
3804
+ exports.PluginHandler = PluginHandler;
3805
+ exports.PluginLoader = PluginLoader;
3806
+ exports.Request = Request;
3807
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvcGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9jb25maWcudHMiLCIuLi9zcmMvdXRpbHMvY29tbW9uLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VwbG9hZC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9zZXR0aW5nLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL3VzZS50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9wcm94eS50cyIsIi4uL3NyYy91dGlscy9pbml0VXRpbHMudHMiLCIuLi9zcmMvcGx1Z2lucy9jb21tYW5kZXIvaW5pdC50cyIsIi4uL3NyYy9wbHVnaW5zL2NvbW1hbmRlci9pMThuLnRzIiwiLi4vc3JjL3BsdWdpbnMvY29tbWFuZGVyL2luZGV4LnRzIiwiLi4vc3JjL2xpYi9MaWZlY3ljbGVQbHVnaW5zLnRzIiwiLi4vc3JjL2xpYi9Db21tYW5kZXIudHMiLCIuLi9zcmMvdXRpbHMvZW51bS50cyIsIi4uL3NyYy9saWIvTG9nZ2VyLnRzIiwiLi4vc3JjL3V0aWxzL2NyZWF0ZUNvbnRleHQudHMiLCIuLi9zcmMvY29yZS9MaWZlY3ljbGUudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9zbW1zLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdGN5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9naXRodWIudHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9xaW5pdS50cyIsIi4uL3NyYy9wbHVnaW5zL3VwbG9hZGVyL2ltZ3VyLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvYWxpeXVuLnRzIiwiLi4vc3JjL3BsdWdpbnMvdXBsb2FkZXIvdXB5dW4udHMiLCIuLi9zcmMvcGx1Z2lucy91cGxvYWRlci9pbmRleC50cyIsIi4uL3NyYy9wbHVnaW5zL3RyYW5zZm9ybWVyL3BhdGgudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9iYXNlNjQudHMiLCIuLi9zcmMvcGx1Z2lucy90cmFuc2Zvcm1lci9pbmRleC50cyIsIi4uL3NyYy9saWIvUGx1Z2luTG9hZGVyLnRzIiwiLi4vc3JjL3V0aWxzL3N0YXRpYy50cyIsIi4uL3NyYy91dGlscy9nZXRDbGlwYm9hcmRJbWFnZS50cyIsIi4uL3NyYy91dGlscy9ldmVudEJ1cy50cyIsIi4uL3NyYy9saWIvUmVxdWVzdC50cyIsIi4uL3NyYy91dGlscy9kYi50cyIsIi4uL3NyYy9saWIvUGx1Z2luSGFuZGxlci50cyIsIi4uL3NyYy9pMThuL3poLUNOLnRzIiwiLi4vc3JjL2kxOG4vZW4udHMiLCIuLi9zcmMvaTE4bi96aC1UVy50cyIsIi4uL3NyYy9pMThuL2luZGV4LnRzIiwiLi4vc3JjL2NvcmUvUGljR28udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcblxyXG5jb25zdCBwbHVnaW5IYW5kbGVyOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICAvLyBjb25zdCBwbHVnaW5IYW5kbGVyID0gbmV3IFBsdWdpbkhhbmRsZXIoY3R4KVxyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luc3RhbGwgPHBsdWdpbnMuLi4+JylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdpbnN0YWxsIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5hbGlhcygnYWRkJylcclxuICAgICAgLm9wdGlvbignLXAsIC0tcHJveHkgPHByb3h5PicsICdBZGQgcHJveHkgZm9yIGluc3RhbGxpbmcnKVxyXG4gICAgICAub3B0aW9uKCctciwgLS1yZWdpc3RyeSA8cmVnaXN0cnk+JywgJ0Nob29zZSBhIHJlZ2lzdHJ5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLmFjdGlvbigocGx1Z2luczogc3RyaW5nW10sIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHsgcHJveHksIHJlZ2lzdHJ5IH0gPSBwcm9ncmFtXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgIHByb3h5LFxyXG4gICAgICAgICAgcmVnaXN0cnlcclxuICAgICAgICB9XHJcbiAgICAgICAgY3R4LnBsdWdpbkhhbmRsZXIuaW5zdGFsbChwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndW5pbnN0YWxsIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5hbGlhcygncm0nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VuaW5zdGFsbCBwaWNnbyBwbHVnaW4nKVxyXG4gICAgICAuYWN0aW9uKChwbHVnaW5zOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVuaW5zdGFsbChwbHVnaW5zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgIH0pXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBkYXRlIDxwbHVnaW5zLi4uPicpXHJcbiAgICAgIC5kZXNjcmlwdGlvbigndXBkYXRlIHBpY2dvIHBsdWdpbicpXHJcbiAgICAgIC5vcHRpb24oJy1wLCAtLXByb3h5IDxwcm94eT4nLCAnQWRkIHByb3h5IGZvciBpbnN0YWxsaW5nJylcclxuICAgICAgLm9wdGlvbignLXIsIC0tcmVnaXN0cnkgPHJlZ2lzdHJ5PicsICdDaG9vc2UgYSByZWdpc3RyeSBmb3IgaW5zdGFsbGluZycpXHJcbiAgICAgIC5hY3Rpb24oKHBsdWdpbnM6IHN0cmluZ1tdLCBwcm9ncmFtOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB7IHByb3h5LCByZWdpc3RyeSB9ID0gcHJvZ3JhbVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICBwcm94eSxcclxuICAgICAgICAgIHJlZ2lzdHJ5XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5wbHVnaW5IYW5kbGVyLnVwZGF0ZShwbHVnaW5zLCBvcHRpb25zKS5jYXRjaCgoZTogRXJyb3IpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgcGx1Z2luSGFuZGxlclxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGNvbmZpZzogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLm9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdzZXQgY29uZmlnIHBhdGgnKVxyXG4gICAgICAvLyB3aWxsIGhhbmRsZSBpbiBgYmluL3BpY2dvYFxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY29uZmlnXHJcbiIsImltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgaW1hZ2VTaXplIH0gZnJvbSAnaW1hZ2Utc2l6ZSdcclxuaW1wb3J0IHtcclxuICBJSW1nU2l6ZSxcclxuICBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mbyxcclxuICBJUGx1Z2luTmFtZVR5cGUsXHJcbiAgSUxvZ2dlcixcclxuICBJUGljR29cclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5cclxuZXhwb3J0IGNvbnN0IGlzVXJsID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSlcclxuZXhwb3J0IGNvbnN0IGlzVXJsRW5jb2RlID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgdXJsID0gdXJsIHx8ICcnXHJcbiAgdHJ5IHtcclxuICAgIC8vIHRoZSB3aG9sZSB1cmwgZW5jb2RlIG9yIGRlY29kZSBzaG9sZCBub3QgdXNlIGVuY29kZVVSSUNvbXBvbmVudCBvciBkZWNvZGVVUklDb21wb25lbnRcclxuICAgIHJldHVybiB1cmwgIT09IGRlY29kZVVSSSh1cmwpXHJcbiAgfSBjYXRjaCAoZSkge1xyXG4gICAgLy8gaWYgc29tZSBlcnJvciBjYXVnaHQsIHRyeSB0byBsZXQgaXQgZ29cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG59XHJcbmV4cG9ydCBjb25zdCBoYW5kbGVVcmxFbmNvZGUgPSAodXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICghaXNVcmxFbmNvZGUodXJsKSkge1xyXG4gICAgdXJsID0gZW5jb2RlVVJJKHVybClcclxuICB9XHJcbiAgcmV0dXJuIHVybFxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0SW1hZ2VTaXplID0gKGZpbGU6IEJ1ZmZlcik6IElJbWdTaXplID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyB3aWR0aCA9IDAsIGhlaWdodCA9IDAgfSA9IGltYWdlU2l6ZShmaWxlKVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogdHJ1ZSxcclxuICAgICAgd2lkdGgsXHJcbiAgICAgIGhlaWdodFxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIC8vIGZhbGxiYWNrIHRvIDIwMCAqIDIwMFxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmVhbDogZmFsc2UsXHJcbiAgICAgIHdpZHRoOiAyMDAsXHJcbiAgICAgIGhlaWdodDogMjAwXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0RlNGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGV4dG5hbWU6IHBhdGguZXh0bmFtZShmaWxlUGF0aCksXHJcbiAgICAgIGZpbGVOYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSxcclxuICAgICAgYnVmZmVyOiBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCksXHJcbiAgICAgIHN1Y2Nlc3M6IHRydWVcclxuICAgIH1cclxuICB9IGNhdGNoIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHJlYXNvbjogYHJlYWQgZmlsZSAke2ZpbGVQYXRofSBlcnJvcmAsXHJcbiAgICAgIHN1Y2Nlc3M6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgZ2V0VVJMRmlsZSA9IGFzeW5jICh1cmw6IHN0cmluZywgY3R4OiBJUGljR28pOiBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPiA9PiB7XHJcbiAgdXJsID0gaGFuZGxlVXJsRW5jb2RlKHVybClcclxuICBsZXQgaXNJbWFnZSA9IGZhbHNlXHJcbiAgbGV0IGV4dG5hbWUgPSAnJ1xyXG4gIGxldCB0aW1lb3V0SWQ6IE5vZGVKUy5UaW1lb3V0XHJcbiAgY29uc3QgcmVxdWVzdEZuID0gbmV3IFByb21pc2U8SVBhdGhUcmFuc2Zvcm1lZEltZ0luZm8+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgY3R4LnJlcXVlc3Qoe1xyXG4gICAgICAgICAgbWV0aG9kOiAnZ2V0JyxcclxuICAgICAgICAgIHVybCxcclxuICAgICAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlLFxyXG4gICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInXHJcbiAgICAgICAgfSlcclxuICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcC5oZWFkZXJzWydjb250ZW50LXR5cGUnXVxyXG4gICAgICAgICAgICBpZiAoY29udGVudFR5cGU/LmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgICAgICAgICAgaXNJbWFnZSA9IHRydWVcclxuICAgICAgICAgICAgICBleHRuYW1lID0gYC4ke2NvbnRlbnRUeXBlLnNwbGl0KCdpbWFnZS8nKVsxXX1gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3AuZGF0YSBhcyBCdWZmZXJcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZClcclxuICAgICAgICBpZiAoaXNJbWFnZSkge1xyXG4gICAgICAgICAgY29uc3QgdXJsUGF0aCA9IG5ldyBVUkwodXJsKS5wYXRobmFtZVxyXG4gICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgIGJ1ZmZlcjogcmVzLFxyXG4gICAgICAgICAgICBmaWxlTmFtZTogcGF0aC5iYXNlbmFtZSh1cmxQYXRoKSxcclxuICAgICAgICAgICAgZXh0bmFtZSxcclxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgICByZWFzb246IGAke3VybH0gaXMgbm90IGltYWdlYFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxyXG4gICAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXHJcbiAgICAgICAgICByZWFzb246IGByZXF1ZXN0ICR7dXJsfSBlcnJvciwgJHtlcnJvcj8ubWVzc2FnZSA/PyAnJ31gXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSkoKS5jYXRjaChyZWplY3QpXHJcbiAgfSlcclxuICBjb25zdCB0aW1lb3V0UHJvbWlzZSA9IG5ldyBQcm9taXNlPElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvPigocmVzb2x2ZSk6IHZvaWQgPT4ge1xyXG4gICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHJlc29sdmUoe1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIHJlYXNvbjogYHJlcXVlc3QgJHt1cmx9IHRpbWVvdXRgXHJcbiAgICAgIH0pXHJcbiAgICB9LCAxMDAwMClcclxuICB9KVxyXG4gIHJldHVybiBQcm9taXNlLnJhY2UoW3JlcXVlc3RGbiwgdGltZW91dFByb21pc2VdKVxyXG59XHJcblxyXG4vKipcclxuICogZGV0ZWN0IHRoZSBpbnB1dCBzdHJpbmcncyB0eXBlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEB4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBzY29wZVxyXG4gKiAyLiBwaWNnby1wbHVnaW4teHh4IC0+IG5vcm1hbFxyXG4gKiAzLiB4eHggLT4gc2ltcGxlXHJcbiAqIDQuIG5vdCBleGlzdHMgb3IgaXMgYSBwYXRoIC0+IHVua25vd25cclxuICogQHBhcmFtIG5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBnZXRQbHVnaW5OYW1lVHlwZSA9IChuYW1lOiBzdHJpbmcpOiBJUGx1Z2luTmFtZVR5cGUgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2NvcGUnXHJcbiAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgcmV0dXJuICdub3JtYWwnXHJcbiAgfSBlbHNlIGlmIChpc1NpbXBsZU5hbWUobmFtZSkpIHtcclxuICAgIHJldHVybiAnc2ltcGxlJ1xyXG4gIH1cclxuICByZXR1cm4gJ3Vua25vd24nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBkZXRlY3QgdGhlIGlucHV0IHN0cmluZyBpcyBhIHNpbXBsZSBwbHVnaW4gbmFtZSBvciBub3RcclxuICogZm9yIGV4YW1wbGVcclxuICogMS4geHh4IC0+IHRydWVcclxuICogMi4gL1Vzci94eC94eHh4L3BpY2dvLXBsdWdpbi14eHggLT4gZmFsc2VcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luTmFtZU9yUGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGlzU2ltcGxlTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcclxuICBpZiAocGF0aC5pc0Fic29sdXRlKG5hbWVPclBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgY29uc3QgcGx1Z2luUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBuYW1lT3JQYXRoKVxyXG4gIGlmIChmcy5leGlzdHNTeW5jKHBsdWdpblBhdGgpKSB7XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcbiAgaWYgKG5hbWVPclBhdGguaW5jbHVkZXMoJy8nKSB8fCBuYW1lT3JQYXRoLmluY2x1ZGVzKCdcXFxcJykpIHtcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxuICByZXR1cm4gdHJ1ZVxyXG59XHJcblxyXG4vKipcclxuICogc3RyZWFtbGluZSB0aGUgZnVsbCBwbHVnaW4gbmFtZSB0byBhIHNpbXBsZSBvbmVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4geHh4XHJcbiAqIDIuIEB4eHgvcGljZ28tcGx1Z2luLXl5eSAtPiB5eXlcclxuICogQHBhcmFtIG5hbWUgcGx1Z2luRnVsbE5hbWVcclxuICovXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVTdHJlYW1saW5lUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGlmICgvXkBbXi9dK1xcL3BpY2dvLXBsdWdpbi0vLnRlc3QobmFtZSkpIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL15AW14vXStcXC9waWNnby1wbHVnaW4tLywgJycpXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL3BpY2dvLXBsdWdpbi0vLCAnJylcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBjb21wbGV0ZSBwbHVnaW4gbmFtZSB0byBmdWxsIG5hbWVcclxuICogZm9yIGV4YW1wbGU6XHJcbiAqIDEuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDIuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiBAcGFyYW0gbmFtZSBwbHVnaW5TaW1wbGVOYW1lXHJcbiAqIEBwYXJhbSBzY29wZSBwbHVnaW5TY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZSA9IChuYW1lOiBzdHJpbmcsIHNjb3BlID0gJycpOiBzdHJpbmcgPT4ge1xyXG4gIGlmIChzY29wZSkge1xyXG4gICAgcmV0dXJuIGBAJHtzY29wZX0vcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiBgcGljZ28tcGx1Z2luLSR7bmFtZX1gXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIGluc3RhbGwvdW5pbnN0YWxsL3VwZGF0ZSBwbHVnaW4gbmFtZSBvciBwYXRoXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHggLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIDMuIHh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC4veHh4eC9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3h4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiAvYWJzb2x1dGVQYXRoLy4uLi9waWNnby1wbHVnaW4teHh4IC0+IC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHhcclxuICogQHBhcmFtIG5hbWVPclBhdGggcGx1Z2luTmFtZSBvciBwbHVnaW5QYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0UHJvY2Vzc1BsdWdpbk5hbWUgPSAobmFtZU9yUGF0aDogc3RyaW5nLCBsb2dnZXI6IElMb2dnZXIgfCBDb25zb2xlID0gY29uc29sZSk6IHN0cmluZyA9PiB7XHJcbiAgY29uc3QgcGx1Z2luTmFtZVR5cGUgPSBnZXRQbHVnaW5OYW1lVHlwZShuYW1lT3JQYXRoKVxyXG4gIHN3aXRjaCAocGx1Z2luTmFtZVR5cGUpIHtcclxuICAgIGNhc2UgJ25vcm1hbCc6XHJcbiAgICBjYXNlICdzY29wZSc6XHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICBjYXNlICdzaW1wbGUnOlxyXG4gICAgICByZXR1cm4gaGFuZGxlQ29tcGxldGVQbHVnaW5OYW1lKG5hbWVPclBhdGgpXHJcbiAgICBkZWZhdWx0OiB7XHJcbiAgICAgIC8vIG5vdywgdGhlIHBsdWdpbk5hbWVUeXBlIGlzIHVua25vdyBoZXJlXHJcbiAgICAgIC8vIDEuIGNoZWNrIGlmIGlzIGFuIGFic29sdXRlIHBhdGhcclxuICAgICAgbGV0IHBsdWdpblBhdGggPSBuYW1lT3JQYXRoXHJcbiAgICAgIGlmIChwYXRoLmlzQWJzb2x1dGUobmFtZU9yUGF0aCkgJiYgZnMuZXhpc3RzU3luYyhuYW1lT3JQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiBoYW5kbGVVbml4U3R5bGVQYXRoKHBsdWdpblBhdGgpXHJcbiAgICAgIH1cclxuICAgICAgLy8gMi4gY2hlY2sgaWYgaXMgYSByZWxhdGl2ZSBwYXRoXHJcbiAgICAgIHBsdWdpblBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgbmFtZU9yUGF0aClcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocGx1Z2luUGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gaGFuZGxlVW5peFN0eWxlUGF0aChwbHVnaW5QYXRoKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIDMuIGludmFsaWQgbmFtZU9yUGF0aFxyXG4gICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW4gJHtuYW1lT3JQYXRofWApXHJcbiAgICAgIHJldHVybiAnJ1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIGdldCB0aGUgbm9ybWFsIHBsdWdpbiBuYW1lXHJcbiAqIGZvciBleGFtcGxlOlxyXG4gKiAxLiBwaWNnby1wbHVnaW4teHh4IC0+IHBpY2dvLXBsdWdpbi14eHhcclxuICogMi4gQHh4eC9waWNnby1wbHVnaW4teHh4IC0+IEB4eHgvcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAzLiAuL3h4eHgvcGljZ28tcGx1Z2luLXh4eCAtPiBwaWNnby1wbHVnaW4teHh4XHJcbiAqIDQuIC9hYnNvbHV0ZVBhdGgvLi4uL3BpY2dvLXBsdWdpbi14eHggLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiA1LiBhbiBleGNlcHRpb246IFtwYWNrYWdlLmpzb24ncyBuYW1lXSAhPT0gW2ZvbGRlciBuYW1lXVxyXG4gKiB0aGVuIHVzZSBbcGFja2FnZS5qc29uJ3MgbmFtZV0sIHVzdWFsbHkgbWF0Y2ggdGhlIHNjb3BlIHBhY2thZ2UuXHJcbiAqIDYuIGlmIHBsdWdpbiBuYW1lIGhhcyB2ZXJzaW9uOiBwaWNnby1wbHVnaW4teHh4QHgueC54IHRoZW4gcmVtb3ZlIHRoZSB2ZXJzaW9uXHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgZ2V0Tm9ybWFsUGx1Z2luTmFtZSA9IChuYW1lT3JQYXRoOiBzdHJpbmcsIGxvZ2dlcjogSUxvZ2dlciB8IENvbnNvbGUgPSBjb25zb2xlKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwbHVnaW5OYW1lVHlwZSA9IGdldFBsdWdpbk5hbWVUeXBlKG5hbWVPclBhdGgpXHJcbiAgc3dpdGNoIChwbHVnaW5OYW1lVHlwZSkge1xyXG4gICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aClcclxuICAgIGNhc2UgJ3Njb3BlJzpcclxuICAgICAgcmV0dXJuIHJlbW92ZVBsdWdpblZlcnNpb24obmFtZU9yUGF0aCwgdHJ1ZSlcclxuICAgIGNhc2UgJ3NpbXBsZSc6XHJcbiAgICAgIHJldHVybiByZW1vdmVQbHVnaW5WZXJzaW9uKGhhbmRsZUNvbXBsZXRlUGx1Z2luTmFtZShuYW1lT3JQYXRoKSlcclxuICAgIGRlZmF1bHQ6IHtcclxuICAgICAgLy8gbm93LCB0aGUgbmFtZU9yUGF0aCBtdXN0IGJlIHBhdGhcclxuICAgICAgLy8gdGhlIG5hbWVPclBhdGggaGVyZSB3aWxsIGJlIGVuc3VyZWQgd2l0aCB1bml4IHN0eWxlXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gZmluZCB0aGUgcGFja2FnZS5qc29uJ3MgbmFtZSBjYXVzZSBucG0gdXNpbmcgdGhlIG5hbWUgaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZFxyXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmMobmFtZU9yUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHBhY2thZ2VKU09OUGF0aCA9IHBhdGgucG9zaXguam9pbihuYW1lT3JQYXRoLCAncGFja2FnZS5qc29uJylcclxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VKU09OUGF0aCkpIHtcclxuICAgICAgICBsb2dnZXIud2FybihgQ2FuJ3QgZmluZCBwbHVnaW46ICR7bmFtZU9yUGF0aH1gKVxyXG4gICAgICAgIHJldHVybiAnJ1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHBrZyA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlSlNPTlBhdGgpIHx8IHt9XHJcbiAgICAgICAgaWYgKCFwa2cubmFtZT8uaW5jbHVkZXMoJ3BpY2dvLXBsdWdpbi0nKSkge1xyXG4gICAgICAgICAgbG9nZ2VyLndhcm4oYFRoZSBwbHVnaW4gcGFja2FnZS5qc29uJ3MgbmFtZSBmaWxlZCBpcyAke3BrZy5uYW1lIGFzIHN0cmluZyB8fCAnZW1wdHknfSwgbmVlZCB0byBpbmNsdWRlIHRoZSBwcmVmaXg6IHBpY2dvLXBsdWdpbi1gKVxyXG4gICAgICAgICAgcmV0dXJuICcnXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwa2cubmFtZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogaGFuZGxlIHRyYW5zZm9ybSB0aGUgcGF0aCB0byB1bml4IHN0eWxlXHJcbiAqIGZvciBleGFtcGxlXHJcbiAqIDEuIEM6XFxcXHh4eFxcXFx4eHggLT4gQzoveHh4L3h4eFxyXG4gKiAyLiAveHh4L3h4eCAtPiAveHh4L3h4eFxyXG4gKiBAcGFyYW0gcGF0aFxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IGhhbmRsZVVuaXhTdHlsZVBhdGggPSAocGF0aFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoQXJyID0gcGF0aFN0ci5zcGxpdChwYXRoLnNlcClcclxuICByZXR1cm4gcGF0aEFyci5qb2luKCcvJylcclxufVxyXG5cclxuLyoqXHJcbiAqIHJlbW92ZSBwbHVnaW4gdmVyc2lvbiB3aGVuIHJlZ2lzdGVyIHBsdWdpbiBuYW1lXHJcbiAqIDEuIHBpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gcGljZ28tcGx1Z2luLXh4eFxyXG4gKiAyLiBAeHh4L3BpY2dvLXBsdWdpbi14eHhAMS4wLjAgLT4gQHh4eC9waWNnby1wbHVnaW4teHh4XHJcbiAqIEBwYXJhbSBuYW1lT3JQYXRoXHJcbiAqIEBwYXJhbSBzY29wZVxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJlbW92ZVBsdWdpblZlcnNpb24gPSAobmFtZU9yUGF0aDogc3RyaW5nLCBzY29wZTogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nID0+IHtcclxuICBpZiAoIW5hbWVPclBhdGguaW5jbHVkZXMoJ0AnKSkge1xyXG4gICAgcmV0dXJuIG5hbWVPclBhdGhcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IHJlZyA9IC8oLitcXC8pPyhwaWNnby1wbHVnaW4tXFx3KykoQC4rKSovXHJcbiAgICAvLyBpZiBpcyBhIHNjb3BlIHBrZ1xyXG4gICAgaWYgKHNjb3BlKSB7XHJcbiAgICAgIHJlZyA9IC8oLitcXC8pPyheQFteL10rXFwvcGljZ28tcGx1Z2luLVxcdyspKEAuKykqL1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hBcnIgPSBuYW1lT3JQYXRoLm1hdGNoKHJlZylcclxuICAgIGlmICghbWF0Y2hBcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdjYW4gbm90IHJlbW92ZSBwbHVnaW4gdmVyc2lvbicpXHJcbiAgICAgIHJldHVybiBuYW1lT3JQYXRoXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbWF0Y2hBcnJbMl1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGUgY29uZmlnIGJsYWNrIGl0ZW0gbGlzdCB3aGljaCB3b24ndCBiZSBzZXR0ZWRcclxuICogb25seSBjYW4gYmUgZ290XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY29uZmlnQmxhY2tMaXN0ID0gW11cclxuXHJcbi8qKlxyXG4gKiBjaGVjayBzb21lIGNvbmZpZyBrZXkgaXMgaW4gYmxhY2tMaXN0XHJcbiAqIEBwYXJhbSBrZXlcclxuICovXHJcbmV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluQmxhY2tMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbiAgcmV0dXJuIGNvbmZpZ0JsYWNrTGlzdC5zb21lKGJsYWNrSXRlbSA9PiBrZXkuc3RhcnRzV2l0aChibGFja0l0ZW0pKVxyXG59XHJcblxyXG4vKipcclxuICogY2hlY2sgdGhlIGlucHV0IGNvbmZpZyBpcyB2YWxpZFxyXG4gKiBjb25maWcgbXVzdCBiZSBvYmplY3Qgc3VjaCBhcyB7IHh4eDogJ3h4eCcgfVxyXG4gKiAmJiBjYW4ndCBiZSBhcnJheVxyXG4gKiBAcGFyYW0gY29uZmlnXHJcbiAqIEByZXR1cm5zXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgaXNJbnB1dENvbmZpZ1ZhbGlkID0gKGNvbmZpZzogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgaWYgKFxyXG4gICAgdHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgJiZcclxuICAgICFBcnJheS5pc0FycmF5KGNvbmZpZykgJiZcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykubGVuZ3RoID4gMFxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2U8VD4gKHN0cjogc3RyaW5nKTogVCB8IHN0cmluZyB7XHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKHN0cilcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgcmV0dXJuIHN0clxyXG4gIH1cclxufVxyXG5cclxuLy8gaG9sZC4uLlxyXG4vLyBleHBvcnQgY29uc3QgY29uZmlnV2hpdGVMaXN0OiBSZWdFeHBbXSA9IFtcclxuLy8gICAvXnBpY0JlZC8sXHJcbi8vICAgL15waWNnb1BsdWdpbnMvLFxyXG4vLyAgIC9eQFteL10rXFwvcGljZ28tcGx1Z2luLS8sXHJcbi8vICAgL2RlYnVnLyxcclxuLy8gICAvc2lsZW50LyxcclxuLy8gICAvY29uZmlnUGF0aC8sXHJcbi8vICAgL15zZXR0aW5ncy8sXHJcbi8vIF1cclxuXHJcbi8vIGV4cG9ydCBjb25zdCBpc0NvbmZpZ0tleUluV2hpdGVMaXN0ID0gKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XHJcbi8vICAgcmV0dXJuIGNvbmZpZ1doaXRlTGlzdC5zb21lKHdoaXRlSXRlbSA9PiB3aGl0ZUl0ZW0udGVzdChrZXkpKVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY29uc3QgZm9yY2VOdW1iZXIgPSAobnVtOiBzdHJpbmcgfCBudW1iZXIgPSAwKTogbnVtYmVyID0+IHtcclxuICByZXR1cm4gaXNOYU4oTnVtYmVyKG51bSkpID8gMCA6IE51bWJlcihudW0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBpc0RldiA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCdcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGlzUHJvZCA9ICgpOiBib29sZWFuID0+IHtcclxuICByZXR1cm4gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJ1xyXG59XHJcbiIsImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi8uLi91dGlscy9jb21tb24nXHJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgdXBsb2FkOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXBsb2FkJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCd1cGxvYWQsIGdvIGdvIGdvJylcclxuICAgICAgLmFyZ3VtZW50cygnW2lucHV0Li4uXScpXHJcbiAgICAgIC5hbGlhcygndScpXHJcbiAgICAgIC5hY3Rpb24oKGlucHV0OiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dExpc3QgPSBpbnB1dFxyXG4gICAgICAgICAgICAubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gaXNVcmwoaXRlbSkgPyBpdGVtIDogcGF0aC5yZXNvbHZlKGl0ZW0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGV4aXN0ID0gZnMuZXhpc3RzU3luYyhpdGVtKSB8fCBpc1VybChpdGVtKVxyXG4gICAgICAgICAgICAgIGlmICghZXhpc3QpIHtcclxuICAgICAgICAgICAgICAgIGN0eC5sb2cud2FybihgJHtpdGVtfSBkb2VzIG5vdCBleGlzdC5gKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICByZXR1cm4gZXhpc3RcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgIGF3YWl0IGN0eC51cGxvYWQoaW5wdXRMaXN0KVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgdXBsb2FkXHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuLy8gaGFuZGxlIG1vZHVsZXMgY29uZmlnIC0+IHNhdmUgdG8gcGljZ28gY29uZmlnIGZpbGVcclxuY29uc3QgaGFuZGxlQ29uZmlnID0gYXN5bmMgKGN0eDogSVBpY0dvLCBwcm9tcHRzOiBJUGx1Z2luQ29uZmlnW10sIG1vZHVsZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcclxuICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChwcm9tcHRzKVxyXG4gIGNvbnN0IGNvbmZpZ05hbWUgPSBtb2R1bGUgPT09ICd1cGxvYWRlcidcclxuICAgID8gYHBpY0JlZC4ke25hbWV9YCA6IG1vZHVsZSA9PT0gJ3RyYW5zZm9ybWVyJ1xyXG4gICAgICA/IGB0cmFuc2Zvcm1lci4ke25hbWV9YCA6IG5hbWVcclxuICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICBbY29uZmlnTmFtZV06IGFuc3dlclxyXG4gIH0pXHJcbn1cclxuXHJcbmNvbnN0IHNldHRpbmcgPSB7XHJcbiAgaGFuZGxlOiAoY3R4OiBJUGljR28pID0+IHtcclxuICAgIGNvbnN0IGNtZCA9IGN0eC5jbWRcclxuICAgIGNtZC5wcm9ncmFtXHJcbiAgICAgIC5jb21tYW5kKCdzZXQnKVxyXG4gICAgICAuYWxpYXMoJ2NvbmZpZycpXHJcbiAgICAgIC5hcmd1bWVudHMoJzxtb2R1bGU+IFtuYW1lXScpXHJcbiAgICAgIC5kZXNjcmlwdGlvbignY29uZmlndXJlIGNvbmZpZyBvZiBwaWNnbyBtb2R1bGVzJylcclxuICAgICAgLmFjdGlvbigobW9kdWxlOiBzdHJpbmcsIG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyAvLyBsb2FkIHRoaXJkLXBhcnR5IHBsdWdpbnNcclxuICAgICAgICAgICAgLy8gYXdhaXQgY3R4LnBsdWdpbkxvYWRlci5sb2FkKClcclxuICAgICAgICAgICAgLy8gaWYgYSBtb2R1bGUgaXMgc3BlY2lmaWMsIHRoZW4ganVzdCBzZXQgdGhpcyBvcHRpb24gaW4gY29uZmlnXHJcbiAgICAgICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAndXBsb2FkZXInOlxyXG4gICAgICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWVyJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdHguaGVscGVyW21vZHVsZV0uZ2V0KG5hbWUpXHJcbiAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHgubG9nLmVycm9yKGBObyAke21vZHVsZX0gbmFtZWQgJHtuYW1lfWApXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ29uZmlnKGN0eCwgaXRlbS5jb25maWcoY3R4KSwgbW9kdWxlLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke21vZHVsZX1gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlclttb2R1bGVdLmdldElkTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYENob29zZSBhKG4pICR7bW9kdWxlfWBcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQ6IGN0eC5nZXRDb25maWcoJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWcoJ3BpY0JlZC5jdXJyZW50JylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8SVN0cmluZ0tleU1hcDxhbnk+Pihwcm9tcHRzKVxyXG4gICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3R4LmhlbHBlclttb2R1bGVdLmdldChhbnN3ZXJbbW9kdWxlXSlcclxuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGl0ZW0uY29uZmlnKGN0eCksIG1vZHVsZSwgYW5zd2VyW21vZHVsZV0pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgICAgY2FzZSAncGx1Z2luJzpcclxuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygncGljZ28tcGx1Z2luLScpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGBwaWNnby1wbHVnaW4tJHtuYW1lfWBcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3R4LmdldENvbmZpZygncGljZ29QbHVnaW5zJykpLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpPy5jb25maWcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKG5hbWUpIS5jb25maWchKGN0eCksICdwbHVnaW4nLCBuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LmxvZy5lcnJvcihgTm8gcGx1Z2luIG5hbWVkICR7bmFtZX1gKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdwbHVnaW4nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LnBsdWdpbkxvYWRlci5nZXRGdWxsTGlzdCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ0Nob29zZSBhIHBsdWdpbidcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQ8YW55Pihwcm9tcHRzKVxyXG4gICAgICAgICAgICAgICAgICBpZiAoY3R4LnBsdWdpbkxvYWRlci5nZXRQbHVnaW4oYW5zd2VyLnBsdWdpbik/LmNvbmZpZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNvbmZpZyhjdHgsIGN0eC5wbHVnaW5Mb2FkZXIuZ2V0UGx1Z2luKGFuc3dlci5wbHVnaW4pIS5jb25maWchKGN0eCksICdwbHVnaW4nLCBhbnN3ZXIucGx1Z2luKVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oYE5vIG1vZHVsZSBuYW1lZCAke21vZHVsZX1gKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignQXZhaWxhYmxlIG1vZHVsZXMgYXJlIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbicpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdXNlTW9kdWxlTmFtZSA9IG1vZHVsZSA9PT0gJ3BsdWdpbicgPyAncGx1Z2lucycgOiBtb2R1bGVcclxuICAgICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKCdDb25maWd1cmUgY29uZmlnIHN1Y2Nlc3NmdWxseSEnKVxyXG4gICAgICAgICAgICBjdHgubG9nLmluZm8oYElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNvbmZpZywgcGxlYXNlIHJ1biAncGljZ28gdXNlICR7dXNlTW9kdWxlTmFtZX0nYClcclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgc2V0dGluZ1xyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4sIFVuZGVmaW5hYmxlLCBJQ0xJQ29uZmlncywgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgdXNlOiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogYXN5bmMgKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAuY29tbWFuZCgndXNlJylcclxuICAgICAgLmFyZ3VtZW50cygnW21vZHVsZV0nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ3VzZSBtb2R1bGVzIG9mIHBpY2dvJylcclxuICAgICAgLmFjdGlvbigobW9kdWxlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gLy8gbG9hZCB0aGlyZC1wYXJ0eSBwbHVnaW5zXHJcbiAgICAgICAgICAgIC8vIGF3YWl0IGN0eC5wbHVnaW5Mb2FkZXIubG9hZCgpXHJcbiAgICAgICAgICAgIGxldCBwcm9tcHRzOiBhbnlbXSA9IFtdXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZzogSUNMSUNvbmZpZ3MgPSB7XHJcbiAgICAgICAgICAgICAgdXBsb2FkZXI6IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd1cGxvYWRlcicsXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlIGFuIHVwbG9hZGVyJyxcclxuICAgICAgICAgICAgICAgIGNob2ljZXM6IGN0eC5oZWxwZXIudXBsb2FkZXIuZ2V0SWRMaXN0KCksXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBjdHguZ2V0Q29uZmlnKCdwaWNCZWQudXBsb2FkZXInKSB8fCBjdHguZ2V0Q29uZmlnKCdwaWNCZWQuY3VycmVudCcpIHx8ICdzbW1zJ1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgdHJhbnNmb3JtZXI6IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdsaXN0JyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICd0cmFuc2Zvcm1lcicsXHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnVXNlIGEgdHJhbnNmb3JtZXInLFxyXG4gICAgICAgICAgICAgICAgY2hvaWNlczogY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXRJZExpc3QoKSxcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC50cmFuc2Zvcm1lcicpIHx8ICdwYXRoJ1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgcGx1Z2luczoge1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2NoZWNrYm94JyxcclxuICAgICAgICAgICAgICAgIG5hbWU6ICdwbHVnaW5zJyxcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdVc2UgcGx1Z2lucycsXHJcbiAgICAgICAgICAgICAgICBjaG9pY2VzOiBjdHgucGx1Z2luTG9hZGVyLmdldEZ1bGxMaXN0KCksXHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OiBPYmplY3Qua2V5cyhjdHguZ2V0Q29uZmlnKCdwaWNnb1BsdWdpbnMnKSkuZmlsdGVyKChpdGVtOiBzdHJpbmcpID0+IGN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke2l0ZW19YCkpXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGlmIGFuIG9wdGlvbiBpcyBzcGVjaWZpYywgdGhlbiBqdXN0IHNldCB0aGlzIG9wdGlvbiBpbiBjb25maWdcclxuICAgICAgICAgICAgaWYgKG1vZHVsZSkge1xyXG4gICAgICAgICAgICAgIGlmIChjb25maWdbbW9kdWxlXSkge1xyXG4gICAgICAgICAgICAgICAgcHJvbXB0cy5wdXNoKGNvbmZpZ1ttb2R1bGVdKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjdHgubG9nLndhcm4oYE5vIG1vZHVsZSBuYW1lZCAke21vZHVsZX1gKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignQXZhaWxhYmxlIG1vZHVsZXMgYXJlIHVwbG9hZGVyfHRyYW5zZm9ybWVyfHBsdWdpbnMnKVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwcm9tcHRzID0gT2JqZWN0LmtleXMoY29uZmlnKS5tYXAoKGl0ZW06IHN0cmluZykgPT4gY29uZmlnW2l0ZW1dKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGNtZC5pbnF1aXJlci5wcm9tcHQ8YW55Pihwcm9tcHRzKVxyXG5cclxuICAgICAgICAgICAgLy8gaGFuZGxlIGZvciBwbHVnaW5zIG9wdGlvbiBmcm9tIEFycmF5IHRvIG9iamVjdFxyXG4gICAgICAgICAgICBpZiAoYW5zd2VyLnBsdWdpbnMpIHtcclxuICAgICAgICAgICAgICBjb25zdCBwbHVnaW5zID0gY3R4LmdldENvbmZpZzxJU3RyaW5nS2V5TWFwPGJvb2xlYW4+PigncGljZ29QbHVnaW5zJylcclxuICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwbHVnaW5zKS5tYXAoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGFuc3dlci5wbHVnaW5zLmluY2x1ZGVzKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgIHBsdWdpbnNbaXRlbV0gPSB0cnVlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBwbHVnaW5zW2l0ZW1dID0gZmFsc2VcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIC8vIHNhdmUgY29uZmlnIGZvciBwbHVnaW5zXHJcbiAgICAgICAgICAgICAgY3R4LnNhdmVDb25maWcoe1xyXG4gICAgICAgICAgICAgICAgcGljZ29QbHVnaW5zOiBwbHVnaW5zXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzYXZlIGNvbmZpZyBmb3IgdXBsb2FkZXIgJiB0cmFuc2Zvcm1lclxyXG4gICAgICAgICAgICBjdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICAgICAgICAgJ3BpY0JlZC5jdXJyZW50JzogYW5zd2VyLnVwbG9hZGVyIHx8IGN0eC5nZXRDb25maWc8c3RyaW5nPigncGljQmVkLmN1cnJlbnQnKSxcclxuICAgICAgICAgICAgICAncGljQmVkLnVwbG9hZGVyJzogYW5zd2VyLnVwbG9hZGVyIHx8IGN0eC5nZXRDb25maWc8c3RyaW5nPigncGljQmVkLmN1cnJlbnQnKSxcclxuICAgICAgICAgICAgICAncGljQmVkLnRyYW5zZm9ybWVyJzogYW5zd2VyLnRyYW5zZm9ybWVyIHx8ICdwYXRoJ1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBjdHgubG9nLnN1Y2Nlc3MoJ0NvbmZpZ3VyZSBjb25maWcgc3VjY2Vzc2Z1bGx5IScpXHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLWRlYnVnJykpIHtcclxuICAgICAgICAgICAgICB0aHJvdyBlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSgpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHVzZVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW4gfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IHByb3h5OiBJUGx1Z2luID0ge1xyXG4gIGhhbmRsZTogKGN0eDogSVBpY0dvKSA9PiB7XHJcbiAgICBjb25zdCBjbWQgPSBjdHguY21kXHJcbiAgICBjbWQucHJvZ3JhbVxyXG4gICAgICAub3B0aW9uKCctcCwgLS1wcm94eSA8dXJsPicsICdzZXQgcHJveHkgZm9yIHVwbG9hZGluZycsIChwcm94eTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgY3R4LnNldENvbmZpZyh7XHJcbiAgICAgICAgICAncGljQmVkLnByb3h5JzogcHJveHlcclxuICAgICAgICB9KVxyXG4gICAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgcHJveHlcclxuIiwiaW1wb3J0IG1hdGNoIGZyb20gJ21pbmltYXRjaCdcclxuaW1wb3J0IHsgSVBpY0dvLCBJT3B0aW9ucywgSUZpbGVUcmVlIH0gZnJvbSAnLi4vdHlwZXMnXHJcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGdsb2JieSBmcm9tICdnbG9iYnknXHJcbmltcG9ydCBlanMgZnJvbSAnZWpzJ1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyYXRlIHRlbXBsYXRlIGZpbGVzIHRvIGRlc3RpbmF0aW9uIGZpbGVzLlxyXG4gKiBAcGFyYW0ge1BpY0dvfSBjdHhcclxuICogQHBhcmFtIHtJT3B0aW9uc30gb3B0aW9uc1xyXG4gKi9cclxuY29uc3QgZ2VuZXJhdGUgPSBhc3luYyAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogUHJvbWlzZTxhbnk+ID0+IHtcclxuICB0cnkge1xyXG4gICAgY29uc3Qgb3B0cyA9IGdldE9wdGlvbnMob3B0aW9ucy50bXApXHJcbiAgICBjb25zdCBzb3VyY2UgPSBwYXRoLmpvaW4ob3B0aW9ucy50bXAsICd0ZW1wbGF0ZScpXHJcbiAgICBsZXQgYW5zd2VycyA9IHt9XHJcbiAgICBpZiAob3B0cy5wcm9tcHRzICYmIG9wdHMucHJvbXB0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFuc3dlcnMgPSBhd2FpdCBjdHguY21kLmlucXVpcmVyLnByb21wdChvcHRzLnByb21wdHMpXHJcbiAgICB9XHJcbiAgICBsZXQgX2ZpbGVzOiBzdHJpbmdbXSA9IGF3YWl0IGdsb2JieShbJyoqLyonXSwgeyBjd2Q6IHNvdXJjZSwgZG90OiB0cnVlIH0pIC8vIGdldCBmaWxlcycgbmFtZSBhcnJheVxyXG4gICAgX2ZpbGVzID0gX2ZpbGVzLmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGxldCBnbG9iID0gJydcclxuICAgICAgT2JqZWN0LmtleXMob3B0cy5maWx0ZXJzKS5mb3JFYWNoKChrZXk6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlmIChtYXRjaChpdGVtLCBrZXksIHsgZG90OiB0cnVlIH0pKSB7XHJcbiAgICAgICAgICBnbG9iID0gaXRlbVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICAgaWYgKGdsb2IpIHsgLy8gZmluZCBhIGZpbHRlciBleHByZXNzaW9uXHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcnMoY3R4LCBvcHRzLmZpbHRlcnNbZ2xvYl0sIGFuc3dlcnMpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfVxyXG4gICAgfSlcclxuICAgIGlmIChfZmlsZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBjdHgubG9nLndhcm4oJ1RlbXBsYXRlIGZpbGVzIG5vdCBmb3VuZCEnKVxyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsZXMgPSByZW5kZXIoX2ZpbGVzLCBzb3VyY2UsIGFuc3dlcnMpXHJcbiAgICB3cml0ZUZpbGVUcmVlKG9wdGlvbnMuZGVzdCwgZmlsZXMpXHJcbiAgICBpZiAodHlwZW9mIG9wdHMuY29tcGxldGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgb3B0cy5jb21wbGV0ZSh7IGFuc3dlcnMsIG9wdGlvbnMsIGZpbGVzOiBfZmlsZXMsIGN0eCB9KVxyXG4gICAgfVxyXG4gICAgaWYgKG9wdHMuY29tcGxldGVNZXNzYWdlKSB7XHJcbiAgICAgIGN0eC5sb2cuc3VjY2VzcyhvcHRzLmNvbXBsZXRlTWVzc2FnZSlcclxuICAgIH1cclxuICAgIGN0eC5sb2cuc3VjY2VzcygnRG9uZSEnKVxyXG4gIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgcmV0dXJuIGN0eC5sb2cuZXJyb3IoZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBSZXR1cm4gdGhlIGZpbHRlcnMnIHJlc3VsdFxyXG4gKiBAcGFyYW0gY3R4IFBpY0dvXHJcbiAqIEBwYXJhbSBleHAgY29uZGl0aW9uIGV4cHJlc3Npb25cclxuICogQHBhcmFtIGRhdGEgb3B0aW9ucyBkYXRhXHJcbiAqL1xyXG5jb25zdCBmaWx0ZXJzID0gKGN0eDogSVBpY0dvLCBleHA6IGFueSwgZGF0YTogYW55KTogYm9vbGVhbiA9PiB7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC1wbHVzLW9wZXJhbmRzLCBuby1uZXctZnVuYywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbFxyXG4gIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKCdkYXRhJywgJ3dpdGggKGRhdGEpIHsgcmV0dXJuICcgKyBleHAgKyAnfScpXHJcbiAgdHJ5IHtcclxuICAgIHJldHVybiBmbihkYXRhKVxyXG4gIH0gY2F0Y2ggKGUpIHtcclxuICAgIGN0eC5sb2cuZXJyb3IoYEVycm9yIHdoZW4gZXZhbHVhdGluZyBmaWx0ZXIgY29uZGl0aW9uOiAke0pTT04uc3RyaW5naWZ5KGV4cCl9YClcclxuICAgIHJldHVybiBmYWxzZVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEdldCB0ZW1wbGF0ZSBvcHRpb25zXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZW1wbGF0ZVBhdGhcclxuICovXHJcbmNvbnN0IGdldE9wdGlvbnMgPSAodGVtcGxhdGVQYXRoOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gIGNvbnN0IG9wdGlvbnNQYXRoID0gcGF0aC5qb2luKHRlbXBsYXRlUGF0aCwgJ2luZGV4LmpzJylcclxuICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zUGF0aCkpIHtcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXHJcbiAgICBjb25zdCBvcHRpb25zID0gcmVxdWlyZShvcHRpb25zUGF0aClcclxuICAgIHJldHVybiBvcHRpb25zXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB7fVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIFJlbmRlciBmaWxlcyB0byBhIHZpcnR1YWwgdHJlZSBvYmplY3RcclxuICogQHBhcmFtIHthcnJheX0gZmlsZXNcclxuICovXHJcbmNvbnN0IHJlbmRlciA9IChmaWxlczogc3RyaW5nW10sIHNvdXJjZTogc3RyaW5nLCBvcHRpb25zOiBhbnkpOiBhbnkgPT4ge1xyXG4gIGNvbnN0IGZpbGVUcmVlOiBJRmlsZVRyZWUgPSB7fVxyXG4gIGZpbGVzLmZvckVhY2goKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkID0+IHtcclxuICAgIGNvbnN0IGZpbGUgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKHNvdXJjZSwgZmlsZVBhdGgpLCAndXRmOCcpXHJcbiAgICBjb25zdCBjb250ZW50ID0gZWpzLnJlbmRlcihmaWxlLCBvcHRpb25zKVxyXG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihjb250ZW50KSB8fCAvW15cXHNdLy50ZXN0KGNvbnRlbnQpKSB7XHJcbiAgICAgIGZpbGVUcmVlW2ZpbGVQYXRoXSA9IGNvbnRlbnRcclxuICAgIH1cclxuICB9KVxyXG4gIHJldHVybiBmaWxlVHJlZVxyXG59XHJcblxyXG4vKipcclxuICogV3JpdGUgcmVuZGVyZWQgZmlsZXMnIGNvbnRlbnQgdG8gcmVhbCBmaWxlXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXJcclxuICogQHBhcmFtIHtvYmplY3R9IGZpbGVzXHJcbiAqL1xyXG5jb25zdCB3cml0ZUZpbGVUcmVlID0gKGRpcjogc3RyaW5nLCBmaWxlczogYW55KTogdm9pZCA9PiB7XHJcbiAgT2JqZWN0LmtleXMoZmlsZXMpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZGlyLCBuYW1lKVxyXG4gICAgZnMuZW5zdXJlRGlyU3luYyhwYXRoLmRpcm5hbWUoZmlsZVBhdGgpKVxyXG4gICAgZnMud3JpdGVGaWxlU3luYyhmaWxlUGF0aCwgZmlsZXNbbmFtZV0pXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IHtcclxuICBmaWx0ZXJzLFxyXG4gIGdlbmVyYXRlLFxyXG4gIHJlbmRlcixcclxuICB3cml0ZUZpbGVUcmVlXHJcbn1cclxuIiwiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJ1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCB7IGdlbmVyYXRlIH0gZnJvbSAnLi4vLi4vdXRpbHMvaW5pdFV0aWxzJ1xyXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnXHJcbmltcG9ydCBkb3dubG9hZCBmcm9tICdkb3dubG9hZC1naXQtcmVwbydcclxuaW1wb3J0IHsgSU9wdGlvbnMsIElQbHVnaW4sIElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgcm0gZnJvbSAncmltcmFmJ1xyXG5cclxuY29uc3QgcnVuID0gKGN0eDogSVBpY0dvLCBvcHRpb25zOiBJT3B0aW9ucyk6IHZvaWQgPT4ge1xyXG4gIC8vIGNvbnN0IG5hbWUgPSBvcHRpb25zLmluUGxhY2UgPyBwYXRoLnJlbGF0aXZlKCcuLi8nLCBwcm9jZXNzLmN3ZCgpKSA6IG9wdGlvbnMucHJvamVjdFxyXG4gIGlmIChvcHRpb25zLm9mZmxpbmUpIHsgLy8gb2ZmbGluZSBtb2RlXHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhvcHRpb25zLnRlbXBsYXRlKSkge1xyXG4gICAgICBnZW5lcmF0ZShjdHgsIG9wdGlvbnMpLmNhdGNoKChlKSA9PiB7IGN0eC5sb2cuZXJyb3IoZSkgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGN0eC5sb2cuZXJyb3IoYExvY2FsIHRlbXBsYXRlICR7b3B0aW9ucy50ZW1wbGF0ZX0gbm90IGZvdW5kYClcclxuICAgIH1cclxuICB9IGVsc2UgeyAvLyBvbmxpbmUgbW9kZVxyXG4gICAgb3B0aW9ucy50ZW1wbGF0ZSA9ICFvcHRpb25zLmhhc1NsYXNoXHJcbiAgICAgID8gJ1BpY0dvL3BpY2dvLXRlbXBsYXRlLScgKyBvcHRpb25zLnRlbXBsYXRlIC8vIG9mZmljaWFsIHRlbXBsYXRlXHJcbiAgICAgIDogb3B0aW9ucy50ZW1wbGF0ZVxyXG4gICAgZG93bmxvYWRBbmRHZW5lcmF0ZShjdHgsIG9wdGlvbnMpXHJcbiAgfVxyXG59XHJcblxyXG4vKipcclxuICogZG93bmxvYWQgdGVtcGxhdGUgJiBnZW5lcmF0ZVxyXG4gKiBAcGFyYW0geyBQaWNHbyB9IGN0eFxyXG4gKiBAcGFyYW0geyBJT3B0aW9ucyB9IG9wdGlvbnNcclxuICovXHJcbmNvbnN0IGRvd25sb2FkQW5kR2VuZXJhdGUgPSAoY3R4OiBJUGljR28sIG9wdGlvbnM6IElPcHRpb25zKTogdm9pZCA9PiB7XHJcbiAgaWYgKGZzLmV4aXN0c1N5bmMob3B0aW9ucy50bXApKSB7XHJcbiAgICBybS5zeW5jKG9wdGlvbnMudG1wKVxyXG4gIH1cclxuICBjdHgubG9nLmluZm8oJ1RlbXBsYXRlIGZpbGVzIGFyZSBkb3dubG9hZGluZy4uLicpXHJcbiAgZG93bmxvYWQob3B0aW9ucy50ZW1wbGF0ZSwgb3B0aW9ucy50bXAsIHsgY2xvbmU6IG9wdGlvbnMuY2xvbmUgfSwgKGVycjogRXJyb3IpID0+IHtcclxuICAgIGlmIChlcnIpIHtcclxuICAgICAgcmV0dXJuIGN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5zdWNjZXNzKCdUZW1wbGF0ZSBmaWxlcyBhcmUgZG93bmxvYWRlZCEnKVxyXG4gICAgZ2VuZXJhdGUoY3R4LCBvcHRpb25zKS5jYXRjaCgoZSkgPT4geyBjdHgubG9nLmVycm9yKGUpIH0pXHJcbiAgfSlcclxufVxyXG5cclxuY29uc3QgaW5pdDogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IGFzeW5jIChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2luaXQnKVxyXG4gICAgICAuYXJndW1lbnRzKCc8dGVtcGxhdGU+IFtwcm9qZWN0XScpXHJcbiAgICAgIC5vcHRpb24oJy0tY2xvbmUnLCAndXNlIGdpdCBjbG9uZScpXHJcbiAgICAgIC5vcHRpb24oJy0tb2ZmbGluZScsICd1c2UgY2FjaGVkIHRlbXBsYXRlJylcclxuICAgICAgLmRlc2NyaXB0aW9uKCdjcmVhdGUgcGljZ28gcGx1Z2luXFwncyBkZXZlbG9wbWVudCB0ZW1wbGF0ZXMnKVxyXG4gICAgICAuYWN0aW9uKCh0ZW1wbGF0ZTogc3RyaW5nLCBwcm9qZWN0OiBzdHJpbmcsIHByb2dyYW06IGFueSkgPT4ge1xyXG4gICAgICAgIChhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAvLyBUaGFua3MgdG8gdnVlLWNsaSBpbml0OiBodHRwczovL2dpdGh1Yi5jb20vdnVlanMvdnVlLWNsaS9ibG9iL21hc3Rlci9iaW4vdnVlLWluaXRcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhc1NsYXNoID0gdGVtcGxhdGUuaW5jbHVkZXMoJy8nKVxyXG4gICAgICAgICAgICBjb25zdCBpblBsYWNlID0gIXByb2plY3QgfHwgcHJvamVjdCA9PT0gJy4nXHJcbiAgICAgICAgICAgIGNvbnN0IGRlc3QgPSBwYXRoLnJlc29sdmUocHJvamVjdCB8fCAnLicpXHJcbiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gcHJvZ3JhbS5jbG9uZSB8fCBmYWxzZVxyXG4gICAgICAgICAgICBjb25zdCBvZmZsaW5lID0gcHJvZ3JhbS5vZmZsaW5lIHx8IGZhbHNlXHJcbiAgICAgICAgICAgIGNvbnN0IHRtcCA9IHBhdGguam9pbihob21lZGlyKCksICcucGljZ28vdGVtcGxhdGVzJywgdGVtcGxhdGUucmVwbGFjZSgvWy86XS9nLCAnLScpKSAvLyBmb3IgY2FjaGluZyB0ZW1wbGF0ZVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb2dyYW0ub2ZmbGluZSkge1xyXG4gICAgICAgICAgICAgIHRlbXBsYXRlID0gdG1wXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgdGVtcGxhdGUsXHJcbiAgICAgICAgICAgICAgcHJvamVjdCxcclxuICAgICAgICAgICAgICBoYXNTbGFzaCxcclxuICAgICAgICAgICAgICBpblBsYWNlLFxyXG4gICAgICAgICAgICAgIGRlc3QsXHJcbiAgICAgICAgICAgICAgY2xvbmUsXHJcbiAgICAgICAgICAgICAgdG1wLFxyXG4gICAgICAgICAgICAgIG9mZmxpbmVcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcHJvamVjdCBpcyBlbXB0eSBvciBleGlzdFxyXG4gICAgICAgICAgICBpZiAoaW5QbGFjZSB8fCBmcy5leGlzdHNTeW5jKGRlc3QpKSB7XHJcbiAgICAgICAgICAgICAgYXdhaXQgY3R4LmNtZC5pbnF1aXJlci5wcm9tcHQoW1xyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnY29uZmlybScsXHJcbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGluUGxhY2VcclxuICAgICAgICAgICAgICAgICAgICA/ICdHZW5lcmF0ZSBwcm9qZWN0IGluIGN1cnJlbnQgZGlyZWN0b3J5PydcclxuICAgICAgICAgICAgICAgICAgICA6ICdUYXJnZXQgZGlyZWN0b3J5IGV4aXN0cy4gQ29udGludWU/JyxcclxuICAgICAgICAgICAgICAgICAgbmFtZTogJ29rJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIF0pLnRoZW4oKGFuc3dlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLm9rKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHsgLy8gcHJvamVjdCBpcyBnaXZlblxyXG4gICAgICAgICAgICAgIHJ1bihjdHgsIG9wdGlvbnMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgICAgICBjdHgubG9nLmVycm9yKGUpXHJcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZGVidWcnKSkge1xyXG4gICAgICAgICAgICAgIHRocm93IGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pKCkuY2F0Y2goKGUpID0+IHsgY3R4LmxvZy5lcnJvcihlKSB9KVxyXG4gICAgICB9KVxyXG4gICAgICAub24oJy0taGVscCcsICgpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coJ0V4YW1wbGVzOicpXHJcbiAgICAgICAgY29uc29sZS5sb2coKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgIyBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIGFuIG9mZmljaWFsIHRlbXBsYXRlJykpXHJcbiAgICAgICAgY29uc29sZS5sb2coJyAgJCBwaWNnbyBpbml0IHBsdWdpbiBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAjIGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHN0cmFpZ2h0IGZyb20gYSBnaXRodWIgdGVtcGxhdGUnKSlcclxuICAgICAgICBjb25zb2xlLmxvZygnICAkIHBpY2dvIGluaXQgdXNlcm5hbWUvcmVwbyBteS1wcm9qZWN0JylcclxuICAgICAgICBjb25zb2xlLmxvZygpXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpbml0XHJcbiIsImltcG9ydCB7IElQbHVnaW4sIElQaWNHbywgSVN0cmluZ0tleU1hcCB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuY29uc3QgaTE4bjogSVBsdWdpbiA9IHtcclxuICBoYW5kbGU6IChjdHg6IElQaWNHbykgPT4ge1xyXG4gICAgY29uc3QgY21kID0gY3R4LmNtZFxyXG4gICAgY21kLnByb2dyYW1cclxuICAgICAgLmNvbW1hbmQoJ2kxOG4nKVxyXG4gICAgICAuYXJndW1lbnRzKCdbbGFuZ10nKVxyXG4gICAgICAuZGVzY3JpcHRpb24oJ2NoYW5nZSBwaWNnbyBsYW5ndWFnZScpXHJcbiAgICAgIC5hY3Rpb24oYXN5bmMgKGxhbmc6IHN0cmluZyA9ICcnKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IGN0eC5pMThuLmdldExhbmd1YWdlTGlzdCgpXHJcbiAgICAgICAgaWYgKCFsYW5nKSB7XHJcbiAgICAgICAgICBjb25zdCBwcm9tcHRzID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogJ2xpc3QnLFxyXG4gICAgICAgICAgICAgIG5hbWU6ICdpMThuJyxcclxuICAgICAgICAgICAgICBjaG9pY2VzOiBsaXN0LFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdDaG9vc2UgYSBsYW5ndWFnZScsXHJcbiAgICAgICAgICAgICAgZGVmYXVsdDogY3R4LmdldENvbmZpZygnc2V0dGluZ3MubGFuZ3VhZ2UnKSB8fCAnemgtQ04nXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIF1cclxuICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGN0eC5jbWQuaW5xdWlyZXIucHJvbXB0PElTdHJpbmdLZXlNYXA8c3RyaW5nPj4ocHJvbXB0cylcclxuICAgICAgICAgIGN0eC5pMThuLnNldExhbmd1YWdlKGFuc3dlci5pMThuKVxyXG4gICAgICAgICAgY3R4LmxvZy5zdWNjZXNzKGBMYW5ndWFnZSBzZXQgdG8gJHthbnN3ZXIuaTE4bn1gKVxyXG4gICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbGlzdC5pbmNsdWRlcyhsYW5nKSkge1xyXG4gICAgICAgICAgcmV0dXJuIGN0eC5sb2cud2FybignTm8gc3VjaCBsYW5ndWFnZScpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN0eC5pMThuLnNldExhbmd1YWdlKGxhbmcpXHJcbiAgICAgICAgY3R4LmxvZy5zdWNjZXNzKGBMYW5ndWFnZSBzZXQgdG8gJHtsYW5nfWApXHJcbiAgICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBpMThuXHJcbiIsImltcG9ydCBwbHVnaW5IYW5kbGVyIGZyb20gJy4vcGx1Z2luSGFuZGxlcidcclxuaW1wb3J0IGNvbmZpZyBmcm9tICcuL2NvbmZpZydcclxuaW1wb3J0IHVwbG9hZCBmcm9tICcuL3VwbG9hZCdcclxuaW1wb3J0IHNldHRpbmcgZnJvbSAnLi9zZXR0aW5nJ1xyXG5pbXBvcnQgdXNlIGZyb20gJy4vdXNlJ1xyXG5pbXBvcnQgcHJveHkgZnJvbSAnLi9wcm94eSdcclxuaW1wb3J0IGluaXQgZnJvbSAnLi9pbml0J1xyXG5pbXBvcnQgaTE4biBmcm9tICcuL2kxOG4nXHJcbmltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgKGN0eDogSVBpY0dvKTogdm9pZCA9PiB7XHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncGx1Z2luSGFuZGxlcicsIHBsdWdpbkhhbmRsZXIpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcignY29uZmlnJywgY29uZmlnKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3NldHRpbmcnLCBzZXR0aW5nKVxyXG4gIGN0eC5jbWQucmVnaXN0ZXIoJ3VwbG9hZCcsIHVwbG9hZClcclxuICBjdHguY21kLnJlZ2lzdGVyKCd1c2UnLCB1c2UpXHJcbiAgY3R4LmNtZC5yZWdpc3RlcigncHJveHknLCBwcm94eSlcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpbml0JywgaW5pdClcclxuICBjdHguY21kLnJlZ2lzdGVyKCdpMThuJywgaTE4bilcclxufVxyXG4iLCJpbXBvcnQgeyBJUGx1Z2luLCBJTGlmZWN5Y2xlUGx1Z2lucyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuZXhwb3J0IGNsYXNzIExpZmVjeWNsZVBsdWdpbnMgaW1wbGVtZW50cyBJTGlmZWN5Y2xlUGx1Z2lucyB7XHJcbiAgc3RhdGljIGN1cnJlbnRQbHVnaW46IHN0cmluZyB8IG51bGxcclxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3Q6IE1hcDxzdHJpbmcsIElQbHVnaW4+XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZE1hcDogTWFwPHN0cmluZywgc3RyaW5nW10+XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IgKG5hbWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZVxyXG4gICAgdGhpcy5saXN0ID0gbmV3IE1hcCgpXHJcbiAgICB0aGlzLnBsdWdpbklkTWFwID0gbmV3IE1hcCgpXHJcbiAgfVxyXG5cclxuICByZWdpc3RlciAoaWQ6IHN0cmluZywgcGx1Z2luOiBJUGx1Z2luKTogdm9pZCB7XHJcbiAgICBpZiAoIWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdpZCBpcyByZXF1aXJlZCEnKVxyXG4gICAgaWYgKHR5cGVvZiBwbHVnaW4uaGFuZGxlICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdwbHVnaW4uaGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiEnKVxyXG4gICAgaWYgKHRoaXMubGlzdC5oYXMoaWQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3RoaXMubmFtZX0gZHVwbGljYXRlIGlkOiAke2lkfSFgKVxyXG4gICAgdGhpcy5saXN0LnNldChpZCwgcGx1Z2luKVxyXG4gICAgaWYgKExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbikge1xyXG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luKSkge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuZ2V0KExpZmVjeWNsZVBsdWdpbnMuY3VycmVudFBsdWdpbik/LnB1c2goaWQpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5zZXQoTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luLCBbaWRdKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyIChwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xyXG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcclxuICAgICAgcGx1Z2luTGlzdD8uZm9yRWFjaCgocGx1Z2luOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldE5hbWUgKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5uYW1lXHJcbiAgfVxyXG5cclxuICBnZXQgKGlkOiBzdHJpbmcpOiBJUGx1Z2luIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3QuZ2V0KGlkKVxyXG4gIH1cclxuXHJcbiAgZ2V0TGlzdCAoKTogSVBsdWdpbltdIHtcclxuICAgIHJldHVybiBbLi4udGhpcy5saXN0LnZhbHVlcygpXVxyXG4gIH1cclxuXHJcbiAgZ2V0SWRMaXN0ICgpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC5rZXlzKCldXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0Q3VycmVudFBsdWdpbk5hbWUgPSAobmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpOiB2b2lkID0+IHtcclxuICBMaWZlY3ljbGVQbHVnaW5zLmN1cnJlbnRQbHVnaW4gPSBuYW1lXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50UGx1Z2luTmFtZSA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcclxuICByZXR1cm4gTGlmZWN5Y2xlUGx1Z2lucy5jdXJyZW50UGx1Z2luXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVBsdWdpbnNcclxuIiwiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cclxuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcidcclxuaW1wb3J0IGlucXVpcmVyLCB7IElucXVpcmVyIH0gZnJvbSAnaW5xdWlyZXInXHJcbmltcG9ydCB7IElQbHVnaW4sIElDb21tYW5kZXIsIElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgY29tbWFuZGVycyBmcm9tICcuLi9wbHVnaW5zL2NvbW1hbmRlcidcclxuaW1wb3J0IHsgZ2V0Q3VycmVudFBsdWdpbk5hbWUgfSBmcm9tICcuL0xpZmVjeWNsZVBsdWdpbnMnXHJcblxyXG5leHBvcnQgY2xhc3MgQ29tbWFuZGVyIGltcGxlbWVudHMgSUNvbW1hbmRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lID0gJ2NvbW1hbmRlcidcclxuICBzdGF0aWMgY3VycmVudFBsdWdpbjogc3RyaW5nIHwgbnVsbFxyXG4gIHByaXZhdGUgcmVhZG9ubHkgbGlzdDogTWFwPHN0cmluZywgSVBsdWdpbj4gPSBuZXcgTWFwKClcclxuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbklkTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4gPSBuZXcgTWFwKClcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcblxyXG4gIHByb2dyYW06IENvbW1hbmRcclxuICBpbnF1aXJlcjogSW5xdWlyZXJcclxuXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLnByb2dyYW0gPSBuZXcgQ29tbWFuZCgpXHJcbiAgICB0aGlzLmlucXVpcmVyID0gaW5xdWlyZXJcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBnZXROYW1lICgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubmFtZVxyXG4gIH1cclxuXHJcbiAgaW5pdCAoKTogdm9pZCB7XHJcbiAgICB0aGlzLnByb2dyYW1cclxuICAgICAgLnZlcnNpb24ocHJvY2Vzcy5lbnYuUElDR09fVkVSU0lPTiwgJy12LCAtLXZlcnNpb24nKVxyXG4gICAgICAub3B0aW9uKCctZCwgLS1kZWJ1ZycsICdkZWJ1ZyBtb2RlJywgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3R4LnNldENvbmZpZyh7XHJcbiAgICAgICAgICBkZWJ1ZzogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0pXHJcbiAgICAgIC5vcHRpb24oJy1zLCAtLXNpbGVudCcsICdzaWxlbnQgbW9kZScsICgpID0+IHtcclxuICAgICAgICB0aGlzLmN0eC5zZXRDb25maWcoe1xyXG4gICAgICAgICAgc2lsZW50OiB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgfSlcclxuICAgICAgLm9uKCdjb21tYW5kOionLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGBJbnZhbGlkIGNvbW1hbmQ6ICR7dGhpcy5wcm9ncmFtLmFyZ3Muam9pbignICcpfVxcblNlZSAtLWhlbHAgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuYClcclxuICAgICAgICBwcm9jZXNzLmV4aXQoMSlcclxuICAgICAgfSlcclxuXHJcbiAgICAvLyBidWlsdC1pbiBjb21tYW5kc1xyXG4gICAgY29tbWFuZGVycyh0aGlzLmN0eClcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyIChpZDogc3RyaW5nLCBwbHVnaW46IElQbHVnaW4pOiB2b2lkIHtcclxuICAgIGlmICghaWQpIHRocm93IG5ldyBUeXBlRXJyb3IoJ25hbWUgaXMgcmVxdWlyZWQhJylcclxuICAgIGlmICh0eXBlb2YgcGx1Z2luLmhhbmRsZSAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcigncGx1Z2luLmhhbmRsZSBtdXN0IGJlIGEgZnVuY3Rpb24hJylcclxuICAgIGlmICh0aGlzLmxpc3QuaGFzKGlkKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt0aGlzLm5hbWV9IHBsdWdpbiBkdXBsaWNhdGUgaWQ6ICR7aWR9IWApXHJcbiAgICB0aGlzLmxpc3Quc2V0KGlkLCBwbHVnaW4pXHJcbiAgICBjb25zdCBjdXJyZW50UGx1Z2luTmFtZSA9IGdldEN1cnJlbnRQbHVnaW5OYW1lKClcclxuICAgIGlmIChjdXJyZW50UGx1Z2luTmFtZSAhPT0gbnVsbCkge1xyXG4gICAgICBpZiAodGhpcy5wbHVnaW5JZE1hcC5oYXMoY3VycmVudFBsdWdpbk5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5JZE1hcC5nZXQoY3VycmVudFBsdWdpbk5hbWUpPy5wdXNoKGlkKVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucGx1Z2luSWRNYXAuc2V0KGN1cnJlbnRQbHVnaW5OYW1lLCBbaWRdKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1bnJlZ2lzdGVyIChwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBsdWdpbklkTWFwLmhhcyhwbHVnaW5OYW1lKSkge1xyXG4gICAgICBjb25zdCBwbHVnaW5MaXN0ID0gdGhpcy5wbHVnaW5JZE1hcC5nZXQocGx1Z2luTmFtZSlcclxuICAgICAgcGx1Z2luTGlzdD8uZm9yRWFjaCgocGx1Z2luOiBzdHJpbmcpID0+IHtcclxuICAgICAgICB0aGlzLmxpc3QuZGVsZXRlKHBsdWdpbilcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRDb21tYW5kcyAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldExpc3QoKS5mb3JFYWNoKChpdGVtOiBJUGx1Z2luKSA9PiB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaXRlbS5oYW5kbGUodGhpcy5jdHgpXHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgZ2V0IChpZDogc3RyaW5nKTogSVBsdWdpbiB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5saXN0LmdldChpZClcclxuICB9XHJcblxyXG4gIGdldExpc3QgKCk6IElQbHVnaW5bXSB7XHJcbiAgICByZXR1cm4gWy4uLnRoaXMubGlzdC52YWx1ZXMoKV1cclxuICB9XHJcblxyXG4gIGdldElkTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmxpc3Qua2V5cygpXVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgQ29tbWFuZGVyXHJcbiIsImV4cG9ydCBlbnVtIElMb2dUeXBlIHtcclxuICBzdWNjZXNzID0gJ3N1Y2Nlc3MnLFxyXG4gIGluZm8gPSAnaW5mbycsXHJcbiAgd2FybiA9ICd3YXJuJyxcclxuICBlcnJvciA9ICdlcnJvcidcclxufVxyXG5cclxuLyoqXHJcbiAqIHRoZXNlIGV2ZW50cyB3aWxsIGJlIGNhdGNoZWQgYnkgdXNlcnNcclxuICovXHJcbmV4cG9ydCBlbnVtIElCdWlsZEluRXZlbnQge1xyXG4gIFVQTE9BRF9QUk9HUkVTUyA9ICd1cGxvYWRQcm9ncmVzcycsXHJcbiAgRkFJTEVEID0gJ2ZhaWxlZCcsXHJcbiAgQkVGT1JFX1RSQU5TRk9STSA9ICdiZWZvcmVUcmFuc2Zvcm0nLFxyXG4gIEJFRk9SRV9VUExPQUQgPSAnYmVmb3JlVXBsb2FkJyxcclxuICBBRlRFUl9VUExPQUQgPSAnYWZ0ZXJVcGxvYWQnLFxyXG4gIEZJTklTSEVEID0gJ2ZpbmlzaGVkJyxcclxuICBJTlNUQUxMID0gJ2luc3RhbGwnLFxyXG4gIFVOSU5TVEFMTCA9ICd1bmluc3RhbGwnLFxyXG4gIFVQREFURSA9ICd1cGRhdGUnLFxyXG4gIE5PVElGSUNBVElPTiA9ICdub3RpZmljYXRpb24nXHJcbn1cclxuXHJcbi8qKlxyXG4gKiB0aGVzZSBldmVudHMgd2lsbCBiZSBjYXRjaGVkIG9ubHkgYnkgcGljZ29cclxuICovXHJcbmV4cG9ydCBlbnVtIElCdXNFdmVudCB7XHJcbiAgQ09ORklHX0NIQU5HRSA9ICdDT05GSUdfQ0hBTkdFJ1xyXG59XHJcbiIsImltcG9ydCBjaGFsayBmcm9tICdjaGFsaydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnXHJcbmltcG9ydCB7IElMb2dUeXBlIH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHtcclxuICBJTG9nQXJndlR5cGUsXHJcbiAgSUxvZ0FyZ3ZUeXBlV2l0aEVycm9yLFxyXG4gIFVuZGVmaW5hYmxlLFxyXG4gIElMb2dDb2xvcixcclxuICBJTG9nZ2VyLFxyXG4gIElQaWNHb1xyXG59IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBmb3JjZU51bWJlciwgaXNEZXYgfSBmcm9tICcuLi91dGlscy9jb21tb24nXHJcblxyXG5leHBvcnQgY2xhc3MgTG9nZ2VyIGltcGxlbWVudHMgSUxvZ2dlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBsZXZlbCA9IHtcclxuICAgIFtJTG9nVHlwZS5zdWNjZXNzXTogJ2dyZWVuJyxcclxuICAgIFtJTG9nVHlwZS5pbmZvXTogJ2JsdWUnLFxyXG4gICAgW0lMb2dUeXBlLndhcm5dOiAneWVsbG93JyxcclxuICAgIFtJTG9nVHlwZS5lcnJvcl06ICdyZWQnXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgcHJpdmF0ZSBsb2dMZXZlbCE6IHN0cmluZ1xyXG4gIHByaXZhdGUgbG9nUGF0aCE6IHN0cmluZ1xyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlTG9nICh0eXBlOiBJTG9nVHlwZSwgLi4ubXNnOiBJTG9nQXJndlR5cGVXaXRoRXJyb3JbXSk6IHZvaWQge1xyXG4gICAgLy8gY2hlY2sgY29uZmlnLnNpbGVudFxyXG4gICAgaWYgKCF0aGlzLmN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3NpbGVudCcpKSB7XHJcbiAgICAgIGNvbnN0IGxvZ0hlYWRlciA9IGNoYWxrW3RoaXMubGV2ZWxbdHlwZV0gYXMgSUxvZ0NvbG9yXShgW1BpY0dvICR7dHlwZS50b1VwcGVyQ2FzZSgpfV06YClcclxuICAgICAgY29uc29sZS5sb2cobG9nSGVhZGVyLCAuLi5tc2cpXHJcbiAgICAgIHRoaXMubG9nTGV2ZWwgPSB0aGlzLmN0eC5nZXRDb25maWcoJ3NldHRpbmdzLmxvZ0xldmVsJylcclxuICAgICAgdGhpcy5sb2dQYXRoID0gdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdzZXR0aW5ncy5sb2dQYXRoJykgfHwgcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICcuL3BpY2dvLmxvZycpXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIC8vIGZpeCBsb2cgZmlsZSBpcyB0b28gbGFyZ2UsIG5vdyB0aGUgbG9nIGZpbGUncyBkZWZhdWx0IHNpemUgaXMgMTAgTUJcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jaGVja0xvZ0ZpbGVJc0xhcmdlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgIGlmIChyZXN1bHQuaXNMYXJnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB3YXJuaW5nTXNnID0gYExvZyBmaWxlIGlzIHRvbyBsYXJnZSAoPiAkeyhyZXN1bHQubG9nRmlsZVNpemVMaW1pdCEpIC8gMTAyNCAvIDEwMjQgfHwgJzEwJ30gTUIpLCByZWNyZWF0ZSBsb2cgZmlsZWBcclxuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdbUGljR28gV0FSTl06JyksIHdhcm5pbmdNc2cpXHJcbiAgICAgICAgICAgIHRoaXMucmVjcmVhdGVMb2dGaWxlKHRoaXMubG9nUGF0aClcclxuICAgICAgICAgICAgbXNnLnVuc2hpZnQod2FybmluZ01zZylcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuaGFuZGxlV3JpdGVMb2codGhpcy5sb2dQYXRoLCB0eXBlLCAuLi5tc2cpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgLy8gd2h5Pz8/XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUGljR28gRXJyb3JdIG9uIGNoZWNraW5nIGxvZyBmaWxlIHNpemUnLCBlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgMClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tMb2dGaWxlSXNMYXJnZSAobG9nUGF0aDogc3RyaW5nKToge1xyXG4gICAgaXNMYXJnZTogYm9vbGVhblxyXG4gICAgbG9nRmlsZVNpemU/OiBudW1iZXJcclxuICAgIGxvZ0ZpbGVTaXplTGltaXQ/OiBudW1iZXJcclxuICB9IHtcclxuICAgIGlmIChmcy5leGlzdHNTeW5jKGxvZ1BhdGgpKSB7XHJcbiAgICAgIGNvbnN0IGxvZ0ZpbGVTaXplID0gZnMuc3RhdFN5bmMobG9nUGF0aCkuc2l6ZVxyXG4gICAgICBjb25zdCBsb2dGaWxlU2l6ZUxpbWl0ID0gZm9yY2VOdW1iZXIodGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPG51bWJlcj4+KCdzZXR0aW5ncy5sb2dGaWxlU2l6ZUxpbWl0JykgfHwgMTApICogMTAyNCAqIDEwMjQgLy8gMTAgTUIgZGVmYXVsdFxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGlzTGFyZ2U6IGxvZ0ZpbGVTaXplID4gbG9nRmlsZVNpemVMaW1pdCxcclxuICAgICAgICBsb2dGaWxlU2l6ZSxcclxuICAgICAgICBsb2dGaWxlU2l6ZUxpbWl0XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlzTGFyZ2U6IGZhbHNlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY3JlYXRlTG9nRmlsZSAobG9nUGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2dQYXRoKSkge1xyXG4gICAgICBmcy51bmxpbmtTeW5jKGxvZ1BhdGgpXHJcbiAgICAgIGZzLmNyZWF0ZUZpbGVTeW5jKGxvZ1BhdGgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVdyaXRlTG9nIChsb2dQYXRoOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgLi4ubXNnOiBJTG9nQXJndlR5cGVXaXRoRXJyb3JbXSk6IHZvaWQge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuY2hlY2tMb2dMZXZlbCh0eXBlLCB0aGlzLmxvZ0xldmVsKSkge1xyXG4gICAgICAgIGxldCBsb2cgPSBgJHtkYXlqcygpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpfSBbUGljR28gJHt0eXBlLnRvVXBwZXJDYXNlKCl9XSBgXHJcbiAgICAgICAgbXNnLmZvckVhY2goKGl0ZW06IElMb2dBcmd2VHlwZVdpdGhFcnJvcikgPT4ge1xyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvciAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgICAgICAgIGxvZyArPSBgXFxuLS0tLS0tRXJyb3IgU3RhY2sgQmVnaW4tLS0tLS1cXG4ke3V0aWwuZm9ybWF0KGl0ZW0/LnN0YWNrKX1cXG4tLS0tLS0tRXJyb3IgU3RhY2sgRW5kLS0tLS0tLSBgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgICAgaXRlbSA9IEpTT04uc3RyaW5naWZ5KGl0ZW0sIG51bGwsIDIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nICs9IGAke2l0ZW0gYXMgc3RyaW5nfSBgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICBsb2cgKz0gJ1xcbidcclxuICAgICAgICAvLyBBIHN5bmNocm9uaXplZCBhcHByb2FjaCB0byBhdm9pZCBsb2cgbXNnIHNlcXVlbmNlIGVycm9yc1xyXG4gICAgICAgIGZzLmFwcGVuZEZpbGVTeW5jKGxvZ1BhdGgsIGxvZylcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbUGljR28gRXJyb3JdIG9uIHdyaXRpbmcgbG9nIGZpbGUnLCBlKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjaGVja0xvZ0xldmVsICh0eXBlOiBzdHJpbmcsIGxldmVsOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBzdHJpbmdbXSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGxldmVsID09PSB1bmRlZmluZWQgfHwgbGV2ZWwgPT09ICdhbGwnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZXZlbCkpIHtcclxuICAgICAgcmV0dXJuIGxldmVsLnNvbWUoKGl0ZW06IHN0cmluZykgPT4gKGl0ZW0gPT09IHR5cGUgfHwgaXRlbSA9PT0gJ2FsbCcpKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHR5cGUgPT09IGxldmVsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdWNjZXNzICguLi5tc2c6IElMb2dBcmd2VHlwZVtdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuc3VjY2VzcywgLi4ubXNnKVxyXG4gIH1cclxuXHJcbiAgaW5mbyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlTG9nKElMb2dUeXBlLmluZm8sIC4uLm1zZylcclxuICB9XHJcblxyXG4gIGVycm9yICguLi5tc2c6IElMb2dBcmd2VHlwZVdpdGhFcnJvcltdKTogdm9pZCB7XHJcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuZXJyb3IsIC4uLm1zZylcclxuICB9XHJcblxyXG4gIHdhcm4gKC4uLm1zZzogSUxvZ0FyZ3ZUeXBlW10pOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLmhhbmRsZUxvZyhJTG9nVHlwZS53YXJuLCAuLi5tc2cpXHJcbiAgfVxyXG5cclxuICBkZWJ1ZyAoLi4ubXNnOiBJTG9nQXJndlR5cGVbXSk6IHZvaWQge1xyXG4gICAgaWYgKGlzRGV2KCkpIHtcclxuICAgICAgdGhpcy5oYW5kbGVMb2coSUxvZ1R5cGUuaW5mbywgLi4ubXNnKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgTG9nZ2VyXHJcbiIsImltcG9ydCB7IElQaWNHbyB9IGZyb20gJy4uL3R5cGVzJ1xyXG5cclxuLyoqXHJcbiAqIGNyZWF0ZSBhbiB1bmlxdWUgY29udGV4dCBmb3IgZWFjaCB1cGxvYWQgcHJvY2Vzc1xyXG4gKiBAcGFyYW0gY3R4XHJcbiAqL1xyXG5leHBvcnQgY29uc3QgY3JlYXRlQ29udGV4dCA9IChjdHg6IElQaWNHbyk6IElQaWNHbyA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIGNvbmZpZ1BhdGg6IGN0eC5jb25maWdQYXRoLFxyXG4gICAgYmFzZURpcjogY3R4LmJhc2VEaXIsXHJcbiAgICBsb2c6IGN0eC5sb2csXHJcbiAgICBjbWQ6IGN0eC5jbWQsXHJcbiAgICBvdXRwdXQ6IFtdLFxyXG4gICAgaW5wdXQ6IFtdLFxyXG4gICAgcGx1Z2luTG9hZGVyOiBjdHgucGx1Z2luTG9hZGVyLFxyXG4gICAgcGx1Z2luSGFuZGxlcjogY3R4LnBsdWdpbkhhbmRsZXIsXHJcbiAgICBSZXF1ZXN0OiBjdHguUmVxdWVzdCxcclxuICAgIGhlbHBlcjogY3R4LmhlbHBlcixcclxuICAgIFZFUlNJT046IGN0eC5WRVJTSU9OLFxyXG4gICAgR1VJX1ZFUlNJT046IGN0eC5HVUlfVkVSU0lPTixcclxuICAgIHJlcXVlc3Q6IGN0eC5yZXF1ZXN0LFxyXG4gICAgaTE4bjogY3R4LmkxOG4sXHJcbiAgICBnZXRDb25maWc6IGN0eC5nZXRDb25maWcuYmluZChjdHgpLFxyXG4gICAgc2F2ZUNvbmZpZzogY3R4LnNhdmVDb25maWcuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQ29uZmlnOiBjdHgucmVtb3ZlQ29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHNldENvbmZpZzogY3R4LnNldENvbmZpZy5iaW5kKGN0eCksXHJcbiAgICB1bnNldENvbmZpZzogY3R4LnVuc2V0Q29uZmlnLmJpbmQoY3R4KSxcclxuICAgIHVwbG9hZDogY3R4LnVwbG9hZC5iaW5kKGN0eCksXHJcbiAgICBhZGRMaXN0ZW5lcjogY3R4LmFkZExpc3RlbmVyLmJpbmQoY3R4KSxcclxuICAgIG9uOiBjdHgub24uYmluZChjdHgpLFxyXG4gICAgb25jZTogY3R4Lm9uY2UuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlTGlzdGVuZXI6IGN0eC5yZW1vdmVMaXN0ZW5lci5iaW5kKGN0eCksXHJcbiAgICBvZmY6IGN0eC5vZmYuYmluZChjdHgpLFxyXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBjdHgucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHNldE1heExpc3RlbmVyczogY3R4LnNldE1heExpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBnZXRNYXhMaXN0ZW5lcnM6IGN0eC5nZXRNYXhMaXN0ZW5lcnMuYmluZChjdHgpLFxyXG4gICAgbGlzdGVuZXJzOiBjdHgubGlzdGVuZXJzLmJpbmQoY3R4KSxcclxuICAgIHJhd0xpc3RlbmVyczogY3R4LnJhd0xpc3RlbmVycy5iaW5kKGN0eCksXHJcbiAgICBlbWl0OiBjdHguZW1pdC5iaW5kKGN0eCksXHJcbiAgICBsaXN0ZW5lckNvdW50OiBjdHgubGlzdGVuZXJDb3VudC5iaW5kKGN0eCksXHJcbiAgICBwcmVwZW5kTGlzdGVuZXI6IGN0eC5wcmVwZW5kTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgcHJlcGVuZE9uY2VMaXN0ZW5lcjogY3R4LnByZXBlbmRPbmNlTGlzdGVuZXIuYmluZChjdHgpLFxyXG4gICAgZXZlbnROYW1lczogY3R4LmV2ZW50TmFtZXMuYmluZChjdHgpXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuaW1wb3J0IHsgSUxpZmVjeWNsZVBsdWdpbnMsIElQaWNHbywgSVBsdWdpbiwgVW5kZWZpbmFibGUgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgaGFuZGxlVXJsRW5jb2RlIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4uL3V0aWxzL2NyZWF0ZUNvbnRleHQnXHJcblxyXG5leHBvcnQgY2xhc3MgTGlmZWN5Y2xlIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcblxyXG4gIGNvbnN0cnVjdG9yIChjdHg6IElQaWNHbykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jdHggPSBjdHhcclxuICB9XHJcblxyXG4gIGFzeW5jIHN0YXJ0IChpbnB1dDogYW55W10pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgLy8gZW5zdXJlIGV2ZXJ5IHVwbG9hZCBwcm9jZXNzIGhhcyBhbiB1bmlxdWUgY29udGV4dFxyXG4gICAgY29uc3QgY3R4ID0gY3JlYXRlQ29udGV4dCh0aGlzLmN0eClcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGltYWdlcyBpbnB1dFxyXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIGFuIGFycmF5LicpXHJcbiAgICAgIH1cclxuICAgICAgY3R4LmlucHV0ID0gaW5wdXRcclxuICAgICAgY3R4Lm91dHB1dCA9IFtdXHJcblxyXG4gICAgICAvLyBsaWZlY3ljbGUgbWFpblxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVRyYW5zZm9ybShjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9UcmFuc2Zvcm0oY3R4KVxyXG4gICAgICBhd2FpdCB0aGlzLmJlZm9yZVVwbG9hZChjdHgpXHJcbiAgICAgIGF3YWl0IHRoaXMuZG9VcGxvYWQoY3R4KVxyXG4gICAgICBhd2FpdCB0aGlzLmFmdGVyVXBsb2FkKGN0eClcclxuICAgICAgcmV0dXJuIGN0eFxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIGN0eC5sb2cud2FybihJQnVpbGRJbkV2ZW50LkZBSUxFRClcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIC0xKVxyXG4gICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgY3R4LmxvZy5lcnJvcihlKVxyXG4gICAgICBpZiAoY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PignZGVidWcnKSkge1xyXG4gICAgICAgIHRocm93IGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gY3R4XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGJlZm9yZVRyYW5zZm9ybSAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4ge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5VUExPQURfUFJPR1JFU1MsIDApXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LkJFRk9SRV9UUkFOU0ZPUk0sIGN0eClcclxuICAgIGN0eC5sb2cuaW5mbygnQmVmb3JlIHRyYW5zZm9ybScpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVUcmFuc2Zvcm1QbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVHJhbnNmb3JtIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMzApXHJcbiAgICBjb25zdCB0eXBlID0gY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+PigncGljQmVkLnRyYW5zZm9ybWVyJykgfHwgJ3BhdGgnXHJcbiAgICBsZXQgY3VycmVudFRyYW5zZm9ybWVyID0gdHlwZVxyXG4gICAgbGV0IHRyYW5zZm9ybWVyID0gY3R4LmhlbHBlci50cmFuc2Zvcm1lci5nZXQodHlwZSlcclxuICAgIGlmICghdHJhbnNmb3JtZXIpIHtcclxuICAgICAgdHJhbnNmb3JtZXIgPSBjdHguaGVscGVyLnRyYW5zZm9ybWVyLmdldCgncGF0aCcpXHJcbiAgICAgIGN1cnJlbnRUcmFuc2Zvcm1lciA9ICdwYXRoJ1xyXG4gICAgICBjdHgubG9nLndhcm4oYENhbid0IGZpbmQgdHJhbnNmb3JtZXIgLSAke3R5cGV9LCBzd2l0Y2ggdG8gZGVmYXVsdCB0cmFuc2Zvcm1lciAtIHBhdGhgKVxyXG4gICAgfVxyXG4gICAgY3R4LmxvZy5pbmZvKGBUcmFuc2Zvcm1pbmcuLi4gQ3VycmVudCB0cmFuc2Zvcm1lciBpcyBbJHtjdXJyZW50VHJhbnNmb3JtZXJ9XWApXHJcbiAgICBhd2FpdCB0cmFuc2Zvcm1lcj8uaGFuZGxlKGN0eClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYmVmb3JlVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgNjApXHJcbiAgICBjdHgubG9nLmluZm8oJ0JlZm9yZSB1cGxvYWQnKVxyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5CRUZPUkVfVVBMT0FELCBjdHgpXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZVBsdWdpbnMoY3R4LmhlbHBlci5iZWZvcmVVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGRvVXBsb2FkIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiB7XHJcbiAgICBsZXQgdHlwZSA9IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC51cGxvYWRlcicpIHx8IGN0eC5nZXRDb25maWc8VW5kZWZpbmFibGU8c3RyaW5nPj4oJ3BpY0JlZC5jdXJyZW50JykgfHwgJ3NtbXMnXHJcbiAgICBsZXQgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCh0eXBlKVxyXG4gICAgbGV0IGN1cnJlbnRUcmFuc2Zvcm1lciA9IHR5cGVcclxuICAgIGlmICghdXBsb2FkZXIpIHtcclxuICAgICAgdHlwZSA9ICdzbW1zJ1xyXG4gICAgICBjdXJyZW50VHJhbnNmb3JtZXIgPSAnc21tcydcclxuICAgICAgdXBsb2FkZXIgPSBjdHguaGVscGVyLnVwbG9hZGVyLmdldCgnc21tcycpXHJcbiAgICAgIGN0eC5sb2cud2FybihgQ2FuJ3QgZmluZCB1cGxvYWRlciAtICR7dHlwZX0sIHN3aXRjaCB0byBkZWZhdWx0IHVwbG9hZGVyIC0gc21tc2ApXHJcbiAgICB9XHJcbiAgICBjdHgubG9nLmluZm8oYFVwbG9hZGluZy4uLiBDdXJyZW50IHVwbG9hZGVyIGlzIFske2N1cnJlbnRUcmFuc2Zvcm1lcn1dYClcclxuICAgIGF3YWl0IHVwbG9hZGVyPy5oYW5kbGUoY3R4KVxyXG4gICAgZm9yIChjb25zdCBvdXRwdXRJbWcgb2YgY3R4Lm91dHB1dCkge1xyXG4gICAgICBvdXRwdXRJbWcudHlwZSA9IHR5cGVcclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgYWZ0ZXJVcGxvYWQgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuQUZURVJfVVBMT0FELCBjdHgpXHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgMTAwKVxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVQbHVnaW5zKGN0eC5oZWxwZXIuYWZ0ZXJVcGxvYWRQbHVnaW5zLCBjdHgpXHJcbiAgICBsZXQgbXNnID0gJydcclxuICAgIGNvbnN0IGxlbmd0aCA9IGN0eC5vdXRwdXQubGVuZ3RoXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY3R4Lm91dHB1dFtpXS5pbWdVcmwgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgbXNnICs9IGhhbmRsZVVybEVuY29kZShjdHgub3V0cHV0W2ldLmltZ1VybCEpXHJcbiAgICAgICAgaWYgKGkgIT09IGxlbmd0aCAtIDEpIHtcclxuICAgICAgICAgIG1zZyArPSAnXFxuJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5iYXNlNjRJbWFnZVxyXG4gICAgICBkZWxldGUgY3R4Lm91dHB1dFtpXS5idWZmZXJcclxuICAgIH1cclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuRklOSVNIRUQsIGN0eClcclxuICAgIGN0eC5sb2cuc3VjY2VzcyhgXFxuJHttc2d9YClcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUGx1Z2lucyAobGlmZUN5Y2xlUGx1Z2luczogSUxpZmVjeWNsZVBsdWdpbnMsIGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+IHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldExpc3QoKVxyXG4gICAgY29uc3QgcGx1Z2luTmFtZXMgPSBsaWZlQ3ljbGVQbHVnaW5zLmdldElkTGlzdCgpXHJcbiAgICBjb25zdCBsaWZlQ3ljbGVOYW1lID0gbGlmZUN5Y2xlUGx1Z2lucy5nZXROYW1lKClcclxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBsdWdpbnMubWFwKGFzeW5jIChwbHVnaW46IElQbHVnaW4sIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjdHgubG9nLmluZm8oYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBydW5uaW5nYClcclxuICAgICAgICBhd2FpdCBwbHVnaW4uaGFuZGxlKGN0eClcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoYCR7bGlmZUN5Y2xlTmFtZX06ICR7cGx1Z2luTmFtZXNbaW5kZXhdfSBlcnJvcmApXHJcbiAgICAgICAgdGhyb3cgZVxyXG4gICAgICB9XHJcbiAgICB9KSlcclxuICAgIHJldHVybiBjdHhcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IExpZmVjeWNsZVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElTbW1zQ29uZmlnLCBJT2xkUmVxT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlciwgYXBpVG9rZW46IHN0cmluZywgYmFja3VwRG9tYWluID0gJycpOiBJT2xkUmVxT3B0aW9ucyA9PiB7XHJcbiAgY29uc3QgZG9tYWluID0gYmFja3VwRG9tYWluIHx8ICdzbS5tcydcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICB1cmw6IGBodHRwczovLyR7ZG9tYWlufS9hcGkvdjIvdXBsb2FkYCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgY29udGVudFR5cGU6ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyxcclxuICAgICAgJ1VzZXItQWdlbnQnOiAnUGljR28nLFxyXG4gICAgICBBdXRob3JpemF0aW9uOiBhcGlUb2tlblxyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIHNtZmlsZToge1xyXG4gICAgICAgIHZhbHVlOiBpbWFnZSxcclxuICAgICAgICBvcHRpb25zOiB7XHJcbiAgICAgICAgICBmaWxlbmFtZTogZmlsZU5hbWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHNzbDogJ3RydWUnXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IHNtbXNDb25maWcgPSBjdHguZ2V0Q29uZmlnPElTbW1zQ29uZmlnPigncGljQmVkLnNtbXMnKVxyXG4gIGlmICghc21tc0NvbmZpZykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IGZpbmQgc21tcyBjb25maWchJylcclxuICB9XHJcbiAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICBmb3IgKGNvbnN0IGltZyBvZiBpbWdMaXN0KSB7XHJcbiAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBpbWFnZSwgc21tc0NvbmZpZz8udG9rZW4sIHNtbXNDb25maWc/LmJhY2t1cERvbWFpbilcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXM6IHN0cmluZyA9IGF3YWl0IGN0eC5yZXF1ZXN0KHBvc3RDb25maWcpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UocmVzKVxyXG4gICAgICAgIGlmIChib2R5LmNvZGUgPT09ICdzdWNjZXNzJykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmRhdGEudXJsXHJcbiAgICAgICAgfSBlbHNlIGlmIChib2R5LmNvZGUgPT09ICdpbWFnZV9yZXBlYXRlZCcgJiYgdHlwZW9mIGJvZHkuaW1hZ2VzID09PSAnc3RyaW5nJykgeyAvLyBkbyBleHRyYSBjaGVjayBzaW5jZSB0aGlzIGVycm9yIHJldHVybiBpcyBub3QgZG9jdW1lbnRlZCBhdCBodHRwczovL2RvYy5zbS5tcy8jYXBpLUltYWdlLVVwbG9hZFxyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmltYWdlc1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICBib2R5OiBib2R5Lm1lc3NhZ2VcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keSlcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xyXG4gICAgICAgIGN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gY3R4XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVNtbXNDb25maWc+KCdwaWNCZWQuc21tcycpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICd0b2tlbicsXHJcbiAgICAgIG1lc3NhZ2U6ICdhcGkgdG9rZW4nLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfVE9LRU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnRva2VuIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JhY2t1cERvbWFpbicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTicpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU4nKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJhY2t1cERvbWFpbiB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3Rlcignc21tcycsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9TTU1TJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSVRjeXVuQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuXHJcbi8vIGdlbmVyYXRlIENPUyBzaWduYXR1cmUgc3RyaW5nXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElTaWduYXR1cmUge1xyXG4gIHNpZ25hdHVyZTogc3RyaW5nXHJcbiAgYXBwSWQ6IHN0cmluZ1xyXG4gIGJ1Y2tldDogc3RyaW5nXHJcbiAgc2lnblRpbWU6IHN0cmluZ1xyXG59XHJcblxyXG5jb25zdCBnZW5lcmF0ZVNpZ25hdHVyZSA9IChvcHRpb25zOiBJVGN5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBJU2lnbmF0dXJlID0+IHtcclxuICBjb25zdCBzZWNyZXRJZCA9IG9wdGlvbnMuc2VjcmV0SWRcclxuICBjb25zdCBzZWNyZXRLZXkgPSBvcHRpb25zLnNlY3JldEtleVxyXG4gIGNvbnN0IGFwcElkID0gb3B0aW9ucy5hcHBJZFxyXG4gIGNvbnN0IGJ1Y2tldCA9IG9wdGlvbnMuYnVja2V0XHJcbiAgbGV0IHNpZ25hdHVyZVxyXG4gIGxldCBzaWduVGltZTogc3RyaW5nID0gJydcclxuICBpZiAoIW9wdGlvbnMudmVyc2lvbiB8fCBvcHRpb25zLnZlcnNpb24gPT09ICd2NCcpIHtcclxuICAgIGNvbnN0IHJhbmRvbSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMDAwMDAwMDAwKVxyXG4gICAgY29uc3QgY3VycmVudCA9IE1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkgLyAxMDAwKSAtIDFcclxuICAgIGNvbnN0IGV4cGlyZWQgPSBjdXJyZW50ICsgMzYwMFxyXG5cclxuICAgIGNvbnN0IG11bHRpU2lnbmF0dXJlID0gYGE9JHthcHBJZH0mYj0ke2J1Y2tldH0maz0ke3NlY3JldElkfSZlPSR7ZXhwaXJlZH0mdD0ke2N1cnJlbnR9JnI9JHtyYW5kb219JmY9YFxyXG5cclxuICAgIGNvbnN0IHNpZ25IZXhLZXkgPSBjcnlwdG8uY3JlYXRlSG1hYygnc2hhMScsIHNlY3JldEtleSkudXBkYXRlKG11bHRpU2lnbmF0dXJlKS5kaWdlc3QoKVxyXG4gICAgY29uc3QgdGVtcFN0cmluZyA9IEJ1ZmZlci5jb25jYXQoW3NpZ25IZXhLZXksIEJ1ZmZlci5mcm9tKG11bHRpU2lnbmF0dXJlKV0pXHJcbiAgICBzaWduYXR1cmUgPSBCdWZmZXIuZnJvbSh0ZW1wU3RyaW5nKS50b1N0cmluZygnYmFzZTY0JylcclxuICB9IGVsc2Uge1xyXG4gICAgLy8gaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi83Nzc4I3NpZ25hdHVyZVxyXG4gICAgY29uc3QgdG9kYXkgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMClcclxuICAgIGNvbnN0IHRvbW9ycm93ID0gdG9kYXkgKyA4NjQwMFxyXG4gICAgc2lnblRpbWUgPSBgJHt0b2RheX07JHt0b21vcnJvd31gXHJcbiAgICBjb25zdCBzaWduS2V5ID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBzZWNyZXRLZXkpLnVwZGF0ZShzaWduVGltZSkuZGlnZXN0KCdoZXgnKVxyXG4gICAgY29uc3QgaHR0cFN0cmluZyA9IGBwdXRcXG4vJHtvcHRpb25zLnBhdGh9JHtmaWxlTmFtZX1cXG5cXG5ob3N0PSR7b3B0aW9ucy5idWNrZXR9LmNvcy4ke29wdGlvbnMuYXJlYX0ubXlxY2xvdWQuY29tXFxuYFxyXG4gICAgY29uc3Qgc2hhMWVkSHR0cFN0cmluZyA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGExJykudXBkYXRlKGh0dHBTdHJpbmcpLmRpZ2VzdCgnaGV4JylcclxuICAgIGNvbnN0IHN0cmluZ1RvU2lnbiA9IGBzaGExXFxuJHtzaWduVGltZX1cXG4ke3NoYTFlZEh0dHBTdHJpbmd9XFxuYFxyXG4gICAgc2lnbmF0dXJlID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBzaWduS2V5KS51cGRhdGUoc3RyaW5nVG9TaWduKS5kaWdlc3QoJ2hleCcpXHJcbiAgfVxyXG4gIHJldHVybiB7XHJcbiAgICBzaWduYXR1cmUsXHJcbiAgICBhcHBJZCxcclxuICAgIGJ1Y2tldCxcclxuICAgIHNpZ25UaW1lXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBwb3N0T3B0aW9ucyA9IChvcHRpb25zOiBJVGN5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIHNpZ25hdHVyZTogSVNpZ25hdHVyZSwgaW1hZ2U6IEJ1ZmZlciwgdmVyc2lvbjogc3RyaW5nKTogSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlID0+IHtcclxuICBjb25zdCBhcmVhID0gb3B0aW9ucy5hcmVhXHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aFxyXG4gIGlmICghb3B0aW9ucy52ZXJzaW9uIHx8IG9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0Jykge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIHVybDogYGh0dHA6Ly8ke2FyZWF9LmZpbGUubXlxY2xvdWQuY29tL2ZpbGVzL3YyLyR7c2lnbmF0dXJlLmFwcElkfS8ke3NpZ25hdHVyZS5idWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZmlsZU5hbWV9YCxcclxuICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgIEhvc3Q6IGAke2FyZWF9LmZpbGUubXlxY2xvdWQuY29tYCxcclxuICAgICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUuc2lnbmF0dXJlLFxyXG4gICAgICAgIGNvbnRlbnRUeXBlOiAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScsXHJcbiAgICAgICAgdXNlckFnZW50OiBgUGljR287JHt2ZXJzaW9ufTtudWxsO251bGxgXHJcbiAgICAgIH0sXHJcbiAgICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgICAgb3A6ICd1cGxvYWQnLFxyXG4gICAgICAgIGZpbGVjb250ZW50OiBpbWFnZVxyXG4gICAgICB9LFxyXG4gICAgICByZXNvbHZlV2l0aEZ1bGxSZXNwb25zZTogdHJ1ZVxyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICB1cmw6IGBodHRwOi8vJHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb20vJHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWAsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICBIb3N0OiBgJHtvcHRpb25zLmJ1Y2tldH0uY29zLiR7b3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb21gLFxyXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBxLXNpZ24tYWxnb3JpdGhtPXNoYTEmcS1haz0ke29wdGlvbnMuc2VjcmV0SWR9JnEtc2lnbi10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWtleS10aW1lPSR7c2lnbmF0dXJlLnNpZ25UaW1lfSZxLWhlYWRlci1saXN0PWhvc3QmcS11cmwtcGFyYW0tbGlzdD0mcS1zaWduYXR1cmU9JHtzaWduYXR1cmUuc2lnbmF0dXJlfWAsXHJcbiAgICAgICAgY29udGVudFR5cGU6IG1pbWUubG9va3VwKGZpbGVOYW1lKSxcclxuICAgICAgICB1c2VyQWdlbnQ6IGBQaWNHbzske3ZlcnNpb259O251bGw7bnVsbGBcclxuICAgICAgfSxcclxuICAgICAgYm9keTogaW1hZ2UsXHJcbiAgICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbyB8IGJvb2xlYW4+ID0+IHtcclxuICBjb25zdCB0Y1l1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElUY3l1bkNvbmZpZz4oJ3BpY0JlZC50Y3l1bicpXHJcbiAgaWYgKCF0Y1l1bk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIHRlbmNlbnQgQ09TIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgY29uc3QgY3VzdG9tVXJsID0gdGNZdW5PcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgcGF0aCA9IHRjWXVuT3B0aW9ucy5wYXRoXHJcbiAgICBjb25zdCB1c2VWNCA9ICF0Y1l1bk9wdGlvbnMudmVyc2lvbiB8fCB0Y1l1bk9wdGlvbnMudmVyc2lvbiA9PT0gJ3Y0J1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZW5lcmF0ZVNpZ25hdHVyZSh0Y1l1bk9wdGlvbnMsIGltZy5maWxlTmFtZSlcclxuICAgICAgICBpZiAoIXNpZ25hdHVyZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpbWFnZSA9IGltZy5idWZmZXJcclxuICAgICAgICBpZiAoIWltYWdlICYmIGltZy5iYXNlNjRJbWFnZSkge1xyXG4gICAgICAgICAgaW1hZ2UgPSBCdWZmZXIuZnJvbShpbWcuYmFzZTY0SW1hZ2UsICdiYXNlNjQnKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBvcHRpb25zID0gcG9zdE9wdGlvbnModGNZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UsIGN0eC5HVUlfVkVSU0lPTiB8fCBjdHguVkVSU0lPTilcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgICAgLnRoZW4oKHJlczogYW55KSA9PiByZXMpXHJcbiAgICAgICAgICAuY2F0Y2goKGVycjogRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXHJcbiAgICAgICAgICAgICAgYm9keToge1xyXG4gICAgICAgICAgICAgICAgbXNnOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdBVVRIX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgICAgICAgZXJyXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIGxldCBib2R5XHJcbiAgICAgICAgaWYgKHVzZVY0ICYmIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShyZXMpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGJvZHkgPSByZXNcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gNDAwKSB7XHJcbiAgICAgICAgICBpZiAoYm9keT8uYm9keT8uZXJyKSB7XHJcbiAgICAgICAgICAgIHRocm93IGJvZHkuYm9keS5lcnJcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Py5ib2R5Py5tc2cgfHwgYm9keT8uYm9keT8ubWVzc2FnZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uVXJsID0gdGNZdW5PcHRpb25zLm9wdGlvbnMgfHwgJydcclxuICAgICAgICBpZiAodXNlVjQgJiYgYm9keS5tZXNzYWdlID09PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYmFzZTY0SW1hZ2VcclxuICAgICAgICAgIGRlbGV0ZSBpbWcuYnVmZmVyXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX1gXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Ym9keS5kYXRhLnNvdXJjZV91cmwgYXMgc3RyaW5nfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCF1c2VWNCAmJiBib2R5ICYmIGJvZHkuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgaWYgKGN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Y3VzdG9tVXJsfS8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShpbWcuZmlsZU5hbWUpfSR7b3B0aW9uVXJsfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgaHR0cHM6Ly8ke3RjWXVuT3B0aW9ucy5idWNrZXR9LmNvcy4ke3RjWXVuT3B0aW9ucy5hcmVhfS5teXFjbG91ZC5jb20vJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUkkoaW1nLmZpbGVOYW1lKX0ke29wdGlvblVybH1gXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihyZXMuYm9keS5tc2cpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmICghdGNZdW5PcHRpb25zLnZlcnNpb24gfHwgdGNZdW5PcHRpb25zLnZlcnNpb24gPT09ICd2NCcpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZShlcnIuZXJyb3IpXHJcbiAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEX1JFQVNPTicsIHtcclxuICAgICAgICAgICAgY29kZTogYm9keS5jb2RlIGFzIHN0cmluZ1xyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB0ZXh0OiAnaHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9kb2N1bWVudC9wcm9kdWN0LzQzNi84NDMyJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVRjeXVuQ29uZmlnPigncGljQmVkLnRjeXVuJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3ZlcnNpb24nLFxyXG4gICAgICB0eXBlOiAnbGlzdCcsXHJcbiAgICAgIGFsaWFzOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT04nKSxcclxuICAgICAgY2hvaWNlczogWyd2NCcsICd2NSddLFxyXG4gICAgICBkZWZhdWx0OiAndjUnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdzZWNyZXRJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5zZWNyZXRJZCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdzZWNyZXRLZXknLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9TRUNSRVRLRVknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldEtleSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdidWNrZXQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcHBJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hcHBJZCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEJykgfSxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcmVhJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9BUkVBJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hcmVhIHx8ICcnLFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEgnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5jdXN0b21VcmwgfHwgJycsXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkwnKSB9LFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5vcHRpb25zIHx8ICcnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX09QVElPTlMnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUycpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ3RjeXVuJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1RFTkNFTlRDTE9VRCcpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUdpdGh1YkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoSlNPTiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAoZmlsZU5hbWU6IHN0cmluZywgb3B0aW9uczogSUdpdGh1YkNvbmZpZywgZGF0YTogYW55KTogSU9sZFJlcU9wdGlvbnNXaXRoSlNPTiA9PiB7XHJcbiAgY29uc3QgcGF0aCA9IG9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gIGNvbnN0IHsgdG9rZW4sIHJlcG8gfSA9IG9wdGlvbnNcclxuICByZXR1cm4ge1xyXG4gICAgbWV0aG9kOiAnUFVUJyxcclxuICAgIHVybDogYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtyZXBvfS9jb250ZW50cy8ke2VuY29kZVVSSShwYXRoKX0ke2VuY29kZVVSSShmaWxlTmFtZSl9YCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogYHRva2VuICR7dG9rZW59YCxcclxuICAgICAgJ1VzZXItQWdlbnQnOiAnUGljR28nLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpXHJcbiAgICB9LFxyXG4gICAgYm9keTogZGF0YSxcclxuICAgIGpzb246IHRydWVcclxuICB9IGFzIGNvbnN0XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgZ2l0aHViT3B0aW9ucyA9IGN0eC5nZXRDb25maWc8SUdpdGh1YkNvbmZpZz4oJ3BpY0JlZC5naXRodWInKVxyXG4gIGlmICghZ2l0aHViT3B0aW9ucykge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGZpbmQgZ2l0aHViIGNvbmZpZycpXHJcbiAgfVxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBpbWdMaXN0ID0gY3R4Lm91dHB1dFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGltZy5iYXNlNjRJbWFnZSB8fCBCdWZmZXIuZnJvbShpbWcuYnVmZmVyKS50b1N0cmluZygnYmFzZTY0JylcclxuICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgbWVzc2FnZTogJ1VwbG9hZCBieSBQaWNHbycsXHJcbiAgICAgICAgICBicmFuY2g6IGdpdGh1Yk9wdGlvbnMuYnJhbmNoLFxyXG4gICAgICAgICAgY29udGVudDogYmFzZTY0SW1hZ2UsXHJcbiAgICAgICAgICBwYXRoOiBnaXRodWJPcHRpb25zLnBhdGggKyBlbmNvZGVVUkkoaW1nLmZpbGVOYW1lKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3N0Q29uZmlnID0gcG9zdE9wdGlvbnMoaW1nLmZpbGVOYW1lLCBnaXRodWJPcHRpb25zLCBkYXRhKVxyXG4gICAgICAgIGNvbnN0IGJvZHk6IHtcclxuICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgZG93bmxvYWRfdXJsOiBzdHJpbmdcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ID0gYXdhaXQgY3R4LnJlcXVlc3QocG9zdENvbmZpZylcclxuICAgICAgICBpZiAoYm9keSkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGlmIChnaXRodWJPcHRpb25zLmN1c3RvbVVybCkge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYCR7Z2l0aHViT3B0aW9ucy5jdXN0b21Vcmx9LyR7Z2l0aHViT3B0aW9ucy5wYXRofSR7aW1nLmZpbGVOYW1lfWBcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmNvbnRlbnQuZG93bmxvYWRfdXJsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VydmVyIGVycm9yLCBwbGVhc2UgdHJ5IGFnYWluJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnIpIHtcclxuICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ0NIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLJylcclxuICAgIH0pXHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUdpdGh1YkNvbmZpZz4oJ3BpY0JlZC5naXRodWInKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAncmVwbycsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9SRVBPJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUkVQTycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5yZXBvIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2JyYW5jaCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9CUkFOQ0gnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5icmFuY2ggfHwgJ21hc3RlcicsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndG9rZW4nLFxyXG4gICAgICB0eXBlOiAncGFzc3dvcmQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9UT0tFTicpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcudG9rZW4gfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfUEFUSCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdnaXRodWInLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfR0lUSFVCJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHFpbml1IGZyb20gJ3Fpbml1J1xyXG5pbXBvcnQgeyBJUGx1Z2luQ29uZmlnLCBJUWluaXVDb25maWcsIElQaWNHbywgSU9sZFJlcU9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IG1pbWUgZnJvbSAnbWltZS10eXBlcydcclxuXHJcbmZ1bmN0aW9uIHBvc3RPcHRpb25zIChvcHRpb25zOiBJUWluaXVDb25maWcsIGZpbGVOYW1lOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGltZ0Jhc2U2NDogc3RyaW5nKTogSU9sZFJlcU9wdGlvbnMge1xyXG4gIGNvbnN0IGFyZWEgPSBzZWxlY3RBcmVhKG9wdGlvbnMuYXJlYSB8fCAnejAnKVxyXG4gIGNvbnN0IHBhdGggPSBvcHRpb25zLnBhdGggfHwgJydcclxuICBjb25zdCBiYXNlNjRGaWxlTmFtZSA9IEJ1ZmZlci5mcm9tKHBhdGggKyBmaWxlTmFtZSwgJ3V0Zi04JykudG9TdHJpbmcoJ2Jhc2U2NCcpLnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgdXJsOiBgaHR0cDovL3VwbG9hZCR7YXJlYX0ucWluaXVwLmNvbS9wdXRiNjQvLTEva2V5LyR7YmFzZTY0RmlsZU5hbWV9YCxcclxuICAgIGhlYWRlcnM6IHtcclxuICAgICAgQXV0aG9yaXphdGlvbjogYFVwVG9rZW4gJHt0b2tlbn1gLFxyXG4gICAgICAnQ29udGVudC1UeXBlJzogbWltZS5sb29rdXAoZmlsZU5hbWUpIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nXHJcbiAgICB9LFxyXG4gICAgYm9keTogaW1nQmFzZTY0XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzZWxlY3RBcmVhIChhcmVhOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIHJldHVybiBhcmVhID09PSAnejAnID8gJycgOiAnLScgKyBhcmVhXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFRva2VuIChxaW5pdU9wdGlvbnM6IGFueSk6IHN0cmluZyB7XHJcbiAgY29uc3QgYWNjZXNzS2V5ID0gcWluaXVPcHRpb25zLmFjY2Vzc0tleVxyXG4gIGNvbnN0IHNlY3JldEtleSA9IHFpbml1T3B0aW9ucy5zZWNyZXRLZXlcclxuICBjb25zdCBtYWMgPSBuZXcgcWluaXUuYXV0aC5kaWdlc3QuTWFjKGFjY2Vzc0tleSwgc2VjcmV0S2V5KVxyXG4gIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICBzY29wZTogcWluaXVPcHRpb25zLmJ1Y2tldFxyXG4gIH1cclxuICBjb25zdCBwdXRQb2xpY3kgPSBuZXcgcWluaXUucnMuUHV0UG9saWN5KG9wdGlvbnMpXHJcbiAgcmV0dXJuIHB1dFBvbGljeS51cGxvYWRUb2tlbihtYWMpXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgcWluaXVPcHRpb25zID0gY3R4LmdldENvbmZpZzxJUWluaXVDb25maWc+KCdwaWNCZWQucWluaXUnKVxyXG4gIGlmICghcWluaXVPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBxaW5pdSBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHFpbml1T3B0aW9ucywgaW1nLmZpbGVOYW1lLCBnZXRUb2tlbihxaW5pdU9wdGlvbnMpLCBiYXNlNjRJbWFnZSlcclxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHJlcylcclxuICAgICAgICBpZiAoYm9keT8ua2V5KSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgY29uc3QgYmFzZVVybCA9IHFpbml1T3B0aW9ucy51cmxcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBxaW5pdU9wdGlvbnMub3B0aW9uc1xyXG4gICAgICAgICAgaW1nLmltZ1VybCA9IGAke2Jhc2VVcmx9LyR7Ym9keS5rZXkgYXMgc3RyaW5nfSR7b3B0aW9uc31gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdVUExPQURfRkFJTEVEJyksXHJcbiAgICAgICAgICAgIGJvZHk6IGJvZHkubXNnXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgY3R4LmxvZy5lcnJvcigncWluaXUgZXJyb3InLCBib2R5KVxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjdHhcclxuICB9IGNhdGNoIChlcnI6IGFueSkge1xyXG4gICAgaWYgKGVyci5tZXNzYWdlICE9PSAnVXBsb2FkIGZhaWxlZCcpIHtcclxuICAgICAgLy8gZXJyLnJlc3BvbnNlIG1heWJlIHVuZGVmaW5lZFxyXG4gICAgICBpZiAoZXJyLnJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgZXJyb3IgPSBlcnIucmVzcG9uc2UuYm9keVxyXG4gICAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyb3IuZXJyb3JcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aHJvdyBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SVFpbml1Q29uZmlnPigncGljQmVkLnFpbml1JykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfQUNDRVNTS0VZJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnc2VjcmV0S2V5JyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9TRUNSRVRLRVknKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnNlY3JldEtleSB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdidWNrZXQnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0JVQ0tFVCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYnVja2V0IHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3VybCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1VSTCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfVVJMJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfVVJMJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy51cmwgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYXJlYScsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX0FSRUEnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hcmVhIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ29wdGlvbnMnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVV9PUFRJT05TJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX01FU1NBR0VfT1BUSU9OUycpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcub3B0aW9ucyB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1FJTklVX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH1cclxuICBdXHJcbiAgcmV0dXJuIGNvbmZpZ1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiByZWdpc3RlciAoY3R4OiBJUGljR28pOiB2b2lkIHtcclxuICBjdHguaGVscGVyLnVwbG9hZGVyLnJlZ2lzdGVyKCdxaW5pdScsIHtcclxuICAgIGdldCBuYW1lICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9RSU5JVScpIH0sXHJcbiAgICBoYW5kbGUsXHJcbiAgICBjb25maWdcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBsdWdpbkNvbmZpZywgSUltZ3VyQ29uZmlnLCBJT2xkUmVxT3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi4vLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgSUxvY2FsZXNLZXkgfSBmcm9tICcuLi8uLi9pMThuL3poLUNOJ1xyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSUltZ3VyQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBpbWdCYXNlNjQ6IHN0cmluZyk6IElPbGRSZXFPcHRpb25zID0+IHtcclxuICBjb25zdCBjbGllbnRJZCA9IG9wdGlvbnMuY2xpZW50SWRcclxuICBjb25zdCBvYmo6IElPbGRSZXFPcHRpb25zID0ge1xyXG4gICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICB1cmw6ICdodHRwczovL2FwaS5pbWd1ci5jb20vMy9pbWFnZScsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEF1dGhvcml6YXRpb246IGBDbGllbnQtSUQgJHtjbGllbnRJZH1gLFxyXG4gICAgICAnY29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGEnLFxyXG4gICAgICBIb3N0OiAnYXBpLmltZ3VyLmNvbScsXHJcbiAgICAgICdVc2VyLUFnZW50JzogJ1BpY0dvJ1xyXG4gICAgfSxcclxuICAgIGZvcm1EYXRhOiB7XHJcbiAgICAgIGltYWdlOiBpbWdCYXNlNjQsXHJcbiAgICAgIHR5cGU6ICdiYXNlNjQnLFxyXG4gICAgICBuYW1lOiBmaWxlTmFtZVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAob3B0aW9ucy5wcm94eSkge1xyXG4gICAgb2JqLnByb3h5ID0gb3B0aW9ucy5wcm94eVxyXG4gIH1cclxuICByZXR1cm4gb2JqXHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgaW1ndXJPcHRpb25zID0gY3R4LmdldENvbmZpZzxJSW1ndXJDb25maWc+KCdwaWNCZWQuaW1ndXInKVxyXG4gIGlmICghaW1ndXJPcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCBpbWd1ciBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGZvciAoY29uc3QgaW1nIG9mIGltZ0xpc3QpIHtcclxuICAgICAgaWYgKGltZy5maWxlTmFtZSAmJiBpbWcuYnVmZmVyKSB7XHJcbiAgICAgICAgY29uc3QgYmFzZTY0SW1hZ2UgPSBpbWcuYmFzZTY0SW1hZ2UgfHwgQnVmZmVyLmZyb20oaW1nLmJ1ZmZlcikudG9TdHJpbmcoJ2Jhc2U2NCcpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKGltZ3VyT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBiYXNlNjRJbWFnZSlcclxuICAgICAgICBjb25zdCByZXM6IHN0cmluZyA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShyZXMpIDogcmVzXHJcbiAgICAgICAgaWYgKGJvZHkuc3VjY2Vzcykge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBib2R5LmRhdGEubGlua1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbicpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICBjdHguZW1pdChJQnVpbGRJbkV2ZW50Lk5PVElGSUNBVElPTiwge1xyXG4gICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HU19BTkRfTkVUV09SSycpLFxyXG4gICAgICB0ZXh0OiAnaHR0cDovL2RvY3MuaW1ndXIuY29tL2FwaS9lcnJuby8nXHJcbiAgICB9KVxyXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxyXG4gICAgdGhyb3cgZXJyPy5yZXNwb25zZT8uZGF0YSB8fCBlcnJcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGNvbmZpZyA9IChjdHg6IElQaWNHbyk6IElQbHVnaW5Db25maWdbXSA9PiB7XHJcbiAgY29uc3QgdXNlckNvbmZpZyA9IGN0eC5nZXRDb25maWc8SUltZ3VyQ29uZmlnPigncGljQmVkLmltZ3VyJykgfHwge31cclxuICBjb25zdCBjb25maWc6IElQbHVnaW5Db25maWdbXSA9IFtcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2NsaWVudElkJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9DTElFTlRJRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY2xpZW50SWQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncHJveHknLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9JTUdVUl9QUk9YWScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfUFJPWFknKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucHJveHkgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2ltZ3VyJywge1xyXG4gICAgZ2V0IG5hbWUgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0lNR1VSJykgfSxcclxuICAgIGhhbmRsZSxcclxuICAgIGNvbmZpZ1xyXG4gIH0pXHJcbn1cclxuIiwiaW1wb3J0IHsgSVBpY0dvLCBJUGx1Z2luQ29uZmlnLCBJQWxpeXVuQ29uZmlnLCBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgfSBmcm9tICcuLi8uLi90eXBlcydcclxuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nXHJcbmltcG9ydCBtaW1lIGZyb20gJ21pbWUtdHlwZXMnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi8uLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uLy4uL2kxOG4vemgtQ04nXHJcblxyXG4vLyBnZW5lcmF0ZSBPU1Mgc2lnbmF0dXJlXHJcbmNvbnN0IGdlbmVyYXRlU2lnbmF0dXJlID0gKG9wdGlvbnM6IElBbGl5dW5Db25maWcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKClcclxuICBjb25zdCBtaW1lVHlwZSA9IG1pbWUubG9va3VwKGZpbGVOYW1lKVxyXG4gIGlmICghbWltZVR5cGUpIHRocm93IEVycm9yKGBObyBtaW1lIHR5cGUgZm91bmQgZm9yIGZpbGUgJHtmaWxlTmFtZX1gKVxyXG5cclxuICBjb25zdCBzaWduU3RyaW5nID0gYFBVVFxcblxcbiR7bWltZVR5cGV9XFxuJHtkYXRlfVxcbi8ke29wdGlvbnMuYnVja2V0fS8ke29wdGlvbnMucGF0aH0ke2ZpbGVOYW1lfWBcclxuXHJcbiAgY29uc3Qgc2lnbmF0dXJlID0gY3J5cHRvLmNyZWF0ZUhtYWMoJ3NoYTEnLCBvcHRpb25zLmFjY2Vzc0tleVNlY3JldCkudXBkYXRlKHNpZ25TdHJpbmcpLmRpZ2VzdCgnYmFzZTY0JylcclxuICByZXR1cm4gYE9TUyAke29wdGlvbnMuYWNjZXNzS2V5SWR9OiR7c2lnbmF0dXJlfWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSUFsaXl1bkNvbmZpZywgZmlsZU5hbWU6IHN0cmluZywgc2lnbmF0dXJlOiBzdHJpbmcsIGltYWdlOiBCdWZmZXIpOiBJT2xkUmVxT3B0aW9uc1dpdGhGdWxsUmVzcG9uc2UgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgdXJsOiBgaHR0cHM6Ly8ke29wdGlvbnMuYnVja2V0fS4ke29wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tLyR7ZW5jb2RlVVJJKG9wdGlvbnMucGF0aCl9JHtlbmNvZGVVUkkoZmlsZU5hbWUpfWAsXHJcbiAgICBoZWFkZXJzOiB7XHJcbiAgICAgIEhvc3Q6IGAke29wdGlvbnMuYnVja2V0fS4ke29wdGlvbnMuYXJlYX0uYWxpeXVuY3MuY29tYCxcclxuICAgICAgQXV0aG9yaXphdGlvbjogc2lnbmF0dXJlLFxyXG4gICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvVVRDU3RyaW5nKCksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiBtaW1lLmxvb2t1cChmaWxlTmFtZSlcclxuICAgIH0sXHJcbiAgICBib2R5OiBpbWFnZSxcclxuICAgIHJlc29sdmVXaXRoRnVsbFJlc3BvbnNlOiB0cnVlXHJcbiAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGUgPSBhc3luYyAoY3R4OiBJUGljR28pOiBQcm9taXNlPElQaWNHbz4gPT4ge1xyXG4gIGNvbnN0IGFsaVl1bk9wdGlvbnMgPSBjdHguZ2V0Q29uZmlnPElBbGl5dW5Db25maWc+KCdwaWNCZWQuYWxpeXVuJylcclxuICBpZiAoIWFsaVl1bk9wdGlvbnMpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQ2FuXFwndCBmaW5kIGFsaVl1biBPU1MgY29uZmlnJylcclxuICB9XHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGltZ0xpc3QgPSBjdHgub3V0cHV0XHJcbiAgICBjb25zdCBjdXN0b21VcmwgPSBhbGlZdW5PcHRpb25zLmN1c3RvbVVybFxyXG4gICAgY29uc3QgcGF0aCA9IGFsaVl1bk9wdGlvbnMucGF0aFxyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBjb25zdCBzaWduYXR1cmUgPSBnZW5lcmF0ZVNpZ25hdHVyZShhbGlZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgbGV0IGltYWdlID0gaW1nLmJ1ZmZlclxyXG4gICAgICAgIGlmICghaW1hZ2UgJiYgaW1nLmJhc2U2NEltYWdlKSB7XHJcbiAgICAgICAgICBpbWFnZSA9IEJ1ZmZlci5mcm9tKGltZy5iYXNlNjRJbWFnZSwgJ2Jhc2U2NCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBwb3N0T3B0aW9ucyhhbGlZdW5PcHRpb25zLCBpbWcuZmlsZU5hbWUsIHNpZ25hdHVyZSwgaW1hZ2UpXHJcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGN0eC5yZXF1ZXN0KG9wdGlvbnMpXHJcbiAgICAgICAgaWYgKGJvZHkuc3RhdHVzQ29kZSA9PT0gMjAwKSB7XHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJhc2U2NEltYWdlXHJcbiAgICAgICAgICBkZWxldGUgaW1nLmJ1ZmZlclxyXG4gICAgICAgICAgY29uc3Qgb3B0aW9uVXJsID0gYWxpWXVuT3B0aW9ucy5vcHRpb25zIHx8ICcnXHJcbiAgICAgICAgICBpZiAoY3VzdG9tVXJsKSB7XHJcbiAgICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHtjdXN0b21Vcmx9LyR7cGF0aH0ke2ltZy5maWxlTmFtZX0ke29wdGlvblVybH1gXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpbWcuaW1nVXJsID0gYGh0dHBzOi8vJHthbGlZdW5PcHRpb25zLmJ1Y2tldH0uJHthbGlZdW5PcHRpb25zLmFyZWF9LmFsaXl1bmNzLmNvbS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHtvcHRpb25Vcmx9YFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQnKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGN0eFxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgYm9keTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignQ0hFQ0tfU0VUVElOR1MnKVxyXG4gICAgfSlcclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJQWxpeXVuQ29uZmlnPigncGljQmVkLmFsaXl1bicpIHx8IHt9XHJcbiAgY29uc3QgY29uZmlnOiBJUGx1Z2luQ29uZmlnW10gPSBbXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhY2Nlc3NLZXlJZCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmFjY2Vzc0tleUlkIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ2FjY2Vzc0tleVNlY3JldCcsXHJcbiAgICAgIHR5cGU6ICdwYXNzd29yZCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5hY2Nlc3NLZXlTZWNyZXQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdhcmVhJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfQVJFQScpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuYXJlYSB8fCAnJyxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQScpIH0sXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAncGF0aCcsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBwcmVmaXggKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX1BBVEgnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIJykgfSxcclxuICAgICAgZGVmYXVsdDogdXNlckNvbmZpZy5wYXRoIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdjdXN0b21VcmwnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkwnKSB9LFxyXG4gICAgICBnZXQgYWxpYXMgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX0FMSUNMT1VEX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcuY3VzdG9tVXJsIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfQUxJQ0xPVURfT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfVxyXG4gIF1cclxuICByZXR1cm4gY29uZmlnXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlZ2lzdGVyIChjdHg6IElQaWNHbyk6IHZvaWQge1xyXG4gIGN0eC5oZWxwZXIudXBsb2FkZXIucmVnaXN0ZXIoJ2FsaXl1bicsIHtcclxuICAgIGdldCBuYW1lICgpIHtcclxuICAgICAgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9BTElDTE9VRCcpXHJcbiAgICB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQbHVnaW5Db25maWcsIElVcHl1bkNvbmZpZywgSU9sZFJlcU9wdGlvbnNXaXRoRnVsbFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xyXG5pbXBvcnQgTUQ1IGZyb20gJ21kNSdcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uLy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IElMb2NhbGVzS2V5IH0gZnJvbSAnLi4vLi4vaTE4bi96aC1DTidcclxuaW1wb3J0IHsgc2FmZVBhcnNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgbWltZSBmcm9tICdtaW1lLXR5cGVzJ1xyXG5cclxuLy8gZ2VuZXJhdGUgQ09TIHNpZ25hdHVyZSBzdHJpbmdcclxuY29uc3QgZ2VuZXJhdGVTaWduYXR1cmUgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgY29uc3Qgb3BlcmF0b3IgPSBvcHRpb25zLm9wZXJhdG9yXHJcbiAgY29uc3QgcGFzc3dvcmQgPSBvcHRpb25zLnBhc3N3b3JkXHJcbiAgY29uc3QgbWQ1UGFzc3dvcmQgPSBNRDUocGFzc3dvcmQpXHJcbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxyXG4gIGNvbnN0IHVyaSA9IGAvJHtvcHRpb25zLmJ1Y2tldH0vJHtlbmNvZGVVUkkocGF0aCl9JHtlbmNvZGVVUkkoZmlsZU5hbWUpfWBcclxuICBjb25zdCB2YWx1ZSA9IGBQVVQmJHt1cml9JiR7ZGF0ZX1gXHJcbiAgY29uc3Qgc2lnbiA9IGNyeXB0by5jcmVhdGVIbWFjKCdzaGExJywgbWQ1UGFzc3dvcmQpLnVwZGF0ZSh2YWx1ZSkuZGlnZXN0KCdiYXNlNjQnKVxyXG4gIHJldHVybiBgVVBZVU4gJHtvcGVyYXRvcn06JHtzaWdufWBcclxufVxyXG5cclxuY29uc3QgcG9zdE9wdGlvbnMgPSAob3B0aW9uczogSVVweXVuQ29uZmlnLCBmaWxlTmFtZTogc3RyaW5nLCBzaWduYXR1cmU6IHN0cmluZywgaW1hZ2U6IEJ1ZmZlcik6IElPbGRSZXFPcHRpb25zV2l0aEZ1bGxSZXNwb25zZSA9PiB7XHJcbiAgY29uc3QgYnVja2V0ID0gb3B0aW9ucy5idWNrZXRcclxuICBjb25zdCBwYXRoID0gb3B0aW9ucy5wYXRoIHx8ICcnXHJcbiAgcmV0dXJuIHtcclxuICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICB1cmw6IGBodHRwczovL3YwLmFwaS51cHl1bi5jb20vJHtidWNrZXR9LyR7ZW5jb2RlVVJJKHBhdGgpfSR7ZW5jb2RlVVJJKGZpbGVOYW1lKX1gLFxyXG4gICAgaGVhZGVyczoge1xyXG4gICAgICBBdXRob3JpemF0aW9uOiBzaWduYXR1cmUsXHJcbiAgICAgIERhdGU6IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6IG1pbWUubG9va3VwKGZpbGVOYW1lKSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ1xyXG4gICAgfSxcclxuICAgIGJvZHk6IGltYWdlLFxyXG4gICAgcmVzb2x2ZVdpdGhGdWxsUmVzcG9uc2U6IHRydWVcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgdXB5dW5PcHRpb25zID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKVxyXG4gIGlmICghdXB5dW5PcHRpb25zKSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgZmluZCB1cFl1biBjb25maWcnKVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc3QgaW1nTGlzdCA9IGN0eC5vdXRwdXRcclxuICAgIGNvbnN0IHBhdGggPSB1cHl1bk9wdGlvbnMucGF0aCB8fCAnJ1xyXG4gICAgZm9yIChjb25zdCBpbWcgb2YgaW1nTGlzdCkge1xyXG4gICAgICBpZiAoaW1nLmZpbGVOYW1lICYmIGltZy5idWZmZXIpIHtcclxuICAgICAgICBsZXQgaW1hZ2UgPSBpbWcuYnVmZmVyXHJcbiAgICAgICAgaWYgKCFpbWFnZSAmJiBpbWcuYmFzZTY0SW1hZ2UpIHtcclxuICAgICAgICAgIGltYWdlID0gQnVmZmVyLmZyb20oaW1nLmJhc2U2NEltYWdlLCAnYmFzZTY0JylcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ2VuZXJhdGVTaWduYXR1cmUodXB5dW5PcHRpb25zLCBpbWcuZmlsZU5hbWUpXHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHBvc3RPcHRpb25zKHVweXVuT3B0aW9ucywgaW1nLmZpbGVOYW1lLCBzaWduYXR1cmUsIGltYWdlKVxyXG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCBjdHgucmVxdWVzdChvcHRpb25zKVxyXG4gICAgICAgIGlmIChib2R5LnN0YXR1c0NvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgZGVsZXRlIGltZy5iYXNlNjRJbWFnZVxyXG4gICAgICAgICAgZGVsZXRlIGltZy5idWZmZXJcclxuICAgICAgICAgIGltZy5pbWdVcmwgPSBgJHt1cHl1bk9wdGlvbnMudXJsfS8ke3BhdGh9JHtpbWcuZmlsZU5hbWV9JHt1cHl1bk9wdGlvbnMub3B0aW9uc31gXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXBsb2FkIGZhaWxlZCcpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY3R4XHJcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcclxuICAgIGlmIChlcnIubWVzc2FnZSA9PT0gJ1VwbG9hZCBmYWlsZWQnKSB7XHJcbiAgICAgIGN0eC5lbWl0KElCdWlsZEluRXZlbnQuTk9USUZJQ0FUSU9OLCB7XHJcbiAgICAgICAgdGl0bGU6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdDSEVDS19TRVRUSU5HUycpXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBib2R5ID0gc2FmZVBhcnNlPHsgY29kZTogc3RyaW5nIH0+KGVyci5lcnJvcilcclxuICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignVVBMT0FEX0ZBSUxFRCcpLFxyXG4gICAgICAgIGJvZHk6IGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1VQTE9BRF9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogdHlwZW9mIGJvZHkgPT09ICdvYmplY3QnID8gYm9keS5jb2RlIDogYm9keVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRleHQ6ICdodHRwOi8vZG9jcy51cHl1bi5jb20vYXBpL2Vycm5vLydcclxuICAgICAgfSlcclxuICAgIH1cclxuICAgIHRocm93IGVyclxyXG4gIH1cclxufVxyXG5cclxuY29uc3QgY29uZmlnID0gKGN0eDogSVBpY0dvKTogSVBsdWdpbkNvbmZpZ1tdID0+IHtcclxuICBjb25zdCB1c2VyQ29uZmlnID0gY3R4LmdldENvbmZpZzxJVXB5dW5Db25maWc+KCdwaWNCZWQudXB5dW4nKSB8fCB7fVxyXG4gIGNvbnN0IGNvbmZpZzogSVBsdWdpbkNvbmZpZ1tdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnYnVja2V0JyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9CVUNLRVQnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLmJ1Y2tldCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcGVyYXRvcicsXHJcbiAgICAgIHR5cGU6ICdpbnB1dCcsXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BFUkFUT1InKSB9LFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHtcclxuICAgICAgICByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX09QRVJBVE9SJylcclxuICAgICAgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1InKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wZXJhdG9yIHx8ICcnLFxyXG4gICAgICByZXF1aXJlZDogdHJ1ZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fUEFTU1dPUkQnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGFzc3dvcmQgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiB0cnVlXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBuYW1lOiAndXJsJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9VUkwnKSB9LFxyXG4gICAgICBnZXQgbWVzc2FnZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fTUVTU0FHRV9VUkwnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLnVybCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IHRydWVcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIG5hbWU6ICdvcHRpb25zJyxcclxuICAgICAgdHlwZTogJ2lucHV0JyxcclxuICAgICAgZ2V0IHByZWZpeCAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBhbGlhcyAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU5fT1BUSU9OUycpIH0sXHJcbiAgICAgIGdldCBtZXNzYWdlICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlMnKSB9LFxyXG4gICAgICBkZWZhdWx0OiB1c2VyQ29uZmlnLm9wdGlvbnMgfHwgJycsXHJcbiAgICAgIHJlcXVpcmVkOiBmYWxzZVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgbmFtZTogJ3BhdGgnLFxyXG4gICAgICB0eXBlOiAnaW5wdXQnLFxyXG4gICAgICBnZXQgcHJlZml4ICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IGFsaWFzICgpIHsgcmV0dXJuIGN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BJQ0JFRF9VUFlVTl9QQVRIJykgfSxcclxuICAgICAgZ2V0IG1lc3NhZ2UgKCkgeyByZXR1cm4gY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSCcpIH0sXHJcbiAgICAgIGRlZmF1bHQ6IHVzZXJDb25maWcucGF0aCB8fCAnJyxcclxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXHJcbiAgICB9XHJcbiAgXVxyXG4gIHJldHVybiBjb25maWdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcmVnaXN0ZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY3R4LmhlbHBlci51cGxvYWRlci5yZWdpc3RlcigndXB5dW4nLCB7XHJcbiAgICBnZXQgbmFtZSAoKSB7IHJldHVybiBjdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQSUNCRURfVVBZVU4nKSB9LFxyXG4gICAgaGFuZGxlLFxyXG4gICAgY29uZmlnXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiB9IGZyb20gJy4uLy4uL3R5cGVzJ1xyXG5pbXBvcnQgU01NU1VwbG9hZGVyIGZyb20gJy4vc21tcydcclxuaW1wb3J0IHRjWXVuVXBsb2FkZXIgZnJvbSAnLi90Y3l1bidcclxuaW1wb3J0IGdpdGh1YlVwbG9hZGVyIGZyb20gJy4vZ2l0aHViJ1xyXG5pbXBvcnQgcWluaXVVcGxvYWRlciBmcm9tICcuL3Fpbml1J1xyXG5pbXBvcnQgaW1ndXJVcGxvYWRlciBmcm9tICcuL2ltZ3VyJ1xyXG5pbXBvcnQgYWxpWXVuVXBsb2FkZXIgZnJvbSAnLi9hbGl5dW4nXHJcbmltcG9ydCB1cFl1blVwbG9hZGVyIGZyb20gJy4vdXB5dW4nXHJcblxyXG5jb25zdCBidWlsZEluVXBsb2FkZXJzOiBJUGljR29QbHVnaW4gPSAoKSA9PiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHJlZ2lzdGVyIChjdHg6IElQaWNHbykge1xyXG4gICAgICBhbGlZdW5VcGxvYWRlcihjdHgpXHJcbiAgICAgIHRjWXVuVXBsb2FkZXIoY3R4KVxyXG4gICAgICBTTU1TVXBsb2FkZXIoY3R4KVxyXG4gICAgICBnaXRodWJVcGxvYWRlcihjdHgpXHJcbiAgICAgIHFpbml1VXBsb2FkZXIoY3R4KVxyXG4gICAgICBpbWd1clVwbG9hZGVyKGN0eClcclxuICAgICAgdXBZdW5VcGxvYWRlcihjdHgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBidWlsZEluVXBsb2FkZXJzXHJcbiIsImltcG9ydCB7XHJcbiAgaXNVcmwsXHJcbiAgZ2V0SW1hZ2VTaXplLFxyXG4gIGdldEZTRmlsZSxcclxuICBnZXRVUkxGaWxlXHJcbn0gZnJvbSAnLi4vLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQYXRoVHJhbnNmb3JtZWRJbWdJbmZvLCBJSW1nSW5mbywgSUltZ1NpemUgfSBmcm9tICcuLi8uLi90eXBlcydcclxuXHJcbmNvbnN0IGhhbmRsZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SVBpY0dvPiA9PiB7XHJcbiAgY29uc3QgcmVzdWx0czogSUltZ0luZm9bXSA9IGN0eC5vdXRwdXRcclxuICBhd2FpdCBQcm9taXNlLmFsbChjdHguaW5wdXQubWFwKGFzeW5jIChpdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgIGxldCBpbmZvOiBJUGF0aFRyYW5zZm9ybWVkSW1nSW5mb1xyXG4gICAgaWYgKGlzVXJsKGl0ZW0pKSB7XHJcbiAgICAgIGluZm8gPSBhd2FpdCBnZXRVUkxGaWxlKGl0ZW0sIGN0eClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGluZm8gPSBhd2FpdCBnZXRGU0ZpbGUoaXRlbSlcclxuICAgIH1cclxuICAgIGlmIChpbmZvLnN1Y2Nlc3MgJiYgaW5mby5idWZmZXIpIHtcclxuICAgICAgY29uc3QgaW1nU2l6ZSA9IGdldEltZ1NpemUoY3R4LCBpbmZvLmJ1ZmZlciwgaXRlbSlcclxuICAgICAgcmVzdWx0c1tpbmRleF0gPSB7XHJcbiAgICAgICAgYnVmZmVyOiBpbmZvLmJ1ZmZlcixcclxuICAgICAgICBmaWxlTmFtZTogaW5mby5maWxlTmFtZSxcclxuICAgICAgICB3aWR0aDogaW1nU2l6ZS53aWR0aCxcclxuICAgICAgICBoZWlnaHQ6IGltZ1NpemUuaGVpZ2h0LFxyXG4gICAgICAgIGV4dG5hbWU6IGluZm8uZXh0bmFtZVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoaW5mby5yZWFzb24pXHJcbiAgICB9XHJcbiAgfSkpXHJcbiAgLy8gcmVtb3ZlIGVtcHR5IGl0ZW1cclxuICBjdHgub3V0cHV0ID0gcmVzdWx0cy5maWx0ZXIoaXRlbSA9PiBpdGVtKVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuY29uc3QgZ2V0SW1nU2l6ZSA9IChjdHg6IElQaWNHbywgZmlsZTogQnVmZmVyLCBwYXRoOiBzdHJpbmcpOiBJSW1nU2l6ZSA9PiB7XHJcbiAgY29uc3QgaW1hZ2VTaXplID0gZ2V0SW1hZ2VTaXplKGZpbGUpXHJcbiAgaWYgKCFpbWFnZVNpemUucmVhbCkge1xyXG4gICAgY3R4LmxvZy53YXJuKGBjYW4ndCBnZXQgJHtwYXRofSdzIGltYWdlIHNpemVgKVxyXG4gICAgY3R4LmxvZy53YXJuKCdmYWxsYmFjayB0byAyMDAgKiAyMDAnKVxyXG4gIH1cclxuICByZXR1cm4gaW1hZ2VTaXplXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtcclxuICBoYW5kbGVcclxufVxyXG4iLCJpbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi8uLi90eXBlcydcclxuY29uc3QgaGFuZGxlID0gYXN5bmMgKGN0eDogSVBpY0dvKTogUHJvbWlzZTxJUGljR28+ID0+IHtcclxuICBjdHgub3V0cHV0LnB1c2goLi4uY3R4LmlucHV0KVxyXG4gIHJldHVybiBjdHhcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIGhhbmRsZVxyXG59XHJcbiIsImltcG9ydCB7IElQaWNHbywgSVBpY0dvUGx1Z2luIH0gZnJvbSAnLi4vLi4vdHlwZXMnXHJcbmltcG9ydCBJbWdGcm9tUGF0aCBmcm9tICcuL3BhdGgnXHJcbmltcG9ydCBJbWdGcm9tQmFzZTY0IGZyb20gJy4vYmFzZTY0J1xyXG5cclxuY29uc3QgYnVpbGRJblRyYW5zZm9ybWVyczogSVBpY0dvUGx1Z2luID0gKCkgPT4ge1xyXG4gIHJldHVybiB7XHJcbiAgICByZWdpc3RlciAoY3R4OiBJUGljR28pIHtcclxuICAgICAgY3R4LmhlbHBlci50cmFuc2Zvcm1lci5yZWdpc3RlcigncGF0aCcsIEltZ0Zyb21QYXRoKVxyXG4gICAgICBjdHguaGVscGVyLnRyYW5zZm9ybWVyLnJlZ2lzdGVyKCdiYXNlNjQnLCBJbWdGcm9tQmFzZTY0KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgYnVpbGRJblRyYW5zZm9ybWVyc1xyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCByZXNvbHZlIGZyb20gJ3Jlc29sdmUnXHJcbmltcG9ydCB7IElCdWlsZEluRXZlbnQgfSBmcm9tICcuLi91dGlscy9lbnVtJ1xyXG5pbXBvcnQgeyBJUGljR28sIElQaWNHb1BsdWdpbiwgSVBsdWdpbkxvYWRlciwgSVBpY0dvUGx1Z2luSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXgnXHJcbmltcG9ydCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi9MaWZlY3ljbGVQbHVnaW5zJ1xyXG5cclxuLyoqXHJcbiAqIExvY2FsIHBsdWdpbiBsb2FkZXIsIGZpbGUgc3lzdGVtIGlzIHJlcXVpcmVkXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgUGx1Z2luTG9hZGVyIGltcGxlbWVudHMgSVBsdWdpbkxvYWRlciB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgbGlzdDogc3RyaW5nW10gPSBbXVxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZnVsbExpc3Q6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpXHJcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5NYXA6IE1hcDxzdHJpbmcsIElQaWNHb1BsdWdpbkludGVyZmFjZT4gPSBuZXcgTWFwKClcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHBhY2thZ2VQYXRoKSkge1xyXG4gICAgICBjb25zdCBwa2cgPSB7XHJcbiAgICAgICAgbmFtZTogJ3BpY2dvLXBsdWdpbnMnLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiAncGljZ28tcGx1Z2lucycsXHJcbiAgICAgICAgcmVwb3NpdG9yeTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9QaWNHby9QaWNHby1Db3JlJyxcclxuICAgICAgICBsaWNlbnNlOiAnTUlUJ1xyXG4gICAgICB9XHJcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMocGFja2FnZVBhdGgsIEpTT04uc3RyaW5naWZ5KHBrZyksICd1dGY4JylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIGdldCBwbHVnaW4gZW50cnlcclxuICBwcml2YXRlIHJlc29sdmVQbHVnaW4gKGN0eDogSVBpY0dvLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIHJlc29sdmUuc3luYyhuYW1lLCB7IGJhc2VkaXI6IGN0eC5iYXNlRGlyIH0pXHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgcmV0dXJuIHBhdGguam9pbihjdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcycsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBsb2FkIGFsbCB0aGlyZCBwYXJ0eSBwbHVnaW5cclxuICBsb2FkICgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhY2thZ2VQYXRoID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdwYWNrYWdlLmpzb24nKVxyXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuY3R4LmJhc2VEaXIsICdub2RlX21vZHVsZXMvJylcclxuICAgIC8vIFRoYW5rcyB0byBoZXhvIC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9oZXhvanMvaGV4by9ibG9iL21hc3Rlci9saWIvaGV4by9sb2FkX3BsdWdpbnMuanNcclxuICAgIGlmICghZnMuZXhpc3RzU3luYyhwbHVnaW5EaXIpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgfVxyXG4gICAgY29uc3QganNvbiA9IGZzLnJlYWRKU09OU3luYyhwYWNrYWdlUGF0aClcclxuICAgIGNvbnN0IGRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IGRldkRlcHMgPSBPYmplY3Qua2V5cyhqc29uLmRldkRlcGVuZGVuY2llcyB8fCB7fSlcclxuICAgIGNvbnN0IG1vZHVsZXMgPSBkZXBzLmNvbmNhdChkZXZEZXBzKS5maWx0ZXIoKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICBpZiAoIS9ecGljZ28tcGx1Z2luLXxeQFteL10rXFwvcGljZ28tcGx1Z2luLS8udGVzdChuYW1lKSkgcmV0dXJuIGZhbHNlXHJcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnJlc29sdmVQbHVnaW4odGhpcy5jdHgsIG5hbWUpXHJcbiAgICAgIHJldHVybiBmcy5leGlzdHNTeW5jKHBhdGgpXHJcbiAgICB9KVxyXG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luKG1vZHVsZSlcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICByZWdpc3RlclBsdWdpbiAobmFtZTogc3RyaW5nLCBwbHVnaW4/OiBJUGljR29QbHVnaW4pOiB2b2lkIHtcclxuICAgIGlmICghbmFtZSB8fCB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5jdHgubG9nLndhcm4oJ1BsZWFzZSBwcm92aWRlIHZhbGlkIHBsdWdpbicpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdGhpcy5mdWxsTGlzdC5hZGQobmFtZSlcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIHJlZ2lzdGVyIGxvY2FsIHBsdWdpblxyXG4gICAgICBpZiAoIXBsdWdpbikge1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5nZXRDb25maWcoYHBpY2dvUGx1Z2lucy4ke25hbWV9YCkgPT09IHRydWUgfHwgKHRoaXMuY3R4LmdldENvbmZpZyhgcGljZ29QbHVnaW5zLiR7bmFtZX1gKSA9PT0gdW5kZWZpbmVkKSkge1xyXG4gICAgICAgICAgdGhpcy5saXN0LnB1c2gobmFtZSlcclxuICAgICAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKG5hbWUpXHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgdGhpcy5nZXRQbHVnaW4obmFtZSkhLnJlZ2lzdGVyKHRoaXMuY3R4KVxyXG4gICAgICAgICAgY29uc3QgcGx1Z2luID0gYHBpY2dvUGx1Z2luc1ske25hbWV9XWBcclxuICAgICAgICAgIHRoaXMuY3R4LnNhdmVDb25maWcoXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBbcGx1Z2luXTogdHJ1ZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIHJlZ2lzdGVyIHByb3ZpZGVkIHBsdWdpblxyXG4gICAgICAgIC8vICYmIHdvbid0IHdyaXRlIGNvbmZpZyB0byBmaWxlc1xyXG4gICAgICAgIHRoaXMubGlzdC5wdXNoKG5hbWUpXHJcbiAgICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgICAgICBjb25zdCBwbHVnaW5JbnRlcmZhY2UgPSBwbHVnaW4odGhpcy5jdHgpXHJcbiAgICAgICAgdGhpcy5wbHVnaW5NYXAuc2V0KG5hbWUsIHBsdWdpbkludGVyZmFjZSlcclxuICAgICAgICBwbHVnaW5JbnRlcmZhY2UucmVnaXN0ZXIodGhpcy5jdHgpXHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5wbHVnaW5NYXAuZGVsZXRlKG5hbWUpXHJcbiAgICAgIHRoaXMubGlzdCA9IHRoaXMubGlzdC5maWx0ZXIoKGl0ZW06IHN0cmluZykgPT4gaXRlbSAhPT0gbmFtZSlcclxuICAgICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGUgYXMgRXJyb3IpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICB0aXRsZTogYFBsdWdpbiAke25hbWV9IExvYWQgRXJyb3JgLFxyXG4gICAgICAgIGJvZHk6IGVcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVucmVnaXN0ZXJQbHVnaW4gKG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5saXN0ID0gdGhpcy5saXN0LmZpbHRlcigoaXRlbTogc3RyaW5nKSA9PiBpdGVtICE9PSBuYW1lKVxyXG4gICAgdGhpcy5mdWxsTGlzdC5kZWxldGUobmFtZSlcclxuICAgIHRoaXMucGx1Z2luTWFwLmRlbGV0ZShuYW1lKVxyXG4gICAgc2V0Q3VycmVudFBsdWdpbk5hbWUobmFtZSlcclxuICAgIHRoaXMuY3R4LmhlbHBlci51cGxvYWRlci51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5oZWxwZXIudHJhbnNmb3JtZXIudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVRyYW5zZm9ybVBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmJlZm9yZVVwbG9hZFBsdWdpbnMudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHguaGVscGVyLmFmdGVyVXBsb2FkUGx1Z2lucy51bnJlZ2lzdGVyKG5hbWUpXHJcbiAgICB0aGlzLmN0eC5jbWQudW5yZWdpc3RlcihuYW1lKVxyXG4gICAgdGhpcy5jdHgucmVtb3ZlQ29uZmlnKCdwaWNnb1BsdWdpbnMnLCBuYW1lKVxyXG4gIH1cclxuXHJcbiAgLy8gZ2V0IHBsdWdpbiBieSBuYW1lXHJcbiAgZ2V0UGx1Z2luIChuYW1lOiBzdHJpbmcpOiBJUGljR29QbHVnaW5JbnRlcmZhY2UgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKHRoaXMucGx1Z2luTWFwLmhhcyhuYW1lKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wbHVnaW5NYXAuZ2V0KG5hbWUpXHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBwYXRoLmpvaW4odGhpcy5jdHguYmFzZURpciwgJ25vZGVfbW9kdWxlcy8nKVxyXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcclxuICAgIGNvbnN0IHBsdWdpbiA9IHJlcXVpcmUocGx1Z2luRGlyICsgbmFtZSkodGhpcy5jdHgpXHJcbiAgICB0aGlzLnBsdWdpbk1hcC5zZXQobmFtZSwgcGx1Z2luKVxyXG4gICAgcmV0dXJuIHBsdWdpblxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBsaXN0IG9mIGVuYWJsZWQgcGx1Z2luc1xyXG4gICAqL1xyXG4gIGdldExpc3QgKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3RcclxuICB9XHJcblxyXG4gIGhhc1BsdWdpbiAobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mdWxsTGlzdC5oYXMobmFtZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZnVsbCBsaXN0IG9mIHBsdWdpbnMsIHdoZXRoZXIgaXQgaXMgZW5hYmxlZCBvciBub3RcclxuICAgKi9cclxuICBnZXRGdWxsTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLmZ1bGxMaXN0XVxyXG4gIH1cclxufVxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5Mb2FkZXJcclxuIiwiZXhwb3J0IGNvbnN0IENMSVBCT0FSRF9JTUFHRV9GT0xERVIgPSAncGljZ28tY2xpcGJvYXJkLWltYWdlcydcclxuIiwiaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJ1xyXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXHJcbmltcG9ydCBvcyBmcm9tICdvcydcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgaXNXc2wgZnJvbSAnaXMtd3NsJ1xyXG5pbXBvcnQgeyBJUGljR28sIElDbGlwYm9hcmRJbWFnZSB9IGZyb20gJy4uL3R5cGVzJ1xyXG5pbXBvcnQgeyBJQnVpbGRJbkV2ZW50IH0gZnJvbSAnLi9lbnVtJ1xyXG5pbXBvcnQgbWFjQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL21hYy5hcHBsZXNjcmlwdCdcclxuaW1wb3J0IHdpbmRvd3NDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93cy5wczEnXHJcbmltcG9ydCB3aW5kb3dzMTBDbGlwYm9hcmRTY3JpcHQgZnJvbSAnLi9jbGlwYm9hcmQvd2luZG93czEwLnBzMSdcclxuaW1wb3J0IGxpbnV4Q2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL2xpbnV4LnNoJ1xyXG5pbXBvcnQgd3NsQ2xpcGJvYXJkU2NyaXB0IGZyb20gJy4vY2xpcGJvYXJkL3dzbC5zaCdcclxuaW1wb3J0IHsgQ0xJUEJPQVJEX0lNQUdFX0ZPTERFUiB9IGZyb20gJy4vc3RhdGljJ1xyXG5cclxuZXhwb3J0IHR5cGUgUGxhdGZvcm0gPSAnZGFyd2luJyB8ICd3aW4zMicgfCAnd2luMTAnIHwgJ2xpbnV4JyB8ICd3c2wnXHJcblxyXG5jb25zdCBnZXRDdXJyZW50UGxhdGZvcm0gPSAoKTogUGxhdGZvcm0gPT4ge1xyXG4gIGNvbnN0IHBsYXRmb3JtID0gcHJvY2Vzcy5wbGF0Zm9ybVxyXG4gIGlmIChpc1dzbCkge1xyXG4gICAgcmV0dXJuICd3c2wnXHJcbiAgfVxyXG4gIGlmIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgY29uc3QgY3VycmVudE9TID0gb3MucmVsZWFzZSgpLnNwbGl0KCcuJylbMF1cclxuICAgIGlmIChjdXJyZW50T1MgPT09ICcxMCcpIHtcclxuICAgICAgcmV0dXJuICd3aW4xMCdcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnd2luMzInXHJcbiAgICB9XHJcbiAgfSBlbHNlIGlmIChwbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgIHJldHVybiAnZGFyd2luJ1xyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gJ2xpbnV4J1xyXG4gIH1cclxufVxyXG5cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0Q29udGVudDoge1xyXG4gIFtrZXkgaW4gUGxhdGZvcm1dOiBzdHJpbmdcclxufSA9IHtcclxuICBkYXJ3aW46IG1hY0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4zMjogd2luZG93c0NsaXBib2FyZFNjcmlwdCxcclxuICB3aW4xMDogd2luZG93czEwQ2xpcGJvYXJkU2NyaXB0LFxyXG4gIGxpbnV4OiBsaW51eENsaXBib2FyZFNjcmlwdCxcclxuICB3c2w6IHdzbENsaXBib2FyZFNjcmlwdFxyXG59XHJcbi8qKlxyXG4gKiBwb3dlcnNoZWxsIHdpbGwgcmVwb3J0IGVycm9yIGlmIGZpbGUgZG9lcyBub3QgaGF2ZSBhICcucHMxJyBleHRlbnNpb24sXHJcbiAqIHNvIHdlIHNob3VsZCBrZWVwIHRoZSBleHRlbnNpb24gbmFtZSBjb25zaXN0ZW50IHdpdGggY29ycmVzcG9uZGluZyBzaGVsbFxyXG4gKi9cclxuY29uc3QgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWU6IHtcclxuICBba2V5IGluIFBsYXRmb3JtXTogc3RyaW5nXHJcbn0gPSB7XHJcbiAgZGFyd2luOiAnbWFjLmFwcGxlc2NyaXB0JyxcclxuICB3aW4zMjogJ3dpbmRvd3MucHMxJyxcclxuICB3aW4xMDogJ3dpbmRvd3MxMC5wczEnLFxyXG4gIGxpbnV4OiAnbGludXguc2gnLFxyXG4gIHdzbDogJ3dzbC5zaCdcclxufVxyXG5cclxuZnVuY3Rpb24gY3JlYXRlSW1hZ2VGb2xkZXIgKGN0eDogSVBpY0dvKTogdm9pZCB7XHJcbiAgY29uc3QgaW1hZ2VQYXRoID0gcGF0aC5qb2luKGN0eC5iYXNlRGlyLCBDTElQQk9BUkRfSU1BR0VfRk9MREVSKVxyXG4gIGlmICghZnMuZXhpc3RzU3luYyhpbWFnZVBhdGgpKSB7XHJcbiAgICBmcy5ta2RpclN5bmMoaW1hZ2VQYXRoKVxyXG4gIH1cclxufVxyXG5cclxuLy8gVGhhbmtzIHRvIHZzLXBpY2dvOiBodHRwczovL2dpdGh1Yi5jb20vU3BhZGVzLVMvdnMtcGljZ28vYmxvYi9tYXN0ZXIvc3JjL2V4dGVuc2lvbi50c1xyXG5jb25zdCBnZXRDbGlwYm9hcmRJbWFnZSA9IGFzeW5jIChjdHg6IElQaWNHbyk6IFByb21pc2U8SUNsaXBib2FyZEltYWdlPiA9PiB7XHJcbiAgY3JlYXRlSW1hZ2VGb2xkZXIoY3R4KVxyXG4gIC8vIGFkZCBhbiBjbGlwYm9hcmQgaW1hZ2UgZm9sZGVyIHRvIGNvbnRyb2wgdGhlIGltYWdlIGNhY2hlIGZpbGVcclxuICBjb25zdCBpbWFnZVBhdGggPSBwYXRoLmpvaW4oY3R4LmJhc2VEaXIsIENMSVBCT0FSRF9JTUFHRV9GT0xERVIsIGAke2RheWpzKCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpfS5wbmdgKVxyXG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxJQ2xpcGJvYXJkSW1hZ2U+KChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbik6IHZvaWQgPT4ge1xyXG4gICAgY29uc3QgcGxhdGZvcm0gPSBnZXRDdXJyZW50UGxhdGZvcm0oKVxyXG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IHBhdGguam9pbihjdHguYmFzZURpciwgcGxhdGZvcm0yU2NyaXB0RmlsZW5hbWVbcGxhdGZvcm1dKVxyXG4gICAgLy8gSWYgdGhlIHNjcmlwdCBkb2VzIG5vdCBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGNvbnRlbnQgdG8gdGhlIHNjcmlwdCBmaWxlXHJcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc2NyaXB0UGF0aCkpIHtcclxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcclxuICAgICAgICBzY3JpcHRQYXRoLFxyXG4gICAgICAgIHBsYXRmb3JtMlNjcmlwdENvbnRlbnRbcGxhdGZvcm1dLFxyXG4gICAgICAgICd1dGY4J1xyXG4gICAgICApXHJcbiAgICB9XHJcbiAgICBsZXQgZXhlY3V0aW9uXHJcbiAgICBpZiAocGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdvc2FzY3JpcHQnLCBbc2NyaXB0UGF0aCwgaW1hZ2VQYXRoXSlcclxuICAgIH0gZWxzZSBpZiAocGxhdGZvcm0gPT09ICd3aW4zMicgfHwgcGxhdGZvcm0gPT09ICd3aW4xMCcpIHtcclxuICAgICAgZXhlY3V0aW9uID0gc3Bhd24oJ3Bvd2Vyc2hlbGwnLCBbXHJcbiAgICAgICAgJy1ub3Byb2ZpbGUnLFxyXG4gICAgICAgICctbm9uaW50ZXJhY3RpdmUnLFxyXG4gICAgICAgICctbm9sb2dvJyxcclxuICAgICAgICAnLXN0YScsXHJcbiAgICAgICAgJy1leGVjdXRpb25wb2xpY3knLCAndW5yZXN0cmljdGVkJyxcclxuICAgICAgICAvLyBmaXggd2luZG93cyAxMCBuYXRpdmUgY21kIGNyYXNoIGJ1ZyB3aGVuIFwicGljZ28gdXBsb2FkXCJcclxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUGljR28vUGljR28tQ29yZS9pc3N1ZXMvMzJcclxuICAgICAgICAvLyAnLXdpbmRvd3N0eWxlJywnaGlkZGVuJyxcclxuICAgICAgICAvLyAnLW5vZXhpdCcsXHJcbiAgICAgICAgJy1maWxlJywgc2NyaXB0UGF0aCxcclxuICAgICAgICBpbWFnZVBhdGhcclxuICAgICAgXSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4ZWN1dGlvbiA9IHNwYXduKCdzaCcsIFtzY3JpcHRQYXRoLCBpbWFnZVBhdGhdKVxyXG4gICAgfVxyXG5cclxuICAgIGV4ZWN1dGlvbi5zdGRvdXQub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XHJcbiAgICAgIGlmIChwbGF0Zm9ybSA9PT0gJ2xpbnV4Jykge1xyXG4gICAgICAgIGlmIChkYXRhLnRvU3RyaW5nKCkudHJpbSgpID09PSAnbm8geGNsaXAgb3Igd2wtY2xpcGJvYXJkJykge1xyXG4gICAgICAgICAgY3R4LmVtaXQoSUJ1aWxkSW5FdmVudC5OT1RJRklDQVRJT04sIHtcclxuICAgICAgICAgICAgdGl0bGU6ICd4Y2xpcCBvciB3bC1jbGlwYm9hcmQgbm90IGZvdW5kJyxcclxuICAgICAgICAgICAgYm9keTogJ1BsZWFzZSBpbnN0YWxsIHhjbGlwKGZvciB4MTEpIG9yIHdsLWNsaXBib2FyZChmb3Igd2F5bGFuZCkgYmVmb3JlIHJ1biBwaWNnbydcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcignUGxlYXNlIGluc3RhbGwgeGNsaXAoZm9yIHgxMSkgb3Igd2wtY2xpcGJvYXJkKGZvciB3YXlsYW5kKSBiZWZvcmUgcnVuIHBpY2dvJykpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGltZ1BhdGggPSBkYXRhLnRvU3RyaW5nKCkudHJpbSgpXHJcblxyXG4gICAgICAvLyBpZiB0aGUgZmlsZVBhdGggaXMgdGhlIHJlYWwgZmlsZSBpbiBzeXN0ZW1cclxuICAgICAgLy8gd2Ugc2hvdWxkIGtlZXAgaXQgaW5zdGVhZCBvZiByZW1vdmluZ1xyXG4gICAgICBsZXQgc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nID0gZmFsc2VcclxuXHJcbiAgICAgIC8vIGluIG1hY09TIGlmIHlvdXIgY29weSB0aGUgZmlsZSBpbiBzeXN0ZW0sIGl0J3MgYmFzZW5hbWUgd2lsbCBub3QgZXF1YWwgdG8gb3VyIGRlZmF1bHQgYmFzZW5hbWVcclxuICAgICAgaWYgKHBhdGguYmFzZW5hbWUoaW1nUGF0aCkgIT09IHBhdGguYmFzZW5hbWUoaW1hZ2VQYXRoKSkge1xyXG4gICAgICAgIC8vIGlmIHRoZSBwYXRoIGlzIG5vdCBnZW5lcmF0ZSBieSBwaWNnb1xyXG4gICAgICAgIC8vIGJ1dCB0aGUgcGF0aCBleGlzdHMsIHdlIHNob3VsZCBrZWVwIGl0XHJcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoaW1nUGF0aCkpIHtcclxuICAgICAgICAgIHNob3VsZEtlZXBBZnRlclVwbG9hZGluZyA9IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gaWYgdGhlIGltZ1BhdGggaXMgaW52YWxpZFxyXG4gICAgICBpZiAoaW1nUGF0aCAhPT0gJ25vIGltYWdlJyAmJiAhZnMuZXhpc3RzU3luYyhpbWdQYXRoKSkge1xyXG4gICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBDYW4ndCBmaW5kICR7aW1nUGF0aH1gKSlcclxuICAgICAgfVxyXG5cclxuICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgaW1nUGF0aCxcclxuICAgICAgICBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmdcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfSlcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZ2V0Q2xpcGJvYXJkSW1hZ2VcclxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xyXG5cclxuY29uc3QgZXZlbnRCdXMgPSBuZXcgRXZlbnRFbWl0dGVyKClcclxuZXhwb3J0IHtcclxuICBldmVudEJ1c1xyXG59XHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xyXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJvbWlzZS1mdW5jdGlvbi1hc3luYyAqL1xyXG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnXHJcbmltcG9ydCB7IElQaWNHbywgVW5kZWZpbmFibGUsIElDb25maWdDaGFuZ2VQYXlsb2FkLCBJQ29uZmlnLCBJUmVxdWVzdENvbmZpZywgSU9sZFJlcU9wdGlvbnMsIElSZXNwb25zZSwgSUZ1bGxSZXNwb25zZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJ1xyXG5pbXBvcnQgRm9ybURhdGEgZnJvbSAnZm9ybS1kYXRhJ1xyXG5pbXBvcnQgaHR0cHMgZnJvbSAnaHR0cHMnXHJcbmltcG9ydCB0dW5uZWwgZnJvbSAndHVubmVsJ1xyXG5jb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcclxuICBtYXhWZXJzaW9uOiAnVExTdjEuMicsXHJcbiAgbWluVmVyc2lvbjogJ1RMU3YxLjInXHJcbn0pXHJcblxyXG4vLyB0aGFua3MgZm9yIGh0dHBzOi8vZ2l0aHViLmRldi9yZXF1ZXN0L3JlcXVlc3QvYmxvYi9tYXN0ZXIvaW5kZXguanNcclxuZnVuY3Rpb24gYXBwZW5kRm9ybURhdGEgKGZvcm06IEZvcm1EYXRhLCBrZXk6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XHJcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAndmFsdWUnIGluIGRhdGEgJiYgJ29wdGlvbnMnIGluIGRhdGEpIHtcclxuICAgIGZvcm0uYXBwZW5kKGtleSwgZGF0YS52YWx1ZSwgZGF0YS5vcHRpb25zKVxyXG4gIH0gZWxzZSB7XHJcbiAgICBmb3JtLmFwcGVuZChrZXksIGRhdGEpXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXF1ZXN0SW50ZXJjZXB0b3IgKG9wdGlvbnM6IElPbGRSZXFPcHRpb25zIHwgQXhpb3NSZXF1ZXN0Q29uZmlnKTogQXhpb3NSZXF1ZXN0Q29uZmlnICYge1xyXG4gIF9faXNPbGRPcHRpb25zPzogYm9vbGVhblxyXG59IHtcclxuICBsZXQgX19pc09sZE9wdGlvbnMgPSBmYWxzZVxyXG4gIGNvbnN0IG9wdDogQXhpb3NSZXF1ZXN0Q29uZmlnPGFueT4gJiB7XHJcbiAgICBfX2lzT2xkT3B0aW9ucz86IGJvb2xlYW5cclxuICB9ID0ge1xyXG4gICAgLi4ub3B0aW9ucyxcclxuICAgIHVybDogKG9wdGlvbnMudXJsIGFzIHN0cmluZykgfHwgJycsXHJcbiAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMgfHwge31cclxuICB9XHJcbiAgLy8gdXNlciByZXF1ZXN0IGNvbmZpZyBwcm94eVxyXG4gIGlmIChvcHRpb25zLnByb3h5KSB7XHJcbiAgICBsZXQgcHJveHlPcHRpb25zID0gb3B0aW9ucy5wcm94eVxyXG4gICAgaWYgKHR5cGVvZiBwcm94eU9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gbmV3IFVSTChvcHRpb25zLnByb3h5KVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcHJveHlPcHRpb25zID0gZmFsc2VcclxuICAgICAgICBvcHQucHJveHkgPSBmYWxzZVxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgfVxyXG4gICAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIH1cclxuICAgIGlmIChwcm94eU9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgICAgb3B0LnByb3h5ID0gZmFsc2VcclxuICAgICAgICBvcHQuaHR0cHNBZ2VudCA9IHR1bm5lbC5odHRwc092ZXJIdHRwKHtcclxuICAgICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucz8uaG9zdG5hbWUsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucz8ucG9ydCwgMTApXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBvcHQucHJveHkgPSB7XHJcbiAgICAgICAgICBob3N0OiBwcm94eU9wdGlvbnMuaG9zdG5hbWUsXHJcbiAgICAgICAgICBwb3J0OiBwYXJzZUludChwcm94eU9wdGlvbnMucG9ydCwgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6ICdodHRwJ1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoJ2Zvcm1EYXRhJyBpbiBvcHRpb25zKSB7XHJcbiAgICBjb25zdCBmb3JtID0gbmV3IEZvcm1EYXRhKClcclxuICAgIGZvciAoY29uc3Qga2V5IGluIG9wdGlvbnMuZm9ybURhdGEpIHtcclxuICAgICAgY29uc3QgZGF0YSA9IG9wdGlvbnMuZm9ybURhdGFba2V5XVxyXG4gICAgICBhcHBlbmRGb3JtRGF0YShmb3JtLCBrZXksIGRhdGEpXHJcbiAgICB9XHJcbiAgICBvcHQuZGF0YSA9IGZvcm1cclxuICAgIG9wdC5oZWFkZXJzID0gT2JqZWN0LmFzc2lnbihvcHQuaGVhZGVycyB8fCB7fSwgZm9ybS5nZXRIZWFkZXJzKCkpXHJcbiAgICBfX2lzT2xkT3B0aW9ucyA9IHRydWVcclxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcclxuICAgIGRlbGV0ZSBvcHQuZm9ybURhdGFcclxuICB9XHJcbiAgaWYgKCdib2R5JyBpbiBvcHRpb25zKSB7XHJcbiAgICBvcHQuZGF0YSA9IG9wdGlvbnMuYm9keVxyXG4gICAgX19pc09sZE9wdGlvbnMgPSB0cnVlXHJcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXHJcbiAgICBkZWxldGUgb3B0LmJvZHlcclxuICB9XHJcbiAgaWYgKCdxcycgaW4gb3B0aW9ucykge1xyXG4gICAgb3B0LnBhcmFtcyA9IG9wdGlvbnMucXNcclxuICAgIF9faXNPbGRPcHRpb25zID0gdHJ1ZVxyXG4gIH1cclxuICBvcHQuX19pc09sZE9wdGlvbnMgPSBfX2lzT2xkT3B0aW9uc1xyXG4gIHJldHVybiBvcHRcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzcG9uc2VJbnRlcmNlcHRvciAocmVzcG9uc2U6IEF4aW9zUmVzcG9uc2UpOiBJRnVsbFJlc3BvbnNlIHtcclxuICByZXR1cm4ge1xyXG4gICAgLi4ucmVzcG9uc2UsXHJcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXHJcbiAgICBib2R5OiByZXNwb25zZS5kYXRhXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXNwb25zZUVycm9ySGFuZGxlciAoZXJyb3I6IGFueSkge1xyXG4gIC8vIGlmIChlcnJvci5yZXNwb25zZSkge1xyXG4gIC8vICAgLy8gVGhlIHJlcXVlc3Qgd2FzIG1hZGUgYW5kIHRoZSBzZXJ2ZXIgcmVzcG9uZGVkIHdpdGggYSBzdGF0dXMgY29kZVxyXG4gIC8vICAgLy8gdGhhdCBmYWxscyBvdXQgb2YgdGhlIHJhbmdlIG9mIDJ4eFxyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm8pXHJcbiAgLy8gfSBlbHNlIGlmIChlcnJvci5yZXF1ZXN0KSB7XHJcbiAgLy8gICAvLyBUaGUgcmVxdWVzdCB3YXMgbWFkZSBidXQgbm8gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkXHJcbiAgLy8gICAvLyBgZXJyb3IucmVxdWVzdGAgaXMgYW4gaW5zdGFuY2Ugb2YgWE1MSHR0cFJlcXVlc3QgaW4gdGhlIGJyb3dzZXIgYW5kIGFuIGluc3RhbmNlIG9mXHJcbiAgLy8gICAvLyBodHRwLkNsaWVudFJlcXVlc3QgaW4gbm9kZS5qc1xyXG4gIC8vICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLnJlcXVlc3QpXHJcbiAgLy8gfSBlbHNlIHtcclxuICAvLyAgIC8vIFNvbWV0aGluZyBoYXBwZW5lZCBpbiBzZXR0aW5nIHVwIHRoZSByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIGFuIEVycm9yXHJcbiAgLy8gICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IubWVzc2FnZSlcclxuICAvLyB9XHJcbiAgY29uc3QgZXJyb3JPYmogPSB7XHJcbiAgICBtZXRob2Q6IGVycm9yPy5jb25maWc/Lm1ldGhvZD8udG9VcHBlckNhc2UoKSB8fCAnJyxcclxuICAgIHVybDogZXJyb3I/LmNvbmZpZz8udXJsIHx8ICcnLFxyXG4gICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgIG1lc3NhZ2U6IGVycm9yPy5tZXNzYWdlIHx8ICcnLFxyXG4gICAgc3RhY2s6IGVycm9yPy5zdGFjayB8fCB7fSxcclxuICAgIHJlc3BvbnNlOiB7XHJcbiAgICAgIHN0YXR1czogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgc3RhdHVzQ29kZTogZXJyb3I/LnJlc3BvbnNlPy5zdGF0dXMgfHwgMCxcclxuICAgICAgYm9keTogZXJyb3I/LnJlc3BvbnNlPy5kYXRhIHx8ICcnXHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvck9iailcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBJUmVxdWVzdCB7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjdHg6IElQaWNHb1xyXG4gIHByaXZhdGUgcHJveHk6IFVuZGVmaW5hYmxlPHN0cmluZz4gPSAnJ1xyXG4gIG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZzxhbnk+ID0ge31cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmluaXQoKVxyXG4gICAgZXZlbnRCdXMub24oSUJ1c0V2ZW50LkNPTkZJR19DSEFOR0UsIChkYXRhOiBJQ29uZmlnQ2hhbmdlUGF5bG9hZDxzdHJpbmcgfCBJQ29uZmlnWydwaWNCZWQnXT4pID0+IHtcclxuICAgICAgc3dpdGNoIChkYXRhLmNvbmZpZ05hbWUpIHtcclxuICAgICAgICBjYXNlICdwaWNCZWQnOlxyXG4gICAgICAgICAgaWYgKChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKT8ucHJveHkpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm94eSA9IChkYXRhLnZhbHVlIGFzIElDb25maWdbJ3BpY0JlZCddKS5wcm94eVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICBjYXNlICdwaWNCZWQucHJveHknOlxyXG4gICAgICAgICAgdGhpcy5wcm94eSA9IGRhdGEudmFsdWUgYXMgc3RyaW5nXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5jdHguZ2V0Q29uZmlnPFVuZGVmaW5hYmxlPHN0cmluZz4+KCdwaWNCZWQucHJveHknKVxyXG4gICAgaWYgKHByb3h5KSB7XHJcbiAgICAgIHRoaXMucHJveHkgPSBwcm94eVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVQcm94eSAoKTogQXhpb3NSZXF1ZXN0Q29uZmlnWydwcm94eSddIHwgZmFsc2Uge1xyXG4gICAgaWYgKHRoaXMucHJveHkpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBwcm94eU9wdGlvbnMgPSBuZXcgVVJMKHRoaXMucHJveHkpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGhvc3Q6IHByb3h5T3B0aW9ucy5ob3N0bmFtZSxcclxuICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KHByb3h5T3B0aW9ucy5wb3J0IHx8ICcwJywgMTApLFxyXG4gICAgICAgICAgcHJvdG9jb2w6IHByb3h5T3B0aW9ucy5wcm90b2NvbFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2VcclxuICB9XHJcblxyXG4gIC8vICM2NCBkeW5hbWljIGdldCBwcm94eSB2YWx1ZVxyXG4gIHJlcXVlc3Q8VCwgVSBleHRlbmRzIChcclxuICAgIElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgSU9sZFJlcU9wdGlvbnMgPyBJT2xkUmVxT3B0aW9ucyA6IElSZXF1ZXN0Q29uZmlnPFU+IGV4dGVuZHMgQXhpb3NSZXF1ZXN0Q29uZmlnID8gQXhpb3NSZXF1ZXN0Q29uZmlnIDogbmV2ZXJcclxuICApPiAob3B0aW9uczogVSk6IFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PiB7XHJcbiAgICB0aGlzLm9wdGlvbnMucHJveHkgPSB0aGlzLmhhbmRsZVByb3h5KClcclxuICAgIHRoaXMub3B0aW9ucy5oZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzIHx8IHt9XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Qm9keUxlbmd0aCA9IEluZmluaXR5XHJcbiAgICB0aGlzLm9wdGlvbnMubWF4Q29udGVudExlbmd0aCA9IEluZmluaXR5XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLnByb3h5ICYmIG9wdGlvbnMudXJsPy5zdGFydHNXaXRoKCdodHRwczovLycpKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5odHRwc0FnZW50ID0gdHVubmVsLmh0dHBzT3Zlckh0dHAoe1xyXG4gICAgICAgIHByb3h5OiB7XHJcbiAgICAgICAgICBob3N0OiB0aGlzLm9wdGlvbnMucHJveHkuaG9zdCxcclxuICAgICAgICAgIHBvcnQ6IHRoaXMub3B0aW9ucy5wcm94eS5wb3J0XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICB0aGlzLm9wdGlvbnMucHJveHkgPSBmYWxzZVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5vcHRpb25zLmh0dHBzQWdlbnQgPSBodHRwc0FnZW50XHJcbiAgICB9XHJcbiAgICAvLyAhTk9USUNFIHRoaXMub3B0aW9ucyAhPT0gb3B0aW9uc1xyXG4gICAgLy8gdGhpcy5vcHRpb25zIGlzIHRoZSBkZWZhdWx0IG9wdGlvbnNcclxuICAgIGNvbnN0IGluc3RhbmNlID0gYXhpb3MuY3JlYXRlKHRoaXMub3B0aW9ucylcclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UocmVzcG9uc2VJbnRlcmNlcHRvciwgcmVzcG9uc2VFcnJvckhhbmRsZXIpXHJcblxyXG4gICAgLy8gY29tcGF0aWJsZSB3aXRoIG9sZCByZXF1ZXN0IG9wdGlvbnMgdG8gbmV3IG9wdGlvbnNcclxuICAgIGNvbnN0IG9wdCA9IHJlcXVlc3RJbnRlcmNlcHRvcihvcHRpb25zKVxyXG5cclxuICAgIGluc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgIC8vIGhhbmRsZSBDb250ZW50LVR5cGVcclxuICAgICAgbGV0IGNvbnRlbnRUeXBlID0gJydcclxuICAgICAgaWYgKG9iaj8uaGVhZGVycz8uY29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLmNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5jb250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uQ29udGVudFR5cGUpIHtcclxuICAgICAgICBjb250ZW50VHlwZSA9IG9iai5oZWFkZXJzLkNvbnRlbnRUeXBlIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVycy5Db250ZW50VHlwZVxyXG4gICAgICB9IGVsc2UgaWYgKG9iaj8uaGVhZGVycz8uWydjb250ZW50LXR5cGUnXSkge1xyXG4gICAgICAgIGNvbnRlbnRUeXBlID0gb2JqLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddIGFzIHN0cmluZ1xyXG4gICAgICAgIGRlbGV0ZSBvYmouaGVhZGVyc1snY29udGVudC10eXBlJ11cclxuICAgICAgfVxyXG4gICAgICBpZiAoY29udGVudFR5cGUgIT09ICcnICYmIG9iai5oZWFkZXJzKSB7XHJcbiAgICAgICAgb2JqLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudFR5cGVcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gb2JqXHJcbiAgICB9KVxyXG4gICAgaWYgKCdyZXNvbHZlV2l0aEZ1bGxSZXNwb25zZScgaW4gb3B0aW9ucyAmJiBvcHRpb25zLnJlc29sdmVXaXRoRnVsbFJlc3BvbnNlKSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZXF1ZXN0KG9wdCkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIC8vIHVzZSBvbGQgcmVxdWVzdCBvcHRpb24gZm9ybWF0XHJcbiAgICAgICAgaWYgKG9wdC5fX2lzT2xkT3B0aW9ucykge1xyXG4gICAgICAgICAgaWYgKCdqc29uJyBpbiBvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmpzb24pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcy5kYXRhKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzLmRhdGFcclxuICAgICAgICB9XHJcbiAgICAgIH0pIGFzIFByb21pc2U8SVJlc3BvbnNlPFQsIFU+PlxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUmVxdWVzdFxyXG4iLCJpbXBvcnQgeyBJQ29uZmlnLCBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSlNPTlN0b3JlIH0gZnJvbSAnQHBpY2dvL3N0b3JlJ1xyXG5pbXBvcnQgeyBJSlNPTiB9IGZyb20gJ0BwaWNnby9zdG9yZS9kaXN0L3R5cGVzJ1xyXG5cclxuY2xhc3MgREIge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBwcml2YXRlIHJlYWRvbmx5IGRiOiBKU09OU3RvcmVcclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgICB0aGlzLmRiID0gbmV3IEpTT05TdG9yZSh0aGlzLmN0eC5jb25maWdQYXRoKVxyXG5cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY0JlZCcpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY0JlZCcsIHtcclxuICAgICAgICAgIHVwbG9hZGVyOiAnc21tcycsXHJcbiAgICAgICAgICBjdXJyZW50OiAnc21tcydcclxuICAgICAgICB9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICghdGhpcy5kYi5oYXMoJ3BpY2dvUGx1Z2lucycpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5kYi5zZXQoJ3BpY2dvUGx1Z2lucycsIHt9KVxyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWQgKGZsdXNoPzogYm9vbGVhbik6IElKU09OIHtcclxuICAgIHJldHVybiB0aGlzLmRiLnJlYWQoZmx1c2gpXHJcbiAgfVxyXG5cclxuICBnZXQgKGtleTogc3RyaW5nID0gJycpOiBhbnkge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5nZXQoa2V5KVxyXG4gIH1cclxuXHJcbiAgc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi5zZXQoa2V5LCB2YWx1ZSlcclxuICB9XHJcblxyXG4gIGhhcyAoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHRoaXMucmVhZCh0cnVlKVxyXG4gICAgcmV0dXJuIHRoaXMuZGIuaGFzKGtleSlcclxuICB9XHJcblxyXG4gIHVuc2V0IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgdGhpcy5yZWFkKHRydWUpXHJcbiAgICByZXR1cm4gdGhpcy5kYi51bnNldChrZXksIHZhbHVlKVxyXG4gIH1cclxuXHJcbiAgc2F2ZUNvbmZpZyAoY29uZmlnOiBQYXJ0aWFsPElDb25maWc+KTogdm9pZCB7XHJcbiAgICBPYmplY3Qua2V5cyhjb25maWcpLmZvckVhY2goKG5hbWU6IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldChuYW1lLCBjb25maWdbbmFtZV0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQ29uZmlnIChjb25maWc6IElDb25maWcpOiB2b2lkIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbmZpZykuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMudW5zZXQobmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERCXHJcblxyXG4vLyBjb25zdCBpbml0Q29uZmlnID0gKGNvbmZpZ1BhdGg6IHN0cmluZyk6IGxvd2RiLkxvd2RiU3luYzxhbnk+ID0+IHtcclxuLy8gfVxyXG5cclxuLy8gY29uc3Qgc2F2ZUNvbmZpZyA9IChjb25maWdQYXRoOiBzdHJpbmcsIGNvbmZpZzogYW55KTogdm9pZCA9PiB7XHJcbi8vICAgY29uc3QgZGIgPSBpbml0Q29uZmlnKGNvbmZpZ1BhdGgpXHJcbi8vICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuLy8gICAgIGRiLnJlYWQoKS5zZXQobmFtZSwgY29uZmlnW25hbWVdKS53cml0ZSgpXHJcbi8vICAgfSlcclxuLy8gfVxyXG5cclxuLy8gZXhwb3J0IHtcclxuLy8gaW5pdENvbmZpZyxcclxuLy8gc2F2ZUNvbmZpZ1xyXG4vLyB9XHJcbiIsImltcG9ydCBzcGF3biBmcm9tICdjcm9zcy1zcGF3bidcclxuaW1wb3J0IHtcclxuICBJUmVzdWx0LFxyXG4gIElQcm9jZXNzRW52LFxyXG4gIElQbHVnaW5Qcm9jZXNzUmVzdWx0LFxyXG4gIElQbHVnaW5IYW5kbGVyLFxyXG4gIElQbHVnaW5IYW5kbGVyT3B0aW9ucyxcclxuICBVbmRlZmluYWJsZSxcclxuICBJUGljR28sXHJcbiAgSVBsdWdpbkhhbmRsZXJSZXN1bHRcclxufSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCB9IGZyb20gJy4uL3V0aWxzL2VudW0nXHJcbmltcG9ydCB7IGdldFByb2Nlc3NQbHVnaW5OYW1lLCBnZXROb3JtYWxQbHVnaW5OYW1lIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJTG9jYWxlc0tleSB9IGZyb20gJy4uL2kxOG4vemgtQ04nXHJcblxyXG5leHBvcnQgY2xhc3MgUGx1Z2luSGFuZGxlciBpbXBsZW1lbnRzIElQbHVnaW5IYW5kbGVyIHtcclxuICAvLyBUaGFua3MgdG8gZmVmbG93IC0+IGh0dHBzOi8vZ2l0aHViLmNvbS9mZWZsb3cvZmVmbG93L2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC9pbnN0YWxsL3BsdWdpbi5qc1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY3R4OiBJUGljR29cclxuICBjb25zdHJ1Y3RvciAoY3R4OiBJUGljR28pIHtcclxuICAgIHRoaXMuY3R4ID0gY3R4XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgaW5zdGFsbGVkUGx1Z2luczogc3RyaW5nW10gPSBbXVxyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zXHJcbiAgICAgIC5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKVxyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgLy8gZGV0ZWN0IGlmIGhhcyBhbHJlYWR5IGluc3RhbGxlZFxyXG4gICAgICAgIC8vIG9yIHdpbGwgY2F1c2UgZXJyb3JcclxuICAgICAgICBpZiAodGhpcy5jdHgucGx1Z2luTG9hZGVyLmhhc1BsdWdpbihpdGVtLnBrZ05hbWUpKSB7XHJcbiAgICAgICAgICBpbnN0YWxsZWRQbHVnaW5zLnB1c2goaXRlbS5wa2dOYW1lKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3MoYFBpY0dvIGhhcyBhbHJlYWR5IGluc3RhbGxlZCAke2l0ZW0ucGtnTmFtZX1gKVxyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHNvbWV0aGluZyB3cm9uZywgZmlsdGVyIGl0IG91dFxyXG4gICAgICAgIGlmICghaXRlbS5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgICAgfSlcclxuICAgIGNvbnN0IGZ1bGxOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0uZnVsbE5hbWUpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChmdWxsTmFtZUxpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAvLyBpbnN0YWxsIHBsdWdpbnMgbXVzdCB1c2UgZnVsbE5hbWVMaXN0OlxyXG4gICAgICAvLyAxLiBpbnN0YWxsIHJlbW90ZSBwYWNhZ2VcclxuICAgICAgLy8gMi4gaW5zdGFsbCBsb2NhbCBwYWNhZ2VcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgnaW5zdGFsbCcsIGZ1bGxOYW1lTGlzdCwgdGhpcy5jdHguYmFzZURpciwgb3B0aW9ucywgZW52KVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIucmVnaXN0ZXJQbHVnaW4ocGx1Z2luTmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogWy4uLnBrZ05hbWVMaXN0LCAuLi5pbnN0YWxsZWRQbHVnaW5zXVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRCcpLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfSlcclxuICAgICAgICBjb25zdCByZXM6IElQbHVnaW5IYW5kbGVyUmVzdWx0PGZhbHNlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgICAgYm9keTogZXJyXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpbnN0YWxsZWRQbHVnaW5zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgnaW5zdGFsbEZhaWxlZCcsIHtcclxuICAgICAgICB0aXRsZTogdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTJykpXHJcbiAgICAgIHRoaXMuY3R4LmVtaXQoJ2luc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1MnKSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcclxuICAgICAgICBib2R5OiBbLi4ucGtnTmFtZUxpc3QsIC4uLmluc3RhbGxlZFBsdWdpbnNdXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdW5pbnN0YWxsIChwbHVnaW5zOiBzdHJpbmdbXSk6IFByb21pc2U8SVBsdWdpbkhhbmRsZXJSZXN1bHQ8Ym9vbGVhbj4+IHtcclxuICAgIGNvbnN0IHByb2Nlc3NQbHVnaW5zID0gcGx1Z2lucy5tYXAoKGl0ZW06IHN0cmluZykgPT4gaGFuZGxlUGx1Z2luTmFtZVByb2Nlc3ModGhpcy5jdHgsIGl0ZW0pKS5maWx0ZXIoaXRlbSA9PiBpdGVtLnN1Y2Nlc3MpXHJcbiAgICBjb25zdCBwa2dOYW1lTGlzdCA9IHByb2Nlc3NQbHVnaW5zLm1hcChpdGVtID0+IGl0ZW0ucGtnTmFtZSlcclxuICAgIGlmIChwa2dOYW1lTGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIHVuaW5zdGFsbCBwbHVnaW5zIG11c3QgdXNlIHBrZ05hbWVMaXN0OlxyXG4gICAgICAvLyBucG0gdW5pbnN0YWxsIHdpbGwgdXNlIHRoZSBwYWNrYWdlLmpzb24ncyBuYW1lXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlY0NvbW1hbmQoJ3VuaW5zdGFsbCcsIHBrZ05hbWVMaXN0LCB0aGlzLmN0eC5iYXNlRGlyKVxyXG4gICAgICBpZiAoIXJlc3VsdC5jb2RlKSB7XHJcbiAgICAgICAgcGtnTmFtZUxpc3QuZm9yRWFjaCgocGx1Z2luTmFtZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5wbHVnaW5Mb2FkZXIudW5yZWdpc3RlclBsdWdpbihwbHVnaW5OYW1lKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jdHgubG9nLnN1Y2Nlc3ModGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1MnKSlcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxTdWNjZXNzJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTJyksXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDx0cnVlPiA9IHtcclxuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgICAgICBib2R5OiBwa2dOYW1lTGlzdFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5jdHguaTE4bi50cmFuc2xhdGU8SUxvY2FsZXNLZXk+KCdQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT04nLCB7XHJcbiAgICAgICAgICBjb2RlOiBgJHtyZXN1bHQuY29kZX1gLFxyXG4gICAgICAgICAgZGF0YTogcmVzdWx0LmRhdGFcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5lcnJvcihlcnIpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndW5pbnN0YWxsRmFpbGVkJywge1xyXG4gICAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcclxuICAgICAgICAgIGJvZHk6IGVyclxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQnKVxyXG4gICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICB0aGlzLmN0eC5lbWl0KCd1bmluc3RhbGxGYWlsZWQnLCB7XHJcbiAgICAgICAgdGl0bGU6IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRUQnKSxcclxuICAgICAgICBib2R5OiBlcnJcclxuICAgICAgfSlcclxuICAgICAgY29uc3QgcmVzOiBJUGx1Z2luSGFuZGxlclJlc3VsdDxmYWxzZT4gPSB7XHJcbiAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlIChwbHVnaW5zOiBzdHJpbmdbXSwgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudj86IElQcm9jZXNzRW52KTogUHJvbWlzZTxJUGx1Z2luSGFuZGxlclJlc3VsdDxib29sZWFuPj4ge1xyXG4gICAgY29uc3QgcHJvY2Vzc1BsdWdpbnMgPSBwbHVnaW5zLm1hcCgoaXRlbTogc3RyaW5nKSA9PiBoYW5kbGVQbHVnaW5OYW1lUHJvY2Vzcyh0aGlzLmN0eCwgaXRlbSkpLmZpbHRlcihpdGVtID0+IGl0ZW0uc3VjY2VzcylcclxuICAgIGNvbnN0IHBrZ05hbWVMaXN0ID0gcHJvY2Vzc1BsdWdpbnMubWFwKGl0ZW0gPT4gaXRlbS5wa2dOYW1lKVxyXG4gICAgaWYgKHBrZ05hbWVMaXN0Lmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8gdXBkYXRlIHBsdWdpbnMgbXVzdCB1c2UgcGtnTmFtZUxpc3Q6XHJcbiAgICAgIC8vIG5wbSB1cGRhdGUgd2lsbCB1c2UgdGhlIHBhY2thZ2UuanNvbidzIG5hbWVcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjQ29tbWFuZCgndXBkYXRlJywgcGtnTmFtZUxpc3QsIHRoaXMuY3R4LmJhc2VEaXIsIG9wdGlvbnMsIGVudilcclxuICAgICAgaWYgKCFyZXN1bHQuY29kZSkge1xyXG4gICAgICAgIHRoaXMuY3R4LmxvZy5zdWNjZXNzKHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTJykpXHJcbiAgICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlU3VjY2VzcycsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUycpLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8dHJ1ZT4gPSB7XHJcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxyXG4gICAgICAgICAgYm9keTogcGtnTmFtZUxpc3RcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGVyciA9IHRoaXMuY3R4LmkxOG4udHJhbnNsYXRlPElMb2NhbGVzS2V5PignUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OJywge1xyXG4gICAgICAgICAgY29kZTogYCR7cmVzdWx0LmNvZGV9YCxcclxuICAgICAgICAgIGRhdGE6IHJlc3VsdC5kYXRhXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgIHRoaXMuY3R4LmVtaXQoJ3VwZGF0ZUZhaWxlZCcsIHtcclxuICAgICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9KVxyXG4gICAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICAgICAgICBib2R5OiBlcnJcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEJylcclxuICAgICAgdGhpcy5jdHgubG9nLmVycm9yKGVycilcclxuICAgICAgdGhpcy5jdHguZW1pdCgndXBkYXRlRmFpbGVkJywge1xyXG4gICAgICAgIHRpdGxlOiB0aGlzLmN0eC5pMThuLnRyYW5zbGF0ZTxJTG9jYWxlc0tleT4oJ1BMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEJyksXHJcbiAgICAgICAgYm9keTogZXJyXHJcbiAgICAgIH0pXHJcbiAgICAgIGNvbnN0IHJlczogSVBsdWdpbkhhbmRsZXJSZXN1bHQ8ZmFsc2U+ID0ge1xyXG4gICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxyXG4gICAgICAgIGJvZHk6IGVyclxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXNcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY0NvbW1hbmQgKGNtZDogc3RyaW5nLCBtb2R1bGVzOiBzdHJpbmdbXSwgd2hlcmU6IHN0cmluZywgb3B0aW9uczogSVBsdWdpbkhhbmRsZXJPcHRpb25zID0ge30sIGVudjogSVByb2Nlc3NFbnYgPSB7fSk6IFByb21pc2U8SVJlc3VsdD4ge1xyXG4gICAgLy8gb3B0aW9ucyBmaXJzdFxyXG4gICAgY29uc3QgcmVnaXN0cnkgPSBvcHRpb25zLnJlZ2lzdHJ5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucmVnaXN0cnknKVxyXG4gICAgY29uc3QgcHJveHkgPSBvcHRpb25zLnByb3h5IHx8IHRoaXMuY3R4LmdldENvbmZpZzxVbmRlZmluYWJsZTxzdHJpbmc+Pignc2V0dGluZ3MucHJveHknKVxyXG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlOiBhbnkpOiB2b2lkID0+IHtcclxuICAgICAgbGV0IGFyZ3MgPSBbY21kXS5jb25jYXQobW9kdWxlcykuY29uY2F0KCctLWNvbG9yPWFsd2F5cycpLmNvbmNhdCgnLS1zYXZlJylcclxuICAgICAgaWYgKHJlZ2lzdHJ5KSB7XHJcbiAgICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KGAtLXJlZ2lzdHJ5PSR7cmVnaXN0cnl9YClcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJveHkpIHtcclxuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoYC0tcHJveHk9JHtwcm94eX1gKVxyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgbnBtID0gc3Bhd24oJ25wbScsIGFyZ3MsIHsgY3dkOiB3aGVyZSwgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgZW52KSB9KVxyXG5cclxuICAgICAgICBsZXQgb3V0cHV0ID0gJydcclxuICAgICAgICBucG0uc3Rkb3V0Py5vbignZGF0YScsIChkYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIG91dHB1dCArPSBkYXRhXHJcbiAgICAgICAgfSkucGlwZShwcm9jZXNzLnN0ZG91dClcclxuXHJcbiAgICAgICAgbnBtLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBvdXRwdXQgKz0gZGF0YVxyXG4gICAgICAgIH0pLnBpcGUocHJvY2Vzcy5zdGRlcnIpXHJcblxyXG4gICAgICAgIG5wbS5vbignY2xvc2UnLCAoY29kZTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IDAsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzb2x2ZSh7IGNvZGU6IGNvZGUsIGRhdGE6IG91dHB1dCB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLy8gZm9yIHVzZXJzIHdobyBoYXZlbid0IGluc3RhbGxlZCBub2RlLmpzXHJcbiAgICAgICAgbnBtLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgdGhpcy5jdHgubG9nLmVycm9yKCdOUE0gaXMgbm90IGluc3RhbGxlZCcpXHJcbiAgICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCAnTlBNIGlzIG5vdCBpbnN0YWxsZWQnKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICB0aGlzLmN0eC5sb2cuZXJyb3IoZSBhcyBFcnJvcilcclxuICAgICAgICB0aGlzLmN0eC5lbWl0KElCdWlsZEluRXZlbnQuRkFJTEVELCBlKVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIHRyYW5zZm9ybSB0aGUgaW5wdXQgcGx1Z2luIG5hbWUgb3IgcGF0aCBzdHJpbmcgdG8gdmFsaWQgcmVzdWx0XHJcbiAqIEBwYXJhbSBjdHhcclxuICogQHBhcmFtIG5hbWVPclBhdGhcclxuICovXHJcbmNvbnN0IGhhbmRsZVBsdWdpbk5hbWVQcm9jZXNzID0gKGN0eDogSVBpY0dvLCBuYW1lT3JQYXRoOiBzdHJpbmcpOiBJUGx1Z2luUHJvY2Vzc1Jlc3VsdCA9PiB7XHJcbiAgY29uc3QgcmVzID0ge1xyXG4gICAgc3VjY2VzczogZmFsc2UsXHJcbiAgICBmdWxsTmFtZTogJycsXHJcbiAgICBwa2dOYW1lOiAnJ1xyXG4gIH1cclxuICBjb25zdCByZXN1bHQgPSBnZXRQcm9jZXNzUGx1Z2luTmFtZShuYW1lT3JQYXRoLCBjdHgubG9nKVxyXG4gIGlmICghcmVzdWx0KSB7XHJcbiAgICByZXR1cm4gcmVzXHJcbiAgfVxyXG4gIC8vIGZpcnN0IGdldCByZXN1bHQgdGhlbiBkbyB0aGlzIHByb2Nlc3NcclxuICAvLyBvciBzb21lIGVycm9yIHdpbGwgbG9nIHR3aWNlXHJcbiAgY29uc3QgcGtnTmFtZSA9IGdldE5vcm1hbFBsdWdpbk5hbWUocmVzdWx0LCBjdHgubG9nKVxyXG4gIGlmICghcGtnTmFtZSkge1xyXG4gICAgcmV0dXJuIHJlc1xyXG4gIH1cclxuICByZXR1cm4ge1xyXG4gICAgc3VjY2VzczogdHJ1ZSxcclxuICAgIGZ1bGxOYW1lOiByZXN1bHQsXHJcbiAgICBwa2dOYW1lXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQbHVnaW5IYW5kbGVyXHJcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vLXRlbXBsYXRlLWN1cmx5LWluLXN0cmluZyAqL1xyXG5leHBvcnQgY29uc3QgWkhfQ04gPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ+S4iuS8oOWksei0pScsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICfor7fmo4Dmn6XkvaDnmoTphY3nva7pobnmmK/lkKbmraPnoa4nLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAn6K+35qOA5p+l5L2g55qE6YWN572u6aG55Lul5Y+K572R57ucJyxcclxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogJ+mUmeivr+egge+8miR7Y29kZX3vvIzor7fmiZPlvIDmtY/op4jlmajnspjotLTlnLDlnYDmn6XnnIvnm7jlhbPljp/lm6AnLFxyXG4gIFNFUlZFUl9FUlJPUjogJ+acjeWKoeerr+WHuumUme+8jOivt+mHjeivlScsXHJcbiAgQVVUSF9GQUlMRUQ6ICforqTor4HlpLHotKUnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICforr7lrppUb2tlbicsXHJcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogJ+Wkh+eUqOS4iuS8oOWfn+WQjScsXHJcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiAn5L6L5aaCIHNtbXMuYXBwJyxcclxuXHJcbiAgLy8gQWxpLWNsb3VkXHJcbiAgUElDQkVEX0FMSUNMT1VEOiAn6Zi/6YeM5LqRT1NTJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6ICforr7lrppLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ+iuvuWumktleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAn6K6+5a6a6Ieq5a6a5LmJ5Z+f5ZCNJyxcclxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBUZW5jZW50LWNsb3VkXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogJ+iFvuiur+S6kUNPUycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ09T54mI5pysJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAn6K6+5a6aU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAn6K6+5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiAn6K6+5a6aQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAn6K6+5a6aQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICforr7lrprlrZjlgqjljLrln58nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ+iuvuWumuWtmOWCqOi3r+W+hCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAn5L6L5aaC77yaMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJphcC1iZWlqaW5nJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VNb2dyMicsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICforr7lrppUb2tlbicsXHJcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiAn6K6+5a6a5LuT5bqT5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiAn6K6+5a6a5YiG5pSv5ZCNJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ+iuvuWumuiHquWumuS5ieWfn+WQjScsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86ICfmoLzlvI/vvJp1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAn5L6L5aaC77yabWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ+S4g+eJm+S6kScsXHJcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogJ+iuvuWumkFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ+iuvuWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1FJTklVX1BBVEg6ICforr7lrprlrZjlgqjot6/lvoQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICforr7lrprorr/pl67nvZHlnYAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiAn6K6+5a6a572R5Z2A5ZCO57yAJyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ+iuvuWumuWtmOWCqOWMuuWfnycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaejAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAn6K6+5a6aQ2xpZW50SWQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ+iuvuWumuS7o+eQhicsXHJcbiAgUElDQkVEX0lNR1VSX01FU1NBR0VfUFJPWFk6ICfkvovlpoLvvJpodHRwOi8vMTI3LjAuMC4xOjEwODAnLFxyXG5cclxuICAvLyB1cHl1blxyXG4gIFBJQ0JFRF9VUFlVTjogJ+WPiOaLjeS6kScsXHJcbiAgUElDQkVEX1VQWVVOX0JVQ0tFVDogJ+iuvuWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1VQWVVOX09QRVJBVE9SOiAn6K6+5a6a5pON5L2c5ZGYJyxcclxuICBQSUNCRURfVVBZVU5fUEFTU1dPUkQ6ICforr7lrprmk43kvZzlkZjlr4bnoIEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVRIOiAn6K6+5a6a5a2Y5YKo6Lev5b6EJyxcclxuICBQSUNCRURfVVBZVU5fVVJMOiAn6K6+5a6a5Yqg6YCf5Z+f5ZCNJyxcclxuICBQSUNCRURfVVBZVU5fT1BUSU9OUzogJ+iuvuWumue9keWdgOWQjue8gCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BFUkFUT1I6ICfkvovlpoLvvJptZScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFTU1dPUkQ6ICfovpPlhaXmk43kvZzlkZjlr4bnoIEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1VSTDogJ+S+i+Wmgu+8mmh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJohaW1nc2xpbScsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuXHJcbiAgLy8gUGx1Z2luIEhhbmRsZXJcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25a6J6KOF5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRUQ6ICfmj5Lku7blronoo4XlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7blronoo4XlpLHotKXvvIzlpLHotKXnoIHkuLoke2NvZGV977yM6ZSZ6K+v5pel5b+X5Li6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fSU5TVEFMTF9GQUlMRURfUEFUSDogJ+aPkuS7tuWuieijheWksei0pe+8jOivt+i+k+WFpeWQiOazleaPkuS7tuWQjeaIluWQiOazleWuieijhei3r+W+hCcsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9TVUNDRVNTOiAn5o+S5Lu25Y246L295oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWNuOi9veWksei0pScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfUkVBU09OOiAn5o+S5Lu25Y246L295aSx6LSl77yM5aSx6LSl56CB5Li6JHtjb2Rlfe+8jOmUmeivr+aXpeW/l+S4uiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VOSU5TVEFMTF9GQUlMRURfVkFMSUQ6ICfmj5Lku7bljbjovb3lpLHotKXvvIzor7fovpPlhaXlkIjms5Xmj5Lku7blkI0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfU1VDQ0VTUzogJ+aPkuS7tuabtOaWsOaIkOWKnycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRUQ6ICfmj5Lku7bmm7TmlrDlpLHotKUnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuabtOaWsOWksei0pe+8jOWksei0peeggeS4uiR7Y29kZX3vvIzplJnor6/ml6Xlv5fkuLogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1ZBTElEOiAn5o+S5Lu25pu05paw5aSx6LSl77yM6K+36L6T5YWl5ZCI5rOV5o+S5Lu25ZCNJ1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBJTG9jYWxlc0tleSA9IGtleW9mIHR5cGVvZiBaSF9DTlxyXG5leHBvcnQgdHlwZSBJTG9jYWxlcyA9IHR5cGVvZiBaSF9DTlxyXG4iLCJpbXBvcnQgeyBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBuby10ZW1wbGF0ZS1jdXJseS1pbi1zdHJpbmcgKi9cclxuZXhwb3J0IGNvbnN0IEVOOiBJTG9jYWxlcyA9IHtcclxuICBVUExPQURfRkFJTEVEOiAnVXBsb2FkIGZhaWxlZCcsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncycsXHJcbiAgQ0hFQ0tfU0VUVElOR1NfQU5EX05FVFdPUks6ICdQbGVhc2UgY2hlY2sgeW91ciBzZXR0aW5ncyBhbmQgbmV0d29yaycsXHJcbiAgVVBMT0FEX0ZBSUxFRF9SRUFTT046ICdFcnJvciBjb2RlOiAke2NvZGV9LCBwbGVhc2Ugb3BlbiB0aGUgYnJvd3NlciBhbmQgcGFzdGUgdGhlIGFkZHJlc3MgdG8gc2VlIHRoZSByZWFzb24nLFxyXG4gIFNFUlZFUl9FUlJPUjogJ1NlcnZlciBlcnJvciwgcGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicsXHJcbiAgQVVUSF9GQUlMRUQ6ICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9TTU1TX0JBQ0tVUF9ET01BSU46ICdTZXQgQmFja3VwIFVwbG9hZCBEb21haW4nLFxyXG4gIFBJQ0JFRF9TTU1TX01FU1NBR0VfQkFDS1VQX0RPTUFJTjogJ0V4LiBzbW1zLmFwcCcsXHJcblxyXG4gIC8vIEFsaS1jbG91ZFxyXG4gIFBJQ0JFRF9BTElDTE9VRDogJ0FsaSBDbG91ZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWUlEOiAnU2V0IEtleUlkJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZU0VDUkVUOiAnU2V0IEtleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9BUkVBOiAnU2V0IEFyZWEnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9DVVNUT01VUkw6ICdTZXQgQ3VzdG9tIFVSTCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX09QVElPTlM6ICdTZXQgVVJMIFN1ZmZpeCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ0V4LiBvc3MtY24tYmVpamluZycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfUEFUSDogJ0V4LiB0ZXN0LycsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ0V4LiBodHRwczovL3Rlc3QuY29tJyxcclxuXHJcbiAgLy8gVGVuY2VudC1jbG91ZFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVUQ6ICdUZW5jZW50IENsb3VkJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1ZFUlNJT046ICdDaG9vc2UgQ09TIHZlcnNpb24nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUSUQ6ICdTZXQgU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9BUFBJRDogJ1NldCBBcHBJZCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICdTZXQgQXJlYScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ1NldCBDdXN0b20gVVJMJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQVBQSUQ6ICdFeC4gMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICdFeC4gYXAtYmVpamluZycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cDovL3Rlc3QuY29tJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfT1BUSU9OUzogJ0V4LiA/aW1hZ2VNb2dyMicsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICdTZXQgVG9rZW4nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUkVQTzogJ1NldCBSZXBvIE5hbWUnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfUEFUSDogJ1NldCBQYXRoJyxcclxuICBQSUNCRURfR0lUSFVCX0JSQU5DSDogJ1NldCBCcmFuY2gnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQ1VTVE9NVVJMOiAnU2V0IEN1c3RvbSBVUkwnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9SRVBPOiAnRXguIHVzZXJuYW1lL3JlcG8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9CUkFOQ0g6ICdFeC4gbWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG4gIFBJQ0JFRF9HSVRIVUJfTUVTU0FHRV9DVVNUT01VUkw6ICdFeC4gaHR0cHM6Ly90ZXN0LmNvbScsXHJcblxyXG4gIC8vIHFpbml1XHJcbiAgUElDQkVEX1FJTklVOiAnUWluaXUnLFxyXG4gIFBJQ0JFRF9RSU5JVV9BQ0NFU1NLRVk6ICdTZXQgQWNjZXNzS2V5JyxcclxuICBQSUNCRURfUUlOSVVfU0VDUkVUS0VZOiAnU2V0IFNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ1NldCBCdWNrZXQnLFxyXG4gIFBJQ0JFRF9RSU5JVV9QQVRIOiAnU2V0IFBhdGgnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICdTZXQgVVJMJyxcclxuICBQSUNCRURfUUlOSVVfT1BUSU9OUzogJ1NldCBVUkwgU3VmZml4JyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ1NldCBBcmVhJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9QQVRIOiAnRXguIHRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAnRXguIHowJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9PUFRJT05TOiAnRXguID9pbWFnZXNsaW0nLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX1VSTDogJ0V4LiBodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAnU2V0IENsaWVudElkJyxcclxuICBQSUNCRURfSU1HVVJfUFJPWFk6ICdTZXQgUHJveHknLFxyXG4gIFBJQ0JFRF9JTUdVUl9NRVNTQUdFX1BST1hZOiAnRXguIGh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAnVXB5dW4nLFxyXG4gIFBJQ0JFRF9VUFlVTl9CVUNLRVQ6ICdTZXQgQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICdTZXQgT3BlcmF0b3InLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ1NldCBPcGVyYXRvciBQYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICdTZXQgUGF0aCcsXHJcbiAgUElDQkVEX1VQWVVOX1VSTDogJ1NldCBVUkwnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAnU2V0IFVSTCBTdWZmaXgnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QRVJBVE9SOiAnRXguIG1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ1BsZWFzZSB0eXBlIHRoZSBvcGVyYXRvciBwYXNzd29yZCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAnRXguIGh0dHA6Ly94eHgudGVzdC51cGNkbi5uZXQnLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX09QVElPTlM6ICdFeC4gIWltZ3NsaW0nLFxyXG4gIFBJQ0JFRF9VUFlVTl9NRVNTQUdFX1BBVEg6ICdFeC4gdGVzdC8nLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICdQbHVnaW4gaW5zdGFsbGVkIHN1Y2Nlc3NmdWxseScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gaW5zdGFsbGF0aW9uIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAnUGx1Z2luIGluc3RhbGxhdGlvbiBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lIG9yIHZhbGlkIGluc3RhbGxhdGlvbiBwYXRoJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICdQbHVnaW4gdW5pbnN0YWxsZWQgc3VjY2Vzc2Z1bGx5JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRDogJ1BsdWdpbiB1bmluc3RhbGwgZmFpbGVkJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICdQbHVnaW4gdW5pbnN0YWxsIGZhaWxlZCwgZXJyb3IgY29kZSBpcyAke2NvZGV9LCBlcnJvciBsb2cgaXMgXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEX1ZBTElEOiAnUGx1Z2luIHVuaW5zdGFsbCBmYWlsZWQsIHBsZWFzZSBlbnRlciBhIHZhbGlkIHBsdWdpbiBuYW1lJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX1NVQ0NFU1M6ICdQbHVnaW4gdXBkYXRlZCBzdWNjZXNzZnVsbHknLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEOiAnUGx1Z2luIHVwZGF0ZSBmYWlsZWQnLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VUERBVEVfRkFJTEVEX1JFQVNPTjogJ1BsdWdpbiB1cGRhdGUgZmFpbGVkLCBlcnJvciBjb2RlIGlzICR7Y29kZX0sIGVycm9yIGxvZyBpcyBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICdQbHVnaW4gdXBkYXRlIGZhaWxlZCwgcGxlYXNlIGVudGVyIGEgdmFsaWQgcGx1Z2luIG5hbWUnXHJcbn1cclxuIiwiaW1wb3J0IHsgSUxvY2FsZXMgfSBmcm9tICcuL3poLUNOJ1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nICovXHJcbmV4cG9ydCBjb25zdCBaSF9UVzogSUxvY2FsZXMgPSB7XHJcbiAgVVBMT0FEX0ZBSUxFRDogJ+S4iuWCs+WkseaVlycsXHJcbiAgQ0hFQ0tfU0VUVElOR1M6ICfoq4vmqqLmn6XkvaDnmoToqK3lrprmmK/lkKbmraPnoronLFxyXG4gIENIRUNLX1NFVFRJTkdTX0FORF9ORVRXT1JLOiAn6KuL5qqi5p+l5L2g55qE6Kit5a6a5Y+K57ay6LevJyxcclxuICBVUExPQURfRkFJTEVEX1JFQVNPTjogJ+mMr+iqpOeivO+8miR7Y29kZX3vvIzoq4vmiZPplovngI/opr3lmajosrzkuIrlnLDlnYDmn6XnnIvnm7jpl5zljp/lm6AnLFxyXG4gIFNFUlZFUl9FUlJPUjogJ+S8uuacjeWZqOWHuumMr++8jOiri+mHjeippicsXHJcbiAgQVVUSF9GQUlMRUQ6ICfoqo3orYnlpLHmlZcnLFxyXG5cclxuICAvLyBzbW1zXHJcbiAgUElDQkVEX1NNTVM6ICdTTS5NUycsXHJcbiAgUElDQkVEX1NNTVNfVE9LRU46ICfoqK3lrppUb2tlbicsXHJcbiAgUElDQkVEX1NNTVNfQkFDS1VQX0RPTUFJTjogJ+WCmeeUqOS4iuWCs+e2suWdgCcsXHJcbiAgUElDQkVEX1NNTVNfTUVTU0FHRV9CQUNLVVBfRE9NQUlOOiAn5L6L5aaCIHNtbXMuYXBwJyxcclxuXHJcbiAgLy8gQWxpLWNsb3VkXHJcbiAgUElDQkVEX0FMSUNMT1VEOiAn6Zi/6YeM5LqRT1NTJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQUNDRVNTS0VZSUQ6ICfoqK3lrppLZXlJZCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FDQ0VTU0tFWVNFQ1JFVDogJ+ioreWumktleVNlY3JldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9QQVRIOiAn6Kit5a6a5YSy5a2Y6Lev5b6RJyxcclxuICBQSUNCRURfQUxJQ0xPVURfQ1VTVE9NVVJMOiAn6Kit5a6a6Ieq6KiC57ay5Z2AJyxcclxuICBQSUNCRURfQUxJQ0xPVURfT1BUSU9OUzogJ+ioreWumue2suWdgOW+jOe2tCcsXHJcbiAgUElDQkVEX0FMSUNMT1VEX01FU1NBR0VfQVJFQTogJ+S+i+Wmgu+8mm9zcy1jbi1iZWlqaW5nJyxcclxuICBQSUNCRURfQUxJQ0xPVURfTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/eC1vc3MtcHJvY2Vzcz14eHgnLFxyXG4gIFBJQ0JFRF9BTElDTE9VRF9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBUZW5jZW50LWNsb3VkXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRDogJ+mosOioiuS6kUNPUycsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9WRVJTSU9OOiAnQ09T54mI5pysJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX1NFQ1JFVElEOiAn6Kit5a6aU2VjcmV0SWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfU0VDUkVUS0VZOiAn6Kit5a6aU2VjcmV0S2V5JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FQUElEOiAn6Kit5a6aQXBwSWQnLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0FSRUE6ICfoqK3lrprlhLLlrZjljYDln58nLFxyXG4gIFBJQ0JFRF9URU5DRU5UQ0xPVURfUEFUSDogJ+ioreWumuWEsuWtmOi3r+W+kScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FQUElEOiAn5L6L5aaC77yaMTIzNDU2Nzg5MCcsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX0FSRUE6ICfkvovlpoLvvJphcC1iZWlqaW5nJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfVEVOQ0VOVENMT1VEX01FU1NBR0VfQ1VTVE9NVVJMOiAn5L6L5aaC77yaaHR0cHM6Ly90ZXN0LmNvbScsXHJcbiAgUElDQkVEX1RFTkNFTlRDTE9VRF9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VNb2dyMicsXHJcblxyXG4gIC8vIEdpdEh1YlxyXG4gIFBJQ0JFRF9HSVRIVUI6ICdHaXRIdWInLFxyXG4gIFBJQ0JFRF9HSVRIVUJfVE9LRU46ICfoqK3lrppUb2tlbicsXHJcbiAgUElDQkVEX0dJVEhVQl9SRVBPOiAn6Kit5a6a5YCJ5bqr5ZCN56ixJyxcclxuICBQSUNCRURfR0lUSFVCX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9HSVRIVUJfQlJBTkNIOiAn6Kit5a6a5YiG5pSv5ZCN56ixJyxcclxuICBQSUNCRURfR0lUSFVCX0NVU1RPTVVSTDogJ+ioreWumuiHquiogue2suWdgCcsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1JFUE86ICfmoLzlvI/vvJp1c2VybmFtZS9yZXBvJyxcclxuICBQSUNCRURfR0lUSFVCX01FU1NBR0VfQlJBTkNIOiAn5L6L5aaC77yabWFpbicsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX1BBVEg6ICfkvovlpoLvvJp0ZXN0LycsXHJcbiAgUElDQkVEX0dJVEhVQl9NRVNTQUdFX0NVU1RPTVVSTDogJ+S+i+Wmgu+8mmh0dHBzOi8vdGVzdC5jb20nLFxyXG5cclxuICAvLyBxaW5pdVxyXG4gIFBJQ0JFRF9RSU5JVTogJ+S4g+eJm+S6kScsXHJcbiAgUElDQkVEX1FJTklVX0FDQ0VTU0tFWTogJ+ioreWumkFjY2Vzc0tleScsXHJcbiAgUElDQkVEX1FJTklVX1NFQ1JFVEtFWTogJ+ioreWumlNlY3JldEtleScsXHJcbiAgUElDQkVEX1FJTklVX0JVQ0tFVDogJ+ioreWumkJ1Y2tldCcsXHJcbiAgUElDQkVEX1FJTklVX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9RSU5JVV9VUkw6ICfoqK3lrproqKrllY/ntrLlnYAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfUUlOSVVfQVJFQTogJ+ioreWumuWEsuWtmOWNgOWfnycsXHJcbiAgUElDQkVEX1FJTklVX01FU1NBR0VfUEFUSDogJ+S+i+Wmgu+8mnRlc3QvJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9BUkVBOiAn5L6L5aaC77yaejAnLFxyXG4gIFBJQ0JFRF9RSU5JVV9NRVNTQUdFX09QVElPTlM6ICfkvovlpoLvvJo/aW1hZ2VzbGltJyxcclxuICBQSUNCRURfUUlOSVVfTUVTU0FHRV9VUkw6ICfkvovlpoLvvJpodHRwczovL3h4eC55eXkuZ2xiLmNsb3VkZG4uY29tJyxcclxuXHJcbiAgLy8gaW1ndXJcclxuICBQSUNCRURfSU1HVVI6ICdJbWd1cicsXHJcbiAgUElDQkVEX0lNR1VSX0NMSUVOVElEOiAn6Kit5a6aQ2xpZW50SWQnLFxyXG4gIFBJQ0JFRF9JTUdVUl9QUk9YWTogJ+ioreWumlBST1hZJyxcclxuICBQSUNCRURfSU1HVVJfTUVTU0FHRV9QUk9YWTogJ+S+i+Wmgu+8mmh0dHA6Ly8xMjcuMC4wLjE6MTA4MCcsXHJcblxyXG4gIC8vIHVweXVuXHJcbiAgUElDQkVEX1VQWVVOOiAn5Y+I5ouN5LqRJyxcclxuICBQSUNCRURfVVBZVU5fQlVDS0VUOiAn6Kit5a6aQnVja2V0JyxcclxuICBQSUNCRURfVVBZVU5fT1BFUkFUT1I6ICfoqK3lrprmk43kvZzlk6EnLFxyXG4gIFBJQ0JFRF9VUFlVTl9QQVNTV09SRDogJ+ioreWumuaTjeS9nOWToeWvhueivCcsXHJcbiAgUElDQkVEX1VQWVVOX1BBVEg6ICfoqK3lrprlhLLlrZjot6/lvpEnLFxyXG4gIFBJQ0JFRF9VUFlVTl9VUkw6ICfoqK3lrprliqDpgJ/ntrLlnYAnLFxyXG4gIFBJQ0JFRF9VUFlVTl9PUFRJT05TOiAn6Kit5a6a57ay5Z2A5b6M57a0JyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9PUEVSQVRPUjogJ+S+i+Wmgu+8mm1lJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVNTV09SRDogJ+i8uOWFpeaTjeS9nOWToeWvhueivCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfVVJMOiAn5L6L5aaC77yaaHR0cDovL3h4eC50ZXN0LnVwY2RuLm5ldCcsXHJcbiAgUElDQkVEX1VQWVVOX01FU1NBR0VfT1BUSU9OUzogJ+S+i+Wmgu+8miFpbWdzbGltJyxcclxuICBQSUNCRURfVVBZVU5fTUVTU0FHRV9QQVRIOiAn5L6L5aaC77yadGVzdC8nLFxyXG5cclxuICAvLyBQbHVnaW4gSGFuZGxlclxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7blronoo53miJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRDogJ+aPkuS7tuWuieijneWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX0lOU1RBTExfRkFJTEVEX1JFQVNPTjogJ+aPkuS7tuWuieijneWkseaVl++8jOWkseaVl+eivOeCuiR7Y29kZX3vvIzpjK/oqqTntIDpjITngrogXFxuICR7ZGF0YX0nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9JTlNUQUxMX0ZBSUxFRF9QQVRIOiAn5o+S5Lu25a6J6KOd5aSx5pWX77yM6KuL6Ly45YWl5q2j56K655qE5o+S5Lu25ZCN56ix5oiW5q2j56K655qE5a6J6KOd6Lev5b6RJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX1NVQ0NFU1M6ICfmj5Lku7bljbjovInmiJDlip8nLFxyXG4gIFBMVUdJTl9IQU5ETEVSX1BMVUdJTl9VTklOU1RBTExfRkFJTEVEOiAn5o+S5Lu25Y246LyJ5aSx5pWXJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9SRUFTT046ICfmj5Lku7bljbjovInlpLHmlZfvvIzlpLHmlZfnorzngroke2NvZGV977yM6Yyv6Kqk57SA6YyE54K6IFxcbiAke2RhdGF9JyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVU5JTlNUQUxMX0ZBSUxFRF9WQUxJRDogJ+aPkuS7tuWNuOi8ieWkseaVl++8jOiri+i8uOWFpeato+eiuueahOaPkuS7tuWQjeeosScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9TVUNDRVNTOiAn5o+S5Lu25pu05paw5oiQ5YqfJyxcclxuICBQTFVHSU5fSEFORExFUl9QTFVHSU5fVVBEQVRFX0ZBSUxFRDogJ+aPkuS7tuabtOaWsOWkseaVlycsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfUkVBU09OOiAn5o+S5Lu25pu05paw5aSx5pWX77yM5aSx5pWX56K854K6JHtjb2Rlfe+8jOmMr+iqpOe0gOmMhOeCuiBcXG4gJHtkYXRhfScsXHJcbiAgUExVR0lOX0hBTkRMRVJfUExVR0lOX1VQREFURV9GQUlMRURfVkFMSUQ6ICfmj5Lku7bmm7TmlrDlpLHmlZfvvIzoq4vovLjlhaXmraPnorrnmoTmj5Lku7blkI3nqLEnXHJcbn1cclxuIiwiaW1wb3J0IHsgWkhfQ04sIElMb2NhbGVzS2V5LCBJTG9jYWxlcyB9IGZyb20gJy4vemgtQ04nXHJcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAnbG9kYXNoJ1xyXG5pbXBvcnQgeyBJUGljR28gfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGZzIGZyb20gJ2ZzLWV4dHJhJ1xyXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJ1xyXG5cclxuaW1wb3J0IHsgT2JqZWN0QWRhcHRlciwgSTE4biB9IGZyb20gJ0BwaWNnby9pMThuJ1xyXG5pbXBvcnQgeyBJU3RyaW5nS2V5TWFwLCBJSTE4bk1hbmFnZXIgfSBmcm9tICcuLi90eXBlcy9pbmRleCdcclxuaW1wb3J0IHsgSUxvY2FsZSB9IGZyb20gJ0BwaWNnby9pMThuL2Rpc3QvdHlwZXMnXHJcbmltcG9ydCB7IEVOIH0gZnJvbSAnLi9lbidcclxuaW1wb3J0IHsgWkhfVFcgfSBmcm9tICcuL3poLVRXJ1xyXG5cclxuY29uc3QgbGFuZ3VhZ2VMaXN0OiBJU3RyaW5nS2V5TWFwPElTdHJpbmdLZXlNYXA8c3RyaW5nPj4gPSB7XHJcbiAgJ3poLUNOJzogWkhfQ04sXHJcbiAgJ3poLVRXJzogWkhfVFcsXHJcbiAgZW46IEVOXHJcbn1cclxuXHJcbmNsYXNzIEkxOG5NYW5hZ2VyIGltcGxlbWVudHMgSUkxOG5NYW5hZ2VyIHtcclxuICBwcml2YXRlIHJlYWRvbmx5IGkxOG46IEkxOG5cclxuICBwcml2YXRlIHJlYWRvbmx5IG9iamVjdEFkYXB0ZXI6IE9iamVjdEFkYXB0ZXJcclxuICBwcml2YXRlIHJlYWRvbmx5IGN0eDogSVBpY0dvXHJcbiAgY29uc3RydWN0b3IgKGN0eDogSVBpY0dvKSB7XHJcbiAgICB0aGlzLmN0eCA9IGN0eFxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyID0gbmV3IE9iamVjdEFkYXB0ZXIobGFuZ3VhZ2VMaXN0KVxyXG4gICAgbGV0IGxhbmd1YWdlID0gdGhpcy5jdHguZ2V0Q29uZmlnPHN0cmluZz4oJ3NldHRpbmdzLmxhbmd1YWdlJykgfHwgJ3poLUNOJ1xyXG4gICAgaWYgKCFsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdKSB7XHJcbiAgICAgIGxhbmd1YWdlID0gJ3poLUNOJyAvLyB1c2UgZGVmYXVsdFxyXG4gICAgfVxyXG4gICAgdGhpcy5pMThuID0gbmV3IEkxOG4oe1xyXG4gICAgICBhZGFwdGVyOiB0aGlzLm9iamVjdEFkYXB0ZXIsXHJcbiAgICAgIGRlZmF1bHRMYW5ndWFnZTogbGFuZ3VhZ2VcclxuICAgIH0pXHJcbiAgICB0aGlzLmxvYWRPdXR0ZXJJMThuKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZE91dHRlckkxOG4gKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHRoaXMuZ2V0T3V0dGVySTE4bkZvbGRlcigpXHJcbiAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGkxOG5Gb2xkZXIsIHtcclxuICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZVxyXG4gICAgfSlcclxuICAgIGZpbGVzLmZvckVhY2goZmlsZSA9PiB7XHJcbiAgICAgIGlmIChmaWxlLmlzRmlsZSgpICYmIGZpbGUubmFtZS5lbmRzV2l0aCgnLnltbCcpKSB7XHJcbiAgICAgICAgY29uc3QgaTE4bkZpbGVQYXRoID0gcGF0aC5qb2luKGkxOG5Gb2xkZXIsIGZpbGUubmFtZSlcclxuICAgICAgICBjb25zdCBpMThuRmlsZSA9IGZzLnJlYWRGaWxlU3luYyhpMThuRmlsZVBhdGgsICd1dGY4JylcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgaTE4bkZpbGVPYmogPSB5YW1sLmxvYWQoaTE4bkZpbGUpIGFzIElMb2NhbGVzXHJcbiAgICAgICAgICBsYW5ndWFnZUxpc3RbZmlsZS5uYW1lLnJlcGxhY2UoL1xcLnltbCQvLCAnJyldID0gaTE4bkZpbGVPYmpcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdXR0ZXJJMThuRm9sZGVyICgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaTE4bkZvbGRlciA9IHBhdGguam9pbih0aGlzLmN0eC5iYXNlRGlyLCAnaTE4bi1jbGknKVxyXG4gICAgaWYgKCFmcy5wYXRoRXhpc3RzU3luYyhpMThuRm9sZGVyKSkge1xyXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGkxOG5Gb2xkZXIpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gaTE4bkZvbGRlclxyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlPFQgZXh0ZW5kcyBzdHJpbmc+KGtleTogSUxvY2FsZXNLZXkgfCBULCBhcmdzPzogSVN0cmluZ0tleU1hcDxzdHJpbmc+KTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmkxOG4udHJhbnNsYXRlKGtleSwgYXJncykgfHwga2V5XHJcbiAgfVxyXG5cclxuICBzZXRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5pMThuLnNldExhbmd1YWdlKGxhbmd1YWdlKVxyXG4gICAgdGhpcy5jdHguc2F2ZUNvbmZpZyh7XHJcbiAgICAgICdzZXR0aW5ncy5sYW5ndWFnZSc6IGxhbmd1YWdlXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgYWRkTG9jYWxlIChsYW5ndWFnZTogc3RyaW5nLCBsb2NhbGVzOiBJTG9jYWxlKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBvcmlnaW5Mb2NhbGVzID0gdGhpcy5vYmplY3RBZGFwdGVyLmdldExvY2FsZShsYW5ndWFnZSlcclxuICAgIGlmICghb3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0xvY2FsZXMgPSBtZXJnZShvcmlnaW5Mb2NhbGVzLCBsb2NhbGVzKVxyXG4gICAgdGhpcy5vYmplY3RBZGFwdGVyLnNldExvY2FsZShsYW5ndWFnZSwgbmV3TG9jYWxlcylcclxuICAgIHJldHVybiB0cnVlXHJcbiAgfVxyXG5cclxuICBhZGRMYW5ndWFnZSAobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlczogSUxvY2FsZSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgb3JpZ2luTG9jYWxlcyA9IHRoaXMub2JqZWN0QWRhcHRlci5nZXRMb2NhbGUobGFuZ3VhZ2UpXHJcbiAgICBpZiAob3JpZ2luTG9jYWxlcykge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIHRoaXMub2JqZWN0QWRhcHRlci5zZXRMb2NhbGUobGFuZ3VhZ2UsIGxvY2FsZXMpXHJcbiAgICBsYW5ndWFnZUxpc3RbbGFuZ3VhZ2VdID0gbG9jYWxlc1xyXG4gICAgcmV0dXJuIHRydWVcclxuICB9XHJcblxyXG4gIGdldExhbmd1YWdlTGlzdCAoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGxhbmd1YWdlTGlzdClcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCB7XHJcbiAgSTE4bk1hbmFnZXJcclxufVxyXG4iLCJpbXBvcnQgZnMgZnJvbSAnZnMtZXh0cmEnXHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJ1xyXG5pbXBvcnQgQ29tbWFuZGVyIGZyb20gJy4uL2xpYi9Db21tYW5kZXInXHJcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL2xpYi9Mb2dnZXInXHJcbmltcG9ydCBMaWZlY3ljbGUgZnJvbSAnLi9MaWZlY3ljbGUnXHJcbmltcG9ydCBMaWZlY3ljbGVQbHVnaW5zLCB7IHNldEN1cnJlbnRQbHVnaW5OYW1lIH0gZnJvbSAnLi4vbGliL0xpZmVjeWNsZVBsdWdpbnMnXHJcbmltcG9ydCB1cGxvYWRlcnMgZnJvbSAnLi4vcGx1Z2lucy91cGxvYWRlcidcclxuaW1wb3J0IHRyYW5zZm9ybWVycyBmcm9tICcuLi9wbHVnaW5zL3RyYW5zZm9ybWVyJ1xyXG5pbXBvcnQgUGx1Z2luTG9hZGVyIGZyb20gJy4uL2xpYi9QbHVnaW5Mb2FkZXInXHJcbmltcG9ydCB7IGdldCwgc2V0LCB1bnNldCB9IGZyb20gJ2xvZGFzaCdcclxuaW1wb3J0IHsgSUhlbHBlciwgSUltZ0luZm8sIElDb25maWcsIElQaWNHbywgSVN0cmluZ0tleU1hcCwgSVBsdWdpbkxvYWRlciwgSUkxOG5NYW5hZ2VyLCBJUGljR29QbHVnaW4sIElQaWNHb1BsdWdpbkludGVyZmFjZSwgSVJlcXVlc3QgfSBmcm9tICcuLi90eXBlcydcclxuaW1wb3J0IGdldENsaXBib2FyZEltYWdlIGZyb20gJy4uL3V0aWxzL2dldENsaXBib2FyZEltYWdlJ1xyXG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9saWIvUmVxdWVzdCdcclxuaW1wb3J0IERCIGZyb20gJy4uL3V0aWxzL2RiJ1xyXG5pbXBvcnQgUGx1Z2luSGFuZGxlciBmcm9tICcuLi9saWIvUGx1Z2luSGFuZGxlcidcclxuaW1wb3J0IHsgSUJ1aWxkSW5FdmVudCwgSUJ1c0V2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZW51bSdcclxuaW1wb3J0IHsgZXZlbnRCdXMgfSBmcm9tICcuLi91dGlscy9ldmVudEJ1cydcclxuaW1wb3J0IHsgaXNDb25maWdLZXlJbkJsYWNrTGlzdCwgaXNJbnB1dENvbmZpZ1ZhbGlkIH0gZnJvbSAnLi4vdXRpbHMvY29tbW9uJ1xyXG5pbXBvcnQgeyBJMThuTWFuYWdlciB9IGZyb20gJy4uL2kxOG4nXHJcblxyXG5leHBvcnQgY2xhc3MgUGljR28gZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBJUGljR28ge1xyXG4gIHByaXZhdGUgX2NvbmZpZyE6IElDb25maWdcclxuICBwcml2YXRlIGxpZmVjeWNsZSE6IExpZmVjeWNsZVxyXG4gIHByaXZhdGUgZGIhOiBEQlxyXG4gIHByaXZhdGUgX3BsdWdpbkxvYWRlciE6IFBsdWdpbkxvYWRlclxyXG4gIGNvbmZpZ1BhdGg6IHN0cmluZ1xyXG4gIGJhc2VEaXIhOiBzdHJpbmdcclxuICBoZWxwZXIhOiBJSGVscGVyXHJcbiAgbG9nOiBMb2dnZXJcclxuICBjbWQ6IENvbW1hbmRlclxyXG4gIG91dHB1dDogSUltZ0luZm9bXVxyXG4gIGlucHV0OiBhbnlbXVxyXG4gIHBsdWdpbkhhbmRsZXI6IFBsdWdpbkhhbmRsZXJcclxuICAvKipcclxuICAgKiBAZGVwcmVjYXRlZCB3aWxsIGJlIHJlbW92ZWQgaW4gdjEuNS4wK1xyXG4gICAqXHJcbiAgICogdXNlIHJlcXVlc3QgaW5zdGVhZFxyXG4gICAqL1xyXG4gIFJlcXVlc3QhOiBSZXF1ZXN0XHJcbiAgaTE4biE6IElJMThuTWFuYWdlclxyXG4gIFZFUlNJT046IHN0cmluZyA9IHByb2Nlc3MuZW52LlBJQ0dPX1ZFUlNJT05cclxuICBHVUlfVkVSU0lPTj86IHN0cmluZ1xyXG5cclxuICBnZXQgcGx1Z2luTG9hZGVyICgpOiBJUGx1Z2luTG9hZGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9wbHVnaW5Mb2FkZXJcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yIChjb25maWdQYXRoOiBzdHJpbmcgPSAnJykge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5jb25maWdQYXRoID0gY29uZmlnUGF0aFxyXG4gICAgdGhpcy5vdXRwdXQgPSBbXVxyXG4gICAgdGhpcy5pbnB1dCA9IFtdXHJcbiAgICB0aGlzLmhlbHBlciA9IHtcclxuICAgICAgdHJhbnNmb3JtZXI6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCd0cmFuc2Zvcm1lcicpLFxyXG4gICAgICB1cGxvYWRlcjogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ3VwbG9hZGVyJyksXHJcbiAgICAgIGJlZm9yZVRyYW5zZm9ybVBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVUcmFuc2Zvcm1QbHVnaW5zJyksXHJcbiAgICAgIGJlZm9yZVVwbG9hZFBsdWdpbnM6IG5ldyBMaWZlY3ljbGVQbHVnaW5zKCdiZWZvcmVVcGxvYWRQbHVnaW5zJyksXHJcbiAgICAgIGFmdGVyVXBsb2FkUGx1Z2luczogbmV3IExpZmVjeWNsZVBsdWdpbnMoJ2FmdGVyVXBsb2FkUGx1Z2lucycpXHJcbiAgICB9XHJcbiAgICB0aGlzLmluaXRDb25maWdQYXRoKClcclxuICAgIHRoaXMubG9nID0gbmV3IExvZ2dlcih0aGlzKVxyXG4gICAgdGhpcy5jbWQgPSBuZXcgQ29tbWFuZGVyKHRoaXMpXHJcbiAgICB0aGlzLnBsdWdpbkhhbmRsZXIgPSBuZXcgUGx1Z2luSGFuZGxlcih0aGlzKVxyXG4gICAgdGhpcy5pbml0Q29uZmlnKClcclxuICAgIHRoaXMuaW5pdCgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRDb25maWdQYXRoICgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1BhdGggPT09ICcnKSB7XHJcbiAgICAgIHRoaXMuY29uZmlnUGF0aCA9IGhvbWVkaXIoKSArICcvLnBpY2dvL2NvbmZpZy5qc29uJ1xyXG4gICAgfVxyXG4gICAgaWYgKHBhdGguZXh0bmFtZSh0aGlzLmNvbmZpZ1BhdGgpLnRvVXBwZXJDYXNlKCkgIT09ICcuSlNPTicpIHtcclxuICAgICAgdGhpcy5jb25maWdQYXRoID0gJydcclxuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgfVxyXG4gICAgdGhpcy5iYXNlRGlyID0gcGF0aC5kaXJuYW1lKHRoaXMuY29uZmlnUGF0aClcclxuICAgIGNvbnN0IGV4aXN0ID0gZnMucGF0aEV4aXN0c1N5bmModGhpcy5jb25maWdQYXRoKVxyXG4gICAgaWYgKCFleGlzdCkge1xyXG4gICAgICBmcy5lbnN1cmVGaWxlU3luYyhgJHt0aGlzLmNvbmZpZ1BhdGh9YClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdENvbmZpZyAoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRiID0gbmV3IERCKHRoaXMpXHJcbiAgICB0aGlzLl9jb25maWcgPSB0aGlzLmRiLnJlYWQodHJ1ZSkgYXMgSUNvbmZpZ1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0ICgpOiB2b2lkIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIGluaXQgMThuIGF0IGZpcnN0XHJcbiAgICAgIHRoaXMuaTE4biA9IG5ldyBJMThuTWFuYWdlcih0aGlzKVxyXG4gICAgICB0aGlzLlJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzKVxyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIgPSBuZXcgUGx1Z2luTG9hZGVyKHRoaXMpXHJcbiAgICAgIC8vIGxvYWQgc2VsZiBwbHVnaW5zXHJcbiAgICAgIHNldEN1cnJlbnRQbHVnaW5OYW1lKCdwaWNnbycpXHJcbiAgICAgIHVwbG9hZGVycyh0aGlzKS5yZWdpc3Rlcih0aGlzKVxyXG4gICAgICB0cmFuc2Zvcm1lcnModGhpcykucmVnaXN0ZXIodGhpcylcclxuICAgICAgc2V0Q3VycmVudFBsdWdpbk5hbWUoJycpXHJcbiAgICAgIC8vIGxvYWQgdGhpcmQtcGFydHkgcGx1Z2luc1xyXG4gICAgICB0aGlzLl9wbHVnaW5Mb2FkZXIubG9hZCgpXHJcbiAgICAgIHRoaXMubGlmZWN5Y2xlID0gbmV3IExpZmVjeWNsZSh0aGlzKVxyXG4gICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LlVQTE9BRF9QUk9HUkVTUywgLTEpXHJcbiAgICAgIHRoaXMubG9nLmVycm9yKGUpXHJcbiAgICAgIHRocm93IGVcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGVhc2lseSBtYW5udWFsbHkgbG9hZCBhIHBsdWdpblxyXG4gICAqIGlmIHByb3ZpZGUgcGx1Z2luIG5hbWUsIHdpbGwgcmVnaXN0ZXIgcGx1Z2luIGJ5IG5hbWVcclxuICAgKiBvciBqdXN0IGluc3RhbnRpYXRlIGEgcGx1Z2luXHJcbiAgICovXHJcbiAgdXNlIChwbHVnaW46IElQaWNHb1BsdWdpbiwgbmFtZT86IHN0cmluZyk6IElQaWNHb1BsdWdpbkludGVyZmFjZSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICB0aGlzLnBsdWdpbkxvYWRlci5yZWdpc3RlclBsdWdpbihuYW1lLCBwbHVnaW4pXHJcbiAgICAgIHJldHVybiB0aGlzLnBsdWdpbkxvYWRlci5nZXRQbHVnaW4obmFtZSkhXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBwbHVnaW5JbnN0YW5jZSA9IHBsdWdpbih0aGlzKVxyXG4gICAgICByZXR1cm4gcGx1Z2luSW5zdGFuY2VcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyQ29tbWFuZHMgKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5jbWQuaW5pdCgpXHJcbiAgICAgIHRoaXMuY21kLmxvYWRDb21tYW5kcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb25maWc8VD4gKG5hbWU/OiBzdHJpbmcpOiBUIHtcclxuICAgIGlmICghbmFtZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fY29uZmlnIGFzIHVua25vd24gYXMgVFxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGdldCh0aGlzLl9jb25maWcsIG5hbWUpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzYXZlQ29uZmlnIChjb25maWc6IElTdHJpbmdLZXlNYXA8YW55Pik6IHZvaWQge1xyXG4gICAgaWYgKCFpc0lucHV0Q29uZmlnVmFsaWQoY29uZmlnKSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKCd0aGUgZm9ybWF0IG9mIGNvbmZpZyBpcyBpbnZhbGlkLCBwbGVhc2UgcHJvdmlkZSBvYmplY3QnKVxyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZylcclxuICAgIHRoaXMuZGIuc2F2ZUNvbmZpZyhjb25maWcpXHJcbiAgfVxyXG5cclxuICByZW1vdmVDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSByZW1vdmVkYClcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLnVuc2V0Q29uZmlnKGtleSwgcHJvcE5hbWUpXHJcbiAgICB0aGlzLmRiLnVuc2V0KGtleSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBzZXRDb25maWcgKGNvbmZpZzogSVN0cmluZ0tleU1hcDxhbnk+KTogdm9pZCB7XHJcbiAgICBpZiAoIWlzSW5wdXRDb25maWdWYWxpZChjb25maWcpKSB7XHJcbiAgICAgIHRoaXMubG9nLndhcm4oJ3RoZSBmb3JtYXQgb2YgY29uZmlnIGlzIGludmFsaWQsIHBsZWFzZSBwcm92aWRlIG9iamVjdCcpXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcclxuICAgICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3QobmFtZSkpIHtcclxuICAgICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7bmFtZX0gY2FuJ3QgYmUgbW9kaWZpZWRgKVxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcclxuICAgICAgICBkZWxldGUgY29uZmlnW25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgc2V0KHRoaXMuX2NvbmZpZywgbmFtZSwgY29uZmlnW25hbWVdKVxyXG4gICAgICBldmVudEJ1cy5lbWl0KElCdXNFdmVudC5DT05GSUdfQ0hBTkdFLCB7XHJcbiAgICAgICAgY29uZmlnTmFtZTogbmFtZSxcclxuICAgICAgICB2YWx1ZTogY29uZmlnW25hbWVdXHJcbiAgICAgIH0pXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdW5zZXRDb25maWcgKGtleTogc3RyaW5nLCBwcm9wTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAoIWtleSB8fCAhcHJvcE5hbWUpIHJldHVyblxyXG4gICAgaWYgKGlzQ29uZmlnS2V5SW5CbGFja0xpc3Qoa2V5KSkge1xyXG4gICAgICB0aGlzLmxvZy53YXJuKGB0aGUgY29uZmlnLiR7a2V5fSBjYW4ndCBiZSB1bnNldGApXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgdW5zZXQodGhpcy5nZXRDb25maWcoa2V5KSwgcHJvcE5hbWUpXHJcbiAgfVxyXG5cclxuICBnZXQgcmVxdWVzdCAoKTogSVJlcXVlc3RbJ3JlcXVlc3QnXSB7XHJcbiAgICByZXR1cm4gdGhpcy5SZXF1ZXN0LnJlcXVlc3QuYmluZCh0aGlzLlJlcXVlc3QpXHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGxvYWQgKGlucHV0PzogYW55W10pOiBQcm9taXNlPElJbWdJbmZvW10gfCBFcnJvcj4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnUGF0aCA9PT0gJycpIHtcclxuICAgICAgdGhpcy5sb2cuZXJyb3IoJ1RoZSBjb25maWd1cmF0aW9uIGZpbGUgb25seSBzdXBwb3J0cyBKU09OIGZvcm1hdC4nKVxyXG4gICAgICByZXR1cm4gW11cclxuICAgIH1cclxuICAgIC8vIHVwbG9hZCBmcm9tIGNsaXBib2FyZFxyXG4gICAgaWYgKGlucHV0ID09PSB1bmRlZmluZWQgfHwgaW5wdXQubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgeyBpbWdQYXRoLCBzaG91bGRLZWVwQWZ0ZXJVcGxvYWRpbmcgfSA9IGF3YWl0IGdldENsaXBib2FyZEltYWdlKHRoaXMpXHJcbiAgICAgICAgaWYgKGltZ1BhdGggPT09ICdubyBpbWFnZScpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW1hZ2Ugbm90IGZvdW5kIGluIGNsaXBib2FyZCcpXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub25jZShJQnVpbGRJbkV2ZW50LkZBSUxFRCwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNob3VsZEtlZXBBZnRlclVwbG9hZGluZykge1xyXG4gICAgICAgICAgICAgIC8vIOWIoOmZpCBwaWNnbyDnlJ/miJDnmoTlm77niYfmlofku7bvvIzkvovlpoIgYH4vLnBpY2dvLzIwMjAwNjIxMjA1NzIwLnBuZ2BcclxuICAgICAgICAgICAgICBmcy5yZW1vdmUoaW1nUGF0aCkuY2F0Y2goKGUpID0+IHsgdGhpcy5sb2cuZXJyb3IoZSkgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRoaXMub25jZSgnZmluaXNoZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkS2VlcEFmdGVyVXBsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgICAgZnMucmVtb3ZlKGltZ1BhdGgpLmNhdGNoKChlKSA9PiB7IHRoaXMubG9nLmVycm9yKGUpIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgdGhpcy5saWZlY3ljbGUuc3RhcnQoW2ltZ1BhdGhdKVxyXG4gICAgICAgICAgcmV0dXJuIG91dHB1dFxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRoaXMuZW1pdChJQnVpbGRJbkV2ZW50LkZBSUxFRCwgZSlcclxuICAgICAgICB0aHJvdyBlXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHVwbG9hZCBmcm9tIHBhdGhcclxuICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IHRoaXMubGlmZWN5Y2xlLnN0YXJ0KGlucHV0KVxyXG4gICAgICByZXR1cm4gb3V0cHV0XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJjb25maWciLCJpbWFnZVNpemUiLCJwYXRoIiwiZnMiLCJ1cmwiLCJVUkwiLCJnbG9iYnkiLCJtYXRjaCIsImVqcyIsInJtIiwiZG93bmxvYWQiLCJob21lZGlyIiwiY2hhbGsiLCJDb21tYW5kIiwiaW5xdWlyZXIiLCJkYXlqcyIsInV0aWwiLCJFdmVudEVtaXR0ZXIiLCJwb3N0T3B0aW9ucyIsImhhbmRsZSIsInJlZ2lzdGVyIiwiZ2VuZXJhdGVTaWduYXR1cmUiLCJjcnlwdG8iLCJtaW1lIiwicWluaXUiLCJNRDUiLCJhbGlZdW5VcGxvYWRlciIsInRjWXVuVXBsb2FkZXIiLCJTTU1TVXBsb2FkZXIiLCJnaXRodWJVcGxvYWRlciIsInFpbml1VXBsb2FkZXIiLCJpbWd1clVwbG9hZGVyIiwidXBZdW5VcGxvYWRlciIsInJlc29sdmUiLCJpc1dzbCIsIm9zIiwic3Bhd24iLCJodHRwcyIsInR1bm5lbCIsIkZvcm1EYXRhIiwiYXhpb3MiLCJKU09OU3RvcmUiLCJPYmplY3RBZGFwdGVyIiwiSTE4biIsInlhbWwiLCJtZXJnZSIsInVwbG9hZGVycyIsInRyYW5zZm9ybWVycyIsImdldCIsInNldCIs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