@decaf-ts/utils 0.3.13 → 0.4.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.
package/dist/utils.cjs CHANGED
@@ -1,10 +1,13 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('prompts'), require('util'), require('@decaf-ts/logging'), require('fs'), require('path'), require('child_process'), require('styled-string-builder'), require('https'), require('rollup'), require('@rollup/plugin-typescript'), require('@rollup/plugin-commonjs'), require('@rollup/plugin-node-resolve'), require('@rollup/plugin-json'), require('typescript')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'prompts', 'util', '@decaf-ts/logging', 'fs', 'path', 'child_process', 'styled-string-builder', 'https', 'rollup', '@rollup/plugin-typescript', '@rollup/plugin-commonjs', '@rollup/plugin-node-resolve', '@rollup/plugin-json', 'typescript'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.utils = {}, global.prompts, global.util, global.logging, global.fs, global.path, global.child_process, global.styledStringBuilder, global.https, global.rollup, global.typescript, global.commonjs, global.pluginNodeResolve, global.json, global.ts));
5
- })(this, (function (exports, prompts, util, logging, fs, path, child_process, styledStringBuilder, https, rollup, typescript, commonjs, pluginNodeResolve, json, ts) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('prompts'), require('util'), require('@decaf-ts/logging'), require('fs'), require('path'), require('child_process'), require('styled-string-builder'), require('https'), require('rollup'), require('@rollup/plugin-typescript'), require('@rollup/plugin-commonjs'), require('@rollup/plugin-node-resolve'), require('@rollup/plugin-json'), require('module'), require('typescript')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'prompts', 'util', '@decaf-ts/logging', 'fs', 'path', 'child_process', 'styled-string-builder', 'https', 'rollup', '@rollup/plugin-typescript', '@rollup/plugin-commonjs', '@rollup/plugin-node-resolve', '@rollup/plugin-json', 'module', 'typescript'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.utils = {}, global.prompts, global.util, global.decafTsLogging, global.fs, global.path, global.childProcess, global.styledStringBuilder, global.https, global.rollup, global.rollupPluginTypescript, global.rollupPluginCommonjs, global.rollupPluginNodeResolve, global.rollupPluginJson, global.module, global.typescript));
5
+ })(this, (function (exports, prompts, util, logging, fs, path, child_process, styledStringBuilder, https, rollup, typescript, commonjs, pluginNodeResolve, json, module, ts) { 'use strict';
6
6
 
7
- function _interopNamespaceDefault(e) {
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
8
11
  var n = Object.create(null);
9
12
  if (e) {
10
13
  Object.keys(e).forEach(function (k) {
@@ -17,11 +20,18 @@
17
20
  }
18
21
  });
19
22
  }
20
- n.default = e;
23
+ n["default"] = e;
21
24
  return Object.freeze(n);
22
25
  }
23
26
 
24
- var ts__namespace = /*#__PURE__*/_interopNamespaceDefault(ts);
27
+ var prompts__default = /*#__PURE__*/_interopDefaultLegacy(prompts);
28
+ var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
29
+ var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
30
+ var https__default = /*#__PURE__*/_interopDefaultLegacy(https);
31
+ var typescript__default = /*#__PURE__*/_interopDefaultLegacy(typescript);
32
+ var commonjs__default = /*#__PURE__*/_interopDefaultLegacy(commonjs);
33
+ var json__default = /*#__PURE__*/_interopDefaultLegacy(json);
34
+ var ts__namespace = /*#__PURE__*/_interopNamespace(ts);
25
35
 
26
36
  /**
27
37
  * @description Represents a user input prompt with various configuration options.
@@ -409,7 +419,7 @@
409
419
  let answers;
410
420
  try {
411
421
  log.verbose(`Asking questions: ${question.map((q) => q.name).join(", ")}`);
412
- answers = await prompts(question);
422
+ answers = await prompts__default["default"](question);
413
423
  log.verbose(`Received answers: ${JSON.stringify(answers, null, 2)}`);
414
424
  }
415
425
  catch (error) {
@@ -1205,7 +1215,7 @@
1205
1215
  */
1206
1216
  function patchFile(path, values) {
1207
1217
  const log = logger.for(patchFile);
1208
- if (!fs.existsSync(path))
1218
+ if (!fs__default["default"].existsSync(path))
1209
1219
  throw new Error(`File not found at path "${path}".`);
1210
1220
  let content = readFile(path);
1211
1221
  try {
@@ -1233,7 +1243,7 @@
1233
1243
  const log = logger.for(readFile);
1234
1244
  try {
1235
1245
  log.verbose(`Reading file "${path}"...`);
1236
- return fs.readFileSync(path, "utf8");
1246
+ return fs__default["default"].readFileSync(path, "utf8");
1237
1247
  }
1238
1248
  catch (error) {
1239
1249
  log.verbose(`Error reading file "${path}": ${error}`);
@@ -1256,7 +1266,7 @@
1256
1266
  const log = logger.for(writeFile);
1257
1267
  try {
1258
1268
  log.verbose(`Writing file "${path} with ${data.length} bytes...`);
1259
- fs.writeFileSync(path, data, "utf8");
1269
+ fs__default["default"].writeFileSync(path, data, "utf8");
1260
1270
  }
1261
1271
  catch (error) {
1262
1272
  log.verbose(`Error writing file "${path}": ${error}`);
@@ -1280,10 +1290,10 @@
1280
1290
  const files = [];
1281
1291
  try {
1282
1292
  log.verbose(`Retrieving all files from "${p}"...`);
1283
- const entries = fs.readdirSync(p);
1293
+ const entries = fs__default["default"].readdirSync(p);
1284
1294
  entries.forEach((entry) => {
1285
- const fullPath = path.join(p, entry);
1286
- const stat = fs.statSync(fullPath);
1295
+ const fullPath = path__default["default"].join(p, entry);
1296
+ const stat = fs__default["default"].statSync(fullPath);
1287
1297
  if (stat.isFile()) {
1288
1298
  files.push(fullPath);
1289
1299
  }
@@ -1316,14 +1326,14 @@
1316
1326
  const log = logger.for(renameFile);
1317
1327
  let descriptorSource, descriptorDest;
1318
1328
  try {
1319
- descriptorSource = fs.statSync(source);
1329
+ descriptorSource = fs__default["default"].statSync(source);
1320
1330
  }
1321
1331
  catch (error) {
1322
1332
  log.verbose(`Source path "${source}" does not exist: ${error}`);
1323
1333
  throw new Error(`Source path "${source}" does not exist: ${error}`);
1324
1334
  }
1325
1335
  try {
1326
- descriptorDest = fs.statSync(dest);
1336
+ descriptorDest = fs__default["default"].statSync(dest);
1327
1337
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1328
1338
  }
1329
1339
  catch (e) {
@@ -1335,7 +1345,7 @@
1335
1345
  }
1336
1346
  try {
1337
1347
  log.verbose(`Renaming ${descriptorSource.isFile() ? "file" : "directory"} "${source}" to "${dest}...`);
1338
- fs.renameSync(source, dest);
1348
+ fs__default["default"].renameSync(source, dest);
1339
1349
  log.verbose(`Successfully renamed to "${dest}"`);
1340
1350
  }
1341
1351
  catch (error) {
@@ -1359,7 +1369,7 @@
1359
1369
  const log = logger.for(copyFile);
1360
1370
  let descriptorSource, descriptorDest;
1361
1371
  try {
1362
- descriptorSource = fs.statSync(source);
1372
+ descriptorSource = fs__default["default"].statSync(source);
1363
1373
  }
1364
1374
  catch (error) {
1365
1375
  log.verbose(`Source path "${source}" does not exist: ${error}`);
@@ -1367,18 +1377,18 @@
1367
1377
  }
1368
1378
  try {
1369
1379
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1370
- descriptorDest = fs.statSync(dest);
1380
+ descriptorDest = fs__default["default"].statSync(dest);
1371
1381
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
1372
1382
  }
1373
1383
  catch (error) {
1374
1384
  if (descriptorSource.isDirectory()) {
1375
1385
  log.verbose(`Dest path "${dest}" does not exist. creating`);
1376
- fs.mkdirSync(dest, { recursive: true });
1386
+ fs__default["default"].mkdirSync(dest, { recursive: true });
1377
1387
  }
1378
1388
  }
1379
1389
  try {
1380
1390
  log.verbose(`Copying ${descriptorSource.isFile() ? "file" : "directory"} "${source}" to "${dest}...`);
1381
- fs.cpSync(source, dest, { recursive: true });
1391
+ fs__default["default"].cpSync(source, dest, { recursive: true });
1382
1392
  }
1383
1393
  catch (error) {
1384
1394
  log.verbose(`Error copying ${descriptorSource.isFile() ? "file" : "directory"} "${source}" to "${dest}: ${error}`);
@@ -1399,13 +1409,13 @@
1399
1409
  function deletePath(p) {
1400
1410
  const log = logger.for(deletePath);
1401
1411
  try {
1402
- const descriptor = fs.statSync(p);
1412
+ const descriptor = fs__default["default"].statSync(p);
1403
1413
  if (descriptor.isFile()) {
1404
1414
  log.verbose(`Deleting file "${p}...`);
1405
- fs.rmSync(p, { recursive: true, force: true });
1415
+ fs__default["default"].rmSync(p, { recursive: true, force: true });
1406
1416
  }
1407
1417
  else if (descriptor.isDirectory())
1408
- fs.rmSync(p, { recursive: true, force: true });
1418
+ fs__default["default"].rmSync(p, { recursive: true, force: true });
1409
1419
  }
1410
1420
  catch (error) {
1411
1421
  log.verbose(`Error Deleting "${p}": ${error}`);
@@ -1445,7 +1455,7 @@
1445
1455
  function getPackage(p = process.cwd(), property) {
1446
1456
  let pkg;
1447
1457
  try {
1448
- pkg = JSON.parse(readFile(path.join(p, `package.json`)));
1458
+ pkg = JSON.parse(readFile(path__default["default"].join(p, `package.json`)));
1449
1459
  }
1450
1460
  catch (error) {
1451
1461
  throw new Error(`Failed to retrieve package information" ${error}`);
@@ -1473,7 +1483,7 @@
1473
1483
  function setPackageAttribute(attr, value, p = process.cwd()) {
1474
1484
  const pkg = getPackage(p);
1475
1485
  pkg[attr] = value;
1476
- writeFile(path.join(p, `package.json`), JSON.stringify(pkg, null, 2));
1486
+ writeFile(path__default["default"].join(p, `package.json`), JSON.stringify(pkg, null, 2));
1477
1487
  }
1478
1488
  /**
1479
1489
  * @description Retrieves the version from package.json.
@@ -2739,7 +2749,7 @@
2739
2749
  return new Promise((resolve, reject) => {
2740
2750
  function request(url) {
2741
2751
  url = encodeURI(url);
2742
- https.get(url, (res) => {
2752
+ https__default["default"].get(url, (res) => {
2743
2753
  if (res.statusCode === 301 || res.statusCode === 307)
2744
2754
  return request(res.headers.location);
2745
2755
  if (res.statusCode !== 200) {
@@ -2763,7 +2773,60 @@
2763
2773
  }
2764
2774
  }
2765
2775
 
2766
- const VERSION_STRING = "0.3.13";
2776
+ function parseList(input) {
2777
+ if (!input)
2778
+ return [];
2779
+ if (Array.isArray(input))
2780
+ return input.map((i) => `${i}`.trim()).filter(Boolean);
2781
+ return `${input}`
2782
+ .split(",")
2783
+ .map((p) => p.trim())
2784
+ .filter(Boolean);
2785
+ }
2786
+ function packageToGlobal(name) {
2787
+ // Remove scope and split by non-alphanumeric chars, then camelCase
2788
+ const withoutScope = name.replace(/^@/, "");
2789
+ const parts = withoutScope.split(/[/\-_.]+/).filter(Boolean);
2790
+ return parts
2791
+ .map((p, i) => i === 0
2792
+ ? p.replace(/[^a-zA-Z0-9]/g, "")
2793
+ : `${p.charAt(0).toUpperCase()}${p.slice(1)}`)
2794
+ .join("");
2795
+ }
2796
+ function getPackageDependencies() {
2797
+ // Try the current working directory first
2798
+ let pkg;
2799
+ try {
2800
+ pkg = getPackage(process.cwd());
2801
+ }
2802
+ catch {
2803
+ pkg = undefined;
2804
+ }
2805
+ // If no dependencies found in cwd, try the package next to this source file (fallback for tests)
2806
+ try {
2807
+ const hasDeps = pkg &&
2808
+ (Object.keys(pkg.dependencies || {}).length > 0 ||
2809
+ Object.keys(pkg.devDependencies || {}).length > 0 ||
2810
+ Object.keys(pkg.peerDependencies || {}).length > 0);
2811
+ if (!hasDeps) {
2812
+ const fallbackDir = path__default["default"].resolve(__dirname, "../../..");
2813
+ try {
2814
+ pkg = getPackage(fallbackDir);
2815
+ }
2816
+ catch {
2817
+ // ignore and keep pkg as-is
2818
+ }
2819
+ }
2820
+ }
2821
+ catch {
2822
+ // ignore
2823
+ }
2824
+ const deps = Object.keys((pkg && pkg.dependencies) || {});
2825
+ const peer = Object.keys((pkg && pkg.peerDependencies) || {});
2826
+ const dev = Object.keys((pkg && pkg.devDependencies) || {});
2827
+ return Array.from(new Set([...deps, ...peer, ...dev]));
2828
+ }
2829
+ const VERSION_STRING = "0.4.1";
2767
2830
  const PACKAGE_STRING = "@decaf-ts/utils";
2768
2831
  var Modes;
2769
2832
  (function (Modes) {
@@ -2776,11 +2839,6 @@
2776
2839
  BuildMode["BUNDLE"] = "bundle";
2777
2840
  BuildMode["ALL"] = "all";
2778
2841
  })(BuildMode || (BuildMode = {}));
2779
- var SEPARATORS;
2780
- (function (SEPARATORS) {
2781
- SEPARATORS["DOT"] = ".";
2782
- })(SEPARATORS || (SEPARATORS = {}));
2783
- const binSourceLocation = "/src/bin";
2784
2842
  const options$2 = {
2785
2843
  prod: {
2786
2844
  type: "boolean",
@@ -2794,6 +2852,14 @@
2794
2852
  type: "string",
2795
2853
  default: BuildMode.ALL,
2796
2854
  },
2855
+ includes: {
2856
+ type: "string",
2857
+ default: "",
2858
+ },
2859
+ externals: {
2860
+ type: "string",
2861
+ default: "",
2862
+ },
2797
2863
  docs: {
2798
2864
  type: "boolean",
2799
2865
  default: false,
@@ -2812,7 +2878,7 @@
2812
2878
  const resolutionCache = new Map();
2813
2879
  return (transformationContext) => {
2814
2880
  return (sourceFile) => {
2815
- const sourceDir = path.dirname(sourceFile.fileName);
2881
+ const sourceDir = path__default["default"].dirname(sourceFile.fileName);
2816
2882
  function resolvePath(importPath) {
2817
2883
  const cacheKey = JSON.stringify([sourceDir, importPath]);
2818
2884
  const cachedValue = resolutionCache.get(cacheKey);
@@ -2820,19 +2886,19 @@
2820
2886
  return cachedValue;
2821
2887
  let resolvedPath = importPath;
2822
2888
  try {
2823
- resolvedPath = path.resolve(sourceDir, resolvedPath + ".ts");
2889
+ resolvedPath = path__default["default"].resolve(sourceDir, resolvedPath + ".ts");
2824
2890
  }
2825
2891
  catch (error) {
2826
2892
  throw new Error(`Failed to resolve path ${importPath}: ${error}`);
2827
2893
  }
2828
2894
  let stat;
2829
2895
  try {
2830
- stat = fs.statSync(resolvedPath);
2896
+ stat = fs__default["default"].statSync(resolvedPath);
2831
2897
  }
2832
2898
  catch (e) {
2833
2899
  try {
2834
2900
  log.verbose(`Testing existence of path ${resolvedPath} as a folder defaulting to index file`);
2835
- stat = fs.statSync(resolvedPath.replace(/\.ts$/gm, ""));
2901
+ stat = fs__default["default"].statSync(resolvedPath.replace(/\.ts$/gm, ""));
2836
2902
  }
2837
2903
  catch (e2) {
2838
2904
  throw new Error(`Failed to resolve path ${importPath}: ${e}, ${e2}`);
@@ -2840,11 +2906,11 @@
2840
2906
  }
2841
2907
  if (stat.isDirectory())
2842
2908
  resolvedPath = resolvedPath.replace(/\.ts$/gm, "/index.ts");
2843
- if (path.isAbsolute(resolvedPath)) {
2844
- const extension = (/\.tsx?$/.exec(path.basename(resolvedPath)) || [])[0] || void 0;
2909
+ if (path__default["default"].isAbsolute(resolvedPath)) {
2910
+ const extension = (/\.tsx?$/.exec(path__default["default"].basename(resolvedPath)) || [])[0] || void 0;
2845
2911
  resolvedPath =
2846
2912
  "./" +
2847
- path.relative(sourceDir, path.resolve(path.dirname(resolvedPath), path.basename(resolvedPath, extension) + ext));
2913
+ path__default["default"].relative(sourceDir, path__default["default"].resolve(path__default["default"].dirname(resolvedPath), path__default["default"].basename(resolvedPath, extension) + ext));
2848
2914
  }
2849
2915
  resolutionCache.set(cacheKey, resolvedPath);
2850
2916
  return resolvedPath;
@@ -2877,7 +2943,7 @@
2877
2943
  !node.moduleSpecifier.text.startsWith("../"))
2878
2944
  return false;
2879
2945
  // only when module specifier has no extension
2880
- if (path.extname(node.moduleSpecifier.text) !== "")
2946
+ if (path__default["default"].extname(node.moduleSpecifier.text) !== "")
2881
2947
  return false;
2882
2948
  return true;
2883
2949
  }
@@ -2900,43 +2966,115 @@
2900
2966
  const log = this.log.for(this.patchFiles);
2901
2967
  const { name, version } = getPackage();
2902
2968
  log.info(`Patching ${name} ${version} module in ${p}...`);
2903
- const stat = fs.statSync(p);
2969
+ const stat = fs__default["default"].statSync(p);
2904
2970
  if (stat.isDirectory())
2905
- fs.readdirSync(p, { withFileTypes: true, recursive: true })
2971
+ fs__default["default"].readdirSync(p, { withFileTypes: true, recursive: true })
2906
2972
  .filter((p) => p.isFile())
2907
- .forEach((file) => patchFile(path.join(file.parentPath, file.name), this.replacements));
2973
+ .forEach((file) => patchFile(path__default["default"].join(file.parentPath, file.name), this.replacements));
2908
2974
  log.verbose(`Module ${name} ${version} patched in ${p}...`);
2909
2975
  }
2910
- reportDiagnostics(diagnostics) {
2911
- diagnostics.forEach((diagnostic) => {
2912
- let message = "Error";
2976
+ reportDiagnostics(diagnostics, logLevel) {
2977
+ const msg = this.formatDiagnostics(diagnostics);
2978
+ if (!Object.values(logging.LogLevel).includes(logLevel))
2979
+ throw new Error(`Invalid LogLevel ${logLevel}`);
2980
+ try {
2981
+ this.log[logLevel](msg);
2982
+ }
2983
+ catch (e) {
2984
+ console.warn(`Failed to get logger for ${logLevel}`);
2985
+ throw e;
2986
+ }
2987
+ return msg;
2988
+ }
2989
+ // Format diagnostics into a single string for throwing or logging
2990
+ formatDiagnostics(diagnostics) {
2991
+ return diagnostics
2992
+ .map((diagnostic) => {
2993
+ let message = "";
2913
2994
  if (diagnostic.file && diagnostic.start) {
2914
2995
  const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
2915
- message += ` ${diagnostic.file.fileName} (${line + 1},${character + 1})`;
2996
+ message += `${diagnostic.file.fileName} (${line + 1},${character + 1})`;
2916
2997
  }
2917
2998
  message +=
2918
2999
  ": " + ts__namespace.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
2919
- console.log(message);
2920
- });
3000
+ return message;
3001
+ })
3002
+ .join("\n");
2921
3003
  }
2922
3004
  readConfigFile(configFileName) {
2923
3005
  // Read config file
2924
- const configFileText = fs.readFileSync(configFileName).toString();
3006
+ const configFileText = fs__default["default"].readFileSync(configFileName).toString();
2925
3007
  // Parse JSON, after removing comments. Just fancier JSON.parse
2926
3008
  const result = ts__namespace.parseConfigFileTextToJson(configFileName, configFileText);
2927
3009
  const configObject = result.config;
2928
3010
  if (!configObject) {
2929
- this.reportDiagnostics([result.error]);
2930
- throw new Error("Failed to parse tsconfig.json");
3011
+ this.reportDiagnostics([result.error], logging.LogLevel.error);
2931
3012
  }
2932
3013
  // Extract config infromation
2933
- const configParseResult = ts__namespace.parseJsonConfigFileContent(configObject, ts__namespace.sys, path.dirname(configFileName));
2934
- if (configParseResult.errors.length > 0) {
2935
- this.reportDiagnostics(configParseResult.errors);
2936
- throw new Error("Failed to parse tsconfig.json");
2937
- }
3014
+ const configParseResult = ts__namespace.parseJsonConfigFileContent(configObject, ts__namespace.sys, path__default["default"].dirname(configFileName));
3015
+ if (configParseResult.errors.length > 0)
3016
+ this.reportDiagnostics(configParseResult.errors, logging.LogLevel.error);
2938
3017
  return configParseResult;
2939
3018
  }
3019
+ evalDiagnostics(diagnostics) {
3020
+ if (diagnostics && diagnostics.length > 0) {
3021
+ const errors = diagnostics.filter((d) => d.category === ts__namespace.DiagnosticCategory.Error);
3022
+ const warnings = diagnostics.filter((d) => d.category === ts__namespace.DiagnosticCategory.Warning);
3023
+ const suggestions = diagnostics.filter((d) => d.category === ts__namespace.DiagnosticCategory.Suggestion);
3024
+ const messages = diagnostics.filter((d) => d.category === ts__namespace.DiagnosticCategory.Message);
3025
+ // Log diagnostics to console
3026
+ if (warnings.length)
3027
+ this.reportDiagnostics(warnings, logging.LogLevel.info);
3028
+ if (errors.length) {
3029
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
3030
+ this.reportDiagnostics(diagnostics, logging.LogLevel.error);
3031
+ this.log.info(`TypeScript reported ${diagnostics.length} diagnostic(s) during check; aborting.`);
3032
+ // throw new Error(
3033
+ // `TypeScript reported ${diagnostics.length} diagnostic(s) during check; aborting.`
3034
+ // );
3035
+ }
3036
+ if (suggestions.length)
3037
+ this.reportDiagnostics(suggestions, logging.LogLevel.info);
3038
+ if (messages.length)
3039
+ this.reportDiagnostics(messages, logging.LogLevel.info);
3040
+ }
3041
+ }
3042
+ preCheckDiagnostics(program) {
3043
+ const diagnostics = ts__namespace.getPreEmitDiagnostics(program);
3044
+ this.evalDiagnostics(diagnostics);
3045
+ }
3046
+ // Create a TypeScript program for the current tsconfig and fail if there are any error diagnostics.
3047
+ async checkTsDiagnostics(isDev, mode, bundle = false) {
3048
+ const log = this.log.for(this.checkTsDiagnostics);
3049
+ let tsConfig;
3050
+ try {
3051
+ tsConfig = this.readConfigFile("./tsconfig.json");
3052
+ }
3053
+ catch (e) {
3054
+ throw new Error(`Failed to parse tsconfig.json: ${e}`);
3055
+ }
3056
+ if (bundle) {
3057
+ tsConfig.options.module = ts.ModuleKind.AMD;
3058
+ tsConfig.options.outDir = "dist";
3059
+ tsConfig.options.isolatedModules = false;
3060
+ tsConfig.options.outFile = this.pkgName;
3061
+ }
3062
+ else {
3063
+ tsConfig.options.outDir = `lib${mode === Modes.ESM ? "/esm" : ""}`;
3064
+ tsConfig.options.module =
3065
+ mode === Modes.ESM ? ts.ModuleKind.ES2022 : ts.ModuleKind.CommonJS;
3066
+ }
3067
+ if (isDev) {
3068
+ tsConfig.options.inlineSourceMap = true;
3069
+ tsConfig.options.sourceMap = false;
3070
+ }
3071
+ else {
3072
+ tsConfig.options.sourceMap = false;
3073
+ }
3074
+ const program = ts__namespace.createProgram(tsConfig.fileNames, tsConfig.options);
3075
+ this.preCheckDiagnostics(program);
3076
+ log.verbose(`TypeScript checks passed (${bundle ? "bundle" : "normal"} mode).`);
3077
+ }
2940
3078
  async buildTs(isDev, mode, bundle = false) {
2941
3079
  const log = this.log.for(this.buildTs);
2942
3080
  log.info(`Building ${this.pkgName} ${this.pkgVersion} module (${mode}) in ${isDev ? "dev" : "prod"} mode...`);
@@ -2977,19 +3115,7 @@
2977
3115
  const allDiagnostics = ts__namespace
2978
3116
  .getPreEmitDiagnostics(program)
2979
3117
  .concat(emitResult.diagnostics);
2980
- allDiagnostics.forEach((diagnostic) => {
2981
- if (diagnostic.file) {
2982
- const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
2983
- const message = ts__namespace.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
2984
- log.info(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`);
2985
- }
2986
- else {
2987
- log.info(ts__namespace.flattenDiagnosticMessageText(diagnostic.messageText, "\n"));
2988
- }
2989
- });
2990
- if (emitResult.emitSkipped) {
2991
- throw new Error("Build failed");
2992
- }
3118
+ this.evalDiagnostics(allDiagnostics);
2993
3119
  }
2994
3120
  async build(isDev, mode, bundle = false) {
2995
3121
  const log = this.log.for(this.build);
@@ -3008,7 +3134,7 @@
3008
3134
  const log = this.log.for(this.copyAssets);
3009
3135
  let hasAssets = false;
3010
3136
  try {
3011
- hasAssets = fs.statSync("./src/assets").isDirectory();
3137
+ hasAssets = fs__default["default"].statSync("./src/assets").isDirectory();
3012
3138
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3013
3139
  }
3014
3140
  catch (e) {
@@ -3017,45 +3143,59 @@
3017
3143
  if (hasAssets)
3018
3144
  copyFile("./src/assets", `./${mode === Modes.CJS ? "lib" : "dist"}/assets`);
3019
3145
  }
3020
- async buildCommands() {
3021
- const commands = fs.readdirSync(path.join(process.cwd() + binSourceLocation)).map((cmd) => cmd.split(SEPARATORS.DOT)[0]);
3022
- for (const cmd of commands) {
3023
- if (!cmd.endsWith(".ts"))
3024
- continue;
3025
- await this.bundle(Modes.CJS, true, true, `${binSourceLocation}/${cmd}.ts`, cmd);
3026
- let data = readFile(`bin/${cmd}.cjs`);
3027
- data = "#!/usr/bin/env node\n" + data;
3028
- writeFile(`bin/${cmd}.cjs`, data);
3029
- fs.chmodSync(`bin/${cmd}.cjs`, "755");
3030
- }
3031
- }
3032
- async bundle(mode, isDev, isLib, entryFile = "src/index.ts", nameOverride = this.pkgName, externals, include = [
3146
+ async bundle(mode, isDev, isLib, entryFile = "src/index.ts", nameOverride = this.pkgName, externalsArg, includeArg = [
3033
3147
  "prompts",
3034
3148
  "styled-string-builder",
3035
3149
  "typed-object-accumulator",
3036
3150
  "@decaf-ts/logging",
3037
3151
  ]) {
3152
+ // Run a TypeScript-only diagnostic check for the bundling configuration and fail fast on any errors.
3153
+ await this.checkTsDiagnostics(isDev, mode, true);
3038
3154
  const isEsm = mode === Modes.ESM;
3039
3155
  const pkgName = this.pkgName;
3156
+ // normalize include and externals
3157
+ const include = Array.from(new Set([...parseList(includeArg)]));
3158
+ let externalsList = parseList(externalsArg);
3159
+ if (externalsList.length === 0) {
3160
+ // if no externals specified, include package.json dependencies to avoid rollup treating them as resolvable
3161
+ externalsList = getPackageDependencies();
3162
+ }
3040
3163
  const ext = Array.from(new Set([
3041
- ...[
3042
- "fs",
3043
- "path",
3044
- "process",
3045
- "rollup",
3046
- "@rollup/plugin-typescript",
3047
- "@rollup/plugin-json",
3048
- "@rollup/plugin-commonjs",
3049
- "@rollup/plugin-node-resolve",
3050
- "child_process",
3051
- "tslib",
3052
- "util",
3053
- "https",
3054
- ],
3055
- ...(externals || []),
3164
+ // builtins and always external runtime deps
3165
+ ...(function builtinList() {
3166
+ try {
3167
+ return (Array.isArray(module.builtinModules) ? module.builtinModules : []);
3168
+ }
3169
+ catch {
3170
+ // fallback to a reasonable subset if `builtinModules` is unavailable
3171
+ return [
3172
+ "fs",
3173
+ "path",
3174
+ "process",
3175
+ "child_process",
3176
+ "util",
3177
+ "https",
3178
+ "http",
3179
+ "os",
3180
+ "stream",
3181
+ "crypto",
3182
+ "zlib",
3183
+ "net",
3184
+ "tls",
3185
+ "url",
3186
+ "querystring",
3187
+ "assert",
3188
+ "events",
3189
+ "tty",
3190
+ "dns",
3191
+ "querystring",
3192
+ ];
3193
+ }
3194
+ })(),
3195
+ ...externalsList,
3056
3196
  ]));
3057
3197
  const plugins = [
3058
- typescript({
3198
+ typescript__default["default"]({
3059
3199
  compilerOptions: {
3060
3200
  module: "esnext",
3061
3201
  declaration: false,
@@ -3065,12 +3205,24 @@
3065
3205
  exclude: ["node_modules", "**/*.spec.ts"],
3066
3206
  tsconfig: "./tsconfig.json",
3067
3207
  }),
3068
- json(),
3208
+ json__default["default"](),
3069
3209
  ];
3210
+ // production minification
3211
+ if (!isDev) {
3212
+ // terser is optional at runtime; import lazily inside bundle to avoid test-time resolution errors
3213
+ try {
3214
+ const terserMod = await import('@rollup/plugin-terser');
3215
+ const terserFn = (terserMod && terserMod.terser) || terserMod.default || terserMod;
3216
+ plugins.push(terserFn());
3217
+ }
3218
+ catch {
3219
+ // if terser isn't available, ignore
3220
+ }
3221
+ }
3070
3222
  if (isLib) {
3071
- plugins.push(commonjs({
3223
+ plugins.push(commonjs__default["default"]({
3072
3224
  include: [],
3073
- exclude: externals,
3225
+ exclude: externalsList,
3074
3226
  }), pluginNodeResolve.nodeResolve({
3075
3227
  resolveOnly: include,
3076
3228
  }));
@@ -3080,6 +3232,12 @@
3080
3232
  plugins: plugins,
3081
3233
  external: ext,
3082
3234
  };
3235
+ // prepare output globals mapping for externals
3236
+ const globals = {};
3237
+ // include all externals and builtins (ext) so Rollup won't guess names for builtins
3238
+ ext.forEach((e) => {
3239
+ globals[e] = packageToGlobal(e);
3240
+ });
3083
3241
  const outputs = [
3084
3242
  {
3085
3243
  file: `${isLib ? "bin/" : "dist/"}${nameOverride ? nameOverride : `.bundle.${!isDev ? "min" : ""}`}${isEsm ? ".esm" : ""}.cjs`,
@@ -3087,7 +3245,7 @@
3087
3245
  name: pkgName,
3088
3246
  esModule: isEsm,
3089
3247
  sourcemap: isDev ? "inline" : false,
3090
- globals: {},
3248
+ globals: globals,
3091
3249
  exports: "auto",
3092
3250
  },
3093
3251
  ];
@@ -3096,8 +3254,7 @@
3096
3254
  console.log(bundle.watchFiles);
3097
3255
  async function generateOutputs(bundle) {
3098
3256
  for (const outputOptions of outputs) {
3099
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
3100
- const { output } = await bundle.write(outputOptions);
3257
+ await bundle.write(outputOptions);
3101
3258
  }
3102
3259
  }
3103
3260
  await generateOutputs(bundle);
@@ -3106,7 +3263,8 @@
3106
3263
  throw new Error(`Failed to bundle: ${e}`);
3107
3264
  }
3108
3265
  }
3109
- async buildByEnv(isDev, mode = BuildMode.ALL) {
3266
+ async buildByEnv(isDev, mode = BuildMode.ALL, includesArg, externalsArg) {
3267
+ // note: includes and externals will be passed through from run() into this method by callers
3110
3268
  try {
3111
3269
  deletePath("lib");
3112
3270
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -3121,26 +3279,26 @@
3121
3279
  catch (e) {
3122
3280
  // do nothing
3123
3281
  }
3124
- fs.mkdirSync("lib");
3125
- fs.mkdirSync("dist");
3282
+ fs__default["default"].mkdirSync("lib");
3283
+ fs__default["default"].mkdirSync("dist");
3126
3284
  if ([BuildMode.ALL, BuildMode.BUILD].includes(mode)) {
3127
3285
  await this.build(isDev, Modes.ESM);
3128
3286
  await this.build(isDev, Modes.CJS);
3129
3287
  this.patchFiles("lib");
3130
3288
  }
3131
3289
  if ([BuildMode.ALL, BuildMode.BUNDLE].includes(mode)) {
3132
- await this.bundle(Modes.ESM, true, false);
3133
- await this.bundle(Modes.CJS, true, false);
3290
+ await this.bundle(Modes.ESM, isDev, false, "src/index.ts", this.pkgName, externalsArg, includesArg);
3291
+ await this.bundle(Modes.CJS, isDev, false, "src/index.ts", this.pkgName, externalsArg, includesArg);
3134
3292
  this.patchFiles("dist");
3135
3293
  }
3136
3294
  this.copyAssets(Modes.CJS);
3137
3295
  this.copyAssets(Modes.ESM);
3138
3296
  }
3139
- async buildDev(mode = BuildMode.ALL) {
3140
- return this.buildByEnv(true, mode);
3297
+ async buildDev(mode = BuildMode.ALL, includesArg, externalsArg) {
3298
+ return this.buildByEnv(true, mode, includesArg, externalsArg);
3141
3299
  }
3142
- async buildProd(mode = BuildMode.ALL) {
3143
- return this.buildByEnv(false, mode);
3300
+ async buildProd(mode = BuildMode.ALL, includesArg, externalsArg) {
3301
+ return this.buildByEnv(false, mode, includesArg, externalsArg);
3144
3302
  }
3145
3303
  async buildDocs() {
3146
3304
  await runCommand(`npm install better-docs taffydb`).promise;
@@ -3174,15 +3332,12 @@
3174
3332
  });
3175
3333
  }
3176
3334
  async run(answers) {
3177
- const { dev, prod, docs, commands, buildMode } = answers;
3178
- if (commands) {
3179
- await this.buildCommands();
3180
- }
3335
+ const { dev, prod, docs, buildMode, includes, externals } = answers;
3181
3336
  if (dev) {
3182
- return await this.buildDev(buildMode);
3337
+ return await this.buildDev(buildMode, includes, externals);
3183
3338
  }
3184
3339
  if (prod) {
3185
- return await this.buildProd(buildMode);
3340
+ return await this.buildProd(buildMode, includes, externals);
3186
3341
  }
3187
3342
  if (docs) {
3188
3343
  return await this.buildDocs();
@@ -3558,7 +3713,7 @@
3558
3713
  this.log.info(`Downloading ${file}`);
3559
3714
  let data = await HttpClient.downloadFile(`${baseUrl}/${file}`);
3560
3715
  data = logging.patchString(data, this.replacements);
3561
- writeFile(path.join(process.cwd(), file), data);
3716
+ writeFile(path__default["default"].join(process.cwd(), file), data);
3562
3717
  }
3563
3718
  }
3564
3719
  /**
@@ -3572,7 +3727,7 @@
3572
3727
  const url = `${baseUrl}/workdocs/licenses/${license}.md`;
3573
3728
  let data = await HttpClient.downloadFile(url);
3574
3729
  data = logging.patchString(data, this.replacements);
3575
- writeFile(path.join(process.cwd(), "LICENSE.md"), data);
3730
+ writeFile(path__default["default"].join(process.cwd(), "LICENSE.md"), data);
3576
3731
  setPackageAttribute("license", license);
3577
3732
  }
3578
3733
  /**
@@ -3580,7 +3735,7 @@
3580
3735
  * @returns {Promise<void>}
3581
3736
  */
3582
3737
  async getIde() {
3583
- fs.mkdirSync(path.join(process.cwd(), ".idea", "runConfigurations"), {
3738
+ fs__default["default"].mkdirSync(path__default["default"].join(process.cwd(), ".idea", "runConfigurations"), {
3584
3739
  recursive: true,
3585
3740
  });
3586
3741
  await this.downloadOption("ide");
@@ -3602,7 +3757,7 @@
3602
3757
  pkg.version = "0.0.1";
3603
3758
  pkg.author = author;
3604
3759
  pkg.license = license;
3605
- fs.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3760
+ fs__default["default"].writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3606
3761
  }
3607
3762
  catch (e) {
3608
3763
  throw new Error(`Error fixing package.json: ${e}`);
@@ -3624,7 +3779,7 @@
3624
3779
  pkg["exports"]["require"] = originalPkg["exports"]["require"];
3625
3780
  pkg["exports"]["import"] = originalPkg["exports"]["import"];
3626
3781
  pkg["types"] = originalPkg["types"];
3627
- fs.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3782
+ fs__default["default"].writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3628
3783
  }
3629
3784
  catch (e) {
3630
3785
  throw new Error(`Error fixing package.json scripts: ${e}`);
@@ -3639,16 +3794,16 @@
3639
3794
  try {
3640
3795
  let status;
3641
3796
  try {
3642
- status = fs.existsSync(token);
3797
+ status = fs__default["default"].existsSync(token);
3643
3798
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
3644
3799
  }
3645
3800
  catch (e) {
3646
3801
  log.info(`Token file ${token} not found. Creating a new one...`);
3647
- fs.writeFileSync(token, token === ".token" ? gitToken : "");
3802
+ fs__default["default"].writeFileSync(token, token === ".token" ? gitToken : "");
3648
3803
  return;
3649
3804
  }
3650
3805
  if (!status) {
3651
- fs.writeFileSync(token, token === ".token" ? gitToken : "");
3806
+ fs__default["default"].writeFileSync(token, token === ".token" ? gitToken : "");
3652
3807
  }
3653
3808
  }
3654
3809
  catch (e) {
@@ -3668,22 +3823,22 @@
3668
3823
  }
3669
3824
  patchFiles() {
3670
3825
  const files = [
3671
- ...fs
3672
- .readdirSync(path.join(process.cwd(), "src"), {
3826
+ ...fs__default["default"]
3827
+ .readdirSync(path__default["default"].join(process.cwd(), "src"), {
3673
3828
  recursive: true,
3674
3829
  withFileTypes: true,
3675
3830
  })
3676
3831
  .filter((entry) => entry.isFile())
3677
- .map((entry) => path.join(entry.parentPath, entry.name)),
3678
- ...fs
3679
- .readdirSync(path.join(process.cwd(), "workdocs"), {
3832
+ .map((entry) => path__default["default"].join(entry.parentPath, entry.name)),
3833
+ ...fs__default["default"]
3834
+ .readdirSync(path__default["default"].join(process.cwd(), "workdocs"), {
3680
3835
  recursive: true,
3681
3836
  withFileTypes: true,
3682
3837
  })
3683
3838
  .filter((entry) => entry.isFile() && entry.name.endsWith(".md"))
3684
- .map((entry) => path.join(entry.parentPath, entry.name)),
3685
- path.join(process.cwd(), ".gitlab-ci.yml"),
3686
- path.join(process.cwd(), "workdocs", "jsdocs.json"),
3839
+ .map((entry) => path__default["default"].join(entry.parentPath, entry.name)),
3840
+ path__default["default"].join(process.cwd(), ".gitlab-ci.yml"),
3841
+ path__default["default"].join(process.cwd(), "workdocs", "jsdocs.json"),
3687
3842
  ];
3688
3843
  for (const file of files) {
3689
3844
  patchFile(file, this.replacements);
@@ -3704,7 +3859,7 @@
3704
3859
  }
3705
3860
  }
3706
3861
  });
3707
- fs.writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3862
+ fs__default["default"].writeFileSync("package.json", JSON.stringify(pkg, null, 2));
3708
3863
  await runCommand("npm install").promise;
3709
3864
  }
3710
3865
  catch (e) {
@@ -4013,7 +4168,7 @@
4013
4168
  * @const VERSION
4014
4169
  * @memberOf module:utils
4015
4170
  */
4016
- const VERSION = "0.3.13";
4171
+ const VERSION = "0.4.1";
4017
4172
  /**
4018
4173
  * @description Represents the current version of the module.
4019
4174
  * @summary Stores the version for the @decaf-ts/utils package. The build replaces
@@ -4046,12 +4201,15 @@
4046
4201
  exports.getAllFiles = getAllFiles;
4047
4202
  exports.getDependencies = getDependencies;
4048
4203
  exports.getPackage = getPackage;
4204
+ exports.getPackageDependencies = getPackageDependencies;
4049
4205
  exports.getPackageVersion = getPackageVersion;
4050
4206
  exports.getSlogan = getSlogan;
4051
4207
  exports.installDependencies = installDependencies;
4052
4208
  exports.installIfNotAvailable = installIfNotAvailable;
4053
4209
  exports.lockify = lockify;
4054
4210
  exports.normalizeImport = normalizeImport;
4211
+ exports.packageToGlobal = packageToGlobal;
4212
+ exports.parseList = parseList;
4055
4213
  exports.patchFile = patchFile;
4056
4214
  exports.printBanner = printBanner;
4057
4215
  exports.pushToGit = pushToGit;
@@ -4064,4 +4222,3 @@
4064
4222
  exports.writeFile = writeFile;
4065
4223
 
4066
4224
  }));
4067
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvaW5wdXQvaW5wdXQudHMiLCIuLi9zcmMvY2xpL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy91dGlscy9mcy50cyIsIi4uL3NyYy9hc3NldHMvc2xvZ2Fucy50cyIsIi4uL3NyYy9vdXRwdXQvY29tbW9uLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kLnRzIiwiLi4vc3JjL3V0aWxzL2h0dHAudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL2J1aWxkLXNjcmlwdHMudHMiLCIuLi9zcmMvY2xpL2NvbW1hbmRzL3RhZy1yZWxlYXNlLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy91cGRhdGUtc2NyaXB0cy50cyIsIi4uL3NyYy93cml0ZXJzL1JlZ2V4cE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBbnN3ZXJzLFxuICBDaG9pY2UsXG4gIEZhbHN5LFxuICBJbml0aWFsUmV0dXJuVmFsdWUsXG4gIFByZXZDYWxsZXIsXG4gIFByb21wdE9iamVjdCxcbiAgUHJvbXB0VHlwZSxcbiAgVmFsdWVPckZ1bmMsXG59IGZyb20gXCJwcm9tcHRzXCI7XG5pbXBvcnQgcHJvbXB0cyBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHsgcGFyc2VBcmdzLCBQYXJzZUFyZ3NDb25maWcgfSBmcm9tIFwidXRpbFwiO1xuaW1wb3J0IHsgV3JpdGFibGUsIFJlYWRhYmxlIH0gZnJvbSBcInN0cmVhbVwiO1xuaW1wb3J0IHsgUGFyc2VBcmdzT3B0aW9uc0NvbmZpZywgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHVzZXIgaW5wdXQgcHJvbXB0IHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZmxleGlibGUgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgdXNlciBpbnB1dCBwcm9tcHRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgUHJvbXB0T2JqZWN0IGludGVyZmFjZSBmcm9tIHRoZSAncHJvbXB0cycgbGlicmFyeSBhbmQgb2ZmZXJzIG1ldGhvZHMgdG8gc2V0XG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHByb21wdC4gVGhlIGNsYXNzIGFsc28gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgZm9yIGNvbW1vbiBpbnB1dCBzY2VuYXJpb3NcbiAqIGFuZCBhcmd1bWVudCBwYXJzaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tICdAZGVjYWYtdHMvdXRpbHMnO1xuICpcbiAqIC8vIENyZWF0ZSBhIHNpbXBsZSB0ZXh0IGlucHV0XG4gKiBjb25zdCBuYW1lSW5wdXQgPSBuZXcgVXNlcklucHV0KCduYW1lJylcbiAqICAgLnNldE1lc3NhZ2UoJ1doYXQgaXMgeW91ciBuYW1lPycpXG4gKiAgIC5zZXRJbml0aWFsKCdVc2VyJyk7XG4gKlxuICogLy8gQ3JlYXRlIGEgbnVtYmVyIGlucHV0IHdpdGggdmFsaWRhdGlvblxuICogY29uc3QgYWdlSW5wdXQgPSBuZXcgVXNlcklucHV0KCdhZ2UnKVxuICogICAuc2V0VHlwZSgnbnVtYmVyJylcbiAqICAgLnNldE1lc3NhZ2UoJ0hvdyBvbGQgYXJlIHlvdT8nKVxuICogICAuc2V0TWluKDApXG4gKiAgIC5zZXRNYXgoMTIwKTtcbiAqXG4gKiAvLyBBc2sgZm9yIGlucHV0IGFuZCBwcm9jZXNzIHRoZSByZXN1bHRzXG4gKiBhc3luYyBmdW5jdGlvbiBnZXRVc2VySW5mbygpIHtcbiAqICAgY29uc3QgYW5zd2VycyA9IGF3YWl0IFVzZXJJbnB1dC5hc2soW25hbWVJbnB1dCwgYWdlSW5wdXRdKTtcbiAqICAgY29uc29sZS5sb2coYEhlbGxvICR7YW5zd2Vycy5uYW1lfSwgeW91IGFyZSAke2Fuc3dlcnMuYWdlfSB5ZWFycyBvbGQuYCk7XG4gKiB9XG4gKlxuICogZ2V0VXNlckluZm8oKTtcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICogICBwYXJ0aWNpcGFudCBQcm9tcHRMaWJyYXJ5XG4gKlxuICogICBDbGllbnQtPj5Vc2VySW5wdXQ6IG5ldyBVc2VySW5wdXQobmFtZSlcbiAqICAgQ2xpZW50LT4+VXNlcklucHV0OiBzZXRNZXNzYWdlKG1lc3NhZ2UpXG4gKiAgIENsaWVudC0+PlVzZXJJbnB1dDogc2V0VHlwZSh0eXBlKVxuICogICBDbGllbnQtPj5Vc2VySW5wdXQ6IHNldEluaXRpYWwoaW5pdGlhbClcbiAqICAgQ2xpZW50LT4+VXNlcklucHV0OiBPdGhlciBjb25maWd1cmF0aW9uIG1ldGhvZHNcbiAqXG4gKiAgIENsaWVudC0+PlVzZXJJbnB1dDogYXNrKClcbiAqICAgVXNlcklucHV0LT4+UHJvbXB0TGlicmFyeTogcHJvbXB0cyhxdWVzdGlvbilcbiAqICAgUHJvbXB0TGlicmFyeS0+PkNsaWVudDogRGlzcGxheSBwcm9tcHRcbiAqICAgQ2xpZW50LT4+UHJvbXB0TGlicmFyeTogVXNlciBwcm92aWRlcyBpbnB1dFxuICogICBQcm9tcHRMaWJyYXJ5LT4+VXNlcklucHV0OiBSZXR1cm4gYW5zd2Vyc1xuICogICBVc2VySW5wdXQtPj5DbGllbnQ6IFJldHVybiBwcm9jZXNzZWQgYW5zd2Vyc1xuICovXG5leHBvcnQgY2xhc3MgVXNlcklucHV0PFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IGltcGxlbWVudHMgUHJvbXB0T2JqZWN0PFI+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2luZy5mb3IoVXNlcklucHV0KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBpbnB1dCBtZXRob2QgKGUuZy4sIHRleHQsIG51bWJlciwgY29uZmlybSkuXG4gICAqL1xuICB0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4gPSBcInRleHRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqL1xuICBuYW1lOiBWYWx1ZU9yRnVuYzxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgVGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIG1lc3NhZ2U/OiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5pdGlhbD86XG4gICAgfCBJbml0aWFsUmV0dXJuVmFsdWVcbiAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3R5bGU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmb3JtYXQgZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHVzZXIncyBpbnB1dCBiZWZvcmUgaXQncyByZXR1cm5lZC5cbiAgICovXG4gIGZvcm1hdD86IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGlucHV0LlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqL1xuICB2YWxpZGF0ZT86XG4gICAgfCBQcmV2Q2FsbGVyPFIsIGJvb2xlYW4gfCBzdHJpbmcgfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICovXG4gIG9uU3RhdGU/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICovXG4gIG1pbj86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtYXg/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCBhbGxvd3MgZGVjaW1hbCBudW1iZXJzLlxuICAgKi9cbiAgZmxvYXQ/OiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKi9cbiAgcm91bmQ/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RydWN0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKi9cbiAgaW5jcmVtZW50PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICovXG4gIGFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqL1xuICBpbmFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGF2YWlsYWJsZSBjaG9pY2VzIGZvciBzZWxlY3QsIG11bHRpc2VsZWN0LCBvciBhdXRvY29tcGxldGUgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBBbiBhcnJheSBvZiBvcHRpb25zIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdCBmcm9tIGluIGNob2ljZS1iYXNlZCBwcm9tcHRzLlxuICAgKi9cbiAgY2hvaWNlcz86IENob2ljZVtdIHwgUHJldkNhbGxlcjxSLCBDaG9pY2VbXSB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBoaW50IHRleHQgZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaGludD86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHdhcm5pbmcgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQSB3YXJuaW5nIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgd2Fybj86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIHN1Z2dlc3Q/OiAoKGlucHV0OiBhbnksIGNob2ljZXM6IENob2ljZVtdKSA9PiBQcm9taXNlPGFueT4pIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGxpbWl0IGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkLlxuICAgKi9cbiAgbGltaXQ/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYXNrIGZvciBwYXNzd29yZCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBoaWRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqL1xuICBtYXNrPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3Rkb3V0IHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIG91dHB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3Rkb3V0PzogV3JpdGFibGUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc3RkaW4gc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBUaGUgaW5wdXQgc3RyZWFtIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICovXG4gIHN0ZGluPzogUmVhZGFibGUgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IobmFtZTogVmFsdWVPckZ1bmM8Uj4pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IG1ldGhvZCBmb3IgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VHlwZSh0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4pOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdHlwZSB0bzogJHt0eXBlfWApO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgcXVlc3Rpb24gb3IgaW5zdHJ1Y3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNZXNzYWdlKHZhbHVlOiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1lc3NhZ2UgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZGVmYXVsdCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5pdGlhbChcbiAgICB2YWx1ZTpcbiAgICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgICAgfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluaXRpYWwgdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbml0aWFsID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3R5bGUgdG8gYmUgYXBwbGllZC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0eWxlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnN0eWxlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGZvcm1hdCBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBmb3JtYXQgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGb3JtYXQodmFsdWU6IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgZm9ybWF0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5mb3JtYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRWYWxpZGF0ZShcbiAgICB2YWx1ZTpcbiAgICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB2YWxpZGF0ZSBmdW5jdGlvbmApO1xuICAgIHRoaXMudmFsaWRhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25TdGF0ZSBjYWxsYmFjayBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblN0YXRlKHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uU3RhdGUgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgbG93ZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtaW5pbXVtIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWluKHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtaW4gdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5taW4gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgaGlnaGVzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWF4aW11bSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1heCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWF4IHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWF4ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgd2hldGhlciB0byBhbGxvdyBmbG9hdCB2YWx1ZXMgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgd2hldGhlciBkZWNpbWFsIG51bWJlcnMgYXJlIGFsbG93ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0RmxvYXQodmFsdWU6IGJvb2xlYW4gfCBQcmV2Q2FsbGVyPFIsIGJvb2xlYW4gfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgZmxvYXQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5mbG9hdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8gZm9yIGZsb2F0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgcHJlY2lzaW9uIG9mIGZsb2F0IGlucHV0cy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFJvdW5kKHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyByb3VuZCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnJvdW5kID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgYWRkaXRpb25hbCBndWlkYW5jZSBwcm92aWRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGluc3RydWN0aW9ucy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluc3RydWN0aW9ucyh2YWx1ZTogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbnN0cnVjdGlvbnMgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5jcmVtZW50IHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBzdGVwIHNpemUgd2hlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGluY3JlbWVudCB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluY3JlbWVudChcbiAgICB2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluY3JlbWVudCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmluY3JlbWVudCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzZXBhcmF0b3IgZm9yIGxpc3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSBsaXN0IGl0ZW1zLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc2VwYXJhdG9yIGNoYXJhY3Rlci5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFNlcGFyYXRvcihcbiAgICB2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHNlcGFyYXRvciB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnNlcGFyYXRvciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBzdHlsZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYWN0aXZlIG9wdGlvbiBzdHlsZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEFjdGl2ZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgYWN0aXZlIHN0eWxlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuYWN0aXZlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3R5bGUgYXBwbGllZCB0byBub24tc2VsZWN0ZWQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluYWN0aXZlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbmFjdGl2ZSBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmluYWN0aXZlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGNob2ljZXMgZm9yIHNlbGVjdCwgbXVsdGlzZWxlY3QsIG9yIGF1dG9jb21wbGV0ZSBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGF2YWlsYWJsZSBvcHRpb25zIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdCBmcm9tIGluIGNob2ljZS1iYXNlZCBwcm9tcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgYXJyYXkgb2YgY2hvaWNlcyBvciBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGUgY2hvaWNlcy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldENob2ljZXMoXG4gICAgdmFsdWU6IENob2ljZVtdIHwgUHJldkNhbGxlcjxSLCBDaG9pY2VbXSB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgY2hvaWNlczogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgdGhpcy5jaG9pY2VzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGhpbnQgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEhpbnQodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGhpbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdhcm5pbmcgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB3YXJuaW5nIHRleHQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRXYXJuKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB3YXJuIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMud2FybiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdWdnZXN0aW9uIGZ1bmN0aW9uIGZvciBhdXRvY29tcGxldGUgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyBzdWdnZXN0aW9ucyBiYXNlZCBvbiB0aGUgdXNlcidzIGlucHV0IGFuZCBhdmFpbGFibGUgY2hvaWNlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gQSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBjdXJyZW50IGlucHV0IGFuZCBhdmFpbGFibGUgY2hvaWNlcyBhbmQgcmV0dXJucyBhIFByb21pc2UgcmVzb2x2aW5nIHRvIHN1Z2dlc3Rpb25zLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0U3VnZ2VzdChcbiAgICB2YWx1ZTogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3VnZ2VzdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuc3VnZ2VzdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIGxpc3QtdHlwZSBwcm9tcHRzLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkLCBvciBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGlzIHZhbHVlLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRMaW1pdCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbGltaXQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXNrIGZvciBwYXNzd29yZCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dCBpbiBwYXNzd29yZC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1hc2sodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1hc2sgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXNrID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG91dHB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzIGFuZCByZXN1bHRzLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgV3JpdGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3Rkb3V0LlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRvdXQodmFsdWU6IFdyaXRhYmxlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHN0ZG91dCBzdHJlYW1gKTtcbiAgICB0aGlzLnN0ZG91dCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3RkaW4gc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciByZWNlaXZpbmcgdXNlciBpbnB1dC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIFJlYWRhYmxlIHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0ZGluLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRpbih2YWx1ZTogUmVhZGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICB0aGlzLnN0ZGluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGlucHV0IGJhc2VkIG9uIHRoZSBjdXJyZW50IFVzZXJJbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIGFuZCByZXR1cm5zIHRoZWlyIHJlc3BvbnNlIGFzIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIGFzeW5jIGFzaygpIHtcbiAgICByZXR1cm4gKGF3YWl0IFVzZXJJbnB1dC5hc2sodGhpcykpW3RoaXMubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPFI+XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBvbmUgb3IgbW9yZSBxdWVzdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFVzZXJJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBhbnN3ZXJzIGFzIGFuIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIEEgc2luZ2xlIFVzZXJJbnB1dCBpbnN0YW5jZSBvciBhbiBhcnJheSBvZiBVc2VySW5wdXQgaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1c2VyJ3MgYW5zd2Vycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBhc2sgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwcm9tcHRzIGxpYnJhcnlcbiAgICogICBBLT4+UDogQ2FsbCBwcm9tcHRzIHdpdGggcXVlc3Rpb24ocylcbiAgICogICBQLT4+VTogRGlzcGxheSBwcm9tcHQocylcbiAgICogICBVLT4+UDogUHJvdmlkZSBpbnB1dFxuICAgKiAgIFAtPj5BOiBSZXR1cm4gYW5zd2Vyc1xuICAgKiAgIEEtPj5BOiBQcm9jZXNzIGFuc3dlcnNcbiAgICogICBBLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBhbnN3ZXJzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrPFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIHF1ZXN0aW9uOiBVc2VySW5wdXQ8Uj4gfCBVc2VySW5wdXQ8Uj5bXVxuICApIHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFzayk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHF1ZXN0aW9uKSkge1xuICAgICAgcXVlc3Rpb24gPSBbcXVlc3Rpb25dO1xuICAgIH1cbiAgICBsZXQgYW5zd2VyczogQW5zd2VyczxSPjtcbiAgICB0cnkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBBc2tpbmcgcXVlc3Rpb25zOiAke3F1ZXN0aW9uLm1hcCgocSkgPT4gcS5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIGFuc3dlcnMgPSBhd2FpdCBwcm9tcHRzKHF1ZXN0aW9uKTtcbiAgICAgIGxvZy52ZXJib3NlKGBSZWNlaXZlZCBhbnN3ZXJzOiAke0pTT04uc3RyaW5naWZ5KGFuc3dlcnMsIG51bGwsIDIpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGdldHRpbmcgaW5wdXQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIG51bWJlciBpbnB1dC5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG51bWJlciwgd2l0aCBvcHRpb25hbCBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgaW5pdGlhbCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgZW50ZXJlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWluPzogbnVtYmVyLFxuICAgIG1heD86IG51bWJlcixcbiAgICBpbml0aWFsPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tOdW1iZXIpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtaW46ICR7bWlufSwgbWF4OiAke21heH0sIGluaXRpYWw6ICR7aW5pdGlhbH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFzayh1c2VySW5wdXQpKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgYSB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRleHQsIHdpdGggb3B0aW9uYWwgbWFza2luZyBhbmQgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza1RleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyB0ZXh0IGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIGNvbmZpcm1hdGlvbiAoeWVzL25vKS5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIGEgeWVzL25vIHF1ZXN0aW9uIGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBhbnN3ZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrQ29uZmlybWF0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIGluaXRpYWw/OiBib29sZWFuXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrQ29uZmlybWF0aW9uKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBBc2tpbmcgY29uZmlybWF0aW9uIGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJjb25maXJtXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsICE9PSBcInVuZGVmaW5lZFwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwZWF0ZWRseSBhc2tzIGZvciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCByZXN1bHQuXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBVc2VySW5wdXQgaW5zdGFuY2UgdG8gdXNlIGZvciBwcm9tcHRpbmcuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nKTpib29sZWFufSB0ZXN0IC0gVmFsaWRhdG9yIGZ1bmN0aW9uIHJlY2VpdmluZyB0aGUgdXNlciBpbnB1dCBhbmQgcmV0dXJuaW5nIHdoZXRoZXIgaXQgaXMgdmFsaWQuXG4gICAqIEBwYXJhbSBkZWZhdWx0Q29uZmlybWF0aW9uIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb25maXJtYXRpb24gcHJvbXB0ICh0cnVlIGZvciB5ZXMsIGZhbHNlIGZvciBubykuXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIDEpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgaW5zaXN0IG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgYXNrIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgdGVzdCBmdW5jdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgYXNrQ29uZmlybWF0aW9uIG1ldGhvZFxuICAgKiAgIGxvb3AgVW50aWwgdmFsaWQgaW5wdXQgb3IgbGltaXQgcmVhY2hlZFxuICAgKiAgICAgSS0+PkE6IENhbGwgYXNrIHdpdGggaW5wdXRcbiAgICogICAgIEEtPj5VOiBQcm9tcHQgdXNlclxuICAgKiAgICAgVS0+PkE6IFByb3ZpZGUgaW5wdXRcbiAgICogICAgIEEtPj5JOiBSZXR1cm4gcmVzdWx0XG4gICAqICAgICBJLT4+VDogVGVzdCByZXN1bHRcbiAgICogICAgIGFsdCBUZXN0IHBhc3Nlc1xuICAgKiAgICAgICBJLT4+QzogQXNrIGZvciBjb25maXJtYXRpb25cbiAgICogICAgICAgQy0+PlU6IENvbmZpcm0gaW5wdXRcbiAgICogICAgICAgVS0+PkM6IFByb3ZpZGUgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5JOiBSZXR1cm4gY29uZmlybWF0aW9uXG4gICAqICAgICAgIGFsdCBDb25maXJtZWRcbiAgICogICAgICAgICBJLS0+PkNhbGxlcjogUmV0dXJuIHZhbGlkIHJlc3VsdFxuICAgKiAgICAgICBlbHNlIE5vdCBjb25maXJtZWRcbiAgICogICAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgVGVzdCBmYWlsc1xuICAgKiAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgSS0tPj5DYWxsZXI6IFJldHVybiB1bmRlZmluZWQgaWYgbGltaXQgcmVhY2hlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdDxSPihcbiAgICBpbnB1dDogVXNlcklucHV0LFxuICAgIHRlc3Q6IChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uOiBib29sZWFuLFxuICAgIGxpbWl0ID0gMVxuICApOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIG9uIGlucHV0OiAke2lucHV0Lm5hbWV9LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBjb25maXJtYXRpb246IGJvb2xlYW47XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gKGF3YWl0IFVzZXJJbnB1dC5hc2soaW5wdXQpKVtcbiAgICAgICAgICBpbnB1dC5uYW1lIGFzIGtleW9mIEFuc3dlcnM8c3RyaW5nPlxuICAgICAgICBdIGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0ZXN0KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgICBgJHtpbnB1dC5uYW1lfS1jb25maXJtYCxcbiAgICAgICAgICBgSXMgdGhlICR7aW5wdXQudHlwZX0gY29ycmVjdD9gLFxuICAgICAgICAgIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25maXJtYXRpb24pIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gd2hpbGUgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIgJiYgbGltaXQgPiAxICYmIGNvdW50KysgPCBsaW1pdCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBFcnJvciB3aGlsZSBpbnNpc3Rpbmc6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIGxvZy5pbmZvKFwibm8gc2VsZWN0aW9uLi4uXCIpO1xuICAgIHJldHVybiByZXN1bHQgYXMgUiB8IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgdGV4dCBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCB0ZXh0IGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6Ym9vbGVhbn0gdGVzdCAtIFZhbGlkYXRvciBmdW5jdGlvbiByZWNlaXZpbmcgdGhlIHVzZXIgaW5wdXQgYW5kIHJldHVybmluZyB3aGV0aGVyIGl0IGlzIHZhbGlkLlxuICAgKiBAcGFyYW0gbWFzayAtIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBtYXNrIHRoZSBpbnB1dCAob3B0aW9uYWwsIGZvciBwYXNzd29yZC1saWtlIGlucHV0cykuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBkZWZhdWx0Q29uZmlybWF0aW9uIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb25maXJtYXRpb24gcHJvbXB0ICh0cnVlIGZvciB5ZXMsIGZhbHNlIGZvciBubykuXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIC0xLCBtZWFuaW5nIHVubGltaXRlZCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkIGlucHV0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3RGb3JUZXh0KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIHRlc3Q6IChyZXM6IHN0cmluZykgPT4gYm9vbGVhbixcbiAgICBtYXNrOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaW5pdGlhbD86IHN0cmluZyxcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uID0gZmFsc2UsXG4gICAgbGltaXQgPSAtMVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuaW5zaXN0Rm9yVGV4dCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIGZvciB0ZXh0IGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgdGVzdDogJHt0ZXN0LnRvU3RyaW5nKCl9LCBtYXNrOiAke21hc2t9LCBpbml0aWFsOiAke2luaXRpYWx9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpLnNldE1lc3NhZ2UocXVlc3Rpb24pO1xuXG4gICAgaWYgKG1hc2spIHVzZXJJbnB1dC5zZXRNYXNrKG1hc2spO1xuICAgIGlmICh0eXBlb2YgaW5pdGlhbCA9PT0gXCJzdHJpbmdcIikgdXNlcklucHV0LnNldEluaXRpYWwoaW5pdGlhbCk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmluc2lzdChcbiAgICAgIHVzZXJJbnB1dCxcbiAgICAgIHRlc3QgYXMgKHJlczogc3RyaW5nIHwgbnVtYmVyKSA9PiBib29sZWFuLFxuICAgICAgZGVmYXVsdENvbmZpcm1hdGlvbixcbiAgICAgIGxpbWl0XG4gICAgKSkgYXMgc3RyaW5nO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwZWF0ZWRseSBhc2tzIGZvciBudW1iZXIgaW5wdXQgdW50aWwgYSB2YWxpZCByZXNwb25zZSBpcyBnaXZlbiBvciB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaW5zaXN0cyBvbiBnZXR0aW5nIGEgdmFsaWQgbnVtYmVyIGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gdGVzdCAtIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICogQHBhcmFtIG1pbiAtIFRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWUgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIG1heCAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb24gLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbmZpcm1hdGlvbiBwcm9tcHQgKHRydWUgZm9yIHllcywgZmFsc2UgZm9yIG5vKS5cbiAgICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGFsbG93ZWQgKGRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgdW5saW1pdGVkKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdEZvck51bWJlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICB0ZXN0OiAocmVzOiBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgbWluPzogbnVtYmVyLFxuICAgIG1heD86IG51bWJlcixcbiAgICBpbml0aWFsPzogbnVtYmVyLFxuICAgIGRlZmF1bHRDb25maXJtYXRpb24gPSBmYWxzZSxcbiAgICBsaW1pdCA9IC0xXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3RGb3JOdW1iZXIpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBmb3IgbnVtYmVyIGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgdGVzdDogJHt0ZXN0LnRvU3RyaW5nKCl9LCBtaW46ICR7bWlufSwgbWF4OiAke21heH0sIGluaXRpYWw6ICR7aW5pdGlhbH0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJudW1iZXJcIik7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1pbihtaW4pO1xuXG4gICAgaWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNYXgobWF4KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldEluaXRpYWwoaW5pdGlhbCk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmluc2lzdChcbiAgICAgIHVzZXJJbnB1dCxcbiAgICAgIHRlc3QgYXMgKHJlczogc3RyaW5nIHwgbnVtYmVyKSA9PiBib29sZWFuLFxuICAgICAgZGVmYXVsdENvbmZpcm1hdGlvbixcbiAgICAgIGxpbWl0XG4gICAgKSkgYXMgbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgb3B0aW9ucy5cbiAgICogQHN1bW1hcnkgVXNlcyBOb2RlLmpzJ3MgdXRpbC5wYXJzZUFyZ3MgdG8gcGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBwYXJzaW5nIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIGFyZ3VtZW50cy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQyBhcyBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIHBhcnNlQXJncyBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIHV0aWwucGFyc2VBcmdzXG4gICAqICAgQy0+PlA6IENhbGwgd2l0aCBvcHRpb25zXG4gICAqICAgUC0+PlA6IFByZXBhcmUgYXJncyBvYmplY3RcbiAgICogICBQLT4+VTogQ2FsbCBwYXJzZUFyZ3Mgd2l0aCBwcmVwYXJlZCBhcmdzXG4gICAqICAgVS0+PlA6IFJldHVybiBwYXJzZWQgcmVzdWx0XG4gICAqICAgUC0tPj5DOiBSZXR1cm4gUGFyc2VBcmdzUmVzdWx0XG4gICAqL1xuICBzdGF0aWMgcGFyc2VBcmdzKG9wdGlvbnM6IFBhcnNlQXJnc09wdGlvbnNDb25maWcpOiBQYXJzZUFyZ3NSZXN1bHQge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMucGFyc2VBcmdzKTtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NDb25maWcgPSB7XG4gICAgICBhcmdzOiBwcm9jZXNzLmFyZ3Yuc2xpY2UoMiksXG4gICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgIH07XG4gICAgbG9nLmRlYnVnKGBQYXJzaW5nIGFyZ3VtZW50czogJHtKU09OLnN0cmluZ2lmeShhcmdzLCBudWxsLCAyKX1gKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHBhcnNlQXJncyhhcmdzKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nLmRlYnVnKFxuICAgICAgICBgRXJyb3Igd2hpbGUgcGFyc2luZyBhcmd1bWVudHM6XFxuJHtKU09OLnN0cmluZ2lmeShhcmdzLCBudWxsLCAyKX1cXG4gfCBvcHRpb25zXFxuJHtKU09OLnN0cmluZ2lmeShvcHRpb25zLCBudWxsLCAyKX1cXG4gfCAke2Vycm9yfWBcbiAgICAgICk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIHBhcnNpbmcgYXJndW1lbnRzOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb21tYW5kIG9wdGlvbnMgZm9yIENMSSBjb21tYW5kcy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIGNvbW1vbiBjb21tYW5kLWxpbmUgb3B0aW9ucyB1c2VkIGFjcm9zcyB2YXJpb3VzIENMSSBjb21tYW5kcy5cbiAqIEBjb25zdCBEZWZhdWx0Q29tbWFuZE9wdGlvbnNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlZmF1bHRDb21tYW5kT3B0aW9uc1xuICogQHByb3BlcnR5IHtPYmplY3R9IHZlcmJvc2UgLSBWZXJib3NpdHkgbGV2ZWwgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcmJvc2UudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB2ZXJib3NlIG9wdGlvbiAobnVtYmVyKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJib3NlLnNob3J0IC0gVGhlIHNob3J0IGZsYWcgZm9yIHRoZSB2ZXJib3NlIG9wdGlvbiAoVikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZS5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHZlcmJvc2l0eSAoMCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdmVyc2lvbiAtIFZlcnNpb24gZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbi50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZlcnNpb24gb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uLnNob3J0IC0gVGhlIHNob3J0IGZsYWcgZm9yIHRoZSB2ZXJzaW9uIG9wdGlvbiAodikuXG4gKiBAcHJvcGVydHkge3VuZGVmaW5lZH0gdmVyc2lvbi5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHZlcnNpb24gZGlzcGxheSAodW5kZWZpbmVkKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBoZWxwIC0gSGVscCBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoZWxwLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgaGVscCBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhlbHAuc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIGhlbHAgb3B0aW9uIChoKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGVscC5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGhlbHAgZGlzcGxheSAoZmFsc2UpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsIC0gTG9nIGxldmVsIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dMZXZlbC50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGxvZ0xldmVsIG9wdGlvbiAoc3RyaW5nKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dMZXZlbC5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGxvZyBsZXZlbCAoXCJpbmZvXCIpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ1N0eWxlIC0gTG9nIHN0eWxpbmcgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ1N0eWxlLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbG9nU3R5bGUgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9nU3R5bGUuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBsb2cgc3R5bGluZyAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGltZXN0YW1wIC0gVGltZXN0YW1wIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRpbWVzdGFtcC50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHRpbWVzdGFtcCBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtib29sZWFufSB0aW1lc3RhbXAuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aW1lc3RhbXAgZGlzcGxheSAodHJ1ZSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gYmFubmVyIC0gQmFubmVyIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJhbm5lci50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGJhbm5lciBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBiYW5uZXIuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBiYW5uZXIgZGlzcGxheSAoZmFsc2UpLlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdENvbW1hbmRPcHRpb25zID0ge1xuICB2ZXJib3NlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiVlwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgdmVyc2lvbjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcInZcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIGhlbHA6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJoXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGxvZ0xldmVsOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBkZWZhdWx0OiBcImluZm9cIixcbiAgfSxcbiAgbG9nU3R5bGU6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICB0aW1lc3RhbXA6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBiYW5uZXI6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb21tYW5kIHZhbHVlcyBkZXJpdmVkIGZyb20gRGVmYXVsdENvbW1hbmRPcHRpb25zLlxuICogQHN1bW1hcnkgQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgYWxsIG9wdGlvbnMgZGVmaW5lZCBpbiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKiBAY29uc3QgRGVmYXVsdENvbW1hbmRWYWx1ZXNcbiAqIEB0eXBlZGVmIHtPYmplY3R9IERlZmF1bHRDb21tYW5kVmFsdWVzXG4gKiBAcHJvcGVydHkge3Vua25vd259IFtrZXk6IHN0cmluZ10gLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCBvcHRpb24gaW4gRGVmYXVsdENvbW1hbmRPcHRpb25zLlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdENvbW1hbmRWYWx1ZXM6IHtcbiAgW2sgaW4ga2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9uc106IHVua25vd247XG59ID0gT2JqZWN0LmtleXMoRGVmYXVsdENvbW1hbmRPcHRpb25zKS5yZWR1Y2UoXG4gIChhY2M6IFJlY29yZDxrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zLCB1bmtub3duPiwga2V5OiBzdHJpbmcpID0+IHtcbiAgICBhY2Nba2V5IGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdID1cbiAgICAgIERlZmF1bHRDb21tYW5kT3B0aW9uc1trZXkgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9uc10uZGVmYXVsdDtcbiAgICByZXR1cm4gYWNjO1xuICB9LFxuICB7fSBhcyBSZWNvcmQ8a2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzLCB1bmtub3duPlxuKTtcbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZW5jb2RpbmcgZm9yIHRleHQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBVVEYtOCBlbmNvZGluZyB1c2VkIGZvciB0ZXh0IHByb2Nlc3NpbmcuXG4gKiBAY29uc3Qge3N0cmluZ30gRW5jb2RpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuY29kaW5nID0gXCJ1dGYtOFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNlbWFudGljIHZlcnNpb25pbmcuXG4gKiBAc3VtbWFyeSBBIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggYW5kIHBhcnNlIHNlbWFudGljIHZlcnNpb24gc3RyaW5ncy5cbiAqIEBjb25zdCB7UmVnRXhwfSBTZW1WZXJzaW9uUmVnZXhcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbVZlcnNpb25SZWdleCA9XG4gIC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKD86LShbMC05QS1aYS16LV0rKD86XFwuWzAtOUEtWmEtel0pKSkvZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3Igc2VtYW50aWMgdmVyc2lvbiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdGhyZWUgbGV2ZWxzIG9mIHNlbWFudGljIHZlcnNpb25pbmc6IFBBVENILCBNSU5PUiwgYW5kIE1BSk9SLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VtVmVyc2lvbiB7XG4gIC8qKiBQYXRjaCB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBidWcgZml4ZXMuICovXG4gIFBBVENIID0gXCJwYXRjaFwiLFxuICAvKiogTWlub3IgdmVyc2lvbiBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgbmV3IGZlYXR1cmVzLiAqL1xuICBNSU5PUiA9IFwibWlub3JcIixcbiAgLyoqIE1ham9yIHZlcnNpb24gZm9yIGNoYW5nZXMgdGhhdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi9cbiAgTUFKT1IgPSBcIm1ham9yXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gaW5kaWNhdGUgbm9uLUNJIGVudmlyb25tZW50LlxuICogQHN1bW1hcnkgVXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBjb21tYW5kIHNob3VsZCBydW4gb3V0c2lkZSBvZiBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gZW52aXJvbm1lbnQuXG4gKiBAY29uc3Qge3N0cmluZ30gTm9DSUZMYWdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IE5vQ0lGTGFnID0gXCItbm8tY2lcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGZvciB0aGUgc2V0dXAgc2NyaXB0IGluIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IElkZW50aWZpZXMgdGhlIHNjcmlwdCB0aGF0IHJ1bnMgYWZ0ZXIgcGFja2FnZSBpbnN0YWxsYXRpb24uXG4gKiBAY29uc3Qge3N0cmluZ30gU2V0dXBTY3JpcHRLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNldHVwU2NyaXB0S2V5ID0gXCJwb3N0aW5zdGFsbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZpbGUgbmFtZXMgZm9yIHN0b3JpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIFRva2VucyB7XG4gIC8qKiBHaXQgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBHSVQgPSBcIi50b2tlblwiLFxuICAvKiogTlBNIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgTlBNID0gXCIubnBtdG9rZW5cIixcbiAgLyoqIERvY2tlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIERPQ0tFUiA9IFwiLmRvY2tlcnRva2VuXCIsXG4gIC8qKiBDb25mbHVlbmNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgQ09ORkxVRU5DRSA9IFwiLmNvbmZsdWVuY2UtdG9rZW5cIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29kZSB1c2VkIHRvIGluZGljYXRlIGFuIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC5cbiAqIEBzdW1tYXJ5IFN0YW5kYXJkIG1lc3NhZ2UgdXNlZCB3aGVuIGEgcHJvY2VzcyBpcyBtYW51YWxseSB0ZXJtaW5hdGVkLlxuICogQGNvbnN0IHtzdHJpbmd9IEFib3J0Q29kZVxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgY29uc3QgQWJvcnRDb2RlID0gXCJBYm9ydGVkXCI7XG4iLCJpbXBvcnQgeyBFbmNvZGluZyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE91dHB1dFdyaXRlciB9IGZyb20gXCIuL091dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgUHJvbWlzZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCI7XG5pbXBvcnQgeyBPdXRwdXRUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3RhbmRhcmQgb3V0cHV0IHdyaXRlciBmb3IgaGFuZGxpbmcgY29tbWFuZCBleGVjdXRpb24gb3V0cHV0LlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPdXRwdXRXcml0ZXIgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvclxuICogaGFuZGxpbmcgdmFyaW91cyB0eXBlcyBvZiBvdXRwdXQgZnJvbSBjb21tYW5kIGV4ZWN1dGlvbiwgaW5jbHVkaW5nIHN0YW5kYXJkIG91dHB1dCxcbiAqIGVycm9yIG91dHB1dCwgYW5kIGV4aXQgY29kZXMuIEl0IGFsc28gaW5jbHVkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBwYXJzaW5nIGNvbW1hbmRzXG4gKiBhbmQgcmVzb2x2aW5nIG9yIHJlamVjdGluZyBwcm9taXNlcyBiYXNlZCBvbiBleGVjdXRpb24gcmVzdWx0cy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGNtZCAtIFRoZSBjb21tYW5kIHN0cmluZyB0byBiZSBleGVjdXRlZC5cbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzICh1bnVzZWQgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24pLlxuICpcbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSAnQGRlY2FmLXRzL3V0aWxzJztcbiAqIGltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gJ0BkZWNhZi10cy91dGlscyc7XG4gKiBcbiAqIC8vIENyZWF0ZSBhIHByb21pc2UgZXhlY3V0b3JcbiAqIGNvbnN0IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8c3RyaW5nPiA9IHtcbiAqICAgcmVzb2x2ZTogKHZhbHVlKSA9PiBjb25zb2xlLmxvZyhgUmVzb2x2ZWQ6ICR7dmFsdWV9YCksXG4gKiAgIHJlamVjdDogKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBSZWplY3RlZDogJHtlcnJvci5tZXNzYWdlfWApXG4gKiB9O1xuICogXG4gKiAvLyBDcmVhdGUgYSBzdGFuZGFyZCBvdXRwdXQgd3JpdGVyXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgU3RhbmRhcmRPdXRwdXRXcml0ZXIoJ2xzIC1sYScsIGV4ZWN1dG9yKTtcbiAqIFxuICogLy8gVXNlIHRoZSB3cml0ZXIgdG8gaGFuZGxlIGNvbW1hbmQgb3V0cHV0XG4gKiB3cml0ZXIuZGF0YSgnRmlsZSBsaXN0IG91dHB1dC4uLicpO1xuICogd3JpdGVyLmV4aXQoMCwgWydDb21tYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSddKTtcbiAqIGBgYFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFN0YW5kYXJkT3V0cHV0V3JpdGVyXG4gKiAgIHBhcnRpY2lwYW50IExvZ2dlclxuICogICBwYXJ0aWNpcGFudCBQcm9taXNlRXhlY3V0b3JcbiAqICAgXG4gKiAgIENsaWVudC0+PlN0YW5kYXJkT3V0cHV0V3JpdGVyOiBuZXcgU3RhbmRhcmRPdXRwdXRXcml0ZXIoY21kLCBsb2NrKVxuICogICBTdGFuZGFyZE91dHB1dFdyaXRlci0+PkxvZ2dlcjogTG9nZ2luZy5mb3IoY21kKVxuICogICBcbiAqICAgQ2xpZW50LT4+U3RhbmRhcmRPdXRwdXRXcml0ZXI6IGRhdGEoY2h1bmspXG4gKiAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyLT4+U3RhbmRhcmRPdXRwdXRXcml0ZXI6IGxvZyhcInN0ZG91dFwiLCBjaHVuaylcbiAqICAgU3RhbmRhcmRPdXRwdXRXcml0ZXItPj5Mb2dnZXI6IGxvZ2dlci5pbmZvKGxvZylcbiAqICAgXG4gKiAgIENsaWVudC0+PlN0YW5kYXJkT3V0cHV0V3JpdGVyOiBlcnJvcihjaHVuaylcbiAqICAgU3RhbmRhcmRPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogbG9nKFwic3RkZXJyXCIsIGNodW5rKVxuICogICBTdGFuZGFyZE91dHB1dFdyaXRlci0+PkxvZ2dlcjogbG9nZ2VyLmluZm8obG9nKVxuICogICBcbiAqICAgQ2xpZW50LT4+U3RhbmRhcmRPdXRwdXRXcml0ZXI6IGV4aXQoY29kZSwgbG9ncylcbiAqICAgU3RhbmRhcmRPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogbG9nKFwic3Rkb3V0XCIsIGV4aXRNZXNzYWdlKVxuICogICBhbHQgY29kZSA9PT0gMFxuICogICAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyLT4+U3RhbmRhcmRPdXRwdXRXcml0ZXI6IHJlc29sdmUobG9ncylcbiAqICAgICBTdGFuZGFyZE91dHB1dFdyaXRlci0+PlByb21pc2VFeGVjdXRvcjogbG9jay5yZXNvbHZlKHJlYXNvbilcbiAqICAgZWxzZSBjb2RlICE9PSAwXG4gKiAgICAgU3RhbmRhcmRPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogcmVqZWN0KGVycm9yKVxuICogICAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyLT4+UHJvbWlzZUV4ZWN1dG9yOiBsb2NrLnJlamVjdChyZWFzb24pXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgU3RhbmRhcmRPdXRwdXRXcml0ZXI8UiA9IHN0cmluZz4gaW1wbGVtZW50cyBPdXRwdXRXcml0ZXIge1xuICBwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGNtZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBsb2NrOiBQcm9taXNlRXhlY3V0b3I8Uj4sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IHVua25vd25bXVxuICApIHtcbiAgICB0aGlzLmxvZ2dlciA9IExvZ2dpbmcuZm9yKHRoaXMuY21kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBvdXRwdXQgdG8gdGhlIGNvbnNvbGUuXG4gICAqIEBzdW1tYXJ5IEZvcm1hdHMgYW5kIGxvZ3MgdGhlIGdpdmVuIGRhdGEgd2l0aCBhIHRpbWVzdGFtcCBhbmQgdHlwZSBpbmRpY2F0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2Ygb3V0cHV0IChzdGRvdXQgb3Igc3RkZXJyKS5cbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgZGF0YSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nKHR5cGU6IE91dHB1dFR5cGUsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcikge1xuICAgIGRhdGEgPSBCdWZmZXIuaXNCdWZmZXIoZGF0YSkgPyBkYXRhLnRvU3RyaW5nKEVuY29kaW5nKSA6IGRhdGE7XG4gICAgY29uc3QgbG9nID0gdHlwZSA9PT0gXCJzdGRlcnJcIiA/IHN0eWxlKGRhdGEpLnJlZC50ZXh0IDogZGF0YTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKGxvZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgc3RhbmRhcmQgb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIHN0YW5kYXJkIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZGF0YShjaHVuazogYW55KSB7XG4gICAgdGhpcy5sb2coXCJzdGRvdXRcIiwgU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgZXJyb3Igb3V0cHV0IGRhdGEuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGdpdmVuIGNodW5rIGFzIGVycm9yIG91dHB1dC5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGVycm9yIGRhdGEgY2h1bmsgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGVycm9yIG9iamVjdHMuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZ2l2ZW4gRXJyb3Igb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIC0gVGhlIEVycm9yIG9iamVjdCB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcnMoZXJyOiBFcnJvcikge1xuICAgIHRoaXMubG9nKFwic3RkZXJyXCIsIGBFcnJvciBleGVjdXRpbmcgY29tbWFuZCBleGl0ZWQgOiAke2Vycn1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyB0aGUgZXhpdCBvZiBhIGNvbW1hbmQuXG4gICAqIEBzdW1tYXJ5IExvZ3MgdGhlIGV4aXQgY29kZSBhbmQgcmVzb2x2ZXMgb3IgcmVqZWN0cyB0aGUgcHJvbWlzZSBiYXNlZCBvbiB0aGUgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgLSBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLlxuICAgKiBAcGFyYW0gbG9ncyAtIEFycmF5IG9mIGxvZyBtZXNzYWdlcyB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIGV4aXRpbmcuXG4gICAqL1xuICBleGl0KGNvZGU6IG51bWJlciB8IHN0cmluZywgbG9nczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIFwic3Rkb3V0XCIsXG4gICAgICBgY29tbWFuZCBleGl0ZWQgY29kZSA6ICR7Y29kZSA9PT0gMCA/IHN0eWxlKGNvZGUudG9TdHJpbmcoKSkuZ3JlZW4udGV4dCA6IHN0eWxlKGNvZGUgPT09IG51bGwgPyBcIm51bGxcIiA6IGNvZGUudG9TdHJpbmcoKSkucmVkLnRleHR9YFxuICAgICk7XG4gICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgIHRoaXMucmVzb2x2ZShsb2dzLm1hcCgobCkgPT4gbC50cmltKCkpLmpvaW4oXCJcXG5cIikgYXMgUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVqZWN0KG5ldyBFcnJvcihsb2dzLmxlbmd0aCA/IGxvZ3Muam9pbihcIlxcblwiKSA6IGNvZGUudG9TdHJpbmcoKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGEgY29tbWFuZCBzdHJpbmcgb3IgYXJyYXkgaW50byBjb21wb25lbnRzLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyB0aGUgY29tbWFuZCBpbnRvIGEgY29uc2lzdGVudCBmb3JtYXQgYW5kIHN0b3JlcyBpdCwgdGhlbiByZXR1cm5zIGl0IHNwbGl0IGludG8gY29tbWFuZCBhbmQgYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIGFzIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MuXG4gICAqIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzIGFzIHNlcGFyYXRlIGVsZW1lbnRzLlxuICAgKi9cbiAgcGFyc2VDb21tYW5kKGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdKTogW3N0cmluZywgc3RyaW5nW11dIHtcbiAgICBjb21tYW5kID0gdHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIgPyBjb21tYW5kLnNwbGl0KFwiIFwiKSA6IGNvbW1hbmQ7XG4gICAgdGhpcy5jbWQgPSBjb21tYW5kLmpvaW4oXCIgXCIpO1xuICAgIHJldHVybiBbY29tbWFuZFswXSwgY29tbWFuZC5zbGljZSgxKV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggYSBzdWNjZXNzIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBzdWNjZXNzIG1lc3NhZ2UgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlKHJlYXNvbjogUikge1xuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRvdXRcIixcbiAgICAgIGAke3RoaXMuY21kfSBleGVjdXRlZCBzdWNjZXNzZnVsbHk6ICR7c3R5bGUocmVhc29uID8gXCJyYW4gdG8gY29tcGxldGlvblwiIDogKHJlYXNvbiBhcyBzdHJpbmcpKS5ncmVlbn1gXG4gICAgKTtcbiAgICB0aGlzLmxvY2sucmVzb2x2ZShyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWplY3RzIHRoZSBwcm9taXNlIHdpdGggYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhbiBlcnJvciBtZXNzYWdlIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIHdpdGggdGhlIGdpdmVuIHJlYXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHJlYXNvbiAtIFRoZSByZWFzb24gZm9yIHJlamVjdGluZyB0aGUgcHJvbWlzZSwgZWl0aGVyIGEgbnVtYmVyIChleGl0IGNvZGUpIG9yIGEgc3RyaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlamVjdChyZWFzb246IG51bWJlciB8IHN0cmluZyB8IEVycm9yKSB7XG4gICAgaWYgKCEocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZWFzb24gPSBuZXcgRXJyb3IoXG4gICAgICAgIHR5cGVvZiByZWFzb24gPT09IFwibnVtYmVyXCIgPyBgRXhpdCBjb2RlICR7cmVhc29ufWAgOiByZWFzb25cbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRlcnJcIixcbiAgICAgIGAke3RoaXMuY21kfSBmYWlsZWQgdG8gZXhlY3V0ZTogJHtzdHlsZShyZWFzb24ubWVzc2FnZSkucmVkfWBcbiAgICApO1xuICAgIHRoaXMubG9jay5yZWplY3QocmVhc29uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zLFxuICBzcGF3bixcbiAgU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxufSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgU3RhbmRhcmRPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi4vd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZFJlc3VsdCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvciB9IGZyb20gXCIuLi93cml0ZXJzL3R5cGVzXCI7XG5pbXBvcnQgeyBBYm9ydENvZGUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IExvZ2dlciwgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9ja2VkIHZlcnNpb24gb2YgYSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFRoaXMgaGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBlbnN1cmVzXG4gKiBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGV2ZW4gd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LlxuICogSXQgdXNlcyBhIFByb21pc2UtYmFzZWQgbG9ja2luZyBtZWNoYW5pc20gdG8gcXVldWUgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGlucHV0IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBmIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGxvY2tlZC4gSXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIFIuXG4gKiBAcmV0dXJuIEEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBpbnB1dCBmdW5jdGlvbiwgYnV0IHdpdGggc2VxdWVudGlhbCBleGVjdXRpb24gZ3VhcmFudGVlZC5cbiAqXG4gKiBAZnVuY3Rpb24gbG9ja2lmeVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IExvY2tlZEZ1bmN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE9yaWdpbmFsRnVuY3Rpb25cbiAqICAgQ2FsbGVyLT4+TG9ja2VkRnVuY3Rpb246IENhbGwgd2l0aCBwYXJhbXNcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogQ2hlY2sgY3VycmVudCBsb2NrXG4gKiAgIGFsdCBMb2NrIGlzIHJlc29sdmVkXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHJlc3VsdFxuICogICBlbHNlIExvY2sgaXMgcGVuZGluZ1xuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+TG9ja2VkRnVuY3Rpb246IFF1ZXVlIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHByb21pc2VcbiAqICAgICBOb3RlIG92ZXIgTG9ja2VkRnVuY3Rpb246IFdhaXQgZm9yIHByZXZpb3VzIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+T3JpZ2luYWxGdW5jdGlvbjogRXhlY3V0ZSB3aXRoIHBhcmFtc1xuICogICAgIE9yaWdpbmFsRnVuY3Rpb24tLT4+TG9ja2VkRnVuY3Rpb246IFJldHVybiByZXN1bHRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0tPj5DYWxsZXI6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHJlc3VsdFxuICogICBlbmRcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogVXBkYXRlIGxvY2tcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NraWZ5PFI+KGY6ICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4gUikge1xuICBsZXQgbG9jazogUHJvbWlzZTxSIHwgdm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGxvY2sudGhlbigoKSA9PiBmKC4uLnBhcmFtcykpO1xuICAgIGxvY2sgPSByZXN1bHQuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENoYWlucyBtdWx0aXBsZSBhYm9ydCBzaWduYWxzIHRvIGEgY29udHJvbGxlci5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBtZWNoYW5pc20gd2hlcmUgbXVsdGlwbGUgYWJvcnQgc2lnbmFscyBjYW4gdHJpZ2dlciBhIHNpbmdsZSBhYm9ydCBjb250cm9sbGVyLlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGNvb3JkaW5hdGluZyBjYW5jZWxsYXRpb24gYWNyb3NzIG11bHRpcGxlIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLlxuICpcbiAqIEBwYXJhbSB7QWJvcnRDb250cm9sbGVyfSBjb250cm9sbGVyIC0gVGhlIGFib3J0IGNvbnRyb2xsZXIgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNpZ25hbHMuXG4gKiBAcGFyYW0gey4uLkFib3J0U2lnbmFsfSBzaWduYWxzIC0gT25lIG9yIG1vcmUgYWJvcnQgc2lnbmFscyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBjb250cm9sbGVyLlxuICogQHJldHVybiB7QWJvcnRDb250cm9sbGVyfSBUaGUgaW5wdXQgY29udHJvbGxlciwgbm93IGNvbm5lY3RlZCB0byB0aGUgc2lnbmFscy5cbiAqXG4gKiBAZnVuY3Rpb24gY2hhaW5BYm9ydENvbnRyb2xsZXJcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICAuLi5zaWduYWxzOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgY29udHJvbGxlciBjaGFpbmVkIHRvIG11bHRpcGxlIGFib3J0IHNpZ25hbHMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGFib3J0IGNvbnRyb2xsZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBpZiBhbnkgb2YgdGhlIHByb3ZpZGVkIHNpZ25hbHMgYXJlIGFib3J0ZWQuXG4gKlxuICogQHBhcmFtIHsuLi5BYm9ydFNpZ25hbH0gc2lnbmFscyAtIE9uZSBvciBtb3JlIGFib3J0IHNpZ25hbHMgdGhhdCBjYW4gdHJpZ2dlciB0aGUgbmV3IGNvbnRyb2xsZXIuXG4gKiBAcmV0dXJuIHtBYm9ydENvbnRyb2xsZXJ9IEEgbmV3IGFib3J0IGNvbnRyb2xsZXIgY29ubmVjdGVkIHRvIHRoZSBzaWduYWxzLlxuICpcbiAqIEBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlclxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICAuLi5zaWduYWxzOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXI7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgYXJndW1lbnQwOiBBYm9ydENvbnRyb2xsZXIgfCBBYm9ydFNpZ25hbCxcbiAgLi4ucmVtYWluZGVyOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBsZXQgc2lnbmFsczogQWJvcnRTaWduYWxbXTtcbiAgbGV0IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBub3JtYWxpemUgYXJnc1xuICBpZiAoYXJndW1lbnQwIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHNpZ25hbHMgPSBbYXJndW1lbnQwLCAuLi5yZW1haW5kZXJdO1xuICB9IGVsc2Uge1xuICAgIGNvbnRyb2xsZXIgPSBhcmd1bWVudDA7XG4gICAgc2lnbmFscyA9IHJlbWFpbmRlcjtcbiAgfVxuXG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgYWJvcnRlZCwgZXhpdCBlYXJseVxuICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgLy8gY2hlY2sgYmVmb3JlIGFkZGluZyEgKGFuZCBhc3N1bWUgdGhlcmUgaXMgbm8gcG9zc2libGUgd2F5IHRoYXQgdGhlIHNpZ25hbCBjb3VsZFxuICAgIC8vIGFib3J0IGJldHdlZW4gdGhlIGBpZmAgY2hlY2sgYW5kIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIpXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBoYW5kbGVyLCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTcGF3bnMgYSBjb21tYW5kIGFzIGEgY2hpbGQgcHJvY2VzcyB3aXRoIG91dHB1dCBoYW5kbGluZy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjaGlsZCBwcm9jZXNzIHRvIGV4ZWN1dGUgYSBjb21tYW5kIHdpdGggc3VwcG9ydCBmb3IgcGlwaW5nIG11bHRpcGxlIGNvbW1hbmRzLFxuICogY3VzdG9tIG91dHB1dCBoYW5kbGluZywgYW5kIGFib3J0IGNvbnRyb2wuIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgbG93LWxldmVsIGRldGFpbHMgb2ZcbiAqIHNwYXduaW5nIHByb2Nlc3NlcyBhbmQgY29ubmVjdGluZyB0aGVpciBpbnB1dHMvb3V0cHV0cyB3aGVuIHBpcGluZyBpcyB1c2VkLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb2Nlc3NlZCBvdXRwdXQsIGRlZmF1bHRpbmcgdG8gc3RyaW5nLlxuICogQHBhcmFtIHtTdGFuZGFyZE91dHB1dFdyaXRlcjxSPn0gb3V0cHV0IC0gVGhlIG91dHB1dCB3cml0ZXIgdG8gaGFuZGxlIGNvbW1hbmQgb3V0cHV0LlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBleGVjdXRlLCBjYW4gaW5jbHVkZSBwaXBlIG9wZXJhdG9ycy5cbiAqIEBwYXJhbSB7U3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvfSBvcHRzIC0gT3B0aW9ucyBmb3IgdGhlIHNwYXduZWQgcHJvY2Vzcy5cbiAqIEBwYXJhbSB7QWJvcnRDb250cm9sbGVyfSBhYm9ydCAtIENvbnRyb2xsZXIgdG8gYWJvcnQgdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICogQHBhcmFtIHtMb2dnZXJ9IGxvZ2dlciAtIExvZ2dlciBmb3IgcmVjb3JkaW5nIGNvbW1hbmQgZXhlY3V0aW9uIGRldGFpbHMuXG4gKiBAcmV0dXJuIHtDaGlsZFByb2Nlc3NXaXRob3V0TnVsbFN0cmVhbXN9IFRoZSBzcGF3bmVkIGNoaWxkIHByb2Nlc3MuXG4gKlxuICogQGZ1bmN0aW9uIHNwYXduQ29tbWFuZFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduQ29tbWFuZDxSID0gc3RyaW5nPihcbiAgb3V0cHV0OiBTdGFuZGFyZE91dHB1dFdyaXRlcjxSPixcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRzOiBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG4gIGFib3J0OiBBYm9ydENvbnRyb2xsZXIsXG4gIGxvZ2dlcjogTG9nZ2VyXG4pOiBDaGlsZFByb2Nlc3NXaXRob3V0TnVsbFN0cmVhbXMge1xuICBmdW5jdGlvbiBzcGF3bklubmVyKGNvbW1hbmQ6IHN0cmluZywgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyKSB7XG4gICAgY29uc3QgW2NtZCwgYXJnel0gPSBvdXRwdXQucGFyc2VDb21tYW5kKGNvbW1hbmQpO1xuICAgIGxvZ2dlci5pbmZvKGBSdW5uaW5nIGNvbW1hbmQ6ICR7Y21kfWApO1xuICAgIGxvZ2dlci5kZWJ1Zyhgd2l0aCBhcmdzOiAke2FyZ3ouam9pbihcIiBcIil9YCk7XG4gICAgY29uc3QgY2hpbGRQcm9jZXNzID0gc3Bhd24oY21kLCBhcmd6LCB7XG4gICAgICAuLi5vcHRzLFxuICAgICAgY3dkOiBvcHRzLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpLFxuICAgICAgZW52OiBPYmplY3QuYXNzaWduKHt9LCBwcm9jZXNzLmVudiwgb3B0cy5lbnYsIHsgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCB9KSxcbiAgICAgIHNoZWxsOiBvcHRzLnNoZWxsIHx8IGZhbHNlLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgICBsb2dnZXIudmVyYm9zZShgcGlkIDogJHtjaGlsZFByb2Nlc3MucGlkfWApO1xuICAgIHJldHVybiBjaGlsZFByb2Nlc3M7XG4gIH1cblxuICBjb25zdCBtID0gY29tbWFuZC5tYXRjaCgvWzw+JCNdL2cpO1xuICBpZiAobSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBjb21tYW5kOiAke2NvbW1hbmR9LiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICR7bX1gXG4gICAgKTtcbiAgaWYgKGNvbW1hbmQuaW5jbHVkZXMoXCIgfCBcIikpIHtcbiAgICBjb25zdCBjbWRzID0gY29tbWFuZC5zcGxpdChcIiB8IFwiKTtcbiAgICBjb25zdCBzcGF3bnMgPSBbXTtcbiAgICBjb25zdCBjb250cm9sbGVycyA9IG5ldyBBcnJheShjbWRzLmxlbmd0aCk7XG4gICAgY29udHJvbGxlcnNbMF0gPSBhYm9ydDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNtZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpICE9PSAwKVxuICAgICAgICBjb250cm9sbGVyc1tpXSA9IGNoYWluQWJvcnRDb250cm9sbGVyKGNvbnRyb2xsZXJzW2kgLSAxXS5zaWduYWwpO1xuICAgICAgc3Bhd25zLnB1c2goc3Bhd25Jbm5lcihjbWRzW2ldLCBjb250cm9sbGVyc1tpXSkpO1xuICAgICAgaWYgKGkgPT09IDApIGNvbnRpbnVlO1xuICAgICAgc3Bhd25zW2kgLSAxXS5zdGRvdXQucGlwZShzcGF3bnNbaV0uc3RkaW4pO1xuICAgIH1cbiAgICByZXR1cm4gc3Bhd25zW2NtZHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICByZXR1cm4gc3Bhd25Jbm5lcihjb21tYW5kLCBhYm9ydCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIGEgY29tbWFuZCBhc3luY2hyb25vdXNseSB3aXRoIGN1c3RvbWl6YWJsZSBvdXRwdXQgaGFuZGxpbmcuXG4gKiBAc3VtbWFyeSBUaGlzIGZ1bmN0aW9uIHJ1bnMgYSBzaGVsbCBjb21tYW5kIGFzIGEgY2hpbGQgcHJvY2VzcywgcHJvdmlkaW5nIGZpbmUtZ3JhaW5lZFxuICogY29udHJvbCBvdmVyIGl0cyBleGVjdXRpb24gYW5kIG91dHB1dCBoYW5kbGluZy4gSXQgc3VwcG9ydHMgY3VzdG9tIG91dHB1dCB3cml0ZXJzLFxuICogYWxsb3dzIGZvciBjb21tYW5kIGFib3J0aW9uLCBhbmQgY2FwdHVyZXMgYm90aCBzdGRvdXQgYW5kIHN0ZGVyci5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAqXG4gKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIHJ1biwgZWl0aGVyIGFzIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0gb3B0cyAtIFNwYXduIG9wdGlvbnMgZm9yIHRoZSBjaGlsZCBwcm9jZXNzLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QuXG4gKiBAcGFyYW0gb3V0cHV0Q29uc3RydWN0b3IgLSBDb25zdHJ1Y3RvciBmb3IgdGhlIG91dHB1dCB3cml0ZXIuIERlZmF1bHRzIHRvIFN0YW5kYXJkT3V0cHV0V3JpdGVyLlxuICogQHBhcmFtIGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBvdXRwdXQgY29uc3RydWN0b3IuXG4gKiBAcmV0dXJuIHtDb21tYW5kUmVzdWx0fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tbWFuZCByZXN1bHQgb2YgdHlwZSBSLlxuICpcbiAqIEBmdW5jdGlvbiBydW5Db21tYW5kXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcnVuQ29tbWFuZFxuICogICBwYXJ0aWNpcGFudCBPdXRwdXRXcml0ZXJcbiAqICAgcGFydGljaXBhbnQgQ2hpbGRQcm9jZXNzXG4gKiAgIENhbGxlci0+PnJ1bkNvbW1hbmQ6IENhbGwgd2l0aCBjb21tYW5kIGFuZCBvcHRpb25zXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IENyZWF0ZSBuZXcgaW5zdGFuY2VcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogUGFyc2UgY29tbWFuZFxuICogICBydW5Db21tYW5kLT4+Q2hpbGRQcm9jZXNzOiBTcGF3biBwcm9jZXNzXG4gKiAgIENoaWxkUHJvY2Vzcy0tPj5ydW5Db21tYW5kOiBSZXR1cm4gcHJvY2VzcyBvYmplY3RcbiAqICAgcnVuQ29tbWFuZC0+PkNoaWxkUHJvY2VzczogU2V0IHVwIGV2ZW50IGxpc3RlbmVyc1xuICogICBsb29wIEZvciBlYWNoIHN0ZG91dCBkYXRhXG4gKiAgICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBzdGRvdXQgZGF0YVxuICogICAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBzdGRvdXQgZGF0YVxuICogICBlbmRcbiAqICAgbG9vcCBGb3IgZWFjaCBzdGRlcnIgZGF0YVxuICogICAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgc3RkZXJyIGRhdGFcbiAqICAgICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgc3RkZXJyIGRhdGFcbiAqICAgZW5kXG4gKiAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgZXJyb3IgKGlmIGFueSlcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIGVycm9yXG4gKiAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgZXhpdFxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgZXhpdFxuICogICBPdXRwdXRXcml0ZXItLT4+cnVuQ29tbWFuZDogUmVzb2x2ZSBvciByZWplY3QgcHJvbWlzZVxuICogICBydW5Db21tYW5kLS0+PkNhbGxlcjogUmV0dXJuIENvbW1hbmRSZXN1bHRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db21tYW5kPFIgPSBzdHJpbmc+KFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyA9IHt9LFxuICBvdXRwdXRDb25zdHJ1Y3RvcjogT3V0cHV0V3JpdGVyQ29uc3RydWN0b3I8XG4gICAgUixcbiAgICBTdGFuZGFyZE91dHB1dFdyaXRlcjxSPixcbiAgICBFcnJvclxuICA+ID0gU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKTogQ29tbWFuZFJlc3VsdDxSPiB7XG4gIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKHJ1bkNvbW1hbmQpO1xuICBjb25zdCBhYm9ydCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBjb25zdCByZXN1bHQ6IE9taXQ8Q29tbWFuZFJlc3VsdCwgXCJwcm9taXNlXCIgfCBcInBpcGVcIj4gPSB7XG4gICAgYWJvcnQ6IGFib3J0LFxuICAgIGNvbW1hbmQ6IGNvbW1hbmQsXG4gICAgbG9nczogW10sXG4gICAgZXJyczogW10sXG4gIH07XG5cbiAgY29uc3QgbG9jayA9IG5ldyBQcm9taXNlPFI+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgb3V0cHV0O1xuICAgIHRyeSB7XG4gICAgICBvdXRwdXQgPSBuZXcgb3V0cHV0Q29uc3RydWN0b3IoXG4gICAgICAgIGNvbW1hbmQsXG4gICAgICAgIHtcbiAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcblxuICAgICAgcmVzdWx0LmNtZCA9IHNwYXduQ29tbWFuZDxSPihvdXRwdXQsIGNvbW1hbmQsIG9wdHMsIGFib3J0LCBsb2dnZXIpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBFcnJvciBydW5uaW5nIGNvbW1hbmQgJHtjb21tYW5kfTogJHtlfWApKTtcbiAgICB9XG5cbiAgICByZXN1bHQuY21kLnN0ZG91dC5zZXRFbmNvZGluZyhcInV0ZjhcIik7XG5cbiAgICByZXN1bHQuY21kLnN0ZG91dC5vbihcImRhdGFcIiwgKGNodW5rOiBhbnkpID0+IHtcbiAgICAgIGNodW5rID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5sb2dzLnB1c2goY2h1bmspO1xuICAgICAgb3V0cHV0LmRhdGEoY2h1bmspO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LmNtZC5zdGRlcnIub24oXCJkYXRhXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGRhdGEgPSBkYXRhLnRvU3RyaW5nKCk7XG4gICAgICByZXN1bHQuZXJycy5wdXNoKGRhdGEpO1xuICAgICAgb3V0cHV0LmVycm9yKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LmNtZC5vbmNlKFwiZXJyb3JcIiwgKGVycjogRXJyb3IpID0+IHtcbiAgICAgIG91dHB1dC5leGl0KGVyci5tZXNzYWdlLCByZXN1bHQuZXJycyk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLm9uY2UoXCJleGl0XCIsIChjb2RlOiBudW1iZXIgPSAwKSA9PiB7XG4gICAgICBpZiAoYWJvcnQuc2lnbmFsLmFib3J0ZWQgJiYgY29kZSA9PT0gbnVsbCkgY29kZSA9IEFib3J0Q29kZSBhcyBhbnk7XG4gICAgICBvdXRwdXQuZXhpdChjb2RlLCBjb2RlID09PSAwID8gcmVzdWx0LmxvZ3MgOiByZXN1bHQuZXJycyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIE9iamVjdC5hc3NpZ24ocmVzdWx0LCB7XG4gICAgcHJvbWlzZTogbG9jayxcbiAgICBwaXBlOiBhc3luYyA8RT4oY2I6IChyOiBSKSA9PiBFKSA9PiB7XG4gICAgICBjb25zdCBsID0gbG9nZ2VyLmZvcihcInBpcGVcIik7XG4gICAgICB0cnkge1xuICAgICAgICBsLnZlcmJvc2UoYEV4ZWN1dGluZyBwaXBlIGZ1bmN0aW9uICR7Y29tbWFuZH0uLi5gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBSID0gYXdhaXQgbG9jaztcbiAgICAgICAgbC52ZXJib3NlKGBQaXBpbmcgb3V0cHV0IHRvICR7Y2IubmFtZX06ICR7cmVzdWx0fWApO1xuICAgICAgICByZXR1cm4gY2IocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgbC5lcnJvcihgRXJyb3IgcGlwaW5nIGNvbW1hbmQgb3V0cHV0OiAke2V9YCk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBDb21tYW5kUmVzdWx0PFI+O1xufVxuIiwiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU1hcCwgU2ltcGxlRGVwZW5kZW5jeU1hcCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nLCBwYXRjaFN0cmluZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihcImZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXRjaGVzIGEgZmlsZSB3aXRoIGdpdmVuIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZmlsZSwgYXBwbGllcyBwYXRjaGVzIHVzaW5nIFRleHRVdGlscywgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBwYXRjaGVkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHBhdGNoIGludG8gdGhlIGZpbGUuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaEZpbGVcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaEZpbGVcbiAqICAgcGFydGljaXBhbnQgZnNcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgVGV4dFV0aWxzXG4gKiAgIHBhcnRpY2lwYW50IHdyaXRlRmlsZVxuICogICBDYWxsZXItPj5wYXRjaEZpbGU6IENhbGwgd2l0aCBwYXRoIGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hGaWxlLT4+ZnM6IENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gKiAgIHBhdGNoRmlsZS0+PnJlYWRGaWxlOiBSZWFkIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0+PmZzOiBSZWFkIGZpbGVcbiAqICAgZnMtLT4+cmVhZEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcmVhZEZpbGUtLT4+cGF0Y2hGaWxlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIHBhdGNoRmlsZS0+PlRleHRVdGlsczogUGF0Y2ggc3RyaW5nXG4gKiAgIFRleHRVdGlscy0tPj5wYXRjaEZpbGU6IFJldHVybiBwYXRjaGVkIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+d3JpdGVGaWxlOiBXcml0ZSBwYXRjaGVkIGNvbnRlbnRcbiAqICAgd3JpdGVGaWxlLT4+ZnM6IFdyaXRlIHRvIGZpbGVcbiAqICAgZnMtLT4+d3JpdGVGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgd3JpdGVGaWxlLS0+PnBhdGNoRmlsZTogRmlsZSB3cml0dGVuXG4gKiAgIHBhdGNoRmlsZS0tPj5DYWxsZXI6IFBhdGNoaW5nIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocGF0Y2hGaWxlKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgYXQgcGF0aCBcIiR7cGF0aH1cIi5gKTtcbiAgbGV0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoKTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyBmaWxlIFwiJHtwYXRofVwiLi4uYCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlcyl9YCk7XG4gICAgY29udGVudCA9IHBhdGNoU3RyaW5nKGNvbnRlbnQsIHZhbHVlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXRjaGluZyBmaWxlOiAke2Vycm9yfWApO1xuICB9XG4gIHdyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50LlxuICogQHN1bW1hcnkgUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHJlYWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICpcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocmVhZEZpbGUpO1xuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBkYXRhIHRvIGEgZmlsZS5cbiAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgcHJvdmlkZWQgZGF0YSB0byBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdyaXRlRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHdyaXRlRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFdyaXRpbmcgZmlsZSBcIiR7cGF0aH0gd2l0aCAke2RhdGEubGVuZ3RofSBieXRlcy4uLmApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgZGF0YSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBmaWxlcyByZWN1cnNpdmVseSBmcm9tIGEgZGlyZWN0b3J5LlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIHRocm91Z2ggZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHRvIGNvbGxlY3QgYWxsIGZpbGUgcGF0aHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgLSBUaGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFtmaWx0ZXJdIC0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gZmlsdGVyIGZpbGVzIGJ5IG5hbWUgb3IgaW5kZXguXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX0gQXJyYXkgb2YgZmlsZSBwYXRocy5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0QWxsRmlsZXNcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbGxGaWxlcyhcbiAgcDogc3RyaW5nLFxuICBmaWx0ZXI/OiAoZjogc3RyaW5nLCBpPzogbnVtYmVyKSA9PiBib29sZWFuXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoZ2V0QWxsRmlsZXMpO1xuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZXRyaWV2aW5nIGFsbCBmaWxlcyBmcm9tIFwiJHtwfVwiLi4uYCk7XG4gICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHApO1xuXG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4ocCwgZW50cnkpO1xuICAgICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZ1bGxQYXRoKTtcblxuICAgICAgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgICAgZmlsZXMucHVzaChmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICBmaWxlcy5wdXNoKC4uLmdldEFsbEZpbGVzKGZ1bGxQYXRoKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFmaWx0ZXIpIHJldHVybiBmaWxlcztcbiAgICByZXR1cm4gZmlsZXMuZmlsdGVyKGZpbHRlcik7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYEVycm9yIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZW5hbWVzIGEgZmlsZSBvciBkaXJlY3RvcnkuXG4gKiBAc3VtbWFyeSBNb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIHNvdXJjZSBwYXRoIHRvIHRoZSBkZXN0aW5hdGlvbiBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBUaGUgc291cmNlIHBhdGggb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5LlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3QgLSBUaGUgZGVzdGluYXRpb24gcGF0aCBmb3IgdGhlIGZpbGUgb3IgZGlyZWN0b3J5LlxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVuYW1lIG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAZnVuY3Rpb24gcmVuYW1lRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHJlbmFtZUZpbGUpO1xuICBsZXQgZGVzY3JpcHRvclNvdXJjZSwgZGVzY3JpcHRvckRlc3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGRlc2NyaXB0b3JEZXN0ID0gZnMuc3RhdFN5bmMoZGVzdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gZG8gbm90aGluZy4gaXRzIG9rXG4gIH1cbiAgaWYgKGRlc2NyaXB0b3JEZXN0KSB7XG4gICAgbG9nLnZlcmJvc2UoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgUmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLnJlbmFtZVN5bmMoc291cmNlLCBkZXN0KTtcbiAgICBsb2cudmVyYm9zZShgU3VjY2Vzc2Z1bGx5IHJlbmFtZWQgdG8gXCIke2Rlc3R9XCJgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIHJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH1cIjogJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb3BpZXMgYSBmaWxlIG9yIGRpcmVjdG9yeS5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBjb3B5IG9mIGEgZmlsZSBvciBkaXJlY3RvcnkgZnJvbSB0aGUgc291cmNlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSAtIFRoZSBzb3VyY2UgcGF0aCBvZiB0aGUgZmlsZSBvciBkaXJlY3RvcnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIGZvciB0aGUgZmlsZSBvciBkaXJlY3RvcnkuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBjb3B5RmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihjb3B5RmlsZSk7XG4gIGxldCBkZXNjcmlwdG9yU291cmNlLCBkZXNjcmlwdG9yRGVzdDtcbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvckRlc3QgPSBmcy5zdGF0U3luYyhkZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGRlc2NyaXB0b3JTb3VyY2UuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlc3QgcGF0aCBcIiR7ZGVzdH1cIiBkb2VzIG5vdCBleGlzdC4gY3JlYXRpbmdgKTtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYENvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLmNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEVycm9yIGNvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fTogJHtlcnJvcn1gXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeS5cbiAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSBhdCB0aGUgc3BlY2lmaWVkIHBhdGgsIHdpdGggcmVjdXJzaXZlIGFuZCBmb3JjZSBvcHRpb25zIGVuYWJsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgLSBUaGUgcGF0aCB0byB0aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gZGVsZXRlLlxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gZGVsZXRlUGF0aFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVBhdGgocDogc3RyaW5nKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoZGVsZXRlUGF0aCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChkZXNjcmlwdG9yLmlzRmlsZSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgZmlsZSBcIiR7cH0uLi5gKTtcbiAgICAgIGZzLnJtU3luYyhwLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIERlbGV0aW5nIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgTG9hZHMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGUgZnJvbSBhIHNwZWNpZmllZCBkaXJlY3Rvcnkgb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIENhbiByZXR1cm4gdGhlIGVudGlyZSBwYWNrYWdlIG9iamVjdCBvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gcGFja2FnZS5qc29uLlxuICogQHJldHVybiB7b2JqZWN0IHwgc3RyaW5nfSBUaGUgcGFyc2VkIGNvbnRlbnRzIG9mIHBhY2thZ2UuanNvbiBvciB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlXG4gKiAgIHBhcnRpY2lwYW50IHJlYWRGaWxlXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0UGFja2FnZTogQ2FsbCB3aXRoIHBhdGggYW5kIG9wdGlvbmFsIHByb3BlcnR5XG4gKiAgIGdldFBhY2thZ2UtPj5yZWFkRmlsZTogUmVhZCBwYWNrYWdlLmpzb25cbiAqICAgcmVhZEZpbGUtLT4+Z2V0UGFja2FnZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICBnZXRQYWNrYWdlLT4+SlNPTjogUGFyc2UgZmlsZSBjb250ZW50XG4gKiAgIEpTT04tLT4+Z2V0UGFja2FnZTogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgYWx0IHByb3BlcnR5IHNwZWNpZmllZFxuICogICAgIGdldFBhY2thZ2UtPj5nZXRQYWNrYWdlOiBDaGVjayBpZiBwcm9wZXJ0eSBleGlzdHNcbiAqICAgICBhbHQgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIHByb3BlcnR5IHZhbHVlXG4gKiAgICAgZWxzZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogVGhyb3cgRXJyb3JcbiAqICAgICBlbmRcbiAqICAgZWxzZSBubyBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIGVudGlyZSBwYWNrYWdlIG9iamVjdFxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2UoXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIHByb3BlcnR5Pzogc3RyaW5nXG4pOiBvYmplY3QgfCBzdHJpbmcge1xuICBsZXQgcGtnOiBhbnk7XG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGFja2FnZSBpbmZvcm1hdGlvblwiICR7ZXJyb3J9YCk7XG4gIH1cblxuICBpZiAocHJvcGVydHkpIHtcbiAgICBpZiAoIShwcm9wZXJ0eSBpbiBwa2cpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgbm90IGZvdW5kIGluIHBhY2thZ2UuanNvbmApO1xuICAgIHJldHVybiBwa2dbcHJvcGVydHldIGFzIHN0cmluZztcbiAgfVxuICByZXR1cm4gcGtnO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTZXRzIGFuIGF0dHJpYnV0ZSBpbiB0aGUgcGFja2FnZS5qc29uIGZpbGUuXG4gKiBAc3VtbWFyeSBVcGRhdGVzIGEgc3BlY2lmaWMgYXR0cmlidXRlIGluIHRoZSBwYWNrYWdlLmpzb24gZmlsZSB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ciAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzZXQgaW4gcGFja2FnZS5qc29uLlxuICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBvYmplY3R9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHNldFBhY2thZ2VBdHRyaWJ1dGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQYWNrYWdlQXR0cmlidXRlKFxuICBhdHRyOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKClcbik6IHZvaWQge1xuICBjb25zdCBwa2cgPSBnZXRQYWNrYWdlKHApIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHBrZ1thdHRyXSA9IHZhbHVlO1xuICB3cml0ZUZpbGUocGF0aC5qb2luKHAsIGBwYWNrYWdlLmpzb25gKSwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IEEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjYWxscyBnZXRQYWNrYWdlIHRvIHJldHJpZXZlIHRoZSBcInZlcnNpb25cIiBwcm9wZXJ0eSBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZlcnNpb24gc3RyaW5nIGZyb20gcGFja2FnZS5qc29uLlxuICogQGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvbihwID0gcHJvY2Vzcy5jd2QoKSk6IHN0cmluZyB7XG4gIHJldHVybiBnZXRQYWNrYWdlKHAsIFwidmVyc2lvblwiKSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhbGwgZGVwZW5kZW5jaWVzIGZyb20gdGhlIHByb2plY3QuXG4gKiBAc3VtbWFyeSBFeGVjdXRlcyAnbnBtIGxzIC0tanNvbicgY29tbWFuZCB0byBnZXQgYSBkZXRhaWxlZCBsaXN0IG9mIGFsbCBkZXBlbmRlbmNpZXMgKHByb2R1Y3Rpb24sIGRldmVsb3BtZW50LCBhbmQgcGVlcikgYW5kIHRoZWlyIHZlcnNpb25zLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIG9mIHRoZSBwcm9qZWN0LlxuICogQHJldHVybiB7UHJvbWlzZTx7cHJvZDogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT4sIGRldjogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT4sIHBlZXI6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+fT59IEFuIG9iamVjdCBjb250YWluaW5nIGFycmF5cyBvZiBwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzLlxuICogQGZ1bmN0aW9uIGdldERlcGVuZGVuY2llc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gKiAgIHBhcnRpY2lwYW50IHJ1bkNvbW1hbmRcbiAqICAgcGFydGljaXBhbnQgSlNPTlxuICogICBDYWxsZXItPj5nZXREZXBlbmRlbmNpZXM6IENhbGwgd2l0aCBvcHRpb25hbCBwYXRoXG4gKiAgIGdldERlcGVuZGVuY2llcy0+PnJ1bkNvbW1hbmQ6IEV4ZWN1dGUgJ25wbSBscyAtLWpzb24nXG4gKiAgIHJ1bkNvbW1hbmQtLT4+Z2V0RGVwZW5kZW5jaWVzOiBSZXR1cm4gY29tbWFuZCBvdXRwdXRcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+SlNPTjogUGFyc2UgY29tbWFuZCBvdXRwdXRcbiAqICAgSlNPTi0tPj5nZXREZXBlbmRlbmNpZXM6IFJldHVybiBwYXJzZWQgb2JqZWN0XG4gKiAgIGdldERlcGVuZGVuY2llcy0+PmdldERlcGVuZGVuY2llczogUHJvY2VzcyBkZXBlbmRlbmNpZXNcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldERlcGVuZGVuY2llcyhcbiAgcGF0aDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogUHJvbWlzZTxEZXBlbmRlbmN5TWFwPiB7XG4gIGxldCBwa2c6IGFueTtcblxuICB0cnkge1xuICAgIHBrZyA9IEpTT04ucGFyc2UoYXdhaXQgcnVuQ29tbWFuZChgbnBtIGxzIC0tanNvbmAsIHsgY3dkOiBwYXRoIH0pLnByb21pc2UpO1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgZGVwZW5kZW5jaWVzOiAke2V9YCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGNvbnN0IG1hcHBlciA9IChlbnRyeTogW3N0cmluZywgdW5rbm93bl0sIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgbmFtZTogZW50cnlbMF0sXG4gICAgdmVyc2lvbjogKGVudHJ5WzFdIGFzIGFueSkudmVyc2lvbixcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9kOiBPYmplY3QuZW50cmllcyhwa2cuZGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgICBkZXY6IE9iamVjdC5lbnRyaWVzKHBrZy5kZXZEZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICAgIHBlZXI6IE9iamVjdC5lbnRyaWVzKHBrZy5wZWVyRGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBwcm9qZWN0IGRlcGVuZGVuY2llcyB0byB0aGVpciBsYXRlc3QgdmVyc2lvbnMuXG4gKiBAc3VtbWFyeSBSdW5zIG5wbS1jaGVjay11cGRhdGVzIHRvIHVwZGF0ZSBwYWNrYWdlLmpzb24gYW5kIHRoZW4gaW5zdGFsbHMgdGhlIHVwZGF0ZWQgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZGVwZW5kZW5jaWVzIGFyZSB1cGRhdGVkLlxuICpcbiAqIEBmdW5jdGlvbiB1cGRhdGVEZXBlbmRlbmNpZXNcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IodXBkYXRlRGVwZW5kZW5jaWVzKTtcbiAgbG9nLmluZm8oXCJjaGVja2luZyBmb3IgdXBkYXRlcy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0tY2hlY2stdXBkYXRlcyAtdVwiKS5wcm9taXNlO1xuICBsb2cuaW5mbyhcInVwZGF0aW5nLi4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwibnB4IG5wbSBydW4gZG8taW5zdGFsbFwiKS5wcm9taXNlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBJbnN0YWxscyBkZXBlbmRlbmNpZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgYXZhaWxhYmxlLlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIHNwZWNpZmllZCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZCBhbmQgaW5zdGFsbHMgYW55IHRoYXQgYXJlIG1pc3NpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gZGVwcyAtIFRoZSBkZXBlbmRlbmNpZXMgdG8gY2hlY2sgYW5kIHBvdGVudGlhbGx5IGluc3RhbGwuXG4gKiBAcGFyYW0ge1NpbXBsZURlcGVuZGVuY3lNYXB9IFtkZXBlbmRlbmNpZXNdIC0gT3B0aW9uYWwgbWFwIG9mIGV4aXN0aW5nIGRlcGVuZGVuY2llcy5cbiAqIEByZXR1cm4ge1Byb21pc2U8U2ltcGxlRGVwZW5kZW5jeU1hcD59IFVwZGF0ZWQgbWFwIG9mIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAZnVuY3Rpb24gaW5zdGFsbElmTm90QXZhaWxhYmxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbElmTm90QXZhaWxhYmxlKFxuICBkZXBzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzPzogU2ltcGxlRGVwZW5kZW5jeU1hcFxuKSB7XG4gIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgY29uc3QgZDogRGVwZW5kZW5jeU1hcCA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGRlcGVuZGVuY2llcyA9IHtcbiAgICAgIHByb2Q6IGQucHJvZD8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgICAgZGV2OiBkLmRldj8ubWFwKChkKSA9PiBkLm5hbWUpIHx8IFtdLFxuICAgICAgcGVlcjogZC5wZWVyPy5tYXAoKHApID0+IHAubmFtZSkgfHwgW10sXG4gICAgfTtcbiAgfVxuICBjb25zdCB7IHByb2QsIGRldiwgcGVlciB9ID0gZGVwZW5kZW5jaWVzO1xuICBjb25zdCBpbnN0YWxsZWQgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoWy4uLihwcm9kIHx8IFtdKSwgLi4uKGRldiB8fCBbXSksIC4uLihwZWVyIHx8IFtdKV0pXG4gICk7XG4gIGRlcHMgPSB0eXBlb2YgZGVwcyA9PT0gXCJzdHJpbmdcIiA/IFtkZXBzXSA6IGRlcHM7XG4gIGNvbnN0IHRvSW5zdGFsbCA9IGRlcHMuZmlsdGVyKChkKSA9PiAhaW5zdGFsbGVkLmluY2x1ZGVzKGQpKTtcblxuICBpZiAodG9JbnN0YWxsLmxlbmd0aCkgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyh7IGRldjogdG9JbnN0YWxsIH0pO1xuICBkZXBlbmRlbmNpZXMuZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgZGVwZW5kZW5jaWVzLmRldi5wdXNoKC4uLnRvSW5zdGFsbCk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFB1c2hlcyBjaGFuZ2VzIHRvIEdpdCByZXBvc2l0b3J5LlxuICogQHN1bW1hcnkgVGVtcG9yYXJpbHkgY2hhbmdlcyBHaXQgdXNlciBjb25maWd1cmF0aW9uLCBjb21taXRzIGFsbCBjaGFuZ2VzLCBwdXNoZXMgdG8gcmVtb3RlLCBhbmQgcmVzdG9yZXMgb3JpZ2luYWwgdXNlciBjb25maWd1cmF0aW9uLlxuICpcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbmdlcyBhcmUgcHVzaGVkLlxuICpcbiAqIEBmdW5jdGlvbiBwdXNoVG9HaXRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXNoVG9HaXQoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocHVzaFRvR2l0KTtcbiAgY29uc3QgZ2l0VXNlciA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIubmFtZVwiKS5wcm9taXNlO1xuICBjb25zdCBnaXRFbWFpbCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIikucHJvbWlzZTtcbiAgbG9nLnZlcmJvc2UoYGNhY2hlZCBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH0uIGNoYW5naW5nIHRvIGF1dG9tYXRpb25gKTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiYXV0b21hdGlvbkBkZWNhZi50c1wiJykucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCJkZWNhZlwiJykucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJQdXNoaW5nIGNoYW5nZXMgdG8gZ2l0Li4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGFkZCAuXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb21taXQgLW0gXCJyZWZzICMxIC0gYWZ0ZXIgcmVwbyBzZXR1cFwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb25maWcgdXNlci5lbWFpbCBcIiR7Z2l0RW1haWx9XCJgKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIubmFtZSBcIiR7Z2l0VXNlcn1cImApLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGByZXZlcnRlZCB0byBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH1gKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gSW5zdGFsbHMgcHJvamVjdCBkZXBlbmRlbmNpZXMuXG4gKiBAc3VtbWFyeSBJbnN0YWxscyBwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIgZGVwZW5kZW5jaWVzIGFzIHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGVwZW5kZW5jaWVzIC0gT2JqZWN0IGNvbnRhaW5pbmcgYXJyYXlzIG9mIGRlcGVuZGVuY2llcyB0byBpbnN0YWxsLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gW2RlcGVuZGVuY2llcy5wcm9kXSAtIFByb2R1Y3Rpb24gZGVwZW5kZW5jaWVzIHRvIGluc3RhbGwuXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbZGVwZW5kZW5jaWVzLmRldl0gLSBEZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMgdG8gaW5zdGFsbC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtkZXBlbmRlbmNpZXMucGVlcl0gLSBQZWVyIGRlcGVuZGVuY2llcyB0byBpbnN0YWxsLlxuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQuXG4gKlxuICogQGZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmNpZXNcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczoge1xuICBwcm9kPzogc3RyaW5nW107XG4gIGRldj86IHN0cmluZ1tdO1xuICBwZWVyPzogc3RyaW5nW107XG59KSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoaW5zdGFsbERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IHByb2QgPSBkZXBlbmRlbmNpZXMucHJvZCB8fCBbXTtcbiAgY29uc3QgZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgY29uc3QgcGVlciA9IGRlcGVuZGVuY2llcy5wZWVyIHx8IFtdO1xuICBpZiAocHJvZC5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgJHtwcm9kLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAke3Byb2Quam9pbihcIiBcIil9YCwgeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSlcbiAgICAgIC5wcm9taXNlO1xuICB9XG4gIGlmIChkZXYubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgZGV2RGVwZW5kZW5jaWVzICR7ZGV2LmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtZGV2ICR7ZGV2LmpvaW4oXCIgXCIpfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICB9XG4gIGlmIChwZWVyLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIHBlZXJEZXBlbmRlbmNpZXMgJHtwZWVyLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtcGVlciAke3BlZXIuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTm9ybWFsaXplcyBpbXBvcnRzIHRvIGhhbmRsZSBib3RoIENvbW1vbkpTIGFuZCBFU01vZHVsZSBmb3JtYXRzLlxuICogQHN1bW1hcnkgVXRpbGl0eSBmdW5jdGlvbiB0byBoYW5kbGUgbW9kdWxlIGltcG9ydCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGZvcm1hdHMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUeXBlIG9mIHRoZSBpbXBvcnRlZCBtb2R1bGUuXG4gKiBAcGFyYW0ge1Byb21pc2U8VD59IGltcG9ydFByb21pc2UgLSBQcm9taXNlIHJldHVybmVkIGJ5IGR5bmFtaWMgaW1wb3J0LlxuICogQHJldHVybiB7UHJvbWlzZTxUPn0gTm9ybWFsaXplZCBtb2R1bGUuXG4gKlxuICogQGZ1bmN0aW9uIG5vcm1hbGl6ZUltcG9ydFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUltcG9ydDxUPihcbiAgaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbigobTogYW55KSA9PiAobS5kZWZhdWx0IHx8IG0pIGFzIFQpO1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmaW5pdGlvbiBvZiBhIHNsb2dhbiBpdGVtLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhIHNpbmdsZSBzbG9nYW4gZW50cnkgd2l0aCB0ZXh0IGFuZCB0YWdzLlxuICogQHR5cGVkZWYge09iamVjdH0gU2xvZ2FuSXRlbVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNsb2dhbiAtIFRoZSBzbG9nYW4gdGV4dC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBUYWdzIC0gQ29tbWEtc2VwYXJhdGVkIHRhZ3MgZGVzY3JpYmluZyB0aGUgc2xvZ2FuLlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIExpc3Qgb2YgYXZhaWxhYmxlIHNsb2dhbnMgZm9yIGJhbm5lcnMgYW5kIG1lc3NhZ2VzLlxuICogQHN1bW1hcnkgSW1tdXRhYmxlIGFycmF5IG9mIHNsb2dhbiBlbnRyaWVzIHVzZWQgYnkge0BsaW5rIGdldFNsb2dhbn0gYW5kIGJhbm5lciByZW5kZXJpbmcuXG4gKiBAdHlwZSB7U2xvZ2FuSXRlbVtdfVxuICogQGNvbnN0IHNsb2dhbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IHNsb2dhbnMgPSBbXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gY2FmZmVpbmUsIG5vIGNoYW9zLiBKdXN0IGNsZWFuIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDYWxtLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnVsbCBmbGF2b3IsIG5vIGppdHRlcnMuIFRoYXQncyBEZWNhZi1UUy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoZWVyZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ2hpbGwgZnVsbHN0YWNrLiBQb3dlcmVkIGJ5IERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGVjYWYtVFM6IEJyZXdlZCBmb3IgY2FsbSBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQnJhbmRpbmdcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTbW9vdGggYXMgeW91ciBtb3JuaW5nIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJBbGwgdGhlIGtpY2ssIG5vbmUgb2YgdGhlIGNyYXNoLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRW5lcmdldGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2lwIGJhY2sgYW5kIHNoaXAgZmFzdGVyLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiS2VlcCBjYWxtIGFuZCBjb2RlIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgUGxheWZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aG91dCB0aGUgY2FmZmVpbmUgc2hha2VzLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgSHVtb3JvdXNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJZb3VyIGZ1bGxzdGFjaywgZGVjYWZmZWluYXRlZC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGNhZmZlaW5lLCBubyBjaGFvcy4gSnVzdCBjbGVhbiBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2FsbSwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZ1bGwgZmxhdm9yLCBubyBqaXR0ZXJzLiBUaGF0XFx1MjAxOXMgRGVjYWYtVFMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGVlcmZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNoaWxsIGZ1bGxzdGFjay4gUG93ZXJlZCBieSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1biwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTOiBCcmV3ZWQgZm9yIGNhbG0gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEJyYW5kaW5nXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU21vb3RoIGFzIHlvdXIgbW9ybmluZyBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQWxsIHRoZSBraWNrLCBub25lIG9mIHRoZSBjcmFzaC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEVuZXJnZXRpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNpcCBiYWNrIGFuZCBzaGlwIGZhc3Rlci5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1blwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIktlZXAgY2FsbSBhbmQgY29kZSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFBsYXlmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDb2RlIHdpdGhvdXQgdGhlIGNhZmZlaW5lIHNoYWtlcy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEh1bW9yb3VzXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiWW91ciBmdWxsc3RhY2ssIGRlY2FmZmVpbmF0ZWQuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBUZWNobmljYWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBjYWZmZWluZSwgbm8gY2hhb3MuIEp1c3QgY2xlYW4gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENhbG0sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGdWxsIGZsYXZvciwgbm8gaml0dGVycy4gVGhhdFxcdTIwMTlzIERlY2FmLVRTLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hlZXJmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDaGlsbCBmdWxsc3RhY2suIFBvd2VyZWQgYnkgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW4sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEZWNhZi1UUzogQnJld2VkIGZvciBjYWxtIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBCcmFuZGluZ1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNtb290aCBhcyB5b3VyIG1vcm5pbmcgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkFsbCB0aGUga2ljaywgbm9uZSBvZiB0aGUgY3Jhc2guXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBFbmVyZ2V0aWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTaXAgYmFjayBhbmQgc2hpcCBmYXN0ZXIuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW5cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJLZWVwIGNhbG0gYW5kIGNvZGUgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBQbGF5ZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ29kZSB3aXRob3V0IHRoZSBjYWZmZWluZSBzaGFrZXMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBIdW1vcm91c1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIllvdXIgZnVsbHN0YWNrLCBkZWNhZmZlaW5hdGVkLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgVGVjaG5pY2FsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gY2FmZmVpbmUsIG5vIGNoYW9zLiBKdXN0IGNsZWFuIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDYWxtLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnVsbCBmbGF2b3IsIG5vIGppdHRlcnMuIFRoYXRcXHUyMDE5cyBEZWNhZi1UUy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoZWVyZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ2hpbGwgZnVsbHN0YWNrLiBQb3dlcmVkIGJ5IERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGVjYWYtVFM6IEJyZXdlZCBmb3IgY2FsbSBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQnJhbmRpbmdcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTbW9vdGggYXMgeW91ciBtb3JuaW5nIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJBbGwgdGhlIGtpY2ssIG5vbmUgb2YgdGhlIGNyYXNoLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRW5lcmdldGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2lwIGJhY2sgYW5kIHNoaXAgZmFzdGVyLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiS2VlcCBjYWxtIGFuZCBjb2RlIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgUGxheWZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aG91dCB0aGUgY2FmZmVpbmUgc2hha2VzLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgSHVtb3JvdXNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJZb3VyIGZ1bGxzdGFjaywgZGVjYWZmZWluYXRlZC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGNhZmZlaW5lLCBubyBjaGFvcy4gSnVzdCBjbGVhbiBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2FsbSwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZ1bGwgZmxhdm9yLCBubyBqaXR0ZXJzLiBUaGF0XFx1MjAxOXMgRGVjYWYtVFMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGVlcmZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNoaWxsIGZ1bGxzdGFjay4gUG93ZXJlZCBieSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1biwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTOiBCcmV3ZWQgZm9yIGNhbG0gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEJyYW5kaW5nXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU21vb3RoIGFzIHlvdXIgbW9ybmluZyBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQWxsIHRoZSBraWNrLCBub25lIG9mIHRoZSBjcmFzaC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEVuZXJnZXRpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNpcCBiYWNrIGFuZCBzaGlwIGZhc3Rlci5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1blwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIktlZXAgY2FsbSBhbmQgY29kZSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFBsYXlmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDb2RlIHdpdGhvdXQgdGhlIGNhZmZlaW5lIHNoYWtlcy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEh1bW9yb3VzXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiWW91ciBmdWxsc3RhY2ssIGRlY2FmZmVpbmF0ZWQuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBUZWNobmljYWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBjYWZmZWluZSwgbm8gY2hhb3MuIEp1c3QgY2xlYW4gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENhbG0sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGdWxsIGZsYXZvciwgbm8gaml0dGVycy4gVGhhdFxcdTIwMTlzIERlY2FmLVRTLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hlZXJmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDaGlsbCBmdWxsc3RhY2suIFBvd2VyZWQgYnkgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW4sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEZWNhZi1UUzogQnJld2VkIGZvciBjYWxtIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBCcmFuZGluZ1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNtb290aCBhcyB5b3VyIG1vcm5pbmcgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkFsbCB0aGUga2ljaywgbm9uZSBvZiB0aGUgY3Jhc2guXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBFbmVyZ2V0aWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTaXAgYmFjayBhbmQgc2hpcCBmYXN0ZXIuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW5cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJLZWVwIGNhbG0gYW5kIGNvZGUgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBQbGF5ZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ29kZSB3aXRob3V0IHRoZSBjYWZmZWluZSBzaGFrZXMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBIdW1vcm91c1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIllvdXIgZnVsbHN0YWNrLCBkZWNhZmZlaW5hdGVkLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgVGVjaG5pY2FsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gY2FmZmVpbmUsIG5vIGNoYW9zLiBKdXN0IGNsZWFuIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDYWxtLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnVsbCBmbGF2b3IsIG5vIGppdHRlcnMuIFRoYXRcXHUyMDE5cyBEZWNhZi1UUy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoZWVyZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ2hpbGwgZnVsbHN0YWNrLiBQb3dlcmVkIGJ5IERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGVjYWYtVFM6IEJyZXdlZCBmb3IgY2FsbSBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQnJhbmRpbmdcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTbW9vdGggYXMgeW91ciBtb3JuaW5nIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJBbGwgdGhlIGtpY2ssIG5vbmUgb2YgdGhlIGNyYXNoLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRW5lcmdldGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2lwIGJhY2sgYW5kIHNoaXAgZmFzdGVyLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiS2VlcCBjYWxtIGFuZCBjb2RlIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgUGxheWZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aG91dCB0aGUgY2FmZmVpbmUgc2hha2VzLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgSHVtb3JvdXNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJZb3VyIGZ1bGxzdGFjaywgZGVjYWZmZWluYXRlZC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGNhZmZlaW5lLCBubyBjaGFvcy4gSnVzdCBjbGVhbiBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2FsbSwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZ1bGwgZmxhdm9yLCBubyBqaXR0ZXJzLiBUaGF0XFx1MjAxOXMgRGVjYWYtVFMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGVlcmZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNoaWxsIGZ1bGxzdGFjay4gUG93ZXJlZCBieSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1biwgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTOiBCcmV3ZWQgZm9yIGNhbG0gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEJyYW5kaW5nXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU21vb3RoIGFzIHlvdXIgbW9ybmluZyBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQWxsIHRoZSBraWNrLCBub25lIG9mIHRoZSBjcmFzaC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEVuZXJnZXRpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNpcCBiYWNrIGFuZCBzaGlwIGZhc3Rlci5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEZ1blwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIktlZXAgY2FsbSBhbmQgY29kZSBEZWNhZi5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFBsYXlmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDb2RlIHdpdGhvdXQgdGhlIGNhZmZlaW5lIHNoYWtlcy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIEh1bW9yb3VzXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiWW91ciBmdWxsc3RhY2ssIGRlY2FmZmVpbmF0ZWQuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBUZWNobmljYWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBjYWZmZWluZSwgbm8gY2hhb3MuIEp1c3QgY2xlYW4gY29kZS5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENhbG0sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGdWxsIGZsYXZvciwgbm8gaml0dGVycy4gVGhhdFxcdTIwMTlzIERlY2FmLVRTLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hlZXJmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDaGlsbCBmdWxsc3RhY2suIFBvd2VyZWQgYnkgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW4sIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEZWNhZi1UUzogQnJld2VkIGZvciBjYWxtIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBCcmFuZGluZ1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNtb290aCBhcyB5b3VyIG1vcm5pbmcgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkFsbCB0aGUga2ljaywgbm9uZSBvZiB0aGUgY3Jhc2guXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBFbmVyZ2V0aWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTaXAgYmFjayBhbmQgc2hpcCBmYXN0ZXIuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBGdW5cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJLZWVwIGNhbG0gYW5kIGNvZGUgRGVjYWYuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBQbGF5ZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ29kZSB3aXRob3V0IHRoZSBjYWZmZWluZSBzaGFrZXMuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBIdW1vcm91c1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIllvdXIgZnVsbHN0YWNrLCBkZWNhZmZlaW5hdGVkLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgVGVjaG5pY2FsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gY2FmZmVpbmUsIG5vIGNoYW9zLiBKdXN0IGNsZWFuIGNvZGUuXCIsXG4gICAgVGFnczogXCJDb2ZmZWUtdGhlbWVkLCBDYWxtLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnVsbCBmbGF2b3IsIG5vIGppdHRlcnMuIFRoYXRcXHUyMDE5cyBEZWNhZi1UUy5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIENoZWVyZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ2hpbGwgZnVsbHN0YWNrLiBQb3dlcmVkIGJ5IERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGVjYWYtVFM6IEJyZXdlZCBmb3IgY2FsbSBjb2RlLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQnJhbmRpbmdcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTbW9vdGggYXMgeW91ciBtb3JuaW5nIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJBbGwgdGhlIGtpY2ssIG5vbmUgb2YgdGhlIGNyYXNoLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRW5lcmdldGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2lwIGJhY2sgYW5kIHNoaXAgZmFzdGVyLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiS2VlcCBjYWxtIGFuZCBjb2RlIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgUGxheWZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aG91dCB0aGUgY2FmZmVpbmUgc2hha2VzLlwiLFxuICAgIFRhZ3M6IFwiQ29mZmVlLXRoZW1lZCwgSHVtb3JvdXNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJZb3VyIGZ1bGxzdGFjaywgZGVjYWZmZWluYXRlZC5cIixcbiAgICBUYWdzOiBcIkNvZmZlZS10aGVtZWQsIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTOiBXaGVyZSBzbWFydCBjb250cmFjdHMgbWVldCBzbWFydCBpbnRlcmZhY2VzLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgU21hcnQgQ29udHJhY3RzLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2hpcCBkQXBwcyB3aXRob3V0IHRoZSBzdHJlc3MuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBDaGVlcmZ1bCwgRGV2ZWxvcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gQ1JVRCwgbm8gcHJvYmxlbSBcXHUyMDE0IERlY2FmIHlvdXIgZGF0YS5cIixcbiAgICBUYWdzOiBcIkRhdGEsIE5vLUNSVUQsIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnJvbSBESUQgdG8gVUksIHdpdGhvdXQgYnJlYWtpbmcgYSBzd2VhdC5cIixcbiAgICBUYWdzOiBcIkRJRCwgU1NJLCBVSSwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTOiBZb3VyIGZyb250ZW5kIGFscmVhZHkgdW5kZXJzdGFuZHMgeW91ciBzbWFydCBjb250cmFjdC5cIixcbiAgICBUYWdzOiBcIlNtYXJ0IENvbnRyYWN0cywgRFgsIE1hZ2ljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2VsZi1zb3ZlcmVpZ24gYnkgZGVzaWduLiBQcm9kdWN0aXZlIGJ5IGRlZmF1bHQuXCIsXG4gICAgVGFnczogXCJTU0ksIERldmVsb3BlciwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJ1aWxkIG9uY2UuIERlcGxveSBldmVyeXdoZXJlLiBEZWNlbnRyYWxpemVkIGFuZCBkZWxpZ2h0ZnVsLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgTXVsdGktcGxhdGZvcm0sIEhhcHB5XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGF0YSB0aGF0IGRlZmluZXMgaXRzIG93biBkZXN0aW55LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBEYXRhLWRyaXZlbiwgRW1wb3dlcm1lbnRcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJHb29kYnllIENSVUQsIGhlbGxvIGludGVudC1iYXNlZCBpbnRlcmZhY2VzLlwiLFxuICAgIFRhZ3M6IFwiTm8tQ1JVRCwgVUksIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlRoZSBzbW9vdGhlc3QgcGF0aCBmcm9tIERJRCB0byBkb25lLlwiLFxuICAgIFRhZ3M6IFwiRElELCBXb3JrZmxvdywgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJCZWNhdXNlIHlvdXIgZEFwcCBkZXNlcnZlcyBtb3JlIHRoYW4gYm9pbGVycGxhdGUuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBEZXZYLCBFZmZpY2llbmN5XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiT3duIHlvdXIgZGF0YS4gT3duIHlvdXIgZmxvdy5cIixcbiAgICBUYWdzOiBcIlNTSSwgQ29udHJvbCwgT3duZXJzaGlwXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiV3JpdGUgbG9naWMgbGlrZSBpdCBiZWxvbmdzIHdpdGggdGhlIGRhdGEgXFx1MjAxNCBiZWNhdXNlIGl0IGRvZXMuXCIsXG4gICAgVGFnczogXCJEYXRhIExvZ2ljLCBEZXZlbG9wZXIsIFNtYXJ0XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnJvbSBzbWFydCBjb250cmFjdHMgdG8gc21hcnRlciBmcm9udGVuZHMuXCIsXG4gICAgVGFnczogXCJTbWFydCBDb250cmFjdHMsIFVJLCBEWFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGNhZmZlaW5lLiBObyBDUlVELiBKdXN0IHRoZSBmdXR1cmUuXCIsXG4gICAgVGFnczogXCJOby1DUlVELCBDb2ZmZWUtdGhlbWVkLCBGdXR1cmlzdGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiVGhlIGZ1dHVyZSBvZiB3ZWIzIFVYIGlzIERlY2FmLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgVVgsIFZpc2lvblwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aCBjb25maWRlbmNlLiBHb3Zlcm4gd2l0aCBjbGFyaXR5LlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgR292ZXJuYW5jZSwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkludGVyZmFjZXMgdGhhdCBvYmV5IHRoZSBkYXRhLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuXCIsXG4gICAgVGFnczogXCJVSSwgRGF0YSBMb2dpYywgU2VsZi1hd2FyZVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJyZXcgYnVzaW5lc3MgbG9naWMgcmlnaHQgaW50byB5b3VyIGJ5dGVzLlwiLFxuICAgIFRhZ3M6IFwiRGF0YSBMb2dpYywgQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRElEcyBkb25lIGRpZmZlcmVudGx5IFxcdTIwMTQgYW5kIGRlbGlnaHRmdWxseS5cIixcbiAgICBUYWdzOiBcIkRJRCwgU2VsZi1Tb3ZlcmVpZ24sIFBsYXlmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEZWNhZi1UUy1UUzogV2hlcmUgYmxvY2tjaGFpbiBjb250cmFjdHMgbWVldCBzbWFydCBpbnRlcmZhY2VzLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgU21hcnQgQ29udHJhY3RzLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2hpcCBkQXBwcyB3aXRob3V0IHRoZSBzdHJlc3MuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBDaGVlcmZ1bCwgRGV2ZWxvcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gYm9pbGVycGxhdGUsIG5vIHByb2JsZW0gXFx1MjAxNCBEZWNhZi1UUyB5b3VyIGRhdGEuXCIsXG4gICAgVGFnczogXCJEYXRhLCBOby1DUlVELCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZyb20gRElEIHRvIFVJLCB3aXRob3V0IGJyZWFraW5nIGEgc3dlYXQuXCIsXG4gICAgVGFnczogXCJESUQsIFNTSSwgVUksIENhbG1cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjpcbiAgICAgIFwiRGVjYWYtVFMtVFM6IFlvdXIgZnJvbnRlbmQgYWxyZWFkeSB1bmRlcnN0YW5kcyB5b3VyIGJsb2NrY2hhaW4gY29udHJhY3QuXCIsXG4gICAgVGFnczogXCJTbWFydCBDb250cmFjdHMsIERYLCBNYWdpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNlbGYtc292ZXJlaWduIGJ5IGRlc2lnbi4gUHJvZHVjdGl2ZSBieSBkZWZhdWx0LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBEZXZlbG9wZXIsIENhbG1cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJCdWlsZCBvbmNlLiBEZXBsb3kgZXZlcnl3aGVyZS4gRGVjZW50cmFsaXplZCBhbmQgZGVsaWdodGZ1bC5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIE11bHRpLXBsYXRmb3JtLCBIYXBweVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRhdGEgdGhhdCBkZWZpbmVzIGl0cyBvd24gZGVzdGlueS5cIixcbiAgICBUYWdzOiBcIlNTSSwgRGF0YS1kcml2ZW4sIEVtcG93ZXJtZW50XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiR29vZGJ5ZSBib2lsZXJwbGF0ZSwgaGVsbG8gaW50ZW50LWJhc2VkIGludGVyZmFjZXMuXCIsXG4gICAgVGFnczogXCJOby1DUlVELCBVSSwgVGVjaG5pY2FsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiVGhlIHNtb290aGVzdCBwYXRoIGZyb20gRElEIHRvIGRvbmUuXCIsXG4gICAgVGFnczogXCJESUQsIFdvcmtmbG93LCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJlY2F1c2UgeW91ciBkQXBwIGRlc2VydmVzIG1vcmUgdGhhbiBib2lsZXJwbGF0ZS5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIERldlgsIEVmZmljaWVuY3lcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJPd24geW91ciBkYXRhLiBPd24geW91ciBmbG93LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBDb250cm9sLCBPd25lcnNoaXBcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJXcml0ZSBsb2dpYyBsaWtlIGl0IGJlbG9uZ3Mgd2l0aCB0aGUgZGF0YSBcXHUyMDE0IGJlY2F1c2UgaXQgZG9lcy5cIixcbiAgICBUYWdzOiBcIkRhdGEgTG9naWMsIERldmVsb3BlciwgU21hcnRcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGcm9tIGJsb2NrY2hhaW4gY29udHJhY3RzIHRvIHNtYXJ0ZXIgZnJvbnRlbmRzLlwiLFxuICAgIFRhZ3M6IFwiU21hcnQgQ29udHJhY3RzLCBVSSwgRFhcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBjYWZmZWluZS4gTm8gYm9pbGVycGxhdGUuIEp1c3QgdGhlIGZ1dHVyZS5cIixcbiAgICBUYWdzOiBcIk5vLUNSVUQsIENvZmZlZS10aGVtZWQsIEZ1dHVyaXN0aWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJUaGUgZnV0dXJlIG9mIHdlYjMgVVggaXMgRGVjYWYtVFMuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBVWCwgVmlzaW9uXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ29kZSB3aXRoIGNvbmZpZGVuY2UuIEdvdmVybiB3aXRoIGNsYXJpdHkuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBHb3Zlcm5hbmNlLCBDYWxtXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiSW50ZXJmYWNlcyB0aGF0IG9iZXkgdGhlIGRhdGEsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC5cIixcbiAgICBUYWdzOiBcIlVJLCBEYXRhIExvZ2ljLCBTZWxmLWF3YXJlXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQnJldyBidXNpbmVzcyBsb2dpYyByaWdodCBpbnRvIHlvdXIgYnl0ZXMuXCIsXG4gICAgVGFnczogXCJEYXRhIExvZ2ljLCBDb2ZmZWUtdGhlbWVkLCBGdW5cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJESURzIGRvbmUgZGlmZmVyZW50bHkgXFx1MjAxNCBhbmQgZGVsaWdodGZ1bGx5LlwiLFxuICAgIFRhZ3M6IFwiRElELCBTZWxmLVNvdmVyZWlnbiwgUGxheWZ1bFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRlY2FmLVRTLVRTOiBXaGVyZSBibG9ja2NoYWluIGNvbnRyYWN0cyBtZWV0IHNtYXJ0IGludGVyZmFjZXMuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBTbWFydCBDb250cmFjdHMsIFRlY2hcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTaGlwIGRBcHBzIHdpdGhvdXQgdGhlIHN0cmVzcy5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIENoZWVyZnVsLCBEZXZlbG9wZXJcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBib2lsZXJwbGF0ZSwgbm8gcHJvYmxlbSBcXHUyMDE0IERlY2FmLVRTIHlvdXIgZGF0YS5cIixcbiAgICBUYWdzOiBcIkRhdGEsIE5vLUNSVUQsIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnJvbSBESUQgdG8gVUksIHdpdGhvdXQgYnJlYWtpbmcgYSBzd2VhdC5cIixcbiAgICBUYWdzOiBcIkRJRCwgU1NJLCBVSSwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOlxuICAgICAgXCJEZWNhZi1UUy1UUzogWW91ciBmcm9udGVuZCBhbHJlYWR5IHVuZGVyc3RhbmRzIHlvdXIgYmxvY2tjaGFpbiBjb250cmFjdC5cIixcbiAgICBUYWdzOiBcIlNtYXJ0IENvbnRyYWN0cywgRFgsIE1hZ2ljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2VsZi1zb3ZlcmVpZ24gYnkgZGVzaWduLiBQcm9kdWN0aXZlIGJ5IGRlZmF1bHQuXCIsXG4gICAgVGFnczogXCJTU0ksIERldmVsb3BlciwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJ1aWxkIG9uY2UuIERlcGxveSBldmVyeXdoZXJlLiBEZWNlbnRyYWxpemVkIGFuZCBkZWxpZ2h0ZnVsLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgTXVsdGktcGxhdGZvcm0sIEhhcHB5XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGF0YSB0aGF0IGRlZmluZXMgaXRzIG93biBkZXN0aW55LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBEYXRhLWRyaXZlbiwgRW1wb3dlcm1lbnRcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJHb29kYnllIGJvaWxlcnBsYXRlLCBoZWxsbyBpbnRlbnQtYmFzZWQgaW50ZXJmYWNlcy5cIixcbiAgICBUYWdzOiBcIk5vLUNSVUQsIFVJLCBUZWNobmljYWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJUaGUgc21vb3RoZXN0IHBhdGggZnJvbSBESUQgdG8gZG9uZS5cIixcbiAgICBUYWdzOiBcIkRJRCwgV29ya2Zsb3csIENoaWxsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQmVjYXVzZSB5b3VyIGRBcHAgZGVzZXJ2ZXMgbW9yZSB0aGFuIGJvaWxlcnBsYXRlLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgRGV2WCwgRWZmaWNpZW5jeVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk93biB5b3VyIGRhdGEuIE93biB5b3VyIGZsb3cuXCIsXG4gICAgVGFnczogXCJTU0ksIENvbnRyb2wsIE93bmVyc2hpcFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIldyaXRlIGxvZ2ljIGxpa2UgaXQgYmVsb25ncyB3aXRoIHRoZSBkYXRhIFxcdTIwMTQgYmVjYXVzZSBpdCBkb2VzLlwiLFxuICAgIFRhZ3M6IFwiRGF0YSBMb2dpYywgRGV2ZWxvcGVyLCBTbWFydFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZyb20gYmxvY2tjaGFpbiBjb250cmFjdHMgdG8gc21hcnRlciBmcm9udGVuZHMuXCIsXG4gICAgVGFnczogXCJTbWFydCBDb250cmFjdHMsIFVJLCBEWFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGNhZmZlaW5lLiBObyBib2lsZXJwbGF0ZS4gSnVzdCB0aGUgZnV0dXJlLlwiLFxuICAgIFRhZ3M6IFwiTm8tQ1JVRCwgQ29mZmVlLXRoZW1lZCwgRnV0dXJpc3RpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlRoZSBmdXR1cmUgb2Ygd2ViMyBVWCBpcyBEZWNhZi1UUy5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIFVYLCBWaXNpb25cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJDb2RlIHdpdGggY29uZmlkZW5jZS4gR292ZXJuIHdpdGggY2xhcml0eS5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIEdvdmVybmFuY2UsIENhbG1cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJJbnRlcmZhY2VzIHRoYXQgb2JleSB0aGUgZGF0YSwgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kLlwiLFxuICAgIFRhZ3M6IFwiVUksIERhdGEgTG9naWMsIFNlbGYtYXdhcmVcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJCcmV3IGJ1c2luZXNzIGxvZ2ljIHJpZ2h0IGludG8geW91ciBieXRlcy5cIixcbiAgICBUYWdzOiBcIkRhdGEgTG9naWMsIENvZmZlZS10aGVtZWQsIEZ1blwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRJRHMgZG9uZSBkaWZmZXJlbnRseSBcXHUyMDE0IGFuZCBkZWxpZ2h0ZnVsbHkuXCIsXG4gICAgVGFnczogXCJESUQsIFNlbGYtU292ZXJlaWduLCBQbGF5ZnVsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRGVjYWYtVFMtVFM6IFdoZXJlIGJsb2NrY2hhaW4gY29udHJhY3RzIG1lZXQgc21hcnQgaW50ZXJmYWNlcy5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIFNtYXJ0IENvbnRyYWN0cywgVGVjaFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNoaXAgZEFwcHMgd2l0aG91dCB0aGUgc3RyZXNzLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgQ2hlZXJmdWwsIERldmVsb3BlclwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIk5vIGJvaWxlcnBsYXRlLCBubyBwcm9ibGVtIFxcdTIwMTQgRGVjYWYtVFMgeW91ciBkYXRhLlwiLFxuICAgIFRhZ3M6IFwiRGF0YSwgTm8tQ1JVRCwgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGcm9tIERJRCB0byBVSSwgd2l0aG91dCBicmVha2luZyBhIHN3ZWF0LlwiLFxuICAgIFRhZ3M6IFwiRElELCBTU0ksIFVJLCBDYWxtXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46XG4gICAgICBcIkRlY2FmLVRTLVRTOiBZb3VyIGZyb250ZW5kIGFscmVhZHkgdW5kZXJzdGFuZHMgeW91ciBibG9ja2NoYWluIGNvbnRyYWN0LlwiLFxuICAgIFRhZ3M6IFwiU21hcnQgQ29udHJhY3RzLCBEWCwgTWFnaWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJTZWxmLXNvdmVyZWlnbiBieSBkZXNpZ24uIFByb2R1Y3RpdmUgYnkgZGVmYXVsdC5cIixcbiAgICBUYWdzOiBcIlNTSSwgRGV2ZWxvcGVyLCBDYWxtXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQnVpbGQgb25jZS4gRGVwbG95IGV2ZXJ5d2hlcmUuIERlY2VudHJhbGl6ZWQgYW5kIGRlbGlnaHRmdWwuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBNdWx0aS1wbGF0Zm9ybSwgSGFwcHlcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEYXRhIHRoYXQgZGVmaW5lcyBpdHMgb3duIGRlc3RpbnkuXCIsXG4gICAgVGFnczogXCJTU0ksIERhdGEtZHJpdmVuLCBFbXBvd2VybWVudFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkdvb2RieWUgYm9pbGVycGxhdGUsIGhlbGxvIGludGVudC1iYXNlZCBpbnRlcmZhY2VzLlwiLFxuICAgIFRhZ3M6IFwiTm8tQ1JVRCwgVUksIFRlY2huaWNhbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlRoZSBzbW9vdGhlc3QgcGF0aCBmcm9tIERJRCB0byBkb25lLlwiLFxuICAgIFRhZ3M6IFwiRElELCBXb3JrZmxvdywgQ2hpbGxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJCZWNhdXNlIHlvdXIgZEFwcCBkZXNlcnZlcyBtb3JlIHRoYW4gYm9pbGVycGxhdGUuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBEZXZYLCBFZmZpY2llbmN5XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiT3duIHlvdXIgZGF0YS4gT3duIHlvdXIgZmxvdy5cIixcbiAgICBUYWdzOiBcIlNTSSwgQ29udHJvbCwgT3duZXJzaGlwXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiV3JpdGUgbG9naWMgbGlrZSBpdCBiZWxvbmdzIHdpdGggdGhlIGRhdGEgXFx1MjAxNCBiZWNhdXNlIGl0IGRvZXMuXCIsXG4gICAgVGFnczogXCJEYXRhIExvZ2ljLCBEZXZlbG9wZXIsIFNtYXJ0XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRnJvbSBibG9ja2NoYWluIGNvbnRyYWN0cyB0byBzbWFydGVyIGZyb250ZW5kcy5cIixcbiAgICBUYWdzOiBcIlNtYXJ0IENvbnRyYWN0cywgVUksIERYXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gY2FmZmVpbmUuIE5vIGJvaWxlcnBsYXRlLiBKdXN0IHRoZSBmdXR1cmUuXCIsXG4gICAgVGFnczogXCJOby1DUlVELCBDb2ZmZWUtdGhlbWVkLCBGdXR1cmlzdGljXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiVGhlIGZ1dHVyZSBvZiB3ZWIzIFVYIGlzIERlY2FmLVRTLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgVVgsIFZpc2lvblwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkNvZGUgd2l0aCBjb25maWRlbmNlLiBHb3Zlcm4gd2l0aCBjbGFyaXR5LlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgR292ZXJuYW5jZSwgQ2FsbVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkludGVyZmFjZXMgdGhhdCBvYmV5IHRoZSBkYXRhLCBub3QgdGhlIG90aGVyIHdheSBhcm91bmQuXCIsXG4gICAgVGFnczogXCJVSSwgRGF0YSBMb2dpYywgU2VsZi1hd2FyZVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJyZXcgYnVzaW5lc3MgbG9naWMgcmlnaHQgaW50byB5b3VyIGJ5dGVzLlwiLFxuICAgIFRhZ3M6IFwiRGF0YSBMb2dpYywgQ29mZmVlLXRoZW1lZCwgRnVuXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiRElEcyBkb25lIGRpZmZlcmVudGx5IFxcdTIwMTQgYW5kIGRlbGlnaHRmdWxseS5cIixcbiAgICBUYWdzOiBcIkRJRCwgU2VsZi1Tb3ZlcmVpZ24sIFBsYXlmdWxcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJEZWNhZi1UUy1UUzogV2hlcmUgYmxvY2tjaGFpbiBjb250cmFjdHMgbWVldCBzbWFydCBpbnRlcmZhY2VzLlwiLFxuICAgIFRhZ3M6IFwiQmxvY2tjaGFpbiwgU21hcnQgQ29udHJhY3RzLCBUZWNoXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiU2hpcCBkQXBwcyB3aXRob3V0IHRoZSBzdHJlc3MuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBDaGVlcmZ1bCwgRGV2ZWxvcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiTm8gYm9pbGVycGxhdGUsIG5vIHByb2JsZW0gXFx1MjAxNCBEZWNhZi1UUyB5b3VyIGRhdGEuXCIsXG4gICAgVGFnczogXCJEYXRhLCBOby1DUlVELCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkZyb20gRElEIHRvIFVJLCB3aXRob3V0IGJyZWFraW5nIGEgc3dlYXQuXCIsXG4gICAgVGFnczogXCJESUQsIFNTSSwgVUksIENhbG1cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjpcbiAgICAgIFwiRGVjYWYtVFMtVFM6IFlvdXIgZnJvbnRlbmQgYWxyZWFkeSB1bmRlcnN0YW5kcyB5b3VyIGJsb2NrY2hhaW4gY29udHJhY3QuXCIsXG4gICAgVGFnczogXCJTbWFydCBDb250cmFjdHMsIERYLCBNYWdpY1wiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIlNlbGYtc292ZXJlaWduIGJ5IGRlc2lnbi4gUHJvZHVjdGl2ZSBieSBkZWZhdWx0LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBEZXZlbG9wZXIsIENhbG1cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJCdWlsZCBvbmNlLiBEZXBsb3kgZXZlcnl3aGVyZS4gRGVjZW50cmFsaXplZCBhbmQgZGVsaWdodGZ1bC5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIE11bHRpLXBsYXRmb3JtLCBIYXBweVwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkRhdGEgdGhhdCBkZWZpbmVzIGl0cyBvd24gZGVzdGlueS5cIixcbiAgICBUYWdzOiBcIlNTSSwgRGF0YS1kcml2ZW4sIEVtcG93ZXJtZW50XCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiR29vZGJ5ZSBib2lsZXJwbGF0ZSwgaGVsbG8gaW50ZW50LWJhc2VkIGludGVyZmFjZXMuXCIsXG4gICAgVGFnczogXCJOby1DUlVELCBVSSwgVGVjaG5pY2FsXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiVGhlIHNtb290aGVzdCBwYXRoIGZyb20gRElEIHRvIGRvbmUuXCIsXG4gICAgVGFnczogXCJESUQsIFdvcmtmbG93LCBDaGlsbFwiLFxuICB9LFxuICB7XG4gICAgU2xvZ2FuOiBcIkJlY2F1c2UgeW91ciBkQXBwIGRlc2VydmVzIG1vcmUgdGhhbiBib2lsZXJwbGF0ZS5cIixcbiAgICBUYWdzOiBcIkJsb2NrY2hhaW4sIERldlgsIEVmZmljaWVuY3lcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJPd24geW91ciBkYXRhLiBPd24geW91ciBmbG93LlwiLFxuICAgIFRhZ3M6IFwiU1NJLCBDb250cm9sLCBPd25lcnNoaXBcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJXcml0ZSBsb2dpYyBsaWtlIGl0IGJlbG9uZ3Mgd2l0aCB0aGUgZGF0YSBcXHUyMDE0IGJlY2F1c2UgaXQgZG9lcy5cIixcbiAgICBUYWdzOiBcIkRhdGEgTG9naWMsIERldmVsb3BlciwgU21hcnRcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJGcm9tIGJsb2NrY2hhaW4gY29udHJhY3RzIHRvIHNtYXJ0ZXIgZnJvbnRlbmRzLlwiLFxuICAgIFRhZ3M6IFwiU21hcnQgQ29udHJhY3RzLCBVSSwgRFhcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJObyBjYWZmZWluZS4gTm8gYm9pbGVycGxhdGUuIEp1c3QgdGhlIGZ1dHVyZS5cIixcbiAgICBUYWdzOiBcIk5vLUNSVUQsIENvZmZlZS10aGVtZWQsIEZ1dHVyaXN0aWNcIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJUaGUgZnV0dXJlIG9mIHdlYjMgVVggaXMgRGVjYWYtVFMuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBVWCwgVmlzaW9uXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQ29kZSB3aXRoIGNvbmZpZGVuY2UuIEdvdmVybiB3aXRoIGNsYXJpdHkuXCIsXG4gICAgVGFnczogXCJCbG9ja2NoYWluLCBHb3Zlcm5hbmNlLCBDYWxtXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiSW50ZXJmYWNlcyB0aGF0IG9iZXkgdGhlIGRhdGEsIG5vdCB0aGUgb3RoZXIgd2F5IGFyb3VuZC5cIixcbiAgICBUYWdzOiBcIlVJLCBEYXRhIExvZ2ljLCBTZWxmLWF3YXJlXCIsXG4gIH0sXG4gIHtcbiAgICBTbG9nYW46IFwiQnJldyBidXNpbmVzcyBsb2dpYyByaWdodCBpbnRvIHlvdXIgYnl0ZXMuXCIsXG4gICAgVGFnczogXCJEYXRhIExvZ2ljLCBDb2ZmZWUtdGhlbWVkLCBGdW5cIixcbiAgfSxcbiAge1xuICAgIFNsb2dhbjogXCJESURzIGRvbmUgZGlmZmVyZW50bHkgXFx1MjAxNCBhbmQgZGVsaWdodGZ1bGx5LlwiLFxuICAgIFRhZ3M6IFwiRElELCBTZWxmLVNvdmVyZWlnbiwgUGxheWZ1bFwiLFxuICB9LFxuXTtcbiIsImltcG9ydCB7IHNsb2dhbnMgfSBmcm9tIFwiLi4vYXNzZXRzL3Nsb2dhbnNcIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEFOU0kgY29sb3IgY29kZXMgZm9yIGJhbm5lciBzdHlsaW5nLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIHNldCBvZiBBTlNJIGNvbG9yIGNvZGVzIHVzZWQgdG8gc3R5bGUgdGhlIGJhbm5lciB0ZXh0LlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5jb25zdCBjb2xvcnMgPSBbXG4gIFwiXFx4MWJbMzg7NTsyMTVtXCIsIC8vIHNvZnQgb3JhbmdlXG4gIFwiXFx4MWJbMzg7NTsyMDltXCIsIC8vIGNvcmFsXG4gIFwiXFx4MWJbMzg7NTsyMDVtXCIsIC8vIHBpbmtcbiAgXCJcXHgxYlszODs1OzIxMG1cIiwgLy8gcGVhY2h5XG4gIFwiXFx4MWJbMzg7NTsyMTdtXCIsIC8vIHNhbG1vblxuICBcIlxceDFiWzM4OzU7MjE2bVwiLCAvLyBsaWdodCBjb3JhbFxuICBcIlxceDFiWzM4OzU7MjI0bVwiLCAvLyBsaWdodCBwZWFjaFxuICBcIlxceDFiWzM4OzU7MjMwbVwiLCAvLyBzb2Z0IGNyZWFtXG4gIFwiXFx4MWJbMzg7NTsyMzBtXCIsIC8vIHNvZnQgY3JlYW1cbl07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByaW50cyBhIHN0eWxlZCBiYW5uZXIgdG8gdGhlIGNvbnNvbGUuXG4gKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYW5kIHByaW50cyBhIGNvbG9yZnVsIEFTQ0lJIGFydCBiYW5uZXIgd2l0aCBhIHJhbmRvbSBzbG9nYW4uXG4gKiBAcGFyYW0ge0xvZ2dlcn0gW2xvZ2dlcl0gLSBPcHRpb25hbCBsb2dnZXIgZm9yIHZlcmJvc2Ugb3V0cHV0LlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICogQGZ1bmN0aW9uIHByaW50QmFubmVyXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gKiAgIHBhcnRpY2lwYW50IGdldFNsb2dhblxuICogICBwYXJ0aWNpcGFudCBwYWRFbmRcbiAqICAgcGFydGljaXBhbnQgY29uc29sZVxuICogICBwcmludEJhbm5lci0+PmdldFNsb2dhbjogQ2FsbCBnZXRTbG9nYW4oKVxuICogICBnZXRTbG9nYW4tLT4+cHJpbnRCYW5uZXI6IFJldHVybiByYW5kb20gc2xvZ2FuXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENyZWF0ZSBiYW5uZXIgQVNDSUkgYXJ0XG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IFNwbGl0IGJhbm5lciBpbnRvIGxpbmVzXG4gKiAgIHByaW50QmFubmVyLT4+cHJpbnRCYW5uZXI6IENhbGN1bGF0ZSBtYXggbGluZSBsZW5ndGhcbiAqICAgcHJpbnRCYW5uZXItPj5wYWRFbmQ6IENhbGwgcGFkRW5kIHdpdGggc2xvZ2FuXG4gKiAgIHBhZEVuZC0tPj5wcmludEJhbm5lcjogUmV0dXJuIHBhZGRlZCBzbG9nYW4gbGluZVxuICogICBsb29wIEZvciBlYWNoIGJhbm5lciBsaW5lXG4gKiAgICAgcHJpbnRCYW5uZXItPj5zdHlsZTogQ2FsbCBzdHlsZShsaW5lKVxuICogICAgIHN0eWxlLS0+PnByaW50QmFubmVyOiBSZXR1cm4gc3R5bGVkIGxpbmVcbiAqICAgICBwcmludEJhbm5lci0+PmNvbnNvbGU6IExvZyBzdHlsZWQgbGluZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50QmFubmVyKGxvZ2dlcj86IExvZ2dlcikge1xuICBjb25zdCBtZXNzYWdlID0gZ2V0U2xvZ2FuKCk7XG4gIGNvbnN0IGJhbm5lcjogc3RyaW5nIHwgc3RyaW5nW10gPVxuICAgIGAjICAgICAgICAgICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgXG4jICAgICAgKCAoICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIFxuIyAgICAgICApICkgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgXG4jICAgIFs9PT09PT09XSAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiMgICAgIFxcYC0tLS0twrQgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRIFxuIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSBcbiMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICBcbiNgLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBtYXhMZW5ndGggPSBiYW5uZXIucmVkdWNlKChtYXgsIGxpbmUpID0+IE1hdGgubWF4KG1heCwgbGluZS5sZW5ndGgpLCAwKTtcbiAgYmFubmVyLnB1c2goYCMgICR7bWVzc2FnZS5wYWRTdGFydChtYXhMZW5ndGggLSAzKX1gKTtcbiAgYmFubmVyLmZvckVhY2goKGxpbmUsIGluZGV4KSA9PiB7XG4gICAgKGxvZ2dlciA/IGxvZ2dlci5pbmZvLmJpbmQobG9nZ2VyKSA6IGNvbnNvbGUubG9nLmJpbmQoY29uc29sZSkpKFxuICAgICAgc3R5bGUobGluZSB8fCBcIlwiKS5yYXcoY29sb3JzW2luZGV4XSkudGV4dFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSBzbG9nYW4gZnJvbSB0aGUgcHJlZGVmaW5lZCBsaXN0LlxuICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJhbmRvbSBzbG9nYW4gb3IgYSBzcGVjaWZpYyBvbmUgYnkgaW5kZXggZnJvbSB0aGUgc2xvZ2FucyBsaXN0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpXSAtIE9wdGlvbmFsIGluZGV4IHRvIHJldHJpZXZlIGEgc3BlY2lmaWMgc2xvZ2FuLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgc2VsZWN0ZWQgc2xvZ2FuLlxuICogQGZ1bmN0aW9uIGdldFNsb2dhblxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBnZXRTbG9nYW5cbiAqICAgcGFydGljaXBhbnQgTWF0aC5yYW5kb21cbiAqICAgcGFydGljaXBhbnQgc2xvZ2Fuc1xuICogICBhbHQgaSBpcyB1bmRlZmluZWRcbiAqICAgICBnZXRTbG9nYW4tPj5NYXRoLnJhbmRvbTogR2VuZXJhdGUgcmFuZG9tIGluZGV4XG4gKiAgICAgTWF0aC5yYW5kb20tLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gcmFuZG9tIGluZGV4XG4gKiAgIGVsc2UgaSBpcyBkZWZpbmVkXG4gKiAgICAgTm90ZSBvdmVyIGdldFNsb2dhbjogVXNlIHByb3ZpZGVkIGluZGV4XG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tPj5zbG9nYW5zOiBBY2Nlc3Mgc2xvZ2FuIGF0IGluZGV4XG4gKiAgIHNsb2dhbnMtLT4+Z2V0U2xvZ2FuOiBSZXR1cm4gc2xvZ2FuXG4gKiAgIGFsdCBFcnJvciBvY2N1cnNcbiAqICAgICBnZXRTbG9nYW4tPj5nZXRTbG9nYW46IFRocm93IGVycm9yXG4gKiAgIGVuZFxuICogICBnZXRTbG9nYW4tLT4+Q2FsbGVyOiBSZXR1cm4gc2xvZ2FuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbG9nYW4oaT86IG51bWJlcik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaSA9XG4gICAgICB0eXBlb2YgaSA9PT0gXCJ1bmRlZmluZWRcIiA/IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHNsb2dhbnMubGVuZ3RoKSA6IGk7XG4gICAgcmV0dXJuIHNsb2dhbnNbaV0uU2xvZ2FuO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHNsb2dhbnM6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFBhcnNlQXJnc1Jlc3VsdCB9IGZyb20gXCIuLi9pbnB1dC90eXBlc1wiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgVXNlcklucHV0IH0gZnJvbSBcIi4uL2lucHV0L2lucHV0XCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXREZXBlbmRlbmNpZXMsIGdldFBhY2thZ2VWZXJzaW9uIH0gZnJvbSBcIi4uL3V0aWxzL2ZzXCI7XG5pbXBvcnQgeyBwcmludEJhbm5lciB9IGZyb20gXCIuLi9vdXRwdXQvY29tbW9uXCI7XG5pbXBvcnQge1xuICBMb2dnZWRDbGFzcyxcbiAgTG9nZ2VkRW52aXJvbm1lbnQsXG4gIExvZ2dlcixcbiAgTG9nZ2luZyxcbiAgTG9nZ2luZ0NvbmZpZyxcbn0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGNsYXNzIENvbW1hbmRcbiAqIEBhYnN0cmFjdFxuICogQHRlbXBsYXRlIEkgLSBUaGUgdHlwZSBvZiBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgY29tbWFuZHMgd2l0aCBpbnB1dCBoYW5kbGluZywgbG9nZ2luZywgYW5kIGV4ZWN1dGlvbiBmbG93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0ge0NvbW1hbmRPcHRpb25zPEk+fSBbaW5wdXRzXSAtIFRoZSBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtyZXF1aXJlbWVudHNdIC0gVGhlIGxpc3Qgb2YgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmQ8SSwgUj4gZXh0ZW5kcyBMb2dnZWRDbGFzcyB7XG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBTdGF0aWMgbG9nZ2VyIGZvciB0aGUgQ29tbWFuZCBjbGFzcy5cbiAgICogQHR5cGUge0xvZ2dlcn1cbiAgICovXG4gIHN0YXRpYyBsb2c6IExvZ2dlcjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgaW5wdXRzOiBDb21tYW5kT3B0aW9uczxJPiA9IHt9IGFzIHVua25vd24gYXMgQ29tbWFuZE9wdGlvbnM8ST4sXG4gICAgcHJvdGVjdGVkIHJlcXVpcmVtZW50czogc3RyaW5nW10gPSBbXVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmICghQ29tbWFuZC5sb2cpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21tYW5kLCBcImxvZ1wiLCB7XG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IExvZ2dpbmcuZm9yKENvbW1hbmQubmFtZSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5pbnB1dHMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsXG4gICAgICBpbnB1dHNcbiAgICApIGFzIENvbW1hbmRPcHRpb25zPEk+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBhcmUgcHJlc2VudC5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBhbmQgY29tcGFyZXMgaXQgYWdhaW5zdCB0aGUgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoZWNrIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgZ2V0RGVwZW5kZW5jaWVzXG4gICAqICAgcGFydGljaXBhbnQgU2V0XG4gICAqICAgQ29tbWFuZC0+PmdldERlcGVuZGVuY2llczogQ2FsbFxuICAgKiAgIGdldERlcGVuZGVuY2llcy0tPj5Db21tYW5kOiBSZXR1cm4ge3Byb2QsIGRldiwgcGVlcn1cbiAgICogICBDb21tYW5kLT4+U2V0OiBDcmVhdGUgU2V0IGZyb20gcHJvZCwgZGV2LCBwZWVyXG4gICAqICAgU2V0LS0+PkNvbW1hbmQ6IFJldHVybiB1bmlxdWUgZGVwZW5kZW5jaWVzXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IENvbXBhcmUgYWdhaW5zdCByZXF1aXJlbWVudHNcbiAgICogICBhbHQgTWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBBZGQgdG8gbWlzc2luZyBsaXN0XG4gICAqICAgZW5kXG4gICAqICAgTm90ZSBvdmVyIENvbW1hbmQ6IElmIG1pc3NpbmcubGVuZ3RoID4gMCwgaGFuZGxlIG1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tSZXF1aXJlbWVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgICBjb25zdCBmdWxsTGlzdCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFsuLi5wcm9kLCAuLi5kZXYsIC4uLnBlZXJdKS52YWx1ZXMoKVxuICAgICkubWFwKChkKSA9PiBkLm5hbWUpO1xuICAgIGZvciAoY29uc3QgZGVwIG9mIHRoaXMucmVxdWlyZW1lbnRzKVxuICAgICAgaWYgKCFmdWxsTGlzdC5pbmNsdWRlcyhkZXApKSBtaXNzaW5nLnB1c2goZGVwKTtcblxuICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBoZWxwIGluZm9ybWF0aW9uIGZvciB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBjbGFzc2VzIHRvIHByb3ZpZGUgc3BlY2lmaWMgaGVscCBpbmZvcm1hdGlvbi5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBwcm90ZWN0ZWQgaGVscChhcmdzOiBQYXJzZUFyZ3NSZXN1bHQpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2cuaW5mbyhcbiAgICAgIGBUaGlzIGlzIGhlbHAuIEknbSBubyB1c2UgYmVjYXVzZSBJIHNob3VsZCBoYXZlIGJlZW4gb3ZlcnJpZGRlbi5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgY29tbWFuZCB3aXRoIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gZGVmaW5lIHRoZSBjb21tYW5kJ3MgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhbnN3ZXJzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiBJXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBvdmVyYWxsIGV4ZWN1dGlvbiBmbG93IG9mIHRoZSBjb21tYW5kLCBpbmNsdWRpbmcgcGFyc2luZyBhcmd1bWVudHMsXG4gICAqIHNldHRpbmcgdXAgbG9nZ2luZywgY2hlY2tpbmcgZm9yIHZlcnNpb24gb3IgaGVscCByZXF1ZXN0cywgYW5kIHJ1bm5pbmcgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IFVzZXJJbnB1dFxuICAgKiAgIHBhcnRpY2lwYW50IExvZ2dpbmdcbiAgICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IHByaW50QmFubmVyXG4gICAqICAgQ29tbWFuZC0+PlVzZXJJbnB1dDogcGFyc2VBcmdzKGlucHV0cylcbiAgICogICBVc2VySW5wdXQtLT4+Q29tbWFuZDogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBQcm9jZXNzIG9wdGlvbnNcbiAgICogICBDb21tYW5kLT4+TG9nZ2luZzogc2V0Q29uZmlnKG9wdGlvbnMpXG4gICAqICAgYWx0IHZlcnNpb24gcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Z2V0UGFja2FnZVZlcnNpb246IENhbGxcbiAgICogICAgIGdldFBhY2thZ2VWZXJzaW9uLS0+PkNvbW1hbmQ6IFJldHVybiB2ZXJzaW9uXG4gICAqICAgZWxzZSBoZWxwIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IGhlbHAoYXJncylcbiAgICogICBlbHNlIGJhbm5lciByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5wcmludEJhbm5lcjogQ2FsbFxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBydW4oYXJncylcbiAgICogICBhbHQgZXJyb3Igb2NjdXJzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogTG9nIGVycm9yXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0tPj5Db21tYW5kOiBSZXR1cm4gcmVzdWx0XG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzOiBQYXJzZUFyZ3NSZXN1bHQgPSBVc2VySW5wdXQucGFyc2VBcmdzKHRoaXMuaW5wdXRzKTtcbiAgICBjb25zdCBlbnYgPSBMb2dnZWRFbnZpcm9ubWVudC5hY2N1bXVsYXRlKERlZmF1bHRDb21tYW5kVmFsdWVzKS5hY2N1bXVsYXRlKFxuICAgICAgYXJncy52YWx1ZXNcbiAgICApO1xuICAgIGNvbnN0IHsgdmVyc2lvbiwgaGVscCwgYmFubmVyIH0gPSBlbnY7XG5cbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgcmV0dXJuIGdldFBhY2thZ2VWZXJzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGhlbHApIHtcbiAgICAgIHJldHVybiB0aGlzLmhlbHAoYXJncyk7XG4gICAgfVxuXG4gICAgaWYgKGJhbm5lcilcbiAgICAgIHByaW50QmFubmVyKFxuICAgICAgICB0aGlzLmxvZy5mb3IocHJpbnRCYW5uZXIsIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IGZhbHNlLFxuICAgICAgICAgIHN0eWxlOiBmYWxzZSxcbiAgICAgICAgICBjb250ZXh0OiBmYWxzZSxcbiAgICAgICAgICBsb2dMZXZlbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4oZW52IGFzIGFueSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJ1bm5pbmcgcHJvdmlkZWQgY2xpIGZ1bmN0aW9uOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgUjtcbiAgfVxufVxuIiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmltcG9ydCBodHRwcyBmcm9tIFwiaHR0cHNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzaW1wbGUgSFRUUCBjbGllbnQgZm9yIGRvd25sb2FkaW5nIGZpbGVzLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGZpbGVzIGZyb20gSFRUUFMgVVJMcy5cbiAqIEl0IHVzZXMgTm9kZS5qcyBidWlsdC1pbiBodHRwcyBtb2R1bGUgdG8gbWFrZSByZXF1ZXN0cy5cbiAqXG4gKiBAY2xhc3MgSHR0cENsaWVudFxuICovXG5leHBvcnQgY2xhc3MgSHR0cENsaWVudCB7XG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoSHR0cENsaWVudCk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGEgZmlsZSBmcm9tIGEgZ2l2ZW4gVVJMLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZSBib2R5IGFzIGEgc3RyaW5nLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCBzY2VuYXJpb3Mgc3VjaCBhcyBub24tMjAwIHN0YXR1cyBjb2RlcyBhbmQgbmV0d29yayBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBmaWxlIHRvIGRvd25sb2FkLlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGZpbGUgY29udGVudCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgSHR0cENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEhUVFBTXG4gICAqICAgcGFydGljaXBhbnQgU2VydmVyXG4gICAqICAgQ2xpZW50LT4+SHR0cENsaWVudDogZG93bmxvYWRGaWxlKHVybClcbiAgICogICBIdHRwQ2xpZW50LT4+SFRUUFM6IGdldCh1cmwpXG4gICAqICAgSFRUUFMtPj5TZXJ2ZXI6IEdFVCByZXF1ZXN0XG4gICAqICAgU2VydmVyLS0+PkhUVFBTOiBSZXNwb25zZVxuICAgKiAgIEhUVFBTLS0+Pkh0dHBDbGllbnQ6IFJlc3BvbnNlIG9iamVjdFxuICAgKiAgIGFsdCBTdGF0dXMgY29kZSBpcyAyMDBcbiAgICogICAgIGxvb3AgRm9yIGVhY2ggZGF0YSBjaHVua1xuICAgKiAgICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdkYXRhJyBldmVudFxuICAgKiAgICAgICBIdHRwQ2xpZW50LT4+SHR0cENsaWVudDogQWNjdW11bGF0ZSBkYXRhXG4gICAqICAgICBlbmRcbiAgICogICAgIEhUVFBTLT4+SHR0cENsaWVudDogJ2VuZCcgZXZlbnRcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZXNvbHZlIHdpdGggZGF0YVxuICAgKiAgIGVsc2UgU3RhdHVzIGNvZGUgaXMgbm90IDIwMFxuICAgKiAgICAgSHR0cENsaWVudC0tPj5DbGllbnQ6IFJlamVjdCB3aXRoIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZG93bmxvYWRGaWxlKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBmdW5jdGlvbiByZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gICAgICAgIHVybCA9IGVuY29kZVVSSSh1cmwpO1xuICAgICAgICBodHRwcy5nZXQodXJsLCAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAzMDEgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwNylcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0KHJlcy5oZWFkZXJzLmxvY2F0aW9uIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgSHR0cENsaWVudC5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9IChzdGF0dXM6ICR7cmVzLnN0YXR1c0NvZGV9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgICAgICAgIHJlcy5vbihcImRhdGFcIiwgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3QodXJsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGNvcHlGaWxlLFxuICBkZWxldGVQYXRoLFxuICBnZXRBbGxGaWxlcyxcbiAgZ2V0UGFja2FnZSxcbiAgcGF0Y2hGaWxlLFxuICByZWFkRmlsZSxcbiAgcmVuYW1lRmlsZSxcbiAgcnVuQ29tbWFuZCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBJbnB1dE9wdGlvbnMsIE91dHB1dE9wdGlvbnMsIHJvbGx1cCwgUm9sbHVwQnVpbGQgfSBmcm9tIFwicm9sbHVwXCI7XG5pbXBvcnQgdHlwZXNjcmlwdCBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tdHlwZXNjcmlwdFwiO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gXCJAcm9sbHVwL3BsdWdpbi1jb21tb25qc1wiO1xuaW1wb3J0IHsgbm9kZVJlc29sdmUgfSBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlXCI7XG5pbXBvcnQganNvbiBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tanNvblwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0ICogYXMgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IERpYWdub3N0aWMsIEVtaXRSZXN1bHQsIE1vZHVsZUtpbmQsIFNvdXJjZUZpbGUgfSBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5jb25zdCBWRVJTSU9OX1NUUklORyA9IFwiIyNWRVJTSU9OIyNcIjtcbmNvbnN0IFBBQ0tBR0VfU1RSSU5HID0gXCIjI1BBQ0tBR0UjI1wiO1xuXG5lbnVtIE1vZGVzIHtcbiAgQ0pTID0gXCJjb21tb25qc1wiLFxuICBFU00gPSBcImVzMjAyMlwiLFxufVxuXG5lbnVtIEJ1aWxkTW9kZSB7XG4gIEJVSUxEID0gXCJidWlsZFwiLFxuICBCVU5ETEUgPSBcImJ1bmRsZVwiLFxuICBBTEwgPSBcImFsbFwiLFxufVxuXG5lbnVtIFNFUEFSQVRPUlMge1xuICBET1QgPSBcIi5cIlxufVxuXG5jb25zdCBiaW5Tb3VyY2VMb2NhdGlvbiA9IFwiL3NyYy9iaW5cIlxuXG5jb25zdCBvcHRpb25zID0ge1xuICBwcm9kOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG4gIGRldjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBidWlsZE1vZGU6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlZmF1bHQ6IEJ1aWxkTW9kZS5BTEwsXG4gIH0sXG4gIGRvY3M6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgY29tbWFuZHM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgYmFubmVyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogZmFsc2UsXG4gIH0sXG59O1xuXG5jb25zdCBjanMyVHJhbnNmb3JtZXIgPSAoZXh0ID0gXCIuY2pzXCIpID0+IHtcbiAgY29uc3QgbG9nID0gQnVpbGRTY3JpcHRzLmxvZy5mb3IoY2pzMlRyYW5zZm9ybWVyKTtcbiAgY29uc3QgcmVzb2x1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICByZXR1cm4gKHRyYW5zZm9ybWF0aW9uQ29udGV4dDogdHMuVHJhbnNmb3JtYXRpb25Db250ZXh0KSA9PiB7XG4gICAgcmV0dXJuIChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2VEaXIgPSBwYXRoLmRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSk7XG5cbiAgICAgIGZ1bmN0aW9uIHJlc29sdmVQYXRoKGltcG9ydFBhdGg6IHN0cmluZykge1xuICAgICAgICBjb25zdCBjYWNoZUtleSA9IEpTT04uc3RyaW5naWZ5KFtzb3VyY2VEaXIsIGltcG9ydFBhdGhdKTtcbiAgICAgICAgY29uc3QgY2FjaGVkVmFsdWUgPSByZXNvbHV0aW9uQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGNhY2hlZFZhbHVlICE9IG51bGwpIHJldHVybiBjYWNoZWRWYWx1ZTtcblxuICAgICAgICBsZXQgcmVzb2x2ZWRQYXRoID0gaW1wb3J0UGF0aDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoc291cmNlRGlyLCByZXNvbHZlZFBhdGggKyBcIi50c1wiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXNvbHZlIHBhdGggJHtpbXBvcnRQYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICAgICAgYFRlc3RpbmcgZXhpc3RlbmNlIG9mIHBhdGggJHtyZXNvbHZlZFBhdGh9IGFzIGEgZm9sZGVyIGRlZmF1bHRpbmcgdG8gaW5kZXggZmlsZWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzdGF0ID0gZnMuc3RhdFN5bmMocmVzb2x2ZWRQYXRoLnJlcGxhY2UoL1xcLnRzJC9nbSwgXCJcIikpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUyOiB1bmtub3duKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBwYXRoICR7aW1wb3J0UGF0aH06ICR7ZX0sICR7ZTJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSlcbiAgICAgICAgICByZXNvbHZlZFBhdGggPSByZXNvbHZlZFBhdGgucmVwbGFjZSgvXFwudHMkL2dtLCBcIi9pbmRleC50c1wiKTtcblxuICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKHJlc29sdmVkUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPVxuICAgICAgICAgICAgKC9cXC50c3g/JC8uZXhlYyhwYXRoLmJhc2VuYW1lKHJlc29sdmVkUGF0aCkpIHx8IFtdKVswXSB8fCB2b2lkIDA7XG5cbiAgICAgICAgICByZXNvbHZlZFBhdGggPVxuICAgICAgICAgICAgXCIuL1wiICtcbiAgICAgICAgICAgIHBhdGgucmVsYXRpdmUoXG4gICAgICAgICAgICAgIHNvdXJjZURpcixcbiAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShyZXNvbHZlZFBhdGgpLFxuICAgICAgICAgICAgICAgIHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoLCBleHRlbnNpb24pICsgZXh0XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXNvbHV0aW9uQ2FjaGUuc2V0KGNhY2hlS2V5LCByZXNvbHZlZFBhdGgpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiB2aXNpdE5vZGUobm9kZTogdHMuTm9kZSk6IHRzLlZpc2l0UmVzdWx0PHRzLk5vZGU+IHtcbiAgICAgICAgaWYgKHNob3VsZE11dGF0ZU1vZHVsZVNwZWNpZmllcihub2RlKSkge1xuICAgICAgICAgIGlmICh0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChub2RlLm1vZHVsZVNwZWNpZmllci50ZXh0KTtcbiAgICAgICAgICAgIGNvbnN0IG5ld01vZHVsZVNwZWNpZmllciA9XG4gICAgICAgICAgICAgIHRyYW5zZm9ybWF0aW9uQ29udGV4dC5mYWN0b3J5LmNyZWF0ZVN0cmluZ0xpdGVyYWwocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1hdGlvbkNvbnRleHQuZmFjdG9yeS51cGRhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgbm9kZS5tb2RpZmllcnMsXG4gICAgICAgICAgICAgIG5vZGUuaW1wb3J0Q2xhdXNlLFxuICAgICAgICAgICAgICBuZXdNb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzRXhwb3J0RGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoKG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQpO1xuICAgICAgICAgICAgY29uc3QgbmV3TW9kdWxlU3BlY2lmaWVyID1cbiAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25Db250ZXh0LmZhY3RvcnkuY3JlYXRlU3RyaW5nTGl0ZXJhbChyZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWF0aW9uQ29udGV4dC5mYWN0b3J5LnVwZGF0ZUV4cG9ydERlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICBub2RlLm1vZGlmaWVycyxcbiAgICAgICAgICAgICAgbm9kZS5pc1R5cGVPbmx5LFxuICAgICAgICAgICAgICBub2RlLmV4cG9ydENsYXVzZSxcbiAgICAgICAgICAgICAgbmV3TW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRzLnZpc2l0RWFjaENoaWxkKG5vZGUsIHZpc2l0Tm9kZSwgdHJhbnNmb3JtYXRpb25Db250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gc2hvdWxkTXV0YXRlTW9kdWxlU3BlY2lmaWVyKG5vZGU6IHRzLk5vZGUpOiBub2RlIGlzIChcbiAgICAgICAgfCB0cy5JbXBvcnREZWNsYXJhdGlvblxuICAgICAgICB8IHRzLkV4cG9ydERlY2xhcmF0aW9uXG4gICAgICApICYge1xuICAgICAgICBtb2R1bGVTcGVjaWZpZXI6IHRzLlN0cmluZ0xpdGVyYWw7XG4gICAgICB9IHtcbiAgICAgICAgaWYgKCF0cy5pc0ltcG9ydERlY2xhcmF0aW9uKG5vZGUpICYmICF0cy5pc0V4cG9ydERlY2xhcmF0aW9uKG5vZGUpKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAobm9kZS5tb2R1bGVTcGVjaWZpZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBvbmx5IHdoZW4gbW9kdWxlIHNwZWNpZmllciBpcyB2YWxpZFxuICAgICAgICBpZiAoIXRzLmlzU3RyaW5nTGl0ZXJhbChub2RlLm1vZHVsZVNwZWNpZmllcikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gb25seSB3aGVuIHBhdGggaXMgcmVsYXRpdmVcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFub2RlLm1vZHVsZVNwZWNpZmllci50ZXh0LnN0YXJ0c1dpdGgoXCIuL1wiKSAmJlxuICAgICAgICAgICFub2RlLm1vZHVsZVNwZWNpZmllci50ZXh0LnN0YXJ0c1dpdGgoXCIuLi9cIilcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gb25seSB3aGVuIG1vZHVsZSBzcGVjaWZpZXIgaGFzIG5vIGV4dGVuc2lvblxuICAgICAgICBpZiAocGF0aC5leHRuYW1lKG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQpICE9PSBcIlwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHMudmlzaXROb2RlKHNvdXJjZUZpbGUsIHZpc2l0Tm9kZSkgYXMgU291cmNlRmlsZTtcbiAgICB9O1xuICB9O1xufTtcblxuZXhwb3J0IGNsYXNzIEJ1aWxkU2NyaXB0cyBleHRlbmRzIENvbW1hbmQ8XG4gIENvbW1hbmRPcHRpb25zPHR5cGVvZiBvcHRpb25zPixcbiAgdm9pZFxuPiB7XG4gIHByaXZhdGUgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGtnVmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHBrZ05hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcbiAgICAgIFwiQnVpbGRTY3JpcHRzXCIsXG4gICAgICBPYmplY3QuYXNzaWduKHt9LCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIG9wdGlvbnMpIGFzIENvbW1hbmRPcHRpb25zPFxuICAgICAgICB0eXBlb2Ygb3B0aW9uc1xuICAgICAgPlxuICAgICk7XG4gICAgY29uc3QgcGtnID0gZ2V0UGFja2FnZSgpIGFzIHsgbmFtZTogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfTtcbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHBrZztcbiAgICB0aGlzLnBrZ05hbWUgPSBuYW1lLmluY2x1ZGVzKFwiQFwiKSA/IG5hbWUuc3BsaXQoXCIvXCIpWzFdIDogbmFtZTtcbiAgICB0aGlzLnBrZ1ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIHRoaXMucmVwbGFjZW1lbnRzW1ZFUlNJT05fU1RSSU5HXSA9IHRoaXMucGtnVmVyc2lvbjtcbiAgICB0aGlzLnJlcGxhY2VtZW50c1tQQUNLQUdFX1NUUklOR10gPSBuYW1lO1xuICB9XG5cbiAgcGF0Y2hGaWxlcyhwOiBzdHJpbmcpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wYXRjaEZpbGVzKTtcbiAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IGdldFBhY2thZ2UoKSBhcyBhbnk7XG4gICAgbG9nLmluZm8oYFBhdGNoaW5nICR7bmFtZX0gJHt2ZXJzaW9ufSBtb2R1bGUgaW4gJHtwfS4uLmApO1xuICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhwKTtcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKVxuICAgICAgZnMucmVhZGRpclN5bmMocCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcC5pc0ZpbGUoKSlcbiAgICAgICAgLmZvckVhY2goKGZpbGUpID0+XG4gICAgICAgICAgcGF0Y2hGaWxlKHBhdGguam9pbihmaWxlLnBhcmVudFBhdGgsIGZpbGUubmFtZSksIHRoaXMucmVwbGFjZW1lbnRzKVxuICAgICAgICApO1xuICAgIGxvZy52ZXJib3NlKGBNb2R1bGUgJHtuYW1lfSAke3ZlcnNpb259IHBhdGNoZWQgaW4gJHtwfS4uLmApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXBvcnREaWFnbm9zdGljcyhkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdKTogdm9pZCB7XG4gICAgZGlhZ25vc3RpY3MuZm9yRWFjaCgoZGlhZ25vc3RpYykgPT4ge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBcIkVycm9yXCI7XG4gICAgICBpZiAoZGlhZ25vc3RpYy5maWxlICYmIGRpYWdub3N0aWMuc3RhcnQpIHtcbiAgICAgICAgY29uc3QgeyBsaW5lLCBjaGFyYWN0ZXIgfSA9XG4gICAgICAgICAgZGlhZ25vc3RpYy5maWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKGRpYWdub3N0aWMuc3RhcnQpO1xuICAgICAgICBtZXNzYWdlICs9IGAgJHtkaWFnbm9zdGljLmZpbGUuZmlsZU5hbWV9ICgke2xpbmUgKyAxfSwke2NoYXJhY3RlciArIDF9KWA7XG4gICAgICB9XG4gICAgICBtZXNzYWdlICs9XG4gICAgICAgIFwiOiBcIiArIHRzLmZsYXR0ZW5EaWFnbm9zdGljTWVzc2FnZVRleHQoZGlhZ25vc3RpYy5tZXNzYWdlVGV4dCwgXCJcXG5cIik7XG4gICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZENvbmZpZ0ZpbGUoY29uZmlnRmlsZU5hbWU6IHN0cmluZykge1xuICAgIC8vIFJlYWQgY29uZmlnIGZpbGVcbiAgICBjb25zdCBjb25maWdGaWxlVGV4dCA9IGZzLnJlYWRGaWxlU3luYyhjb25maWdGaWxlTmFtZSkudG9TdHJpbmcoKTtcblxuICAgIC8vIFBhcnNlIEpTT04sIGFmdGVyIHJlbW92aW5nIGNvbW1lbnRzLiBKdXN0IGZhbmNpZXIgSlNPTi5wYXJzZVxuICAgIGNvbnN0IHJlc3VsdCA9IHRzLnBhcnNlQ29uZmlnRmlsZVRleHRUb0pzb24oY29uZmlnRmlsZU5hbWUsIGNvbmZpZ0ZpbGVUZXh0KTtcbiAgICBjb25zdCBjb25maWdPYmplY3QgPSByZXN1bHQuY29uZmlnO1xuICAgIGlmICghY29uZmlnT2JqZWN0KSB7XG4gICAgICB0aGlzLnJlcG9ydERpYWdub3N0aWNzKFtyZXN1bHQuZXJyb3IhXSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcGFyc2UgdHNjb25maWcuanNvblwiKTtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGNvbmZpZyBpbmZyb21hdGlvblxuICAgIGNvbnN0IGNvbmZpZ1BhcnNlUmVzdWx0ID0gdHMucGFyc2VKc29uQ29uZmlnRmlsZUNvbnRlbnQoXG4gICAgICBjb25maWdPYmplY3QsXG4gICAgICB0cy5zeXMsXG4gICAgICBwYXRoLmRpcm5hbWUoY29uZmlnRmlsZU5hbWUpXG4gICAgKTtcbiAgICBpZiAoY29uZmlnUGFyc2VSZXN1bHQuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucmVwb3J0RGlhZ25vc3RpY3MoY29uZmlnUGFyc2VSZXN1bHQuZXJyb3JzKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBwYXJzZSB0c2NvbmZpZy5qc29uXCIpO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnUGFyc2VSZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkVHMoaXNEZXY6IGJvb2xlYW4sIG1vZGU6IE1vZGVzLCBidW5kbGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkVHMpO1xuICAgIGxvZy5pbmZvKFxuICAgICAgYEJ1aWxkaW5nICR7dGhpcy5wa2dOYW1lfSAke3RoaXMucGtnVmVyc2lvbn0gbW9kdWxlICgke21vZGV9KSBpbiAke2lzRGV2ID8gXCJkZXZcIiA6IFwicHJvZFwifSBtb2RlLi4uYFxuICAgICk7XG4gICAgbGV0IHRzQ29uZmlnO1xuICAgIHRyeSB7XG4gICAgICB0c0NvbmZpZyA9IHRoaXMucmVhZENvbmZpZ0ZpbGUoXCIuL3RzY29uZmlnLmpzb25cIik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgdHNjb25maWcuanNvbjogJHtlfWApO1xuICAgIH1cblxuICAgIGlmIChidW5kbGUpIHtcbiAgICAgIHRzQ29uZmlnLm9wdGlvbnMubW9kdWxlID0gTW9kdWxlS2luZC5BTUQ7XG4gICAgICB0c0NvbmZpZy5vcHRpb25zLm91dERpciA9IFwiZGlzdFwiO1xuICAgICAgdHNDb25maWcub3B0aW9ucy5pc29sYXRlZE1vZHVsZXMgPSBmYWxzZTtcbiAgICAgIHRzQ29uZmlnLm9wdGlvbnMub3V0RmlsZSA9IHRoaXMucGtnTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHNDb25maWcub3B0aW9ucy5vdXREaXIgPSBgbGliJHttb2RlID09PSBNb2Rlcy5FU00gPyBcIi9lc21cIiA6IFwiXCJ9YDtcbiAgICAgIHRzQ29uZmlnLm9wdGlvbnMubW9kdWxlID1cbiAgICAgICAgbW9kZSA9PT0gTW9kZXMuRVNNID8gTW9kdWxlS2luZC5FUzIwMjIgOiBNb2R1bGVLaW5kLkNvbW1vbkpTO1xuICAgIH1cblxuICAgIGlmIChpc0Rldikge1xuICAgICAgdHNDb25maWcub3B0aW9ucy5pbmxpbmVTb3VyY2VNYXAgPSB0cnVlO1xuICAgICAgdHNDb25maWcub3B0aW9ucy5zb3VyY2VNYXAgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHNDb25maWcub3B0aW9ucy5zb3VyY2VNYXAgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9ncmFtID0gdHMuY3JlYXRlUHJvZ3JhbSh0c0NvbmZpZy5maWxlTmFtZXMsIHRzQ29uZmlnLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtYXRpb25zOiB7IGJlZm9yZT86IGFueVtdIH0gPSB7fTtcbiAgICBpZiAobW9kZSA9PT0gTW9kZXMuQ0pTKSB7XG4gICAgICB0cmFuc2Zvcm1hdGlvbnMuYmVmb3JlID0gW2NqczJUcmFuc2Zvcm1lcihcIi5janNcIildO1xuICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gTW9kZXMuRVNNKSB7XG4gICAgICB0cmFuc2Zvcm1hdGlvbnMuYmVmb3JlID0gW2NqczJUcmFuc2Zvcm1lcihcIi5qc1wiKV07XG4gICAgfVxuXG4gICAgY29uc3QgZW1pdFJlc3VsdDogRW1pdFJlc3VsdCA9IHByb2dyYW0uZW1pdChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRyYW5zZm9ybWF0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCBhbGxEaWFnbm9zdGljcyA9IHRzXG4gICAgICAuZ2V0UHJlRW1pdERpYWdub3N0aWNzKHByb2dyYW0pXG4gICAgICAuY29uY2F0KGVtaXRSZXN1bHQuZGlhZ25vc3RpY3MpO1xuXG4gICAgYWxsRGlhZ25vc3RpY3MuZm9yRWFjaCgoZGlhZ25vc3RpYykgPT4ge1xuICAgICAgaWYgKGRpYWdub3N0aWMuZmlsZSkge1xuICAgICAgICBjb25zdCB7IGxpbmUsIGNoYXJhY3RlciB9ID1cbiAgICAgICAgICBkaWFnbm9zdGljLmZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oZGlhZ25vc3RpYy5zdGFydCEpO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdHMuZmxhdHRlbkRpYWdub3N0aWNNZXNzYWdlVGV4dChcbiAgICAgICAgICBkaWFnbm9zdGljLm1lc3NhZ2VUZXh0LFxuICAgICAgICAgIFwiXFxuXCJcbiAgICAgICAgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYCR7ZGlhZ25vc3RpYy5maWxlLmZpbGVOYW1lfSAoJHtsaW5lICsgMX0sJHtjaGFyYWN0ZXIgKyAxfSk6ICR7bWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuaW5mbyh0cy5mbGF0dGVuRGlhZ25vc3RpY01lc3NhZ2VUZXh0KGRpYWdub3N0aWMubWVzc2FnZVRleHQsIFwiXFxuXCIpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZW1pdFJlc3VsdC5lbWl0U2tpcHBlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVpbGQgZmFpbGVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGQoaXNEZXY6IGJvb2xlYW4sIG1vZGU6IE1vZGVzLCBidW5kbGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmJ1aWxkKTtcbiAgICBhd2FpdCB0aGlzLmJ1aWxkVHMoaXNEZXYsIG1vZGUsIGJ1bmRsZSk7XG5cbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBNb2R1bGUgJHt0aGlzLnBrZ05hbWV9ICR7dGhpcy5wa2dWZXJzaW9ufSAoJHttb2RlfSkgYnVpbHQgaW4gJHtpc0RldiA/IFwiZGV2XCIgOiBcInByb2RcIn0gbW9kZS4uLmBcbiAgICApO1xuICAgIGlmIChtb2RlID09PSBNb2Rlcy5DSlMgJiYgIWJ1bmRsZSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBnZXRBbGxGaWxlcyhcbiAgICAgICAgXCJsaWJcIixcbiAgICAgICAgKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoXCIuanNcIikgJiYgIWZpbGUuaW5jbHVkZXMoXCIvZXNtL1wiKVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyAke2ZpbGV9J3MgY2pzIGltcG9ydHMuLi5gKTtcbiAgICAgICAgY29uc3QgZiA9IGZpbGUucmVwbGFjZShcIi5qc1wiLCBcIi5janNcIik7XG4gICAgICAgIGF3YWl0IHJlbmFtZUZpbGUoZmlsZSwgZik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29weUFzc2V0cyhtb2RlOiBNb2Rlcykge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNvcHlBc3NldHMpO1xuICAgIGxldCBoYXNBc3NldHMgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgaGFzQXNzZXRzID0gZnMuc3RhdFN5bmMoXCIuL3NyYy9hc3NldHNcIikuaXNEaXJlY3RvcnkoKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gbG9nLnZlcmJvc2UoYE5vIGFzc2V0cyBmb3VuZCBpbiAuL3NyYy9hc3NldHMgdG8gY29weWApO1xuICAgIH1cbiAgICBpZiAoaGFzQXNzZXRzKVxuICAgICAgY29weUZpbGUoXG4gICAgICAgIFwiLi9zcmMvYXNzZXRzXCIsXG4gICAgICAgIGAuLyR7bW9kZSA9PT0gTW9kZXMuQ0pTID8gXCJsaWJcIiA6IFwiZGlzdFwifS9hc3NldHNgXG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRDb21tYW5kcygpIHtcbiAgICBjb25zdCBjb21tYW5kczogc3RyaW5nW10gID0gZnMucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCkgKyBiaW5Tb3VyY2VMb2NhdGlvbikpLm1hcCgoY21kKSA9PiBjbWQuc3BsaXQoU0VQQVJBVE9SUy5ET1QpWzBdKSBcbiAgICBmb3IgKGNvbnN0IGNtZCBvZiBjb21tYW5kcykge1xuICAgICAgaWYgKCFjbWQuZW5kc1dpdGgoXCIudHNcIikpIGNvbnRpbnVlO1xuXG4gICAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5DSlMsIHRydWUsIHRydWUsIGAke2JpblNvdXJjZUxvY2F0aW9ufS8ke2NtZH0udHNgLCBjbWQpO1xuICAgICAgbGV0IGRhdGEgPSByZWFkRmlsZShgYmluLyR7Y21kfS5janNgKTtcbiAgICAgIGRhdGEgPSBcIiMhL3Vzci9iaW4vZW52IG5vZGVcXG5cIiArIGRhdGE7XG4gICAgICB3cml0ZUZpbGUoYGJpbi8ke2NtZH0uY2pzYCwgZGF0YSk7XG4gICAgICBmcy5jaG1vZFN5bmMoYGJpbi8ke2NtZH0uY2pzYCwgXCI3NTVcIik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVuZGxlKFxuICAgIG1vZGU6IE1vZGVzLFxuICAgIGlzRGV2OiBib29sZWFuLFxuICAgIGlzTGliOiBib29sZWFuLFxuICAgIGVudHJ5RmlsZTogc3RyaW5nID0gXCJzcmMvaW5kZXgudHNcIixcbiAgICBuYW1lT3ZlcnJpZGU6IHN0cmluZyA9IHRoaXMucGtnTmFtZSxcbiAgICBleHRlcm5hbHM/OiBzdHJpbmdbXSxcbiAgICBpbmNsdWRlOiBzdHJpbmdbXSA9IFtcbiAgICAgIFwicHJvbXB0c1wiLFxuICAgICAgXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIixcbiAgICAgIFwidHlwZWQtb2JqZWN0LWFjY3VtdWxhdG9yXCIsXG4gICAgICBcIkBkZWNhZi10cy9sb2dnaW5nXCIsXG4gICAgXVxuICApIHtcbiAgICBjb25zdCBpc0VzbSA9IG1vZGUgPT09IE1vZGVzLkVTTTtcbiAgICBjb25zdCBwa2dOYW1lID0gdGhpcy5wa2dOYW1lO1xuXG4gICAgY29uc3QgZXh0ID0gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoW1xuICAgICAgICAuLi5bXG4gICAgICAgICAgXCJmc1wiLFxuICAgICAgICAgIFwicGF0aFwiLFxuICAgICAgICAgIFwicHJvY2Vzc1wiLFxuICAgICAgICAgIFwicm9sbHVwXCIsXG4gICAgICAgICAgXCJAcm9sbHVwL3BsdWdpbi10eXBlc2NyaXB0XCIsXG4gICAgICAgICAgXCJAcm9sbHVwL3BsdWdpbi1qc29uXCIsXG4gICAgICAgICAgXCJAcm9sbHVwL3BsdWdpbi1jb21tb25qc1wiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlXCIsXG4gICAgICAgICAgXCJjaGlsZF9wcm9jZXNzXCIsXG4gICAgICAgICAgXCJ0c2xpYlwiLFxuICAgICAgICAgIFwidXRpbFwiLFxuICAgICAgICAgIFwiaHR0cHNcIixcbiAgICAgICAgXSxcbiAgICAgICAgLi4uKGV4dGVybmFscyB8fCBbXSksXG4gICAgICBdKVxuICAgICk7XG5cbiAgICBjb25zdCBwbHVnaW5zID0gW1xuICAgICAgdHlwZXNjcmlwdCh7XG4gICAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICAgIG1vZHVsZTogXCJlc25leHRcIixcbiAgICAgICAgICBkZWNsYXJhdGlvbjogZmFsc2UsXG4gICAgICAgICAgb3V0RGlyOiBpc0xpYiA/IFwiYmluXCIgOiBcImRpc3RcIixcbiAgICAgICAgfSxcbiAgICAgICAgaW5jbHVkZTogW1wic3JjLyoqLyoudHNcIl0sXG4gICAgICAgIGV4Y2x1ZGU6IFtcIm5vZGVfbW9kdWxlc1wiLCBcIioqLyouc3BlYy50c1wiXSxcbiAgICAgICAgdHNjb25maWc6IFwiLi90c2NvbmZpZy5qc29uXCIsXG4gICAgICB9KSxcbiAgICAgIGpzb24oKSxcbiAgICBdO1xuXG4gICAgaWYgKGlzTGliKSB7XG4gICAgICBwbHVnaW5zLnB1c2goXG4gICAgICAgIGNvbW1vbmpzKHtcbiAgICAgICAgICBpbmNsdWRlOiBbXSxcbiAgICAgICAgICBleGNsdWRlOiBleHRlcm5hbHMsXG4gICAgICAgIH0pLFxuICAgICAgICBub2RlUmVzb2x2ZSh7XG4gICAgICAgICAgcmVzb2x2ZU9ubHk6IGluY2x1ZGUsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0OiBJbnB1dE9wdGlvbnMgPSB7XG4gICAgICBpbnB1dDogZW50cnlGaWxlLFxuICAgICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICAgIGV4dGVybmFsOiBleHQsXG4gICAgfTtcblxuICAgIGNvbnN0IG91dHB1dHM6IE91dHB1dE9wdGlvbnNbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgZmlsZTogYCR7aXNMaWIgPyBcImJpbi9cIiA6IFwiZGlzdC9cIn0ke25hbWVPdmVycmlkZSA/IG5hbWVPdmVycmlkZSA6IGAuYnVuZGxlLiR7IWlzRGV2ID8gXCJtaW5cIiA6IFwiXCJ9YH0ke2lzRXNtID8gXCIuZXNtXCIgOiBcIlwifS5janNgLFxuICAgICAgICBmb3JtYXQ6IGlzTGliID8gXCJjanNcIiA6IGlzRXNtID8gXCJlc21cIiA6IFwidW1kXCIsXG4gICAgICAgIG5hbWU6IHBrZ05hbWUsXG4gICAgICAgIGVzTW9kdWxlOiBpc0VzbSxcbiAgICAgICAgc291cmNlbWFwOiBpc0RldiA/IFwiaW5saW5lXCIgOiBmYWxzZSxcbiAgICAgICAgZ2xvYmFsczoge30sXG4gICAgICAgIGV4cG9ydHM6IFwiYXV0b1wiLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJ1bmRsZSA9IGF3YWl0IHJvbGx1cChpbnB1dCk7XG4gICAgICBjb25zb2xlLmxvZyhidW5kbGUud2F0Y2hGaWxlcyk7XG4gICAgICBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZU91dHB1dHMoYnVuZGxlOiBSb2xsdXBCdWlsZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG91dHB1dE9wdGlvbnMgb2Ygb3V0cHV0cykge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICBjb25zdCB7IG91dHB1dCB9ID0gYXdhaXQgYnVuZGxlLndyaXRlKG91dHB1dE9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IGdlbmVyYXRlT3V0cHV0cyhidW5kbGUpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGJ1bmRsZTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYnVpbGRCeUVudihpc0RldjogYm9vbGVhbiwgbW9kZTogQnVpbGRNb2RlID0gQnVpbGRNb2RlLkFMTCkge1xuICAgIHRyeSB7XG4gICAgICBkZWxldGVQYXRoKFwibGliXCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGRlbGV0ZVBhdGgoXCJkaXN0XCIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gICAgZnMubWtkaXJTeW5jKFwibGliXCIpO1xuICAgIGZzLm1rZGlyU3luYyhcImRpc3RcIik7XG5cbiAgICBpZiAoW0J1aWxkTW9kZS5BTEwsIEJ1aWxkTW9kZS5CVUlMRF0uaW5jbHVkZXMobW9kZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGQoaXNEZXYsIE1vZGVzLkVTTSk7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkKGlzRGV2LCBNb2Rlcy5DSlMpO1xuICAgICAgdGhpcy5wYXRjaEZpbGVzKFwibGliXCIpO1xuICAgIH1cblxuICAgIGlmIChbQnVpbGRNb2RlLkFMTCwgQnVpbGRNb2RlLkJVTkRMRV0uaW5jbHVkZXMobW9kZSkpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVuZGxlKE1vZGVzLkVTTSwgdHJ1ZSwgZmFsc2UpO1xuICAgICAgYXdhaXQgdGhpcy5idW5kbGUoTW9kZXMuQ0pTLCB0cnVlLCBmYWxzZSk7XG4gICAgICB0aGlzLnBhdGNoRmlsZXMoXCJkaXN0XCIpO1xuICAgIH1cblxuICAgIHRoaXMuY29weUFzc2V0cyhNb2Rlcy5DSlMpO1xuICAgIHRoaXMuY29weUFzc2V0cyhNb2Rlcy5FU00pO1xuICB9XG5cbiAgYXN5bmMgYnVpbGREZXYobW9kZTogQnVpbGRNb2RlID0gQnVpbGRNb2RlLkFMTCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQnlFbnYodHJ1ZSwgbW9kZSk7XG4gIH1cblxuICBhc3luYyBidWlsZFByb2QobW9kZTogQnVpbGRNb2RlID0gQnVpbGRNb2RlLkFMTCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQnlFbnYoZmFsc2UsIG1vZGUpO1xuICB9XG5cbiAgYXN5bmMgYnVpbGREb2NzKCkge1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIGJldHRlci1kb2NzIHRhZmZ5ZGJgKS5wcm9taXNlO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5weCBtYXJrZG93bi1pbmNsdWRlIC4vd29ya2RvY3MvcmVhZG1lLW1kLmpzb25gKS5wcm9taXNlO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnB4IGpzZG9jIC1jIC4vd29ya2RvY3MvanNkb2NzLmpzb24gLXQgLi9ub2RlX21vZHVsZXMvYmV0dGVyLWRvY3NgXG4gICAgKS5wcm9taXNlO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSByZW1vdmUgYmV0dGVyLWRvY3MgdGFmZnlkYmApLnByb21pc2U7XG4gICAgW1xuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvYXNzZXRzXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL2Fzc2V0c1wiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL3JlcG9ydHMvY292ZXJhZ2VcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvcmVwb3J0cy9jb3ZlcmFnZVwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL3JlcG9ydHMvaHRtbFwiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXBvcnRzL2h0bWxcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9yZXNvdXJjZXNcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvcmVzb3VyY2VzXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwiTElDRU5TRS5tZFwiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy9MSUNFTlNFLm1kXCIsXG4gICAgICB9LFxuICAgIF0uZm9yRWFjaCgoZikgPT4ge1xuICAgICAgY29uc3QgeyBzcmMsIGRlc3QgfSA9IGY7XG4gICAgICBjb3B5RmlsZShzcmMsIGRlc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHJ1bjxSPihcbiAgICBhbnN3ZXJzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIG9wdGlvbnNdOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTxzdHJpbmcgfCB2b2lkIHwgUj4ge1xuICAgIGNvbnN0IHsgZGV2LCBwcm9kLCBkb2NzLCBjb21tYW5kcywgYnVpbGRNb2RlIH0gPSBhbnN3ZXJzO1xuXG4gICAgaWYgKGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQ29tbWFuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2KSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERldihidWlsZE1vZGUgYXMgQnVpbGRNb2RlKTtcbiAgICB9XG4gICAgaWYgKHByb2QpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1aWxkUHJvZChidWlsZE1vZGUgYXMgQnVpbGRNb2RlKTtcbiAgICB9XG4gICAgaWYgKGRvY3MpIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmJ1aWxkRG9jcygpO1xuICAgIH1cbiAgfVxufVxuIiwiLyogaXN0YW5idWwgaWdub3JlIGZpbGUgKi9cbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IE5vQ0lGTGFnLCBTZW1WZXJzaW9uLCBTZW1WZXJzaW9uUmVnZXggfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgY2k6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBtZXNzYWdlOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJtXCIsXG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwidFwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbn07XG5cbi8qKlxuICogQGNsYXNzIFJlbGVhc2VTY3JpcHRcbiAqIEBleHRlbmRzIHtDb21tYW5kfVxuICogQGNhdmVnb3J5IHNjcmlwdHNcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbW1hbmQtbGluZSBzY3JpcHQgZm9yIG1hbmFnaW5nIHJlbGVhc2VzIGFuZCB2ZXJzaW9uIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBUaGlzIHNjcmlwdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW5kIHB1c2hpbmcgbmV3IHJlbGVhc2VzLiBJdCBoYW5kbGVzIHZlcnNpb24gdXBkYXRlcyxcbiAqIGNvbW1pdCBtZXNzYWdlcywgYW5kIG9wdGlvbmFsbHkgcHVibGlzaGVzIHRvIE5QTS4gVGhlIHNjcmlwdCBzdXBwb3J0cyBzZW1hbnRpYyB2ZXJzaW9uaW5nIGFuZCBjYW4gd29yayBpbiBib3RoIENJIGFuZCBub24tQ0kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2NyaXB0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2kgLSBXaGV0aGVyIHRoZSBzY3JpcHQgaXMgcnVubmluZyBpbiBhIENJIGVudmlyb25tZW50IChkZWZhdWx0OiB0cnVlKVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSByZWxlYXNlIG1lc3NhZ2UgKHNob3J0OiAnbScpXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50YWcgLSBUaGUgdmVyc2lvbiB0YWcgdG8gdXNlIChzaG9ydDogJ3QnLCBkZWZhdWx0OiB1bmRlZmluZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxlYXNlU2NyaXB0IGV4dGVuZHMgQ29tbWFuZDx0eXBlb2Ygb3B0aW9ucywgdm9pZD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlbGVhc2VTY3JpcHRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSB2ZXJzaW9uIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgdmFsaWRhdGVzIHRoZSBwcm92aWRlZCB0YWcgb3IgcHJvbXB0cyB0aGUgdXNlciBmb3IgYSBuZXcgb25lIGlmIG5vdCBwcm92aWRlZCBvciBpbnZhbGlkLlxuICAgKiBJdCBhbHNvIGRpc3BsYXlzIHRoZSBsYXRlc3QgZ2l0IHRhZ3MgZm9yIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyAtIFRoZSB2ZXJzaW9uIHRhZyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCB2ZXJzaW9uIHRhZ1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRlc3RWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VySW5wdXRcbiAgICogICBwYXJ0aWNpcGFudCBHIGFzIEdpdFxuICAgKiAgIFItPj5UOiB0ZXN0VmVyc2lvbih0YWcpXG4gICAqICAgYWx0IHRhZyBpcyB2YWxpZFxuICAgKiAgICAgVC0tPj5SOiByZXR1cm4gdGFnXG4gICAqICAgZWxzZSB0YWcgaXMgaW52YWxpZCBvciBub3QgcHJvdmlkZWRcbiAgICogICAgIFItPj5HOiBMaXN0IGxhdGVzdCBnaXQgdGFnc1xuICAgKiAgICAgUi0+PlU6IFByb21wdCBmb3IgbmV3IHRhZ1xuICAgKiAgICAgVS0tPj5SOiByZXR1cm4gbmV3IHRhZ1xuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVZlcnNpb24odGFnPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlVmVyc2lvbik7XG4gICAgdGFnID0gdGhpcy50ZXN0VmVyc2lvbigodGFnIGFzIHN0cmluZykgfHwgXCJcIik7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgIGxvZy52ZXJib3NlKFwiTm8gcmVsZWFzZSBtZXNzYWdlIHByb3ZpZGVkLiBQcm9tcHRpbmcgZm9yIG9uZTpcIik7XG4gICAgICBsb2cuaW5mbyhgTGlzdGluZyBsYXRlc3QgZ2l0IHRhZ3M6YCk7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHRhZyAtLXNvcnQ9LXRhZ2dlcmRhdGUgfCBoZWFkIC1uIDVcIikucHJvbWlzZTtcbiAgICAgIHJldHVybiBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJ0YWdcIixcbiAgICAgICAgXCJFbnRlciB0aGUgbmV3IHRhZyBudW1iZXIgKGFjY2VwdHMgdiouKi4qWy0uLi5dKVwiLFxuICAgICAgICAodmFsKSA9PlxuICAgICAgICAgICEhdmFsLnRvU3RyaW5nKCkubWF0Y2goL152WzAtOV0rXFwuWzAtOV0rLlswLTldKygtWzAtOWEtekEtWi1dKyk/JC8pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyBpZiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBpcyB2YWxpZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB2ZXJzaW9uIGlzIGEgdmFsaWQgc2VtYW50aWMgdmVyc2lvbiBvciBhIHByZWRlZmluZWQgdXBkYXRlIHR5cGUgKFBBVENILCBNSU5PUiwgTUFKT1IpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHRvIHRlc3RcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIHZhbGlkYXRlZCB2ZXJzaW9uIG9yIHVuZGVmaW5lZCBpZiBpbnZhbGlkXG4gICAqL1xuICB0ZXN0VmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRlc3RWZXJzaW9uKTtcbiAgICB2ZXJzaW9uID0gdmVyc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5QQVRDSDpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NSU5PUjpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NQUpPUjpcbiAgICAgICAgbG9nLnZlcmJvc2UoYFVzaW5nIHByb3ZpZGVkIFNlbVZlciB1cGRhdGU6ICR7dmVyc2lvbn1gLCAxKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICBgVGVzdGluZyBwcm92aWRlZCB2ZXJzaW9uIGZvciBTZW1WZXIgY29tcGF0aWJpbGl0eTogJHt2ZXJzaW9ufWAsXG4gICAgICAgICAgMVxuICAgICAgICApO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoU2VtVmVyc2lvblJlZ2V4KS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAke3ZlcnNpb259YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsb2cudmVyYm9zZShgdmVyc2lvbiBhcHByb3ZlZDogJHt2ZXJzaW9ufWAsIDEpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSByZWxlYXNlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGVpdGhlciByZXR1cm5zIHRoZSBwcm92aWRlZCBtZXNzYWdlIG9yIHByb21wdHMgdGhlIHVzZXIgZm9yIGEgbmV3IG9uZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgcmVsZWFzZSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCByZWxlYXNlIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHByZXBhcmVNZXNzYWdlKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlTWVzc2FnZSk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBsb2cudmVyYm9zZShcIk5vIHJlbGVhc2UgbWVzc2FnZSBwcm92aWRlZC4gUHJvbXB0aW5nIGZvciBvbmVcIik7XG4gICAgICByZXR1cm4gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBcIldoYXQgc2hvdWxkIGJlIHRoZSByZWxlYXNlIG1lc3NhZ2UvdGlja2V0P1wiLFxuICAgICAgICAodmFsKSA9PiAhIXZhbCAmJiB2YWwudG9TdHJpbmcoKS5sZW5ndGggPiA1XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgcmVsZWFzZSBzY3JpcHQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIG9yY2hlc3RyYXRlcyB0aGUgZW50aXJlIHJlbGVhc2UgcHJvY2VzcywgaW5jbHVkaW5nIHZlcnNpb24gcHJlcGFyYXRpb24sIG1lc3NhZ2UgY3JlYXRpb24sXG4gICAqIGdpdCBvcGVyYXRpb25zLCBhbmQgbnBtIHB1Ymxpc2hpbmcgKGlmIG5vdCBpbiBDSSBlbnZpcm9ubWVudCkuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBWIGFzIFByZXBhcmVWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBQcmVwYXJlTWVzc2FnZVxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTlBNXG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBHaXRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJJbnB1dFxuICAgKiAgIFItPj5WOiBwcmVwYXJlVmVyc2lvbih0YWcpXG4gICAqICAgUi0+Pk06IHByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpXG4gICAqICAgUi0+Pk46IFJ1biBwcmVwYXJlLXJlbGVhc2Ugc2NyaXB0XG4gICAqICAgUi0+Pkc6IENoZWNrIGdpdCBzdGF0dXNcbiAgICogICBhbHQgY2hhbmdlcyBleGlzdFxuICAgKiAgICAgUi0+PlU6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICBVLS0+PlI6IENvbmZpcm1cbiAgICogICAgIFItPj5HOiBBZGQgYW5kIGNvbW1pdCBjaGFuZ2VzXG4gICAqICAgZW5kXG4gICAqICAgUi0+Pk46IFVwZGF0ZSBucG0gdmVyc2lvblxuICAgKiAgIFItPj5HOiBQdXNoIGNoYW5nZXMgYW5kIHRhZ3NcbiAgICogICBhbHQgbm90IENJIGVudmlyb25tZW50XG4gICAqICAgICBSLT4+TjogUHVibGlzaCB0byBucG1cbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBhcmdzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIG9wdGlvbnNdOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHsgY2kgfSA9IGFyZ3M7XG4gICAgbGV0IHsgdGFnLCBtZXNzYWdlIH0gPSBhcmdzO1xuICAgIHRhZyA9IGF3YWl0IHRoaXMucHJlcGFyZVZlcnNpb24odGFnIGFzIHN0cmluZyk7XG4gICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBydW4gcHJlcGFyZS1yZWxlYXNlIC0tICR7dGFnfSAke21lc3NhZ2V9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gICAgcmVzdWx0ID0gYXdhaXQgcnVuQ29tbWFuZChcImdpdCBzdGF0dXMgLS1wb3JjZWxhaW5cIikucHJvbWlzZTtcbiAgICBhd2FpdCByZXN1bHQ7XG4gICAgaWYgKFxuICAgICAgcmVzdWx0LmxvZ3MubGVuZ3RoICYmXG4gICAgICAoYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJnaXQtY2hhbmdlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHB1c2ggdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5P1wiLFxuICAgICAgICB0cnVlXG4gICAgICApKVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgICAgYGdpdCBjb21taXQgLW0gXCIke3RhZ30gLSAke21lc3NhZ2V9IC0gYWZ0ZXIgcmVsZWFzZSBwcmVwYXJhdGlvbiR7Y2kgPyBcIlwiIDogTm9DSUZMYWd9XCJgXG4gICAgICApLnByb21pc2U7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnBtIHZlcnNpb24gXCIke3RhZ31cIiAtbSBcIiR7bWVzc2FnZX0ke2NpID8gXCJcIiA6IE5vQ0lGTGFnfVwiYFxuICAgICkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHB1c2ggLS1mb2xsb3ctdGFnc1wiKS5wcm9taXNlO1xuICAgIGlmICghY2kpIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJOUE1fVE9LRU49JChjYXQgLm5wbXRva2VuKSBucG0gcHVibGlzaCAtLWFjY2VzcyBwdWJsaWNcIilcbiAgICAgICAgLnByb21pc2U7XG4gICAgfVxuICB9XG59XG4iLCIvKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFBhY2thZ2UsXG4gIEh0dHBDbGllbnQsXG4gIHBhdGNoRmlsZSxcbiAgcnVuQ29tbWFuZCxcbiAgc2V0UGFja2FnZUF0dHJpYnV0ZSxcbiAgU2V0dXBTY3JpcHRLZXksXG4gIFRva2VucyxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXRcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcsIHBhdGNoU3RyaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmNvbnN0IGJhc2VVcmwgPVxuICBcImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kZWNhZi10cy90cy13b3Jrc3BhY2UvbWFzdGVyXCI7XG5cbmNvbnN0IG9wdGlvbnMgPSB7XG4gIHRlbXBsYXRlczogW1xuICAgIFwiLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9idWdfcmVwb3J0Lm1kXCIsXG4gICAgXCIuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2ZlYXR1cmVfcmVxdWVzdC5tZFwiLFxuICAgIFwiLmdpdGh1Yi9GVU5ESU5HLnltbFwiLFxuICBdLFxuICB3b3JrZmxvd3M6IFtcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL2NvZGVxbC1hbmFseXNpcy55bWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL2plc3QtY292ZXJhZ2UueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3Mvbm9kZWpzLWJ1aWxkLXByb2QueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcGFnZXMueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC1vbi1yZWxlYXNlLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2Utb24tdGFnLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3NueWstYW5hbHlzaXMueWFtbFwiLFxuICBdLFxuICBpZGU6IFtcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0FsbCBUZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9idWlsZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9idWlsZF9wcm9kLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2NvdmVyYWdlLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2RvY3MucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZHJhd2luZ3MucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZmxhc2gtZm9yd2FyZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9JbnRlZ3JhdGlvbl9UZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9CdW5kbGluZ19UZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9saW50LWZpeC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9yZWxlYXNlLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3Rlc3RfY2lyY3VsYXIucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdW1sLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL1VuaXQgVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdXBkYXRlLXNjcmlwdHMucnVuLnhtbFwiLFxuICBdLFxuICBkb2NzOiBbXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvQ29udHJpYnV0aW5nLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvRG9jdW1lbnRhdGlvbi5tZFwiLFxuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0ZvciBEZXZlbG9wZXJzLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy8yLUJhZGdlcy5tZFwiLFxuICAgIFwid29ya2RvY3MvanNkb2NzLmpzb25cIixcbiAgICBcIndvcmtkb2NzL3JlYWRtZS1tZC5qc29uXCIsXG4gIF0sXG4gIHN0eWxlczogW1wiLnByZXR0aWVycmNcIiwgXCJlc2xpbnQuY29uZmlnLmpzXCJdLFxuICBzY3JpcHRzOiBbXG4gICAgXCJiaW4vdXBkYXRlLXNjcmlwdHMuY2pzXCIsXG4gICAgXCJiaW4vdGFnLXJlbGVhc2UuY2pzXCIsXG4gICAgXCJiaW4vYnVpbGQtc2NyaXB0cy5janNcIixcbiAgXSxcbiAgdGVzdHM6IFtcImplc3QuY29uZmlnLnRzXCIsIFwid29ya2RvY3MvcmVwb3J0cy9qZXN0LmNvdmVyYWdlLmNvbmZpZy50c1wiXSxcbiAgdHlwZXNjcmlwdDogW1widHNjb25maWcuanNvblwiXSxcbiAgZG9ja2VyOiBbXCJEb2NrZXJmaWxlXCJdLFxuICBhdXRvbWF0aW9uOiBbXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9HaXRIdWIubWRcIixcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L0ppcmEubWRcIixcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L1RlYW1zLm1kXCIsXG4gIF0sXG59O1xuXG5jb25zdCBhcmd6eiA9IHtcbiAgLy8gaW5pdCBhdHRyaWJ1dGVzXG4gIGJvb3Q6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgb3JnOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJvXCIsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcIm5cIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIGF1dGhvcjoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiYVwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgLy8gdXBkYXRlIGF0dHJpYnV0ZXNcbiAgYWxsOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGxpY2Vuc2U6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIG1lc3NhZ2U6IFwiUGljayB0aGUgbGljZW5zZVwiLFxuICB9LFxuICBzY3JpcHRzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHN0eWxlczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkb2NzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGlkZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB3b3JrZmxvd3M6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdGVtcGxhdGVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHR5cGVzY3JpcHQ6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZG9ja2VyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHBrZzoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkZXBlbmRlbmNpZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdGVzdHM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgYXV0b21hdGlvbjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxufTtcblxuLyoqXG4gKiBAY2xhc3MgVGVtcGxhdGVTeW5jXG4gKiBAZXh0ZW5kcyB7Q29tbWFuZH1cbiAqIEBjYXRlZ29yeSBzY3JpcHRzXG4gKiBAZGVzY3JpcHRpb24gQSBjb21tYW5kLWxpbmUgdG9vbCBmb3Igc3luY2hyb25pemluZyBwcm9qZWN0IHRlbXBsYXRlcyBhbmQgY29uZmlndXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gZG93bmxvYWQgYW5kIHVwZGF0ZSB2YXJpb3VzIHByb2plY3QgZmlsZXMgYW5kIGNvbmZpZ3VyYXRpb25zIGZyb20gYSByZW1vdGUgcmVwb3NpdG9yeS5cbiAqIEl0IHN1cHBvcnRzIHVwZGF0aW5nIGxpY2Vuc2VzLCBJREUgY29uZmlndXJhdGlvbnMsIHNjcmlwdHMsIHN0eWxlcywgZG9jdW1lbnRhdGlvbiwgd29ya2Zsb3dzLCBhbmQgdGVtcGxhdGVzLlxuICpcbiAqIEBwYXJhbSB7Q29tbWFuZE9wdGlvbnN9IGFyZ3MgLSBUaGUgY29tbWFuZCBvcHRpb25zIGZvciBUZW1wbGF0ZVN5bmNcbiAqL1xuZXhwb3J0IGNsYXNzIFRlbXBsYXRlU3luYyBleHRlbmRzIENvbW1hbmQ8Q29tbWFuZE9wdGlvbnM8dHlwZW9mIGFyZ3p6Piwgdm9pZD4ge1xuICBwcml2YXRlIHJlcGxhY2VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiVGVtcGxhdGVTeW5jXCIsIGFyZ3p6KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFZhbHVlc0Zyb21QYWNrYWdlKCkge1xuICAgIGNvbnN0IHAgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IGF1dGhvciA9IGdldFBhY2thZ2UocCwgXCJhdXRob3JcIikgYXMgc3RyaW5nO1xuICAgIGNvbnN0IHNjb3BlZE5hbWUgPSBnZXRQYWNrYWdlKHAsIFwibmFtZVwiKTtcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gc2NvcGVkTmFtZSBhcyBzdHJpbmc7XG4gICAgbGV0IG9yZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IG5hbWUuc3BsaXQoXCIvXCIpO1xuICAgICAgbmFtZSA9IHNwbGl0WzFdO1xuICAgICAgb3JnID0gc3BsaXRbMF0ucmVwbGFjZShcIkBcIiwgXCJcIik7XG4gICAgfVxuICAgIFtcIlRpYWdvIFZlbmNlc2xhdVwiLCBcIlRpYWdvVmVuY2VzbGF1XCIsIFwiJHthdXRob3J9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSBhdXRob3IpXG4gICAgKTtcbiAgICBbXCJUUy1Xb3Jrc3BhY2VcIiwgXCJ0cy13b3Jrc3BhY2VcIiwgXCIke25hbWV9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSBuYW1lKVxuICAgICk7XG4gICAgW1wiZGVjYWYtdHNcIiwgXCIke29yZ31cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IChvcmcgYXMgc3RyaW5nKSB8fCAnXCJcIicpXG4gICAgKTtcbiAgICB0aGlzLnJlcGxhY2VtZW50c1tcIiR7b3JnX29yX293bmVyfVwiXSA9IG9yZyB8fCBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZmlsZXMgZm9yIGEgc3BlY2lmaWMgb3B0aW9uIGNhdGVnb3J5LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBkb3dubG9hZHMgYWxsIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIG9wdGlvbiBrZXkgZnJvbSB0aGUgcmVtb3RlIHJlcG9zaXRvcnkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHJlcHJlc2VudGluZyB0aGUgb3B0aW9uIGNhdGVnb3J5IHRvIGRvd25sb2FkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNwZWNpZmllZCBvcHRpb24ga2V5IGlzIG5vdCBmb3VuZFxuICAgKi9cbiAgYXN5bmMgZG93bmxvYWRPcHRpb24oa2V5OiBrZXlvZiB0eXBlb2Ygb3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGtleSBpbiBvcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBPcHRpb24gXCIke2tleX1cIiBub3QgZm91bmQgaW4gb3B0aW9uc2ApO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IG9wdGlvbnNba2V5IGFzIGtleW9mIHR5cGVvZiBvcHRpb25zXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgdGhpcy5sb2cuaW5mbyhgRG93bmxvYWRpbmcgJHtmaWxlfWApO1xuXG4gICAgICBsZXQgZGF0YSA9IGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9LyR7ZmlsZX1gKTtcbiAgICAgIGRhdGEgPSBwYXRjaFN0cmluZyhkYXRhLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgICB3cml0ZUZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIGZpbGUpLCBkYXRhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhbmQgc2V0cyB1cCB0aGUgc3BlY2lmaWVkIGxpY2Vuc2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGRvd25sb2FkcyB0aGUgY2hvc2VuIGxpY2Vuc2UgZmlsZSwgc2F2ZXMgaXQgdG8gdGhlIHByb2plY3QsIGFuZCB1cGRhdGVzIHRoZSBwYWNrYWdlLmpzb24gbGljZW5zZSBmaWVsZC5cbiAgICogQHBhcmFtIHtcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwifSBsaWNlbnNlIC0gVGhlIGxpY2Vuc2UgdG8gZG93bmxvYWQgYW5kIHNldCB1cFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldExpY2Vuc2UobGljZW5zZTogXCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIikge1xuICAgIHRoaXMubG9nLmluZm8oYERvd25sb2FkaW5nICR7bGljZW5zZX0gbGljZW5zZWApO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9L3dvcmtkb2NzL2xpY2Vuc2VzLyR7bGljZW5zZX0ubWRgO1xuICAgIGxldCBkYXRhID0gYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUodXJsKTtcbiAgICBkYXRhID0gcGF0Y2hTdHJpbmcoZGF0YSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgIHdyaXRlRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJMSUNFTlNFLm1kXCIpLCBkYXRhKTtcbiAgICBzZXRQYWNrYWdlQXR0cmlidXRlKFwibGljZW5zZVwiLCBsaWNlbnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIElERSBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldElkZSgpIHtcbiAgICBmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLmlkZWFcIiwgXCJydW5Db25maWd1cmF0aW9uc1wiKSwge1xuICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuZG93bmxvYWRPcHRpb24oXCJpZGVcIik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBucG0gc2NyaXB0c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIGdldFNjcmlwdHMoKSB7XG4gICAgYXdhaXQgdGhpcy5kb3dubG9hZE9wdGlvbihcInNjcmlwdHNcIik7XG4gICAgdGhpcy5sb2cuaW5mbyhcInBsZWFzZSByZS1ydW4gdGhlIGNvbW1hbmRcIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgc3R5bGUgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRTdHlsZXMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwic3R5bGVzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHRlbXBsYXRlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFRlbXBsYXRlcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0ZW1wbGF0ZXNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgd29ya2Zsb3cgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRXb3JrZmxvd3MgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwid29ya2Zsb3dzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0RG9jcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJkb2NzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHR5cGVzY3JpcHQgY29uZmlnIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFR5cGVzY3JpcHQgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidHlwZXNjcmlwdFwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhdXRvbWF0aW9uIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0QXV0b21hdGlvbiA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJhdXRvbWF0aW9uXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGF1dG9tYXRpb24gZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUZXN0cyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0ZXN0c1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBkb2NrZXIgaW1hZ2UgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0RG9ja2VyID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImRvY2tlclwiKTtcblxuICBhc3luYyBpbml0UGFja2FnZShwa2dOYW1lOiBzdHJpbmcsIGF1dGhvcjogc3RyaW5nLCBsaWNlbnNlOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGtnID0gZ2V0UGFja2FnZSgpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgZGVsZXRlIHBrZ1tTZXR1cFNjcmlwdEtleV07XG4gICAgICBwa2cubmFtZSA9IHBrZ05hbWU7XG4gICAgICBwa2cudmVyc2lvbiA9IFwiMC4wLjFcIjtcbiAgICAgIHBrZy5hdXRob3IgPSBhdXRob3I7XG4gICAgICBwa2cubGljZW5zZSA9IGxpY2Vuc2U7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBhY2thZ2VTY3JpcHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsUGtnID0gSlNPTi5wYXJzZShcbiAgICAgICAgYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vcGFja2FnZS5qc29uYClcbiAgICAgICk7XG4gICAgICBjb25zdCB7IHNjcmlwdHMgfSA9IG9yaWdpbmFsUGtnO1xuXG4gICAgICBjb25zdCBwa2c6IHR5cGVvZiBvcmlnaW5hbFBrZyA9IGdldFBhY2thZ2UoKSBhcyB7XG4gICAgICAgIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmtleXMocGtnLnNjcmlwdHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIHNjcmlwdHMpIHtcbiAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IHBhdGNoU3RyaW5nKHNjcmlwdHNba2V5XSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgICAgICAgIGlmIChyZXBsYWNlZCAhPT0gc2NyaXB0c1trZXldKSB7XG4gICAgICAgICAgICBwa2cuc2NyaXB0c1trZXldID0gcmVwbGFjZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcGtnW1wiZXhwb3J0c1wiXVtcInJlcXVpcmVcIl0gPSBvcmlnaW5hbFBrZ1tcImV4cG9ydHNcIl1bXCJyZXF1aXJlXCJdO1xuICAgICAgcGtnW1wiZXhwb3J0c1wiXVtcImltcG9ydFwiXSA9IG9yaWdpbmFsUGtnW1wiZXhwb3J0c1wiXVtcImltcG9ydFwiXTtcbiAgICAgIHBrZ1tcInR5cGVzXCJdID0gb3JpZ2luYWxQa2dbXCJ0eXBlc1wiXTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb24gc2NyaXB0czogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRva2VuRmlsZXMoKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuY3JlYXRlVG9rZW5GaWxlcyk7XG4gICAgY29uc3QgZ2l0VG9rZW4gPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgIFwidG9rZW5cIixcbiAgICAgIFwicGxlYXNlIGlucHV0IHlvdXIgZ2l0aHViIHRva2VuXCIsXG4gICAgICAocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuICEhcmVzLm1hdGNoKC9eZ2hwX1swLTlhLXpBLVpdezM2fSQvZyk7XG4gICAgICB9XG4gICAgKTtcbiAgICBPYmplY3QudmFsdWVzKFRva2VucykuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBzdGF0dXM7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RhdHVzID0gZnMuZXhpc3RzU3luYyh0b2tlbik7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgbG9nLmluZm8oYFRva2VuIGZpbGUgJHt0b2tlbn0gbm90IGZvdW5kLiBDcmVhdGluZyBhIG5ldyBvbmUuLi5gKTtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRva2VuLCB0b2tlbiA9PT0gXCIudG9rZW5cIiA/IGdpdFRva2VuIDogXCJcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3RhdHVzKSB7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0b2tlbiwgdG9rZW4gPT09IFwiLnRva2VuXCIgPyBnaXRUb2tlbiA6IFwiXCIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgY3JlYXRpbmcgdG9rZW4gZmlsZSAke3Rva2VufTogJHtlfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JnKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3JnID0gYXdhaXQgVXNlcklucHV0LmFza1RleHQoXG4gICAgICBcIk9yZ2FuaXphdGlvblwiLFxuICAgICAgXCJFbnRlciB0aGUgb3JnYW5pemF0aW9uIG5hbWUgKHdpbGwgYmUgdXNlZCB0byBzY29wZSB5b3VyIG5wbSBwcm9qZWN0LiBsZWF2ZSBibGFuayB0byBjcmVhdGUgYSB1bnNjb3BlZCBwcm9qZWN0KTpcIlxuICAgICk7XG4gICAgY29uc3QgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgIFwiQ29uZmlybSBvcmdhbml6YXRpb25cIixcbiAgICAgIFwiSXMgdGhpcyBvcmdhbml6YXRpb24gY29ycmVjdD9cIixcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGlmICghY29uZmlybWF0aW9uKSByZXR1cm4gdGhpcy5nZXRPcmcoKTtcblxuICAgIHJldHVybiBvcmc7XG4gIH1cblxuICBhc3luYyBhdWRpdEZpeCgpIHtcbiAgICByZXR1cm4gYXdhaXQgcnVuQ29tbWFuZChcIm5wbSBhdWRpdCBmaXggLS1mb3JjZVwiKS5wcm9taXNlO1xuICB9XG5cbiAgcGF0Y2hGaWxlcygpIHtcbiAgICBjb25zdCBmaWxlcyA9IFtcbiAgICAgIC4uLmZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJzcmNcIiksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gcGF0aC5qb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSxcbiAgICAgIC4uLmZzXG4gICAgICAgIC5yZWFkZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ3b3JrZG9jc1wiKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkgJiYgZW50cnkubmFtZS5lbmRzV2l0aChcIi5tZFwiKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IHBhdGguam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSksXG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuZ2l0bGFiLWNpLnltbFwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIndvcmtkb2NzXCIsIFwianNkb2NzLmpzb25cIiksXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgcGF0Y2hGaWxlKGZpbGUgYXMgc3RyaW5nLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGVwZW5kZW5jaWVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFBrZyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9L3BhY2thZ2UuanNvbmApXG4gICAgICApO1xuICAgICAgY29uc3QgeyBkZXZEZXBlbmRlbmNpZXMgfSA9IG9yaWdpbmFsUGtnO1xuXG4gICAgICBjb25zdCBwa2c6IHR5cGVvZiBvcmlnaW5hbFBrZyA9IGdldFBhY2thZ2UoKSBhcyB7XG4gICAgICAgIHNjcmlwdHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICB9O1xuICAgICAgT2JqZWN0LmtleXMocGtnLnNjcmlwdHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGRldkRlcGVuZGVuY2llcykge1xuICAgICAgICAgIGNvbnN0IHJlcGxhY2VkID0gZGV2RGVwZW5kZW5jaWVzW2tleV07XG4gICAgICAgICAgaWYgKHJlcGxhY2VkICE9PSBkZXZEZXBlbmRlbmNpZXNba2V5XSkge1xuICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdID1cbiAgICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdIHx8IHt9O1xuICAgICAgICAgICAgKHBrZyBhcyBhbnkpW1wiZGV2RGVwZW5kZW5jaWVzXCJdW2tleV0gPSByZXBsYWNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcIm5wbSBpbnN0YWxsXCIpLnByb21pc2U7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llczogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgdGVtcGxhdGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIG9yY2hlc3RyYXRlcyB0aGUgZG93bmxvYWRpbmcgb2YgdmFyaW91cyBwcm9qZWN0IGNvbXBvbmVudHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFyZ3MgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgVGVtcGxhdGVTeW5jXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBnZXRMaWNlbnNlXG4gICAqICAgcGFydGljaXBhbnQgSSBhcyBnZXRJZGVcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIGdldFNjcmlwdHNcbiAgICogICBwYXJ0aWNpcGFudCBTdCBhcyBnZXRTdHlsZXNcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIGdldERvY3NcbiAgICogICBwYXJ0aWNpcGFudCBXIGFzIGdldFdvcmtmbG93c1xuICAgKiAgIHBhcnRpY2lwYW50IFRlIGFzIGdldFRlbXBsYXRlc1xuICAgKiAgIFQtPj5UOiBQYXJzZSBhcmd1bWVudHNcbiAgICogICBhbHQgYWxsIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlQ6IFNldCBhbGwgY29tcG9uZW50IGZsYWdzIHRvIHRydWVcbiAgICogICBlbmRcbiAgICogICBhbHQgbGljZW5zZSBpcyBzcGVjaWZpZWRcbiAgICogICAgIFQtPj5MOiBnZXRMaWNlbnNlKGxpY2Vuc2UpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGlkZSBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5JOiBnZXRJZGUoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBzY3JpcHRzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlM6IGdldFNjcmlwdHMoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBzdHlsZXMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+U3Q6IGdldFN0eWxlcygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGRvY3MgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+RDogZ2V0RG9jcygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHdvcmtmbG93cyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5XOiBnZXRXb3JrZmxvd3MoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCB0ZW1wbGF0ZXMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VGU6IGdldFRlbXBsYXRlcygpXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgYXJnczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIHR5cGVvZiBhcmd6el06IHVua25vd24gfVxuICApIHtcbiAgICBsZXQgeyBsaWNlbnNlIH0gPSBhcmdzO1xuICAgIGNvbnN0IHsgYm9vdCB9ID0gYXJncztcbiAgICBsZXQge1xuICAgICAgYWxsLFxuICAgICAgc2NyaXB0cyxcbiAgICAgIHN0eWxlcyxcbiAgICAgIGRvY3MsXG4gICAgICBpZGUsXG4gICAgICB3b3JrZmxvd3MsXG4gICAgICB0ZW1wbGF0ZXMsXG4gICAgICBkb2NrZXIsXG4gICAgICB0eXBlc2NyaXB0LFxuICAgICAgZGVwZW5kZW5jaWVzLFxuICAgICAgdGVzdHMsXG4gICAgICBhdXRvbWF0aW9uLFxuICAgICAgcGtnLFxuICAgIH0gPSBhcmdzO1xuICAgIGlmIChcbiAgICAgIHNjcmlwdHMgfHxcbiAgICAgIHN0eWxlcyB8fFxuICAgICAgZG9jcyB8fFxuICAgICAgaWRlIHx8XG4gICAgICB3b3JrZmxvd3MgfHxcbiAgICAgIHRlbXBsYXRlcyB8fFxuICAgICAgZG9ja2VyIHx8XG4gICAgICB0eXBlc2NyaXB0IHx8XG4gICAgICBhdXRvbWF0aW9uIHx8XG4gICAgICBkZXBlbmRlbmNpZXMgfHxcbiAgICAgIHRlc3RzIHx8XG4gICAgICBwa2dcbiAgICApXG4gICAgICBhbGwgPSBmYWxzZTtcblxuICAgIGlmIChib290KSB7XG4gICAgICBjb25zdCBvcmcgPSBhd2FpdCB0aGlzLmdldE9yZygpO1xuICAgICAgY29uc3QgbmFtZSA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIlByb2plY3QgbmFtZVwiLFxuICAgICAgICBcIkVudGVyIHRoZSBwcm9qZWN0IG5hbWU6XCIsXG4gICAgICAgIChyZXM6IHN0cmluZykgPT4gcmVzLmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICBjb25zdCBhdXRob3IgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJBdXRob3JcIixcbiAgICAgICAgXCJFbnRlciB0aGUgYXV0aG9yIG5hbWU6XCIsXG4gICAgICAgIChyZXM6IHN0cmluZykgPT4gcmVzLmxlbmd0aCA+IDFcbiAgICAgICk7XG4gICAgICBjb25zdCBwa2dOYW1lID0gb3JnID8gYEAke29yZ30vJHtuYW1lfWAgOiBuYW1lO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXRQYWNrYWdlKHBrZ05hbWUsIGF1dGhvciwgbGljZW5zZSBhcyBzdHJpbmcpO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVUb2tlbkZpbGVzKCk7XG4gICAgICBhd2FpdCB0aGlzLmF1ZGl0Rml4KCk7XG4gICAgICB0aGlzLnBhdGNoRmlsZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoYWxsKSB7XG4gICAgICBzY3JpcHRzID0gZmFsc2U7XG4gICAgICBzdHlsZXMgPSB0cnVlO1xuICAgICAgZG9jcyA9IHRydWU7XG4gICAgICBpZGUgPSB0cnVlO1xuICAgICAgd29ya2Zsb3dzID0gdHJ1ZTtcbiAgICAgIHRlbXBsYXRlcyA9IHRydWU7XG4gICAgICBkb2NrZXIgPSB0cnVlO1xuICAgICAgdHlwZXNjcmlwdCA9IHRydWU7XG4gICAgICBwa2cgPSB0cnVlO1xuICAgICAgZGVwZW5kZW5jaWVzID0gdHJ1ZTtcbiAgICAgIHRlc3RzID0gdHJ1ZTtcbiAgICAgIGF1dG9tYXRpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNjcmlwdHMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBzY3JpcHRzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJzY3JpcHRzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHNjcmlwdHM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoc2NyaXB0cykgYXdhaXQgdGhpcy5nZXRTY3JpcHRzKCk7XG5cbiAgICB0aGlzLmxvYWRWYWx1ZXNGcm9tUGFja2FnZSgpO1xuICAgIGlmICghYWxsICYmIHR5cGVvZiBsaWNlbnNlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBjb25maXJtYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImxpY2Vuc2VcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBzZXQgYSBsaWNlbnNlP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgICAgaWYgKGNvbmZpcm1hdGlvbilcbiAgICAgICAgbGljZW5zZSA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICAgIFwibGljZW5zZVwiLFxuICAgICAgICAgIFwiRW50ZXIgdGhlIGRlc2lyZWQgTGljZW5zZSAoTUlUfEdQTHxBcGFjaGV8TEdQTHxBR1BMKTpcIixcbiAgICAgICAgICAodmFsKSA9PiAhIXZhbCAmJiAhIXZhbC5tYXRjaCgvXihNSVR8R1BMfEFwYWNoZXxMR1BMfEFHUEwpJC9nKVxuICAgICAgICApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGxpY2Vuc2UgIT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBhd2FpdCB0aGlzLmdldExpY2Vuc2UoXG4gICAgICAgIGxpY2Vuc2UgYXMgXCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIlxuICAgICAgKTtcblxuICAgIGlmICh0eXBlb2YgaWRlID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgaWRlID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJpZGVcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgaWRlIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoaWRlKSBhd2FpdCB0aGlzLmdldElkZSgpO1xuXG4gICAgaWYgKHR5cGVvZiB0eXBlc2NyaXB0ID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdHlwZXNjcmlwdCA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwidHlwZXNjcmlwdFwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB0eXBlc2NyaXB0IGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHR5cGVzY3JpcHQpIGF3YWl0IHRoaXMuZ2V0VHlwZXNjcmlwdCgpO1xuXG4gICAgaWYgKHR5cGVvZiBkb2NrZXIgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkb2NrZXIgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImRvY2tlclwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBkb2NrZXIgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChkb2NrZXIpIGF3YWl0IHRoaXMuZ2V0RG9ja2VyKCk7XG4gICAgaWYgKHR5cGVvZiBhdXRvbWF0aW9uID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgYXV0b21hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiYXV0b21hdGlvblwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBhdXRvbWF0aW9uIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGF1dG9tYXRpb24pIGF3YWl0IHRoaXMuZ2V0QXV0b21hdGlvbigpO1xuXG4gICAgaWYgKHR5cGVvZiBzdHlsZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBzdHlsZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInN0eWxlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBzdHlsZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHN0eWxlcykgYXdhaXQgdGhpcy5nZXRTdHlsZXMoKTtcblxuICAgIGlmICh0eXBlb2YgZG9jcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRvY3MgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImRvY3NcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgZG9jcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoZG9jcykgYXdhaXQgdGhpcy5nZXREb2NzKCk7XG4gICAgaWYgKHR5cGVvZiB3b3JrZmxvd3MgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB3b3JrZmxvd3MgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcIndvcmtmbG93c1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB3b3JrZmxvd3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHdvcmtmbG93cykgYXdhaXQgdGhpcy5nZXRXb3JrZmxvd3MoKTtcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRlbXBsYXRlcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwidGVtcGxhdGVzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHRlbXBsYXRlcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodGVtcGxhdGVzKSBhd2FpdCB0aGlzLmdldFRlbXBsYXRlcygpO1xuICAgIGlmICh0eXBlb2YgcGtnID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgcGtnID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgeW91ciBwYWNrYWdlLmpzb24gc2NyaXB0cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAocGtnKSBhd2FpdCB0aGlzLnVwZGF0ZVBhY2thZ2VTY3JpcHMoKTtcblxuICAgIGlmICh0eXBlb2YgdGVzdHMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0ZXN0cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIHlvdXIgdGVzdCBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0ZXN0cykgYXdhaXQgdGhpcy5nZXRUZXN0cygpO1xuXG4gICAgaWYgKHR5cGVvZiBkZXBlbmRlbmNpZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkZXBlbmRlbmNpZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSBkZXYgZGVwZW5kZW5jaWVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChkZXBlbmRlbmNpZXMpIGF3YWl0IHRoaXMudXBkYXRlRGVwZW5kZW5jaWVzKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFN0YW5kYXJkT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4vU3RhbmRhcmRPdXRwdXRXcml0ZXJcIjtcbmltcG9ydCB7IFByb21pc2VFeGVjdXRvciB9IGZyb20gXCIuLi91dGlscy90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHNwZWNpYWxpemVkIG91dHB1dCB3cml0ZXIgdGhhdCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gcHJvY2VzcyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXIgdG8gcHJvdmlkZSByZWdleC1iYXNlZCBvdXRwdXQgcHJvY2Vzc2luZy5cbiAqIEl0IGFsbG93cyBmb3IgcGF0dGVybiBtYXRjaGluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbSBhbmQgY2FuIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9uc1xuICogYmFzZWQgb24gbWF0Y2hlZCBwYXR0ZXJucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGNtZCAtIFRoZSBjb21tYW5kIHN0cmluZyB0byBiZSBleGVjdXRlZC5cbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBmbGFncyAtIE9wdGlvbmFsIGZsYWdzIGZvciB0aGUgUmVnRXhwIGNvbnN0cnVjdG9yLCBkZWZhdWx0cyB0byBcImdcIi5cbiAqXG4gKiBAY2xhc3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBSZWdleHBPdXRwdXRXcml0ZXIgfSBmcm9tICdAZGVjYWYtdHMvdXRpbHMnO1xuICogaW1wb3J0IHsgUHJvbWlzZUV4ZWN1dG9yIH0gZnJvbSAnQGRlY2FmLXRzL3V0aWxzJztcbiAqIFxuICogLy8gQ3JlYXRlIGEgcHJvbWlzZSBleGVjdXRvclxuICogY29uc3QgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxzdHJpbmcsIEVycm9yPiA9IHtcbiAqICAgcmVzb2x2ZTogKHZhbHVlKSA9PiBjb25zb2xlLmxvZyhgUmVzb2x2ZWQ6ICR7dmFsdWV9YCksXG4gKiAgIHJlamVjdDogKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBSZWplY3RlZDogJHtlcnJvci5tZXNzYWdlfWApXG4gKiB9O1xuICogXG4gKiAvLyBDcmVhdGUgYSByZWdleHAgb3V0cHV0IHdyaXRlciB0aGF0IG1hdGNoZXMgdmVyc2lvbiBudW1iZXJzXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUmVnZXhwT3V0cHV0V3JpdGVyKCdub2RlIC0tdmVyc2lvbicsIGV4ZWN1dG9yLCAvdihcXGQrXFwuXFxkK1xcLlxcZCspLyk7XG4gKiBcbiAqIC8vIFVzZSB0aGUgd3JpdGVyIHRvIGhhbmRsZSBjb21tYW5kIG91dHB1dFxuICogd3JpdGVyLmRhdGEoJ3YxNC4xNy4wJyk7ICAvLyBUaGlzIHdpbGwgYXV0b21hdGljYWxseSByZXNvbHZlIHdpdGggXCJ2MTQuMTcuMFwiXG4gKiBgYGBcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZWdleHBPdXRwdXRXcml0ZXJcbiAqICAgcGFydGljaXBhbnQgU3RhbmRhcmRPdXRwdXRXcml0ZXJcbiAqICAgcGFydGljaXBhbnQgTG9nZ2VyXG4gKiAgIFxuICogICBDbGllbnQtPj5SZWdleHBPdXRwdXRXcml0ZXI6IG5ldyBSZWdleHBPdXRwdXRXcml0ZXIoY21kLCBsb2NrLCByZWdleHAsIGZsYWdzKVxuICogICBSZWdleHBPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogc3VwZXIoY21kLCBsb2NrKVxuICogICBTdGFuZGFyZE91dHB1dFdyaXRlci0+PkxvZ2dlcjogTG9nZ2luZy5mb3IoY21kKVxuICogICBSZWdleHBPdXRwdXRXcml0ZXItPj5SZWdleHBPdXRwdXRXcml0ZXI6IGNvbXBpbGUgcmVnZXhwXG4gKiAgIFxuICogICBDbGllbnQtPj5SZWdleHBPdXRwdXRXcml0ZXI6IGRhdGEoY2h1bmspXG4gKiAgIFJlZ2V4cE91dHB1dFdyaXRlci0+PlN0YW5kYXJkT3V0cHV0V3JpdGVyOiBzdXBlci5kYXRhKGNodW5rKVxuICogICBTdGFuZGFyZE91dHB1dFdyaXRlci0+PkxvZ2dlcjogbG9nZ2VyLmluZm8obG9nKVxuICogICBSZWdleHBPdXRwdXRXcml0ZXItPj5SZWdleHBPdXRwdXRXcml0ZXI6IHRlc3RBbmRSZXNvbHZlKGNodW5rKVxuICogICBSZWdleHBPdXRwdXRXcml0ZXItPj5SZWdleHBPdXRwdXRXcml0ZXI6IHRlc3QoY2h1bmspXG4gKiAgIGFsdCBtYXRjaCBmb3VuZFxuICogICAgIFJlZ2V4cE91dHB1dFdyaXRlci0+PlJlZ2V4cE91dHB1dFdyaXRlcjogcmVzb2x2ZShtYXRjaFswXSlcbiAqICAgICBSZWdleHBPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogcmVzb2x2ZShtYXRjaFswXSlcbiAqICAgZW5kXG4gKiAgIFxuICogICBDbGllbnQtPj5SZWdleHBPdXRwdXRXcml0ZXI6IGVycm9yKGNodW5rKVxuICogICBSZWdleHBPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogc3VwZXIuZXJyb3IoY2h1bmspXG4gKiAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyLT4+TG9nZ2VyOiBsb2dnZXIuaW5mbyhsb2cpXG4gKiAgIFJlZ2V4cE91dHB1dFdyaXRlci0+PlJlZ2V4cE91dHB1dFdyaXRlcjogdGVzdEFuZFJlamVjdChjaHVuaylcbiAqICAgUmVnZXhwT3V0cHV0V3JpdGVyLT4+UmVnZXhwT3V0cHV0V3JpdGVyOiB0ZXN0KGNodW5rKVxuICogICBhbHQgbWF0Y2ggZm91bmRcbiAqICAgICBSZWdleHBPdXRwdXRXcml0ZXItPj5SZWdleHBPdXRwdXRXcml0ZXI6IHJlamVjdChtYXRjaFswXSlcbiAqICAgICBSZWdleHBPdXRwdXRXcml0ZXItPj5TdGFuZGFyZE91dHB1dFdyaXRlcjogcmVqZWN0KG1hdGNoWzBdKVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2V4cE91dHB1dFdyaXRlciBleHRlbmRzIFN0YW5kYXJkT3V0cHV0V3JpdGVyPHN0cmluZz4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgbWF0Y2hpbmcgb3V0cHV0LlxuICAgKiBAc3VtbWFyeSBUaGlzIHJlYWRvbmx5IHByb3BlcnR5IHN0b3JlcyB0aGUgY29tcGlsZWQgUmVnRXhwIHVzZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVnZXhwOiBSZWdFeHA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY21kOiBzdHJpbmcsXG4gICAgbG9jazogUHJvbWlzZUV4ZWN1dG9yPHN0cmluZywgRXJyb3I+LFxuICAgIHJlZ2V4cDogc3RyaW5nIHwgUmVnRXhwLFxuICAgIGZsYWdzID0gXCJnXCJcbiAgKSB7XG4gICAgc3VwZXIoY21kLCBsb2NrKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5yZWdleHAgPVxuICAgICAgICB0eXBlb2YgcmVnZXhwID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChyZWdleHAsIGZsYWdzKSA6IHJlZ2V4cDtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcmVndWxhciBleHByZXNzaW9uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgaW5wdXQgZGF0YSBhZ2FpbnN0IHRoZSBzdG9yZWQgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBpbnB1dCBkYXRhIGFuZCByZXR1cm5zIHRoZSBtYXRjaCByZXN1bHQuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZXhlY3V0aW9uLCBvciB1bmRlZmluZWQgaWYgYW4gZXJyb3Igb2NjdXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0KGRhdGE6IHN0cmluZykge1xuICAgIHRoaXMucmVnZXhwLmxhc3RJbmRleCA9IDA7XG4gICAgbGV0IG1hdGNoO1xuICAgIHRyeSB7XG4gICAgICBtYXRjaCA9IHRoaXMucmVnZXhwLmV4ZWMoZGF0YSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUuZGVidWcoYEZhaWxlZCB0byBwYXJzZSBjaHVuazogJHtkYXRhfVxcbkVycm9yOiAke2V9IGApO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIHdpdGggdGhlIGZpcnN0IG1hdGNoIGdyb3VwIGlmIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCB0ZXN0QW5kUmVzb2x2ZShkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVzb2x2ZShtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBkYXRhIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSB0ZXN0IG1ldGhvZCBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlamVjdChkYXRhOiBzdHJpbmcpIHtcbiAgICBjb25zdCBtYXRjaCA9IHRoaXMudGVzdChkYXRhKTtcbiAgICBpZiAobWF0Y2gpIHRoaXMucmVqZWN0KG1hdGNoWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGRhdGEgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGRhdGEgbWV0aG9kIGFuZCB0aGVuIHRlc3RzIHRoZSBkYXRhIGZvciBhIG1hdGNoIHRvIHBvdGVudGlhbGx5IHJlc29sdmUgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIHByb2Nlc3MuXG4gICAqL1xuICBvdmVycmlkZSBkYXRhKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5kYXRhKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZXNvbHZlKFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgZXJyb3IgY2h1bmtzLlxuICAgKiBAc3VtbWFyeSBDYWxscyB0aGUgcGFyZW50IGNsYXNzIGVycm9yIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZWplY3QgdGhlIHByb21pc2UuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgb3ZlcnJpZGUgZXJyb3IoY2h1bms6IGFueSkge1xuICAgIHN1cGVyLmVycm9yKGNodW5rKTtcbiAgICB0aGlzLnRlc3RBbmRSZWplY3QoU3RyaW5nKGNodW5rKSk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2NsaVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL291dHB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dyaXRlcnNcIjtcblxuLyoqXG4gKiBAbW9kdWxlIHV0aWxzXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0aWVzIGFuZCBidWlsZGluZyBibG9ja3MgZm9yIERlY2FmLVRTIENMSSBhbmQgc2NyaXB0aW5nLlxuICogQHN1bW1hcnkgQWdncmVnYXRlcyBDTEkgY29tbWFuZCBpbmZyYXN0cnVjdHVyZSwgaW5wdXQgaGVscGVycywgb3V0cHV0IHdyaXRlcnMsIGZpbGVzeXN0ZW0vbmV0d29yayB1dGlsaXRpZXMsXG4gKiBhbmQgc2hhcmVkIHR5cGVzLiBDb25zdW1lcnMgdHlwaWNhbGx5IHVzZSB7QGxpbmsgQ29tbWFuZH0sIHtAbGluayBVc2VySW5wdXR9LCB7QGxpbmsgU3RhbmRhcmRPdXRwdXRXcml0ZXJ9LFxuICoge0BsaW5rIHByaW50QmFubmVyfSwgYW5kIHV0aWxpdGllcyBmcm9tIHtAbGluayBtb2R1bGU6dXRpbHN8dXRpbHN9LlxuICpcbiAqIFRoaXMgZW50cnlwb2ludCByZS1leHBvcnRzIHN1YnBhY2thZ2VzOlxuICogLSBDTEkgZnJhbWV3b3JrIHVuZGVyIGAuL2NsaWAgKGNvbW1hbmQgYmFzZSwgb3B0aW9ucywgYnVpbHQtaW4gY29tbWFuZHMpXG4gKiAtIElucHV0IGhlbHBlcnMgdW5kZXIgYC4vaW5wdXRgIChwcm9tcHRpbmcgYW5kIGFyZyBwYXJzaW5nKVxuICogLSBPdXRwdXQgaGVscGVycyB1bmRlciBgLi9vdXRwdXRgIChiYW5uZXIgYW5kIHN0eWxpbmcpXG4gKiAtIEdlbmVyYWwgdXRpbGl0aWVzIHVuZGVyIGAuL3V0aWxzYCAoZnMsIGh0dHAsIGV4ZWMsIHR5cGVzKVxuICogLSBXcml0ZXJzIHVuZGVyIGAuL3dyaXRlcnNgIChzdGRvdXQvc3RkZXJyIHByb2Nlc3NvcnMpXG4gKlxuICogTm90ZTogSW5kaXZpZHVhbCBleHBvcnRzIGFyZSBkb2N1bWVudGVkIGluIHRoZWlyIHNvdXJjZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIG1vZHVsZS5cbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgdmVyc2lvbiBmb3IgdGhlIEBkZWNhZi10cy91dGlscyBwYWNrYWdlLiBUaGUgYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBwbGFjZWhvbGRlciB3aXRoIHRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgYXQgcHVibGlzaCB0aW1lLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSB2ZXJzaW9uIGZvciB0aGUgQGRlY2FmLXRzL3V0aWxzIHBhY2thZ2UuIFRoZSBidWlsZCByZXBsYWNlc1xuICogdGhlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBhdCBwdWJsaXNoIHRpbWUuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0UjI1wiO1xuIl0sIm5hbWVzIjpbIkxvZ2dpbmciLCJwYXJzZUFyZ3MiLCJTZW1WZXJzaW9uIiwiVG9rZW5zIiwic3R5bGUiLCJzcGF3biIsInBhdGNoU3RyaW5nIiwiTG9nZ2VkQ2xhc3MiLCJMb2dnZWRFbnZpcm9ubWVudCIsIm9wdGlvbnMiLCJ0cyIsIk1vZHVsZUtpbmQiLCJub2RlUmVzb2x2ZSIsInJvbGx1cCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWdCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQXVERztVQUNVLFNBQVMsQ0FBQTtpQkFDSSxJQUFNLENBQUEsTUFBQSxHQUFHQSxlQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBd0p4RCxJQUFBLFdBQUEsQ0FBWSxJQUFvQixFQUFBO0lBdkpoQzs7O0lBR0c7WUFDSCxJQUFJLENBQUEsSUFBQSxHQUEyRCxNQUFNO0lBb0puRSxRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSTs7SUFHbEI7Ozs7OztJQU1HO0lBQ0gsSUFBQSxPQUFPLENBQUMsSUFBNEQsRUFB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