appium 2.0.0-beta.43 → 2.0.0-beta.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/build/lib/appium.d.ts +137 -15
  2. package/build/lib/appium.d.ts.map +1 -1
  3. package/build/lib/appium.js +5 -5
  4. package/build/lib/appium.js.map +1 -0
  5. package/build/lib/cli/args.js +3 -3
  6. package/build/lib/cli/args.js.map +1 -0
  7. package/build/lib/cli/driver-command.js +3 -3
  8. package/build/lib/cli/driver-command.js.map +1 -0
  9. package/build/lib/cli/extension-command.d.ts.map +1 -1
  10. package/build/lib/cli/extension-command.js +4 -4
  11. package/build/lib/cli/extension-command.js.map +1 -0
  12. package/build/lib/cli/extension.js +3 -3
  13. package/build/lib/cli/extension.js.map +1 -0
  14. package/build/lib/cli/parser.js +3 -3
  15. package/build/lib/cli/parser.js.map +1 -0
  16. package/build/lib/cli/plugin-command.js +3 -3
  17. package/build/lib/cli/plugin-command.js.map +1 -0
  18. package/build/lib/cli/utils.js +3 -3
  19. package/build/lib/cli/utils.js.map +1 -0
  20. package/build/lib/config-file.js +3 -3
  21. package/build/lib/config-file.js.map +1 -0
  22. package/build/lib/config.js +3 -3
  23. package/build/lib/config.js.map +1 -0
  24. package/build/lib/constants.js +3 -3
  25. package/build/lib/constants.js.map +1 -0
  26. package/build/lib/extension/driver-config.d.ts +3 -2
  27. package/build/lib/extension/driver-config.d.ts.map +1 -1
  28. package/build/lib/extension/driver-config.js +3 -3
  29. package/build/lib/extension/driver-config.js.map +1 -0
  30. package/build/lib/extension/extension-config.js +3 -3
  31. package/build/lib/extension/extension-config.js.map +1 -0
  32. package/build/lib/extension/index.js +3 -3
  33. package/build/lib/extension/index.js.map +1 -0
  34. package/build/lib/extension/manifest.d.ts +1 -2
  35. package/build/lib/extension/manifest.d.ts.map +1 -1
  36. package/build/lib/extension/manifest.js +35 -30
  37. package/build/lib/extension/manifest.js.map +1 -0
  38. package/build/lib/extension/package-changed.js +3 -3
  39. package/build/lib/extension/package-changed.js.map +1 -0
  40. package/build/lib/extension/plugin-config.js +3 -3
  41. package/build/lib/extension/plugin-config.js.map +1 -0
  42. package/build/lib/grid-register.js +3 -3
  43. package/build/lib/grid-register.js.map +1 -0
  44. package/build/lib/logger.js.map +1 -0
  45. package/build/lib/logsink.js +3 -3
  46. package/build/lib/logsink.js.map +1 -0
  47. package/build/lib/main.d.ts.map +1 -1
  48. package/build/lib/main.js +4 -3
  49. package/build/lib/main.js.map +1 -0
  50. package/build/lib/schema/arg-spec.js +3 -3
  51. package/build/lib/schema/arg-spec.js.map +1 -0
  52. package/build/lib/schema/cli-args.js +3 -3
  53. package/build/lib/schema/cli-args.js.map +1 -0
  54. package/build/lib/schema/cli-transformers.d.ts +1 -1
  55. package/build/lib/schema/cli-transformers.d.ts.map +1 -1
  56. package/build/lib/schema/cli-transformers.js +23 -18
  57. package/build/lib/schema/cli-transformers.js.map +1 -0
  58. package/build/lib/schema/index.js.map +1 -0
  59. package/build/lib/schema/keywords.js.map +1 -0
  60. package/build/lib/schema/schema.js +3 -3
  61. package/build/lib/schema/schema.js.map +1 -0
  62. package/build/lib/utils.d.ts +296 -27
  63. package/build/lib/utils.d.ts.map +1 -1
  64. package/build/lib/utils.js +60 -27
  65. package/build/lib/utils.js.map +1 -0
  66. package/build/tsconfig.tsbuildinfo +1 -1
  67. package/lib/appium.js +32 -18
  68. package/lib/cli/extension-command.js +2 -1
  69. package/lib/extension/driver-config.js +2 -1
  70. package/lib/extension/manifest.js +49 -32
  71. package/lib/main.js +3 -1
  72. package/lib/schema/cli-transformers.js +27 -23
  73. package/lib/utils.js +143 -62
  74. package/package.json +17 -18
  75. package/test.d.ts +0 -7
  76. package/test.js +0 -13
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-args.js","names":["TYPENAMES","Object","freeze","ARRAY","OBJECT","BOOLEAN","INTEGER","NUMBER","NULL","STRING","SHORT_ARG_CUTOFF","aliasToFlag","argSpec","alias","extType","extName","name","arg","isShort","length","_","kebabCase","screamingSnakeCase","flow","snakeCase","toUpper","getSchemaValidator","ref","schemaId","coerce","identity","value","coerced","errors","validate","isEmpty","ArgumentTypeError","formatErrors","makeDescription","schema","appiumCliDescription","description","appiumDeprecated","desc","subSchemaToArgDef","subSchema","type","appiumCliAliases","appiumCliTransformer","enum","enumValues","aliases","map","argOpts","required","help","argTypeFunction","action","const","transformers","json","csv","parseFloat","parseInt","TypeError","metavar","choices","String","toParserArgs","flattened","flattenSchema","filter","appiumCliIgnored","Map"],"sources":["../../../lib/schema/cli-args.js"],"sourcesContent":["import {ArgumentTypeError} from 'argparse';\nimport _ from 'lodash';\nimport {formatErrors as formatErrors} from '../config-file';\nimport {flattenSchema, validate} from './schema';\nimport {transformers} from './cli-transformers';\n\n/**\n * This module concerns functions which convert schema definitions to\n * `argparse`-compatible data structures, for deriving CLI arguments from a\n * schema.\n */\n\n/**\n * Lookup of possible values for the `type` field in a JSON schema.\n * @type {Readonly<Record<string, import('json-schema').JSONSchema7TypeName>>}\n */\nconst TYPENAMES = Object.freeze({\n ARRAY: 'array',\n OBJECT: 'object',\n BOOLEAN: 'boolean',\n INTEGER: 'integer',\n NUMBER: 'number',\n NULL: 'null',\n STRING: 'string',\n});\n\n/**\n * Options with alias lengths less than this will be considered \"short\" flags.\n */\nconst SHORT_ARG_CUTOFF = 3;\n\n/**\n * Convert an alias (`foo`) to a flag (`--foo`) or a short flag (`-f`).\n * @param {ArgSpec} argSpec - the argument specification\n * @param {string} [alias] - the alias to convert to a flag\n * @returns {string} the flag\n */\nfunction aliasToFlag(argSpec, alias) {\n const {extType, extName, name} = argSpec;\n const arg = alias ?? name;\n const isShort = arg.length < SHORT_ARG_CUTOFF;\n if (extType && extName) {\n return isShort\n ? `--${extType}-${_.kebabCase(extName)}-${arg}`\n : `--${extType}-${_.kebabCase(extName)}-${_.kebabCase(arg)}`;\n }\n return isShort ? `-${arg}` : `--${_.kebabCase(arg)}`;\n}\n\n/**\n * Converts a string to SCREAMING_SNAKE_CASE\n */\nconst screamingSnakeCase = _.flow(_.snakeCase, _.toUpper);\n\n/**\n * Given unique property name `name`, return a function which validates a value\n * against a property within the schema.\n * @template Coerced\n * @param {ArgSpec} argSpec - Argument name\n * @param {(value: string) => Coerced} [coerce] - Function to coerce to a different\n * primitive\n * @todo See if we can remove `coerce` by allowing Ajv to coerce in its\n * constructor options\n * @returns\n */\nfunction getSchemaValidator({ref: schemaId}, coerce = _.identity) {\n /** @param {string} value */\n return (value) => {\n const coerced = coerce(value);\n const errors = validate(coerced, schemaId);\n if (_.isEmpty(errors)) {\n return coerced;\n }\n throw new ArgumentTypeError('\\n\\n' + formatErrors(errors, value, {schemaId}));\n };\n}\n\n/**\n * Determine the description for display on the CLI, given the schema.\n * @param {AppiumJSONSchema} schema\n * @returns {string}\n */\nfunction makeDescription(schema) {\n const {appiumCliDescription, description = '', appiumDeprecated} = schema;\n let desc = appiumCliDescription ?? description;\n if (appiumDeprecated) {\n desc = `[DEPRECATED] ${desc}`;\n }\n return desc;\n}\n\n/**\n * Given arg `name`, a JSON schema `subSchema`, and options, return an argument definition\n * as understood by `argparse`.\n * @param {AppiumJSONSchema} subSchema - JSON schema for the option\n * @param {ArgSpec} argSpec - Argument spec tuple\n * @returns {[string[], import('argparse').ArgumentOptions]} Tuple of flag and options\n */\nfunction subSchemaToArgDef(subSchema, argSpec) {\n let {type, appiumCliAliases, appiumCliTransformer, enum: enumValues} = subSchema;\n\n const {name, arg} = argSpec;\n\n const aliases = [\n aliasToFlag(argSpec),\n .../** @type {string[]} */ (appiumCliAliases ?? []).map((alias) => aliasToFlag(argSpec, alias)),\n ];\n\n /** @type {import('argparse').ArgumentOptions} */\n let argOpts = {\n required: false,\n help: makeDescription(subSchema),\n };\n\n /**\n * Generally we will provide a `type` to `argparse` as a function which\n * validates using ajv (which is much more full-featured than what `argparse`\n * can offer). The exception is `boolean`-type options, which have no\n * `argType`.\n *\n * Not sure if this type is correct, but it's not doing what I want. I want\n * to say \"this is a function which returns something of type `T` where `T` is\n * never a `Promise`\". This function must be sync.\n * @type {((value: string) => unknown)|undefined}\n */\n let argTypeFunction;\n\n // handle special cases for various types\n switch (type) {\n // booleans do not have a type per `ArgumentOptions`, just an \"action\"\n // NOTE: due to limitations of `argparse`, we cannot provide fancy help text, and must rely on its internal error messaging.\n case TYPENAMES.BOOLEAN: {\n argOpts.action = 'store_const';\n argOpts.const = true;\n break;\n }\n\n case TYPENAMES.OBJECT: {\n argTypeFunction = transformers.json;\n break;\n }\n\n // arrays are treated as CSVs, because `argparse` doesn't handle array data.\n case TYPENAMES.ARRAY: {\n argTypeFunction = transformers.csv;\n break;\n }\n\n // \"number\" type is coerced to float. `argparse` does this for us if we use `float` type, but\n // we don't.\n case TYPENAMES.NUMBER: {\n argTypeFunction = getSchemaValidator(argSpec, parseFloat);\n break;\n }\n\n // \"integer\" is coerced to an .. integer. again, `argparse` would do this for us if we used `int`.\n case TYPENAMES.INTEGER: {\n argTypeFunction = getSchemaValidator(argSpec, _.parseInt);\n break;\n }\n\n // strings (like number and integer) are subject to further validation\n // (e.g., must satisfy a mask or regex or even some custom validation\n // function)\n case TYPENAMES.STRING: {\n argTypeFunction = getSchemaValidator(argSpec);\n break;\n }\n\n // TODO: there may be some way to restrict this at the Ajv level --\n // that may involve patching the metaschema.\n case TYPENAMES.NULL:\n // falls through\n default: {\n throw new TypeError(`Schema property \"${arg}\": \\`${type}\\` type unknown or disallowed`);\n }\n }\n\n // metavar is used in help text. `boolean` cannot have a metavar--it is not\n // displayed--and `argparse` throws if you give it one.\n if (type !== TYPENAMES.BOOLEAN) {\n argOpts.metavar = screamingSnakeCase(name);\n }\n\n // the validity of \"appiumCliTransformer\" should already have been determined\n // by ajv during schema validation in `finalizeSchema()`. the `array` &\n // `object` types have already added a formatter (see above, so we don't do it\n // twice).\n if (type !== TYPENAMES.ARRAY && type !== TYPENAMES.OBJECT && appiumCliTransformer) {\n argTypeFunction = _.flow(argTypeFunction ?? _.identity, transformers[appiumCliTransformer]);\n }\n\n if (argTypeFunction) {\n argOpts.type = argTypeFunction;\n }\n\n // convert JSON schema `enum` to `choices`. `enum` can contain any JSON type, but `argparse`\n // is limited to a single type per arg (I think). so let's make everything a string.\n // and might as well _require_ the `type: string` while we're at it.\n if (enumValues && !_.isEmpty(enumValues)) {\n if (type === TYPENAMES.STRING) {\n argOpts.choices = enumValues.map(String);\n } else {\n throw new TypeError(\n `Problem with schema for ${arg}; \\`enum\\` is only supported for \\`type: 'string'\\``\n );\n }\n }\n\n return [aliases, argOpts];\n}\n\n/**\n * Converts the finalized, flattened schema representation into\n * ArgumentDefinitions for handoff to `argparse`.\n *\n * @throws If schema has not been added to ajv (via `finalizeSchema()`)\n * @returns {import('../cli/args').ArgumentDefinitions} A map of arryas of\n * aliases to `argparse` arguments; empty if no schema found\n */\nexport function toParserArgs() {\n const flattened = flattenSchema().filter(({schema}) => !schema.appiumCliIgnored);\n return new Map(_.map(flattened, ({schema, argSpec}) => subSchemaToArgDef(schema, argSpec)));\n}\n\n/**\n * @template T\n * @typedef {import('ajv/dist/types').FormatValidator<T>} FormatValidator<T>\n */\n\n/**\n * A JSON 7 schema with our custom keywords.\n * @typedef {import('./keywords').AppiumJSONSchemaKeywords & import('json-schema').JSONSchema7} AppiumJSONSchema\n */\n\n/**\n * @typedef {import('./arg-spec').ArgSpec} ArgSpec\n */\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export namespace transformers {
2
- function csv(value: string): string[];
2
+ function csv(csvOrPath: string): string[];
3
3
  function json(jsonOrPath: string): any;
4
4
  }
5
5
  //# sourceMappingURL=cli-transformers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-transformers.d.ts","sourceRoot":"","sources":["../../../lib/schema/cli-transformers.js"],"names":[],"mappings":";IA4DO,sCAiBJ;IAOK,uCA6BL"}
1
+ {"version":3,"file":"cli-transformers.d.ts","sourceRoot":"","sources":["../../../lib/schema/cli-transformers.js"],"names":[],"mappings":";IA4DO,0CAsBJ;IAOK,uCA4BL"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -15,6 +13,8 @@ var _fs = require("fs");
15
13
 
16
14
  var _lodash = _interopRequireDefault(require("lodash"));
17
15
 
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
18
  function parseCsvLine(value) {
19
19
  return value.split(',').map(v => v.trim()).filter(Boolean);
20
20
  }
@@ -24,34 +24,39 @@ function parseCsvFile(value) {
24
24
  }
25
25
 
26
26
  const transformers = {
27
- csv: value => {
28
- let body;
27
+ csv: csvOrPath => {
28
+ let csv = csvOrPath;
29
+ let loadedFromFile = false;
29
30
 
30
- try {
31
- body = (0, _fs.readFileSync)(value, 'utf8');
32
- } catch (err) {
33
- if (err.code !== 'ENOENT') {
34
- throw new _argparse.ArgumentTypeError(`Could not read file ${body}: ${err.message}`);
31
+ if ((0, _fs.existsSync)(csvOrPath)) {
32
+ try {
33
+ csv = (0, _fs.readFileSync)(csvOrPath, 'utf8');
34
+ } catch (err) {
35
+ throw new _argparse.ArgumentTypeError(`Could not read file '${csvOrPath}': ${err.message}`);
35
36
  }
37
+
38
+ loadedFromFile = true;
36
39
  }
37
40
 
38
41
  try {
39
- return body ? parseCsvFile(body) : parseCsvLine(value);
42
+ return loadedFromFile ? parseCsvFile(csv) : parseCsvLine(csv);
40
43
  } catch (err) {
41
- throw new _argparse.ArgumentTypeError('Must be a comma-delimited string, e.g., "foo,bar,baz"');
44
+ const msg = loadedFromFile ? `The provided value of '${csvOrPath}' must be a valid CSV` : `Must be a comma-delimited string, e.g., "foo,bar,baz"`;
45
+ throw new TypeError(`${msg}. Original error: ${err.message}`);
42
46
  }
43
47
  },
44
48
  json: jsonOrPath => {
45
49
  let json = jsonOrPath;
46
50
  let loadedFromFile = false;
47
51
 
48
- try {
49
- json = (0, _fs.readFileSync)(jsonOrPath, 'utf8');
50
- loadedFromFile = true;
51
- } catch (err) {
52
- if (err.code !== 'ENOENT') {
53
- throw err;
52
+ if ((0, _fs.existsSync)(jsonOrPath)) {
53
+ try {
54
+ json = (0, _fs.readFileSync)(jsonOrPath, 'utf8');
55
+ } catch (err) {
56
+ throw new _argparse.ArgumentTypeError(`Could not read file '${jsonOrPath}': ${err.message}`);
54
57
  }
58
+
59
+ loadedFromFile = true;
55
60
  }
56
61
 
57
62
  try {
@@ -71,4 +76,4 @@ const transformers = {
71
76
  }
72
77
  };
73
78
  exports.transformers = transformers;
74
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUNzdkxpbmUiLCJ2YWx1ZSIsInNwbGl0IiwibWFwIiwidiIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwicGFyc2VDc3ZGaWxlIiwiZmxhdE1hcCIsInRyYW5zZm9ybWVycyIsImNzdiIsImJvZHkiLCJyZWFkRmlsZVN5bmMiLCJlcnIiLCJjb2RlIiwiQXJndW1lbnRUeXBlRXJyb3IiLCJtZXNzYWdlIiwianNvbiIsImpzb25PclBhdGgiLCJsb2FkZWRGcm9tRmlsZSIsInJlc3VsdCIsIkpTT04iLCJwYXJzZSIsIl8iLCJpc1BsYWluT2JqZWN0IiwiRXJyb3IiLCJ0cnVuY2F0ZSIsImxlbmd0aCIsImUiLCJtc2ciLCJUeXBlRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvc2NoZW1hL2NsaS10cmFuc2Zvcm1lcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmd1bWVudFR5cGVFcnJvcn0gZnJvbSAnYXJncGFyc2UnO1xuaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbi8qKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY3VzdG9tIGtleXdvcmRzIGZvciBBcHBpdW0gc2NoZW1hcywgYXMgd2VsbCBhc1xuICogXCJ0cmFuc2Zvcm1lcnNcIiAoc2VlIGBhcmdUcmFuc2Zvcm1lcnNgIGJlbG93KS5cbiAqXG4gKiBDdXN0b20ga2V5d29yZHMgYXJlIGp1c3QgcHJvcGVydGllcyB0aGF0IHdpbGwgYXBwZWFyIGluIGEgc2NoZW1hIChlLmcuLFxuICogYGFwcGl1bS1jb25maWctc2NoZW1hLmpzYCkgYmV5b25kIHdoYXQgdGhlIEpTT04gU2NoZW1hIHNwZWMgb2ZmZXJzLiAgVGhlc2VcbiAqIGFyZSB1c2FibGUgYnkgZXh0ZW5zaW9ucywgYXMgd2VsbC5cbiAqL1xuXG4vKipcbiAqIFNwbGl0cyBhIENTViBzdHJpbmcgaW50byBhbiBhcnJheVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmZ1bmN0aW9uIHBhcnNlQ3N2TGluZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWVcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHYpID0+IHYudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59XG5cbi8qKlxuICogU3BsaXQgYSBmaWxlIGJ5IG5ld2xpbmUgdGhlbiBjYWxscyB7QGxpbmsgcGFyc2VDc3ZMaW5lfSBvbiBlYWNoIGxpbmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3ZGaWxlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdCgvXFxyP1xcbi8pXG4gICAgLm1hcCgodikgPT4gdi50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5mbGF0TWFwKHBhcnNlQ3N2TGluZSk7XG59XG5cbi8qKlxuICogTmFtZXNwYWNlIGNvbnRhaW5pbmcgX3RyYW5zZm9ybWVyc18gZm9yIENMSSBhcmd1bWVudHMuICBcIlZhbGlkYXRvcnNcIiBhbmRcbiAqIFwiZm9ybWF0dGVyc1wiIGRvIG5vdCBhY3R1YWxseSBtb2RpZnkgdGhlIHZhbHVlLCBidXQgdGhlc2UgZG8uXG4gKlxuICogVXNlIGNhc2UgaXMgZm9yIHdoZW4gdGhlIGNvbmZpZyBmaWxlIGNhbiBhY2NlcHQgZS5nLiwgYSBgc3RyaW5nW11gLCBidXQgdGhlXG4gKiBDTEkgY2FuIG9ubHkgdGFrZSBhIGBzdHJpbmdgIChhcyBgYXJncGFyc2VgIHNlZW1zIHRvIGJlIGxpbWl0ZWQgaW4gdGhhdFxuICogZmFzaGlvbjsgaXQgYWxzbyBjYW5ub3QgdW5kZXJzdGFuZCBhbiBhcmd1bWVudCBoYXZpbmcgbXVsdGlwbGUgdHlwZXMpLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgYGNzdmAgdHJhbnNmb3JtIHRha2VzIGEgYHN0cmluZ2AgYW5kIHJldHVybnMgYSBgc3RyaW5nW11gIGJ5XG4gKiBzcGxpdHRpbmcgaXQgYnkgY29tbWEtLV9vcl8gaWYgdGhhdCBgc3RyaW5nYCBoYXBwZW5zIHRvIGJlIGFcbiAqIGZpbGVwYXRoLS1yZWFkaW5nIHRoZSBmaWxlIGFzIGEgYC5jc3ZgLlxuICpcbiAqIFRoaXMgY29udGFpbnMgc29tZSBjb3B5LXBhc3RlZCBjb2RlIGZyb20gYGxpYi9jbGkvcGFyc2VyLWhlbHBlcnMuanNgLCB3aGljaCB3YXNcbiAqIG9ibGl0ZXJhdGVkLlxuICovXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtZXJzID0ge1xuICAvKipcbiAgICogR2l2ZW4gYSBDU1Ytc3R5bGUgc3RyaW5nIG9yIHBhdGhuYW1lLCBwYXJzZSBpdCBpbnRvIGFuIGFycmF5LlxuICAgKiBUaGUgZmlsZSBjYW4gYWxzbyBiZSBzcGxpdCBvbiBuZXdsaW5lcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGNzdjogKHZhbHVlKSA9PiB7XG4gICAgbGV0IGJvZHk7XG4gICAgLy8gc2luY2UgdGhpcyB2YWx1ZSBjb3VsZCBiZSBhIHNpbmdsZSBzdHJpbmcgKG5vIGNvbW1hcykgX29yXyBhIHBhdGhuYW1lLCB3ZSB3aWxsIG5lZWRcbiAgICAvLyB0byBhdHRlbXB0IHRvIHBhcnNlIGl0IGFzIGEgZmlsZSBfZmlyc3RfLlxuICAgIHRyeSB7XG4gICAgICBib2R5ID0gcmVhZEZpbGVTeW5jKHZhbHVlLCAndXRmOCcpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRUeXBlRXJyb3IoYENvdWxkIG5vdCByZWFkIGZpbGUgJHtib2R5fTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGJvZHkgPyBwYXJzZUNzdkZpbGUoYm9keSkgOiBwYXJzZUNzdkxpbmUodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50VHlwZUVycm9yKCdNdXN0IGJlIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZywgZS5nLiwgXCJmb28sYmFyLGJhelwiJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBQYXJzZSBhIHN0cmluZyB3aGljaCBjb3VsZCBiZSBhIHBhdGggdG8gYSBKU09OIGZpbGUgb3IgYSBKU09OIHN0cmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGpzb25PclBhdGhcbiAgICogQHJldHVybnMge29iamVjdH1cbiAgICovXG4gIGpzb246IChqc29uT3JQYXRoKSA9PiB7XG4gICAgbGV0IGpzb24gPSBqc29uT3JQYXRoO1xuICAgIGxldCBsb2FkZWRGcm9tRmlsZSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAvLyB1c2Ugc3luY2hyb25vdXMgZmlsZSBhY2Nlc3MsIGFzIGBhcmdwYXJzZWAgcHJvdmlkZXMgbm8gd2F5IG9mIGVpdGhlclxuICAgICAgLy8gYXdhaXRpbmcgb3IgdXNpbmcgY2FsbGJhY2tzLiBUaGlzIHN0ZXAgaGFwcGVucyBpbiBzdGFydHVwLCBpbiB3aGF0IGlzXG4gICAgICAvLyBlZmZlY3RpdmVseSBjb21tYW5kLWxpbmUgY29kZSwgc28gbm90aGluZyBpcyBibG9ja2VkIGluIHRlcm1zIG9mXG4gICAgICAvLyBzZXNzaW9ucywgc28gaG9sZGluZyB1cCB0aGUgZXZlbnQgbG9vcCBkb2VzIG5vdCBpbmN1ciB0aGUgdXN1YWxcbiAgICAgIC8vIGRyYXdiYWNrcy5cbiAgICAgIGpzb24gPSByZWFkRmlsZVN5bmMoanNvbk9yUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGxvYWRlZEZyb21GaWxlID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIHVucmVhZGFibGUgZmlsZXMgZG9uJ3QgY291bnQuLi4gYnV0IG90aGVyIHByb2JsZW1zIGRvLlxuICAgICAgaWYgKGVyci5jb2RlICE9PSAnRU5PRU5UJykge1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgICAgaWYgKCFfLmlzUGxhaW5PYmplY3QocmVzdWx0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke18udHJ1bmNhdGUocmVzdWx0LCB7bGVuZ3RoOiAxMDB9KX0nIGlzIG5vdCBhbiBvYmplY3RgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc3QgbXNnID0gbG9hZGVkRnJvbUZpbGVcbiAgICAgICAgPyBgVGhlIHByb3ZpZGVkIHZhbHVlIG9mICcke2pzb25PclBhdGh9JyBtdXN0IGJlIGEgdmFsaWQgSlNPTmBcbiAgICAgICAgOiBgVGhlIHByb3ZpZGVkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBKU09OYDtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7bXNnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfSxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBZ0JBLFNBQVNBLFlBQVQsQ0FBc0JDLEtBQXRCLEVBQTZCO0VBQzNCLE9BQU9BLEtBQUssQ0FDVEMsS0FESSxDQUNFLEdBREYsRUFFSkMsR0FGSSxDQUVDQyxDQUFELElBQU9BLENBQUMsQ0FBQ0MsSUFBRixFQUZQLEVBR0pDLE1BSEksQ0FHR0MsT0FISCxDQUFQO0FBSUQ7O0FBT0QsU0FBU0MsWUFBVCxDQUFzQlAsS0FBdEIsRUFBNkI7RUFDM0IsT0FBT0EsS0FBSyxDQUNUQyxLQURJLENBQ0UsT0FERixFQUVKQyxHQUZJLENBRUNDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxJQUFGLEVBRlAsRUFHSkMsTUFISSxDQUdHQyxPQUhILEVBSUpFLE9BSkksQ0FJSVQsWUFKSixDQUFQO0FBS0Q7O0FBaUJNLE1BQU1VLFlBQVksR0FBRztFQU8xQkMsR0FBRyxFQUFHVixLQUFELElBQVc7SUFDZCxJQUFJVyxJQUFKOztJQUdBLElBQUk7TUFDRkEsSUFBSSxHQUFHLElBQUFDLGdCQUFBLEVBQWFaLEtBQWIsRUFBb0IsTUFBcEIsQ0FBUDtJQUNELENBRkQsQ0FFRSxPQUFPYSxHQUFQLEVBQVk7TUFDWixJQUFJQSxHQUFHLENBQUNDLElBQUosS0FBYSxRQUFqQixFQUEyQjtRQUN6QixNQUFNLElBQUlDLDJCQUFKLENBQXVCLHVCQUFzQkosSUFBSyxLQUFJRSxHQUFHLENBQUNHLE9BQVEsRUFBbEUsQ0FBTjtNQUNEO0lBQ0Y7O0lBRUQsSUFBSTtNQUNGLE9BQU9MLElBQUksR0FBR0osWUFBWSxDQUFDSSxJQUFELENBQWYsR0FBd0JaLFlBQVksQ0FBQ0MsS0FBRCxDQUEvQztJQUNELENBRkQsQ0FFRSxPQUFPYSxHQUFQLEVBQVk7TUFDWixNQUFNLElBQUlFLDJCQUFKLENBQXNCLHVEQUF0QixDQUFOO0lBQ0Q7RUFDRixDQXhCeUI7RUErQjFCRSxJQUFJLEVBQUdDLFVBQUQsSUFBZ0I7SUFDcEIsSUFBSUQsSUFBSSxHQUFHQyxVQUFYO0lBQ0EsSUFBSUMsY0FBYyxHQUFHLEtBQXJCOztJQUNBLElBQUk7TUFNRkYsSUFBSSxHQUFHLElBQUFMLGdCQUFBLEVBQWFNLFVBQWIsRUFBeUIsTUFBekIsQ0FBUDtNQUNBQyxjQUFjLEdBQUcsSUFBakI7SUFDRCxDQVJELENBUUUsT0FBT04sR0FBUCxFQUFZO01BRVosSUFBSUEsR0FBRyxDQUFDQyxJQUFKLEtBQWEsUUFBakIsRUFBMkI7UUFDekIsTUFBTUQsR0FBTjtNQUNEO0lBQ0Y7O0lBQ0QsSUFBSTtNQUNGLE1BQU1PLE1BQU0sR0FBR0MsSUFBSSxDQUFDQyxLQUFMLENBQVdMLElBQVgsQ0FBZjs7TUFDQSxJQUFJLENBQUNNLGVBQUEsQ0FBRUMsYUFBRixDQUFnQkosTUFBaEIsQ0FBTCxFQUE4QjtRQUM1QixNQUFNLElBQUlLLEtBQUosQ0FBVyxJQUFHRixlQUFBLENBQUVHLFFBQUYsQ0FBV04sTUFBWCxFQUFtQjtVQUFDTyxNQUFNLEVBQUU7UUFBVCxDQUFuQixDQUFrQyxvQkFBaEQsQ0FBTjtNQUNEOztNQUNELE9BQU9QLE1BQVA7SUFDRCxDQU5ELENBTUUsT0FBT1EsQ0FBUCxFQUFVO01BQ1YsTUFBTUMsR0FBRyxHQUFHVixjQUFjLEdBQ3JCLDBCQUF5QkQsVUFBVyx3QkFEZixHQUVyQix5Q0FGTDtNQUdBLE1BQU0sSUFBSVksU0FBSixDQUFlLEdBQUVELEdBQUkscUJBQW9CRCxDQUFDLENBQUNaLE9BQVEsRUFBbkQsQ0FBTjtJQUNEO0VBQ0Y7QUE1RHlCLENBQXJCIn0=
79
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwYXJzZUNzdkxpbmUiLCJ2YWx1ZSIsInNwbGl0IiwibWFwIiwidiIsInRyaW0iLCJmaWx0ZXIiLCJCb29sZWFuIiwicGFyc2VDc3ZGaWxlIiwiZmxhdE1hcCIsInRyYW5zZm9ybWVycyIsImNzdiIsImNzdk9yUGF0aCIsImxvYWRlZEZyb21GaWxlIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsImVyciIsIkFyZ3VtZW50VHlwZUVycm9yIiwibWVzc2FnZSIsIm1zZyIsIlR5cGVFcnJvciIsImpzb24iLCJqc29uT3JQYXRoIiwicmVzdWx0IiwiSlNPTiIsInBhcnNlIiwiXyIsImlzUGxhaW5PYmplY3QiLCJFcnJvciIsInRydW5jYXRlIiwibGVuZ3RoIiwiZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY2hlbWEvY2xpLXRyYW5zZm9ybWVycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FyZ3VtZW50VHlwZUVycm9yfSBmcm9tICdhcmdwYXJzZSc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjdXN0b20ga2V5d29yZHMgZm9yIEFwcGl1bSBzY2hlbWFzLCBhcyB3ZWxsIGFzXG4gKiBcInRyYW5zZm9ybWVyc1wiIChzZWUgYGFyZ1RyYW5zZm9ybWVyc2AgYmVsb3cpLlxuICpcbiAqIEN1c3RvbSBrZXl3b3JkcyBhcmUganVzdCBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBhcHBlYXIgaW4gYSBzY2hlbWEgKGUuZy4sXG4gKiBgYXBwaXVtLWNvbmZpZy1zY2hlbWEuanNgKSBiZXlvbmQgd2hhdCB0aGUgSlNPTiBTY2hlbWEgc3BlYyBvZmZlcnMuICBUaGVzZVxuICogYXJlIHVzYWJsZSBieSBleHRlbnNpb25zLCBhcyB3ZWxsLlxuICovXG5cbi8qKlxuICogU3BsaXRzIGEgQ1NWIHN0cmluZyBpbnRvIGFuIGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuZnVuY3Rpb24gcGFyc2VDc3ZMaW5lKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgodikgPT4gdi50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn1cblxuLyoqXG4gKiBTcGxpdCBhIGZpbGUgYnkgbmV3bGluZSB0aGVuIGNhbGxzIHtAbGluayBwYXJzZUNzdkxpbmV9IG9uIGVhY2ggbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5mdW5jdGlvbiBwYXJzZUNzdkZpbGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlXG4gICAgLnNwbGl0KC9cXHI/XFxuLylcbiAgICAubWFwKCh2KSA9PiB2LnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmZsYXRNYXAocGFyc2VDc3ZMaW5lKTtcbn1cblxuLyoqXG4gKiBOYW1lc3BhY2UgY29udGFpbmluZyBfdHJhbnNmb3JtZXJzXyBmb3IgQ0xJIGFyZ3VtZW50cy4gIFwiVmFsaWRhdG9yc1wiIGFuZFxuICogXCJmb3JtYXR0ZXJzXCIgZG8gbm90IGFjdHVhbGx5IG1vZGlmeSB0aGUgdmFsdWUsIGJ1dCB0aGVzZSBkby5cbiAqXG4gKiBVc2UgY2FzZSBpcyBmb3Igd2hlbiB0aGUgY29uZmlnIGZpbGUgY2FuIGFjY2VwdCBlLmcuLCBhIGBzdHJpbmdbXWAsIGJ1dCB0aGVcbiAqIENMSSBjYW4gb25seSB0YWtlIGEgYHN0cmluZ2AgKGFzIGBhcmdwYXJzZWAgc2VlbXMgdG8gYmUgbGltaXRlZCBpbiB0aGF0XG4gKiBmYXNoaW9uOyBpdCBhbHNvIGNhbm5vdCB1bmRlcnN0YW5kIGFuIGFyZ3VtZW50IGhhdmluZyBtdWx0aXBsZSB0eXBlcykuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBgY3N2YCB0cmFuc2Zvcm0gdGFrZXMgYSBgc3RyaW5nYCBhbmQgcmV0dXJucyBhIGBzdHJpbmdbXWAgYnlcbiAqIHNwbGl0dGluZyBpdCBieSBjb21tYS0tX29yXyBpZiB0aGF0IGBzdHJpbmdgIGhhcHBlbnMgdG8gYmUgYVxuICogZmlsZXBhdGgtLXJlYWRpbmcgdGhlIGZpbGUgYXMgYSBgLmNzdmAuXG4gKlxuICogVGhpcyBjb250YWlucyBzb21lIGNvcHktcGFzdGVkIGNvZGUgZnJvbSBgbGliL2NsaS9wYXJzZXItaGVscGVycy5qc2AsIHdoaWNoIHdhc1xuICogb2JsaXRlcmF0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1lcnMgPSB7XG4gIC8qKlxuICAgKiBHaXZlbiBhIENTVi1zdHlsZSBzdHJpbmcgb3IgcGF0aG5hbWUsIHBhcnNlIGl0IGludG8gYW4gYXJyYXkuXG4gICAqIFRoZSBmaWxlIGNhbiBhbHNvIGJlIHNwbGl0IG9uIG5ld2xpbmVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY3N2T3JQYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGNzdjogKGNzdk9yUGF0aCkgPT4ge1xuICAgIGxldCBjc3YgPSBjc3ZPclBhdGg7XG4gICAgbGV0IGxvYWRlZEZyb21GaWxlID0gZmFsc2U7XG4gICAgLy8gc2luY2UgdGhpcyB2YWx1ZSBjb3VsZCBiZSBhIHNpbmdsZSBzdHJpbmcgKG5vIGNvbW1hcykgX29yXyBhIHBhdGhuYW1lLCB3ZSB3aWxsIG5lZWRcbiAgICAvLyB0byBhdHRlbXB0IHRvIHBhcnNlIGl0IGFzIGEgZmlsZSBfZmlyc3RfLlxuICAgIGlmIChleGlzdHNTeW5jKGNzdk9yUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNzdiA9IHJlYWRGaWxlU3luYyhjc3ZPclBhdGgsICd1dGY4Jyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50VHlwZUVycm9yKGBDb3VsZCBub3QgcmVhZCBmaWxlICcke2Nzdk9yUGF0aH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgbG9hZGVkRnJvbUZpbGUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbG9hZGVkRnJvbUZpbGUgPyBwYXJzZUNzdkZpbGUoY3N2KSA6IHBhcnNlQ3N2TGluZShjc3YpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc3QgbXNnID0gbG9hZGVkRnJvbUZpbGVcbiAgICAgICAgPyBgVGhlIHByb3ZpZGVkIHZhbHVlIG9mICcke2Nzdk9yUGF0aH0nIG11c3QgYmUgYSB2YWxpZCBDU1ZgXG4gICAgICAgIDogYE11c3QgYmUgYSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLCBlLmcuLCBcImZvbyxiYXIsYmF6XCJgO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHttc2d9LiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBhcnNlIGEgc3RyaW5nIHdoaWNoIGNvdWxkIGJlIGEgcGF0aCB0byBhIEpTT04gZmlsZSBvciBhIEpTT04gc3RyaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ganNvbk9yUGF0aFxuICAgKiBAcmV0dXJucyB7b2JqZWN0fVxuICAgKi9cbiAganNvbjogKGpzb25PclBhdGgpID0+IHtcbiAgICBsZXQganNvbiA9IGpzb25PclBhdGg7XG4gICAgbGV0IGxvYWRlZEZyb21GaWxlID0gZmFsc2U7XG4gICAgaWYgKGV4aXN0c1N5bmMoanNvbk9yUGF0aCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIHVzZSBzeW5jaHJvbm91cyBmaWxlIGFjY2VzcywgYXMgYGFyZ3BhcnNlYCBwcm92aWRlcyBubyB3YXkgb2YgZWl0aGVyXG4gICAgICAgIC8vIGF3YWl0aW5nIG9yIHVzaW5nIGNhbGxiYWNrcy4gVGhpcyBzdGVwIGhhcHBlbnMgaW4gc3RhcnR1cCwgaW4gd2hhdCBpc1xuICAgICAgICAvLyBlZmZlY3RpdmVseSBjb21tYW5kLWxpbmUgY29kZSwgc28gbm90aGluZyBpcyBibG9ja2VkIGluIHRlcm1zIG9mXG4gICAgICAgIC8vIHNlc3Npb25zLCBzbyBob2xkaW5nIHVwIHRoZSBldmVudCBsb29wIGRvZXMgbm90IGluY3VyIHRoZSB1c3VhbFxuICAgICAgICAvLyBkcmF3YmFja3MuXG4gICAgICAgIGpzb24gPSByZWFkRmlsZVN5bmMoanNvbk9yUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRUeXBlRXJyb3IoYENvdWxkIG5vdCByZWFkIGZpbGUgJyR7anNvbk9yUGF0aH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgICAgbG9hZGVkRnJvbUZpbGUgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICAgIGlmICghXy5pc1BsYWluT2JqZWN0KHJlc3VsdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtfLnRydW5jYXRlKHJlc3VsdCwge2xlbmd0aDogMTAwfSl9JyBpcyBub3QgYW4gb2JqZWN0YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1zZyA9IGxvYWRlZEZyb21GaWxlXG4gICAgICAgID8gYFRoZSBwcm92aWRlZCB2YWx1ZSBvZiAnJHtqc29uT3JQYXRofScgbXVzdCBiZSBhIHZhbGlkIEpTT05gXG4gICAgICAgIDogYFRoZSBwcm92aWRlZCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSlNPTmA7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke21zZ30uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0sXG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7OztBQWdCQSxTQUFTQSxZQUFULENBQXNCQyxL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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-transformers.js","names":["parseCsvLine","value","split","map","v","trim","filter","Boolean","parseCsvFile","flatMap","transformers","csv","csvOrPath","loadedFromFile","existsSync","readFileSync","err","ArgumentTypeError","message","msg","TypeError","json","jsonOrPath","result","JSON","parse","_","isPlainObject","Error","truncate","length","e"],"sources":["../../../lib/schema/cli-transformers.js"],"sourcesContent":["import {ArgumentTypeError} from 'argparse';\nimport {readFileSync, existsSync} from 'fs';\nimport _ from 'lodash';\n\n/**\n * This module provides custom keywords for Appium schemas, as well as\n * \"transformers\" (see `argTransformers` below).\n *\n * Custom keywords are just properties that will appear in a schema (e.g.,\n * `appium-config-schema.js`) beyond what the JSON Schema spec offers. These\n * are usable by extensions, as well.\n */\n\n/**\n * Splits a CSV string into an array\n * @param {string} value\n * @returns {string[]}\n */\nfunction parseCsvLine(value) {\n return value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n}\n\n/**\n * Split a file by newline then calls {@link parseCsvLine} on each line.\n * @param {string} value\n * @returns {string[]}\n */\nfunction parseCsvFile(value) {\n return value\n .split(/\\r?\\n/)\n .map((v) => v.trim())\n .filter(Boolean)\n .flatMap(parseCsvLine);\n}\n\n/**\n * Namespace containing _transformers_ for CLI arguments. \"Validators\" and\n * \"formatters\" do not actually modify the value, but these do.\n *\n * Use case is for when the config file can accept e.g., a `string[]`, but the\n * CLI can only take a `string` (as `argparse` seems to be limited in that\n * fashion; it also cannot understand an argument having multiple types).\n *\n * For example, the `csv` transform takes a `string` and returns a `string[]` by\n * splitting it by comma--_or_ if that `string` happens to be a\n * filepath--reading the file as a `.csv`.\n *\n * This contains some copy-pasted code from `lib/cli/parser-helpers.js`, which was\n * obliterated.\n */\nexport const transformers = {\n /**\n * Given a CSV-style string or pathname, parse it into an array.\n * The file can also be split on newlines.\n * @param {string} csvOrPath\n * @returns {string[]}\n */\n csv: (csvOrPath) => {\n let csv = csvOrPath;\n let loadedFromFile = false;\n // since this value could be a single string (no commas) _or_ a pathname, we will need\n // to attempt to parse it as a file _first_.\n if (existsSync(csvOrPath)) {\n try {\n csv = readFileSync(csvOrPath, 'utf8');\n } catch (err) {\n throw new ArgumentTypeError(`Could not read file '${csvOrPath}': ${err.message}`);\n }\n loadedFromFile = true;\n }\n\n try {\n return loadedFromFile ? parseCsvFile(csv) : parseCsvLine(csv);\n } catch (err) {\n const msg = loadedFromFile\n ? `The provided value of '${csvOrPath}' must be a valid CSV`\n : `Must be a comma-delimited string, e.g., \"foo,bar,baz\"`;\n throw new TypeError(`${msg}. Original error: ${err.message}`);\n }\n },\n\n /**\n * Parse a string which could be a path to a JSON file or a JSON string.\n * @param {string} jsonOrPath\n * @returns {object}\n */\n json: (jsonOrPath) => {\n let json = jsonOrPath;\n let loadedFromFile = false;\n if (existsSync(jsonOrPath)) {\n try {\n // use synchronous file access, as `argparse` provides no way of either\n // awaiting or using callbacks. This step happens in startup, in what is\n // effectively command-line code, so nothing is blocked in terms of\n // sessions, so holding up the event loop does not incur the usual\n // drawbacks.\n json = readFileSync(jsonOrPath, 'utf8');\n } catch (err) {\n throw new ArgumentTypeError(`Could not read file '${jsonOrPath}': ${err.message}`);\n }\n loadedFromFile = true;\n }\n try {\n const result = JSON.parse(json);\n if (!_.isPlainObject(result)) {\n throw new Error(`'${_.truncate(result, {length: 100})}' is not an object`);\n }\n return result;\n } catch (e) {\n const msg = loadedFromFile\n ? `The provided value of '${jsonOrPath}' must be a valid JSON`\n : `The provided value must be a valid JSON`;\n throw new TypeError(`${msg}. Original error: ${e.message}`);\n }\n },\n};\n"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;;;AAgBA,SAASA,YAAT,CAAsBC,KAAtB,EAA6B;EAC3B,OAAOA,KAAK,CACTC,KADI,CACE,GADF,EAEJC,GAFI,CAECC,CAAD,IAAOA,CAAC,CAACC,IAAF,EAFP,EAGJC,MAHI,CAGGC,OAHH,CAAP;AAID;;AAOD,SAASC,YAAT,CAAsBP,KAAtB,EAA6B;EAC3B,OAAOA,KAAK,CACTC,KADI,CACE,OADF,EAEJC,GAFI,CAECC,CAAD,IAAOA,CAAC,CAACC,IAAF,EAFP,EAGJC,MAHI,CAGGC,OAHH,EAIJE,OAJI,CAIIT,YAJJ,CAAP;AAKD;;AAiBM,MAAMU,YAAY,GAAG;EAO1BC,GAAG,EAAGC,SAAD,IAAe;IAClB,IAAID,GAAG,GAAGC,SAAV;IACA,IAAIC,cAAc,GAAG,KAArB;;IAGA,IAAI,IAAAC,cAAA,EAAWF,SAAX,CAAJ,EAA2B;MACzB,IAAI;QACFD,GAAG,GAAG,IAAAI,gBAAA,EAAaH,SAAb,EAAwB,MAAxB,CAAN;MACD,CAFD,CAEE,OAAOI,GAAP,EAAY;QACZ,MAAM,IAAIC,2BAAJ,CAAuB,wBAAuBL,SAAU,MAAKI,GAAG,CAACE,OAAQ,EAAzE,CAAN;MACD;;MACDL,cAAc,GAAG,IAAjB;IACD;;IAED,IAAI;MACF,OAAOA,cAAc,GAAGL,YAAY,CAACG,GAAD,CAAf,GAAuBX,YAAY,CAACW,GAAD,CAAxD;IACD,CAFD,CAEE,OAAOK,GAAP,EAAY;MACZ,MAAMG,GAAG,GAAGN,cAAc,GACrB,0BAAyBD,SAAU,uBADd,GAErB,uDAFL;MAGA,MAAM,IAAIQ,SAAJ,CAAe,GAAED,GAAI,qBAAoBH,GAAG,CAACE,OAAQ,EAArD,CAAN;IACD;EACF,CA7ByB;EAoC1BG,IAAI,EAAGC,UAAD,IAAgB;IACpB,IAAID,IAAI,GAAGC,UAAX;IACA,IAAIT,cAAc,GAAG,KAArB;;IACA,IAAI,IAAAC,cAAA,EAAWQ,UAAX,CAAJ,EAA4B;MAC1B,IAAI;QAMFD,IAAI,GAAG,IAAAN,gBAAA,EAAaO,UAAb,EAAyB,MAAzB,CAAP;MACD,CAPD,CAOE,OAAON,GAAP,EAAY;QACZ,MAAM,IAAIC,2BAAJ,CAAuB,wBAAuBK,UAAW,MAAKN,GAAG,CAACE,OAAQ,EAA1E,CAAN;MACD;;MACDL,cAAc,GAAG,IAAjB;IACD;;IACD,IAAI;MACF,MAAMU,MAAM,GAAGC,IAAI,CAACC,KAAL,CAAWJ,IAAX,CAAf;;MACA,IAAI,CAACK,eAAA,CAAEC,aAAF,CAAgBJ,MAAhB,CAAL,EAA8B;QAC5B,MAAM,IAAIK,KAAJ,CAAW,IAAGF,eAAA,CAAEG,QAAF,CAAWN,MAAX,EAAmB;UAACO,MAAM,EAAE;QAAT,CAAnB,CAAkC,oBAAhD,CAAN;MACD;;MACD,OAAOP,MAAP;IACD,CAND,CAME,OAAOQ,CAAP,EAAU;MACV,MAAMZ,GAAG,GAAGN,cAAc,GACrB,0BAAyBS,UAAW,wBADf,GAErB,yCAFL;MAGA,MAAM,IAAIF,SAAJ,CAAe,GAAED,GAAI,qBAAoBY,CAAC,CAACb,OAAQ,EAAnD,CAAN;IACD;EACF;AAhEyB,CAArB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/schema/index.js"],"sourcesContent":["export * from './schema';\nexport * from './cli-args';\n"],"mappings":";;;;;;;;AAAA;;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA;;AACA;;AAAA;EAAA;EAAA;EAAA;IAAA;IAAA;MAAA;IAAA;EAAA;AAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keywords.js","names":["keywords","appiumCliAliases","keyword","metaSchema","type","items","minLength","minItems","uniqueItems","description","appiumCliDest","appiumCliDescription","schemaType","appiumCliTransformer","enum","Object","keys","transformers","appiumCliIgnored","appiumDeprecated","$comment"],"sources":["../../../lib/schema/keywords.js"],"sourcesContent":["import {transformers} from './cli-transformers';\n\n/**\n * Collection of keyword definitions to add to the singleton `Ajv` instance.\n * @type {Record<string,KeywordDefinition>}\n */\nexport const keywords = {\n /**\n * Keyword to provide a list of command alias names for the CLI.\n *\n * If defined, there must be at least one item in the array and it must be non-empty.\n * All items in the array must be unique.\n *\n * @todo Avoid alias collisions!\n * @type {KeywordDefinition}\n * @example\n * {appiumCliAliases: ['B', 'bobby', 'robert']}\n */\n appiumCliAliases: {\n keyword: 'appiumCliAliases',\n metaSchema: {\n type: 'array',\n items: {\n type: 'string',\n minLength: 1,\n },\n minItems: 1,\n uniqueItems: true,\n description:\n 'List of aliases for the argument. Aliases shorter than three (3) characters will be prefixed with a single dash; otherwise two (2).',\n },\n },\n /**\n * Keyword to provide the name of the property in the destination (parsed\n * args) object. By default, this value will be whatever the property name is,\n * but camel-cased. If a flag needs something _other_ than just camel-casing,\n * use this.\n * @type {KeywordDefinition}\n * @example\n * // for prop 'no-color'\n * {appiumCliDest: 'NOCOLOR'} // value will be stored as property `NOCOLOR` instead of `noColor`\n */\n appiumCliDest: {\n keyword: 'appiumCliDest',\n metaSchema: {\n type: 'string',\n minLength: 1,\n description: 'Name of the associated property in the parsed CLI arguments object',\n },\n },\n\n /**\n * CLI-specific description of the property. Sometimes the allowed type can\n * be different enough on the CLI that providing a description written for a\n * config file context wouldn't make sense.\n * @type {KeywordDefinition}\n * @example\n * {appiumCliDescription: 'This is a comma-delimited string, but in the config file it is an array'}\n */\n appiumCliDescription: {\n keyword: 'appiumCliDescription',\n schemaType: 'string',\n metaSchema: {\n type: 'string',\n minLength: 1,\n description: 'Description to provide in the --help text of the CLI. Overrides `description`',\n },\n },\n\n /**\n * Transformers for CLI args. These usually take strings then do something with them, like\n * read a file or parse further.\n * @type {KeywordDefinition}\n */\n appiumCliTransformer: {\n keyword: 'appiumCliTransformer',\n metaSchema: {\n type: 'string',\n enum: Object.keys(transformers),\n description:\n 'The name of a custom transformer to run against the value as provided via the CLI.',\n },\n },\n\n /**\n * Flag to tell Appium to _not_ provide this property as a CLI argument.\n * @type {KeywordDefinition}\n */\n appiumCliIgnored: {\n keyword: 'appiumCliIgnored',\n metaSchema: {\n type: 'boolean',\n description:\n 'If `true`, Appium will not provide this property as a CLI argument. This is NOT the same as a \"hidden\" argument.',\n enum: [true],\n },\n },\n\n /**\n * Mark this property as deprecated.\n * @type {KeywordDefinition}\n */\n appiumDeprecated: {\n keyword: 'appiumDeprecated',\n metaSchema: {\n type: 'boolean',\n description: 'If `true`, this property will be displayed as \"deprecated\" to the user',\n enum: [true],\n $comment:\n 'JSON schema draft-2019-09 keyword `deprecated` serves the same purpose. This keyword should itself be deprecated if we move to draft-2019-09!',\n },\n },\n};\n\n/**\n * These are the valid values for the `appiumCliTransformer` keyword.\n * Unfortunately, TS cannot infer this in a JS context. In TS, we'd use\n * `as const` when defining `argTransformers`, then get `keyof typeof argTransformers`. alas.\n * @typedef {'csv'|'json'} AppiumCliTransformerName\n */\n\n/**\n * These are the custom keywords that Appium recognizes.\n *\n * @typedef AppiumJSONSchemaKeywords\n * @property {string} [appiumCliDest]\n * @property {string} [appiumCliDescription]\n * @property {string[]} [appiumCliAliases]\n * @property {boolean} [appiumCliIgnored]\n * @property {AppiumCliTransformerName} [appiumCliTransformer]\n * @property {boolean} [appiumDeprecated]\n */\n\n/**\n * @typedef {import('ajv').KeywordDefinition} KeywordDefinition\n */\n"],"mappings":";;;;;;;;;AAAA;;AAMO,MAAMA,QAAQ,GAAG;EAYtBC,gBAAgB,EAAE;IAChBC,OAAO,EAAE,kBADO;IAEhBC,UAAU,EAAE;MACVC,IAAI,EAAE,OADI;MAEVC,KAAK,EAAE;QACLD,IAAI,EAAE,QADD;QAELE,SAAS,EAAE;MAFN,CAFG;MAMVC,QAAQ,EAAE,CANA;MAOVC,WAAW,EAAE,IAPH;MAQVC,WAAW,EACT;IATQ;EAFI,CAZI;EAoCtBC,aAAa,EAAE;IACbR,OAAO,EAAE,eADI;IAEbC,UAAU,EAAE;MACVC,IAAI,EAAE,QADI;MAEVE,SAAS,EAAE,CAFD;MAGVG,WAAW,EAAE;IAHH;EAFC,CApCO;EAqDtBE,oBAAoB,EAAE;IACpBT,OAAO,EAAE,sBADW;IAEpBU,UAAU,EAAE,QAFQ;IAGpBT,UAAU,EAAE;MACVC,IAAI,EAAE,QADI;MAEVE,SAAS,EAAE,CAFD;MAGVG,WAAW,EAAE;IAHH;EAHQ,CArDA;EAoEtBI,oBAAoB,EAAE;IACpBX,OAAO,EAAE,sBADW;IAEpBC,UAAU,EAAE;MACVC,IAAI,EAAE,QADI;MAEVU,IAAI,EAAEC,MAAM,CAACC,IAAP,CAAYC,6BAAZ,CAFI;MAGVR,WAAW,EACT;IAJQ;EAFQ,CApEA;EAkFtBS,gBAAgB,EAAE;IAChBhB,OAAO,EAAE,kBADO;IAEhBC,UAAU,EAAE;MACVC,IAAI,EAAE,SADI;MAEVK,WAAW,EACT,kHAHQ;MAIVK,IAAI,EAAE,CAAC,IAAD;IAJI;EAFI,CAlFI;EAgGtBK,gBAAgB,EAAE;IAChBjB,OAAO,EAAE,kBADO;IAEhBC,UAAU,EAAE;MACVC,IAAI,EAAE,SADI;MAEVK,WAAW,EAAE,wEAFH;MAGVK,IAAI,EAAE,CAAC,IAAD,CAHI;MAIVM,QAAQ,EACN;IALQ;EAFI;AAhGI,CAAjB"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -25,6 +23,8 @@ var _argSpec = require("./arg-spec");
25
23
 
26
24
  var _keywords = require("./keywords");
27
25
 
26
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
+
28
28
  class RoachHotelMap extends Map {
29
29
  set(key, value) {
30
30
  if (this.has(key)) {
@@ -447,4 +447,4 @@ const {
447
447
  isAllowedSchemaFileExtension
448
448
  } = AppiumSchema;
449
449
  exports.isAllowedSchemaFileExtension = isAllowedSchemaFileExtension;
450
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb2FjaEhvdGVsTWFwIiwiTWFwIiwic2V0Iiwia2V5IiwidmFsdWUiLCJoYXMiLCJFcnJvciIsImRlbGV0ZSIsImNsZWFyIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsIlNldCIsIkFwcGl1bVNjaGVtYSIsIl9hcmdTcGVjcyIsIl9yZWdpc3RlcmVkU2NoZW1hcyIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJfYWp2IiwiX2luc3RhbmNlIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJjb25zdHJ1Y3RvciIsIl9pbnN0YW50aWF0ZUFqdiIsImNyZWF0ZSIsImluc3RhbmNlIiwiXyIsImJpbmRBbGwiLCJoYXNSZWdpc3RlcmVkU2NoZW1hIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJpc0ZpbmFsaXplZCIsIkJvb2xlYW4iLCJnZXRBbGxBcmdTcGVjcyIsImZpbmFsaXplIiwiYWp2IiwiYmFzZVNjaGVtYSIsImNsb25lRGVlcCIsIkFwcGl1bUNvbmZpZ0pzb25TY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJhZGRGb3JtYXRzIiwiQWp2IiwiYWxsRXJyb3JzIiwia2V5d29yZHMiLCJrZXl3b3JkIiwiYWRkS2V5d29yZCIsInJlc2V0Iiwic2NoZW1hSWQiLCJrZXlzIiwicmVtb3ZlU2NoZW1hIiwicmVnaXN0ZXJTY2hlbWEiLCJpc1VuZGVmaW5lZCIsIlR5cGVFcnJvciIsImlzU3VwcG9ydGVkU2NoZW1hVHlwZSIsIlNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3IiLCJub3JtYWxpemVkRXh0TmFtZSIsImtlYmFiQ2FzZSIsImdldCIsIlNjaGVtYU5hbWVDb25mbGljdEVycm9yIiwiZ2V0QXJnU3BlYyIsIm5hbWUiLCJ0b0FyZyIsImhhc0FyZ1NwZWMiLCJnZXREZWZhdWx0cyIsImZsYXR0ZW4iLCJTY2hlbWFGaW5hbGl6YXRpb25FcnJvciIsInJlZHVjZXIiLCJkZWZhdWx0cyIsInJldHZhbCIsInZhbHVlcyIsImdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIiwic3BlY3MiLCJmaWx0ZXIiLCJzcGVjIiwicmF3RGVzdCIsImdldFNjaGVtYSIsInN0YWNrIiwicHJlZml4IiwiZmxhdHRlbmVkIiwicGFpcnMiLCJ0b1BhaXJzIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJpc1BsYWluT2JqZWN0IiwiJGFzeW5jIiwiY29kZSIsImRhdGEiLCJtc2ciLCJpc0Jvb2xlYW4iLCJKU09OIiwic3RyaW5naWZ5IiwiYXBwaXVtU2NoZW1hIiwiZmluYWxpemVTY2hlbWEiLCJyZXNldFNjaGVtYSIsImZsYXR0ZW5TY2hlbWEiLCJnZXREZWZhdWx0c0ZvclNjaGVtYSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBanYgZnJvbSAnYWp2JztcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7RFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtBcHBpdW1Db25maWdKc29uU2NoZW1hfSBmcm9tICdAYXBwaXVtL3NjaGVtYSc7XG5pbXBvcnQge0FQUElVTV9DT05GSUdfU0NIRU1BX0lELCBBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FfSBmcm9tICcuL2FyZy1zcGVjJztcbmltcG9ydCB7a2V5d29yZHN9IGZyb20gJy4va2V5d29yZHMnO1xuXG4vKipcbiAqIEtleS92YWx1ZSBwYWlycyBnbyBpbi4uLiBidXQgdGhleSBkb24ndCBjb21lIG91dC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAZXh0ZW5kcyB7TWFwPEssVj59XG4gKi9cbmV4cG9ydCBjbGFzcyBSb2FjaEhvdGVsTWFwIGV4dGVuZHMgTWFwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAgICovXG4gIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGlzIGFscmVhZHkgc2V0YCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtLfSBrZXlcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBkZWxldGUoa2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgUm9hY2hIb3RlbE1hcGApO1xuICB9XG59XG5cbi8qKlxuICogRXh0ZW5zaW9ucyB0aGF0IGFuIGV4dGVuc2lvbiBzY2hlbWEgZmlsZSBjYW4gaGF2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmpzb24nLCAnLmpzJywgJy5janMnXSk7XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBBanYgYW5kIHNjaGVtYS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBTaG91bGQgaGF2ZSBiZWVuIG5hbWVkIEhpZ2hsYW5kZXIsIGJlY2F1c2UgX3RoZXJlIGNhbiBvbmx5IGJlIG9uZV9cbiAqL1xuY2xhc3MgQXBwaXVtU2NoZW1hIHtcbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB1bmlxdWUgYXJndW1lbnQgSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9cy5cbiAgICpcbiAgICogQW4gXCJhcmd1bWVudFwiIGlzIGEgQ0xJIGFyZ3VtZW50IG9yIGEgY29uZmlnIHByb3BlcnR5LlxuICAgKlxuICAgKiBVc2VkIHRvIHByb3ZpZGUgZWFzeSBsb29rdXBzIG9mIGFyZ3VtZW50IG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgb2YgdGhvc2UgYXJndW1lbnRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Um9hY2hIb3RlbE1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBleHRlbnNpb24gdHlwZXMgdG8gZXh0ZW5zaW9uIG5hbWVzIHRvIHNjaGVtYSBvYmplY3RzLlxuICAgKlxuICAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuYW1pbmcgY29uZmxpY3RzLiBUaGUgc2NoZW1hc1xuICAgKiBhcmUgc3RvcmVkIGhlcmUgaW4gbWVtb3J5IHVudGlsIHRoZSBpbnN0YW5jZSBpcyBfZmluYWxpemVkXy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxFeHRlbnNpb25UeXBlLE1hcDxzdHJpbmcsU2NoZW1hT2JqZWN0Pj59XG4gICAqL1xuICBfcmVnaXN0ZXJlZFNjaGVtYXMgPSB7W0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLCBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCl9O1xuXG4gIC8qKlxuICAgKiBBanYgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Fqdn1cbiAgICovXG4gIF9hanY7XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBvZiBzY2hlbWEgSURzIHRvIGZpbmFsaXplZCBzY2hlbWFzLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVmZXJlbmNlcywgYnV0IHJhdGhlciB0aGUgcm9vdCBzY2hlbWFzIHRoZW1zZWx2ZXMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4/fVxuICAgKi9cbiAgX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBBanYsIGFkZHMgc3RhbmRhcmQgZm9ybWF0cyBhbmQgb3VyIGN1c3RvbSBrZXl3b3Jkcy5cbiAgICogQHNlZSBodHRwczovL25wbS5pbS9hanYtZm9ybWF0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fYWp2ID0gQXBwaXVtU2NoZW1hLl9pbnN0YW50aWF0ZUFqdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgY3JlYXRlcyBhIG5ldyBvbmUuXG4gICAqIEJpbmRzIHB1YmxpYyBtZXRob2RzIHRvIHRoZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgaWYgKCFBcHBpdW1TY2hlbWEuX2luc3RhbmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICAgIEFwcGl1bVNjaGVtYS5faW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgIF8uYmluZEFsbChpbnN0YW5jZSwgW1xuICAgICAgICAnZmluYWxpemUnLFxuICAgICAgICAnZmxhdHRlbicsXG4gICAgICAgICdnZXRBbGxBcmdTcGVjcycsXG4gICAgICAgICdnZXRBcmdTcGVjJyxcbiAgICAgICAgJ2dldERlZmF1bHRzJyxcbiAgICAgICAgJ2dldERlZmF1bHRzRm9yRXh0ZW5zaW9uJyxcbiAgICAgICAgJ2dldFNjaGVtYScsXG4gICAgICAgICdoYXNBcmdTcGVjJyxcbiAgICAgICAgJ2lzRmluYWxpemVkJyxcbiAgICAgICAgJ3JlZ2lzdGVyU2NoZW1hJyxcbiAgICAgICAgJ2hhc1JlZ2lzdGVyZWRTY2hlbWEnLFxuICAgICAgICAncmVzZXQnLFxuICAgICAgICAndmFsaWRhdGUnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcGl1bVNjaGVtYS5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzY2hlbWEgaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBnaXZlbiBleHRlbnNpb24gdHlwZSBhbmQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gd2hldGhlciBvciBub3QgdGhlIGluc3RhbmNlIGhhcyBiZWVuIF9maW5hbGl6ZWRfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1JlZ2lzdGVyZWRTY2hlbWEoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5oYXMoZXh0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplIGZpbmFsaXplfSBoYXMgYmVlbiBjYWxsZWRcbiAgICogc3VjY2Vzc2Z1bGx5IGFuZCB7QGxpbmsgQXBwaXVtU2NoZW1hLnJlc2V0IHJlc2V0fSBoYXMgbm90IGJlZW4gY2FsbGVkIHNpbmNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZmluYWxpemVkXG4gICAqL1xuICBpc0ZpbmFsaXplZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIGdldEFsbEFyZ1NwZWNzKCkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzPn0gKi8gKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IHRoaXMuX2FqdjtcblxuICAgIC8vIEFqdiB3aWxsIF9tdXRhdGVfIHRoZSBzY2hlbWEsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgY29uc3QgYmFzZVNjaGVtYSA9IF8uY2xvbmVEZWVwKEFwcGl1bUNvbmZpZ0pzb25TY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKF8ub21pdChiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXMsIFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVdKSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID0ge1xuICAgICAgICAgICAgJHJlZixcbiAgICAgICAgICAgICRjb21tZW50OiBleHROYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovIChzY2hlbWEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJhc2VTY2hlbWE7XG4gICAgICB9LFxuICAgICAgYmFzZVNjaGVtYVxuICAgICk7XG5cbiAgICBhanYuYWRkU2NoZW1hKGZpbmFsU2NoZW1hLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCk7XG4gICAgZmluYWxpemVkU2NoZW1hc1tBUFBJVU1fQ09ORklHX1NDSEVNQV9JRF0gPSBmaW5hbFNjaGVtYTtcbiAgICBhanYudmFsaWRhdGVTY2hlbWEoZmluYWxTY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IGZpbmFsaXplZFNjaGVtYXM7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBhbmQgY3JlYXRlcyBhbiBBanYgaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtBanZ9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbnRpYXRlQWp2KCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBhZGQgY3VzdG9tIGtleXdvcmRzIHRvIGFqdi4gc2VlIHNjaGVtYS1rZXl3b3Jkcy5qc1xuICAgIF8uZm9yRWFjaChrZXl3b3JkcywgKGtleXdvcmQpID0+IHtcbiAgICAgIGFqdi5hZGRLZXl3b3JkKGtleXdvcmQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFqdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuXG4gICAqXG4gICAqIC0gUmVtb3ZlcyBhbGwgYWRkZWQgc2NoZW1hcyBmcm9tIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHJlZ2lzdGVyZWQgc2NoZW1hc1xuICAgKiAtIFNldHMgdGhlIHtAbGluayBBcHBpdW1TY2hlbWEuX2ZpbmFsaXplZCBfZmluYWxpemVkfSBmbGFnIHRvIGBmYWxzZWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBhZ2FpbiwgeW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIGZpcnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGZvciAoY29uc3Qgc2NoZW1hSWQgb2YgT2JqZWN0LmtleXModGhpcy5fZmluYWxpemVkU2NoZW1hcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuX2Fqdi5yZW1vdmVTY2hlbWEoc2NoZW1hSWQpO1xuICAgIH1cbiAgICB0aGlzLl9hcmdTcGVjcyA9IG5ldyBSb2FjaEhvdGVsTWFwKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMgPSB7XG4gICAgICBbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgICBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAgIC8vIEFqdiBzZWVtcyB0byBoYXZlIGFuIG92ZXItZWFnZXIgY2FjaGUsIHNvIHdlIGhhdmUgdG8gZHVtcCB0aGUgb2JqZWN0IGVudGlyZWx5LlxuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzY2hlbWEgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgXCJmYWlsLWZhc3RcIiBpbiB0aGF0IHRoZSBzY2hlbWEgd2lsbCBpbW1lZGlhdGVseSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyBfb3JfIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiB0aGUgc2NoZW1hJ3MgYCRzY2hlbWFgIHByb3AgaXMuXG4gICAqXG4gICAqIERvZXMgX25vdF8gYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGBhanZgIGluc3RhbmNlICh0aGlzIGlzIGRvbmUgYnkge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0pLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIFVuaXF1ZSBleHRlbnNpb24gbmFtZSBmb3IgYHR5cGVgXG4gICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWEgLSBTY2hlbWEgb2JqZWN0XG4gICAqIEB0aHJvd3Mge1NjaGVtYU5hbWVDb25mbGljdEVycm9yfSBJZiB0aGUgc2NoZW1hIGlzIGFuIGludmFsaWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpIHtcbiAgICBpZiAoIShleHRUeXBlICYmIGV4dE5hbWUpIHx8IF8uaXNVbmRlZmluZWQoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lLCBhbmQgYSBkZWZpbmVkIHNjaGVtYScpO1xuICAgIH1cbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5pc1N1cHBvcnRlZFNjaGVtYVR5cGUoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3Ioc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4dE5hbWUgPSBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgICBpZiAodGhpcy5oYXNSZWdpc3RlcmVkU2NoZW1hKGV4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lKSkge1xuICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmdldChub3JtYWxpemVkRXh0TmFtZSkgPT09IHNjaGVtYSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX2Fqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uc2V0KG5vcm1hbGl6ZWRFeHROYW1lLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgQXJnU3BlY30gZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtBcmdTcGVjfHVuZGVmaW5lZH0gQXJnU3BlYyBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFyZ1NwZWMobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5nZXQoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGtub3dzIGFib3V0IGFuIGFyZ3VtZW50IGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBzdWNoIGFuIHtAbGluayBBcmdTcGVjfSBleGlzdHNcbiAgICovXG4gIGhhc0FyZ1NwZWMobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5oYXMoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBSZWNvcmRgIG9mIGFyZ3VtZW50IFwiZGVzdFwiIHN0cmluZ3MgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBcImRlc3RcIiBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gb2JqZWN0IHJldHVybmVkIGJ5XG4gICAqIGBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlclsncGFyc2VfYXJncyddYC5cbiAgICogQHRlbXBsYXRlIHtib29sZWFufHVuZGVmaW5lZH0gRmxhdHRlbmVkXG4gICAqIEBwYXJhbSB7RmxhdHRlbmVkfSBbZmxhdHRlbj10cnVlXSAtIElmIGB0cnVlYCwgZmxhdHRlbnMgdGhlIHJldHVybmVkIG9iamVjdFxuICAgKiB1c2luZyBcImtleXBhdGhcIi1zdHlsZSBrZXlzIG9mIHRoZSBmb3JtYXQgYDxleHRUeXBlPi48ZXh0TmFtZT4uPGFyZ05hbWU+YC5cbiAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmVzdGVkIG9iamVjdCB1c2luZyBgZXh0VHlwZWAgYW5kIGBleHROYW1lYCBhc1xuICAgKiBwcm9wZXJ0aWVzLiBCYXNlIGFyZ3VtZW50cyAoc2VydmVyIGFyZ3VtZW50cykgYXJlIGFsd2F5cyBhdCB0aGUgdG9wIGxldmVsLlxuICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHMoZmxhdHRlbiA9IC8qKiBAdHlwZSB7RmxhdHRlbmVkfSAqLyAodHJ1ZSkpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY2FsbGJhY2sgRGVmYXVsdFJlZHVjZXJcbiAgICAgKiBAcGFyYW0ge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gZGVmYXVsdHNcbiAgICAgKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWNcbiAgICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgICAqL1xuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFJlZHVjZXJ9ICovXG4gICAgY29uc3QgcmVkdWNlciA9IGZsYXR0ZW5cbiAgICAgID8gKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1tkZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICA6IChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgZGVzdH0pID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgICAgXy5zZXQoZGVmYXVsdHMsIGRlc3QsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgICAgfTtcblxuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSAqL1xuICAgIGNvbnN0IHJldHZhbCA9IHt9O1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLnJlZHVjZShyZWR1Y2VyLCByZXR2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmbGF0dGVuZWQgUmVjb3JkIG9mIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gS2V5cyB3aWxsXG4gICAqIGJlIG9mIGZvcm1hdCBgPGFyZ05hbWU+YC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPn1cbiAgICovXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHNwZWNzID0gWy4uLnRoaXMuX2FyZ1NwZWNzLnZhbHVlcygpXS5maWx0ZXIoXG4gICAgICAoc3BlYykgPT4gc3BlYy5leHRUeXBlID09PSBleHRUeXBlICYmIHNwZWMuZXh0TmFtZSA9PT0gZXh0TmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHNwZWNzLnJlZHVjZSgoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIHJhd0Rlc3R9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBkZWZhdWx0c1tyYXdEZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBzY2hlbWEgaW50byBhbiBhcnJheSBvZiBgU2NoZW1hT2JqZWN0YHMgYW5kIGFzc29jaWF0ZWRcbiAgICoge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9LlxuICAgKlxuICAgKiBDb252ZXJ0cyBuZXN0ZWQgZXh0ZW5zaW9uIHNjaGVtYXMgdG8ga2V5cyBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kXG4gICAqIG5hbWUuIFVzZWQgd2hlbiB0cmFuc2xhdGluZyB0byBgYXJncGFyc2VgIG9wdGlvbnMgb3IgZ2V0dGluZyB0aGUgbGlzdCBvZlxuICAgKiBkZWZhdWx0IHZhbHVlcyAoc2VlIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9KSBmb3IgQ0xJIG9yIG90aGVyd2lzZS5cbiAgICpcbiAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnRlcm1lZGlhdGUgcmVwcnNlbnRhdGlvbiB1c2VkIGJ5IGBjbGktYXJnc2BcbiAgICogbW9kdWxlJ3MgYHRvUGFyc2VyQXJnc2AsIHdoaWNoIGNvbnZlcnRzIHRoZSBmaW5hbGl6ZWQgc2NoZW1hIHRvIHBhcmFtZXRlcnNcbiAgICogdXNlZCBieSBgYXJncGFyc2VgLlxuICAgKiBAdGhyb3dzIElmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LlxuICAgKiBAcmV0dXJucyB7RmxhdHRlbmVkU2NoZW1hfVxuICAgKi9cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpO1xuXG4gICAgLyoqIEB0eXBlIHsge3Byb3BlcnRpZXM6IFNjaGVtYU9iamVjdCwgcHJlZml4OiBzdHJpbmdbXX1bXSB9ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9IEFyZ1NwZWMuZXh0ZW5zaW9uSW5mb0Zyb21Sb290U2NoZW1hSWQoJHJlZik7XG4gICAgICAgICAgaWYgKCFub3JtYWxpemVkRXh0TmFtZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgZXh0ZW5zaW9uIG5hbWUgZnJvbSBzY2hlbWEgSUQgJHskcmVmfS4gVGhpcyBpcyBhIGJ1Zy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHJlZlNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBbLi4ucHJlZml4LCBrZXksIG5vcm1hbGl6ZWRFeHROYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IERSSVZFUl9UWVBFICYmIGtleSAhPT0gUExVR0lOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBbZXh0VHlwZSwgZXh0TmFtZV0gPSBwcmVmaXg7XG4gICAgICAgICAgY29uc3QgYXJnU3BlYyA9IHRoaXMuZ2V0QXJnU3BlYyhrZXksIC8qKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZX0gKi8gKGV4dFR5cGUpLCBleHROYW1lKTtcbiAgICAgICAgICBpZiAoIWFyZ1NwZWMpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBVbmtub3duIGFyZ3VtZW50IHdpdGgga2V5ICR7a2V5fSwgZXh0VHlwZSAke2V4dFR5cGV9IGFuZCBleHROYW1lICR7ZXh0TmFtZX0uIFRoaXMgaXMgYSBidWcuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhdHRlbmVkLnB1c2goe3NjaGVtYTogXy5jbG9uZURlZXAodmFsdWUpLCBhcmdTcGVjfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGl0c2VsZlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRFxuICAgKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWRcbiAgICogQHJldHVybnMge1NjaGVtYU9iamVjdH1cbiAgICovXG4gIGdldFNjaGVtYShyZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1NjaGVtYU9iamVjdH0gKi8gKHRoaXMuX2dldFZhbGlkYXRvcihyZWYpLnNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHNjaGVtYSB2YWxpZGF0b3IgZnVuY3Rpb24gZnJvbSBBanZcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpZF0gLSBTY2hlbWEgSURcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuVmFsaWRhdGVGdW5jdGlvbn1cbiAgICovXG4gIF9nZXRWYWxpZGF0b3IoaWQgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2Fqdi5nZXRTY2hlbWEoaWQpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICBpZiAoaWQgPT09IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcihpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0LCB2YWxpZGF0ZXMgaXQgYWdhaW5zdCB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gICAqIElmIGVycm9ycyBvY2N1ciwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgbm9uLWVtcHR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgKGhvcGVmdWxseSBhbiBvYmplY3QpIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSUQgb3IgcmVmLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IEFycmF5IG9mIGVycm9ycywgaWYgYW55LlxuICAgKi9cbiAgdmFsaWRhdGUodmFsdWUsIHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fZ2V0VmFsaWRhdG9yKHJlZik7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKSA/IFsuLi52YWxpZGF0b3IuZXJyb3JzXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGBmaWxlbmFtZWAncyBmaWxlIGV4dGVuc2lvbiBpcyBhbGxvd2VkIChpbiB7QGxpbmsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OU30pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbihmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgc2NoZW1hYCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgbm9uLXRydWUgYCRhc3luY2AgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWEgLSBTY2hlbWEgdG8gY2hlY2tcbiAgICogQHJldHVybnMge3NjaGVtYSBpcyBTY2hlbWFPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRTY2hlbWFUeXBlKHNjaGVtYSkge1xuICAgIHJldHVybiBfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSAmJiBzY2hlbWEuJGFzeW5jICE9PSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlIGhhcyBub3QgeWV0IGJlZW4gZmluYWxpemVkLCBidXRcbiAqIHRoZSBtZXRob2QgY2FsbGVkIHJlcXVpcmVzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9GSU5BTElaQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdTY2hlbWEgbm90IHlldCBmaW5hbGl6ZWQ7IGBmaW5hbGl6ZSgpYCBtdXN0IGJlIGNhbGxlZCBmaXJzdC4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgXCJ1bmlxdWVcIiBzY2hlbWEgSUQgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hIElELlxuICpcbiAqIFRoaXMgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGNhdXNlZCBieSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIHNjaGVtYSB0d2ljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYU5hbWVDb25mbGljdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfTkFNRV9DT05GTElDVCc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7ZXh0VHlwZTogRXh0ZW5zaW9uVHlwZSwgZXh0TmFtZTogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihgTmFtZSBmb3IgJHtleHRUeXBlfSBzY2hlbWEgXCIke2V4dE5hbWV9XCIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hYCk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY2hlbWFJZCkge1xuICAgIHN1cGVyKGBVbmtub3duIHNjaGVtYTogXCIke3NjaGVtYUlkfVwiYCk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYUlkfTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBidXQgaXQncyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICpcbiAqIFwiVmFsaWRcIiBzY2hlbWFzIHdoaWNoIGFyZSB1bnN1cHBvcnRlZCBpbmNsdWRlIGJvb2xlYW4gc2NoZW1hcyBhbmQgYXN5bmMgc2NoZW1hc1xuICogKGhhdmluZyBhIGB0cnVlYCBgJGFzeW5jYCBwcm9wZXJ0eSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOU1VQUE9SVEVEX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hOiBhbnksIGV4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvODI3N1xuICAgIHN1cGVyKFxuICAgICAgKCgpID0+IHtcbiAgICAgICAgbGV0IG1zZyA9IGBVbnN1cHBvcnRlZCBzY2hlbWEgZnJvbSAke2V4dFR5cGV9IFwiJHtleHROYW1lfVwiOmA7XG4gICAgICAgIGlmIChfLmlzQm9vbGVhbihzY2hlbWEpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIGNhbm5vdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICAgIGlmIChzY2hlbWEuJGFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGFuIGFzeW5jIHNjaGVtYWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBzY2hlbWEgSVMgc3VwcG9ydGVkOyB0aGlzIGVycm9yIHNob3VsZCBub3QgYmUgdGhyb3duICh0aGlzIGlzIGEgYnVnKS4gdmFsdWUgb2Ygc2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIG11c3QgYmUgYSBwbGFpbiBvYmplY3Qgd2l0aG91dCBhIHRydWUgXCIkYXN5bmNcIiBwcm9wZXJ0eWA7XG4gICAgICB9KSgpXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSB7c2NoZW1hLCBleHRUeXBlLCBleHROYW1lfTtcbiAgfVxufVxuXG5jb25zdCBhcHBpdW1TY2hlbWEgPSBBcHBpdW1TY2hlbWEuY3JlYXRlKCk7XG5cbmV4cG9ydCBjb25zdCB7XG4gIHJlZ2lzdGVyU2NoZW1hLFxuICBnZXRBbGxBcmdTcGVjcyxcbiAgZ2V0QXJnU3BlYyxcbiAgaGFzQXJnU3BlYyxcbiAgaXNGaW5hbGl6ZWQsXG4gIGZpbmFsaXplOiBmaW5hbGl6ZVNjaGVtYSxcbiAgcmVzZXQ6IHJlc2V0U2NoZW1hLFxuICB2YWxpZGF0ZSxcbiAgZ2V0U2NoZW1hLFxuICBmbGF0dGVuOiBmbGF0dGVuU2NoZW1hLFxuICBnZXREZWZhdWx0czogZ2V0RGVmYXVsdHNGb3JTY2hlbWEsXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uLFxufSA9IGFwcGl1bVNjaGVtYTtcbmV4cG9ydCBjb25zdCB7aXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbn0gPSBBcHBpdW1TY2hlbWE7XG5cbi8qKlxuICogQXBwaXVtIG9ubHkgc3VwcG9ydHMgc2NoZW1hcyB0aGF0IGFyZSBwbGFpbiBvYmplY3RzOyBub3QgYXJyYXlzLlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0ICYge1trZXk6IG51bWJlcl06IG5ldmVyfX0gU2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IGhhdmluZyBwcm9wZXJ0eSBgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlYFxuICogQHR5cGVkZWYgU3RyaWN0UHJvcFxuICogQHByb3BlcnR5IHtmYWxzZX0gYWRkaXRpb25hbFByb3BlcnRpZXNcbiAqL1xuXG4vKipcbiAqIEEge0BsaW5rIFNjaGVtYU9iamVjdH0gd2l0aCBgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlYFxuICogQHR5cGVkZWYge1NjaGVtYU9iamVjdCAmIFN0cmljdFByb3B9IFN0cmljdFNjaGVtYU9iamVjdFxuICovXG5cbi8qKlxuICogQSBsaXN0IG9mIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9IG9iamVjdHMuXG4gKlxuICogSW50ZXJtZWRpYXRlIGRhdGEgc3RydWN0dXJlIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRoZSBlbnRpcmUgc2NoZW1hIGRvd24gdG8gQ0xJIGFyZ3VtZW50cy5cbiAqIEB0eXBlZGVmIHsge3NjaGVtYTogU2NoZW1hT2JqZWN0LCBhcmdTcGVjOiBBcmdTcGVjfVtdIH0gRmxhdHRlbmVkU2NoZW1hXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJnU3BlY1snZGVmYXVsdFZhbHVlJ119IEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIGUuZy4gYHtkcml2ZXI6IHtmb286ICdiYXInfX1gIHdoZXJlIGBmb29gIGlzIHRoZSBhcmcgbmFtZSBhbmQgYGJhcmAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxSZWNvcmQ8c3RyaW5nLEFyZ1NwZWNEZWZhdWx0VmFsdWU+Pn0gTmVzdGVkQXJnU3BlY0RlZmF1bHRWYWx1ZVxuICovXG5cbi8qKlxuICogSGVscGVyIHR5cGUgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIEFwcGl1bVNjaGVtYS5nZXREZWZhdWx0c31cbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbnx1bmRlZmluZWR9IEZsYXR0ZW5lZFxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsRmxhdHRlbmVkIGV4dGVuZHMgdHJ1ZSA/IEFyZ1NwZWNEZWZhdWx0VmFsdWUgOiBBcmdTcGVjRGVmYXVsdFZhbHVlIHwgTmVzdGVkQXJnU3BlY0RlZmF1bHRWYWx1ZT59IERlZmF1bHRWYWx1ZXNcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQVFPLE1BQU1BLGFBQU4sU0FBNEJDLEdBQTVCLENBQWdDO0VBS3JDQyxHQUFHLENBQUNDLEdBQUQsRUFBTUMsS0FBTixFQUFhO0lBQ2QsSUFBSSxLQUFLQyxHQUFMLENBQVNGLEdBQVQsQ0FBSixFQUFtQjtNQUNqQixNQUFNLElBQUlHLEtBQUosQ0FBVyxHQUFFSCxHQUFJLGlCQUFqQixDQUFOO0lBQ0Q7O0lBQ0QsT0FBTyxNQUFNRCxHQUFOLENBQVVDLEdBQVYsRUFBZUMsS0FBZixDQUFQO0VBQ0Q7O0VBTURHLE1BQU0sQ0FBQ0osR0FBRCxFQUFNO0lBQ1YsT0FBTyxLQUFQO0VBQ0Q7O0VBRURLLEtBQUssR0FBRztJQUNOLE1BQU0sSUFBSUYsS0FBSixDQUFXLDRCQUFYLENBQU47RUFDRDs7QUF0Qm9DOzs7QUE0QmhDLE1BQU1HLHlCQUF5QixHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDLE9BQUQsRUFBVSxLQUFWLEVBQWlCLE1BQWpCLENBQVIsQ0FBbEM7OztBQU9QLE1BQU1DLFlBQU4sQ0FBbUI7RUFVakJDLFNBQVMsR0FBRyxJQUFJWixhQUFKLEVBQUg7RUFVVGEsa0JBQWtCLEdBQUc7SUFBQyxDQUFDQyxzQkFBRCxHQUFlLElBQUliLEdBQUosRUFBaEI7SUFBMkIsQ0FBQ2Msc0JBQUQsR0FBZSxJQUFJZCxHQUFKO0VBQTFDLENBQUg7RUFRbEJlLElBQUk7RUFPWSxPQUFUQyxTQUFTO0VBU2hCQyxpQkFBaUIsR0FBRyxJQUFI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
450
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSb2FjaEhvdGVsTWFwIiwiTWFwIiwic2V0Iiwia2V5IiwidmFsdWUiLCJoYXMiLCJFcnJvciIsImRlbGV0ZSIsImNsZWFyIiwiQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OUyIsIlNldCIsIkFwcGl1bVNjaGVtYSIsIl9hcmdTcGVjcyIsIl9yZWdpc3RlcmVkU2NoZW1hcyIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJfYWp2IiwiX2luc3RhbmNlIiwiX2ZpbmFsaXplZFNjaGVtYXMiLCJjb25zdHJ1Y3RvciIsIl9pbnN0YW50aWF0ZUFqdiIsImNyZWF0ZSIsImluc3RhbmNlIiwiXyIsImJpbmRBbGwiLCJoYXNSZWdpc3RlcmVkU2NoZW1hIiwiZXh0VHlwZSIsImV4dE5hbWUiLCJpc0ZpbmFsaXplZCIsIkJvb2xlYW4iLCJnZXRBbGxBcmdTcGVjcyIsImZpbmFsaXplIiwiYWp2IiwiYmFzZVNjaGVtYSIsImNsb25lRGVlcCIsIkFwcGl1bUNvbmZpZ0pzb25TY2hlbWEiLCJhZGRBcmdTcGVjcyIsInNjaGVtYSIsInByb3BOYW1lIiwicHJvcFNjaGVtYSIsIk9iamVjdCIsImVudHJpZXMiLCJhcmdTcGVjIiwiQXJnU3BlYyIsImRlc3QiLCJhcHBpdW1DbGlEZXN0IiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsImFyZyIsIm9taXQiLCJwcm9wZXJ0aWVzIiwic2VydmVyIiwiZmluYWxpemVkU2NoZW1hcyIsImZpbmFsU2NoZW1hIiwicmVkdWNlIiwiZXh0ZW5zaW9uU2NoZW1hcyIsImZvckVhY2giLCIkcmVmIiwidG9TY2hlbWFCYXNlUmVmIiwiJGlkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCIkY29tbWVudCIsInZhbGlkYXRlU2NoZW1hIiwiYWRkU2NoZW1hIiwiQVBQSVVNX0NPTkZJR19TQ0hFTUFfSUQiLCJmcmVlemUiLCJhZGRGb3JtYXRzIiwiQWp2IiwiYWxsRXJyb3JzIiwia2V5d29yZHMiLCJrZXl3b3JkIiwiYWRkS2V5d29yZCIsInJlc2V0Iiwic2NoZW1hSWQiLCJrZXlzIiwicmVtb3ZlU2NoZW1hIiwicmVnaXN0ZXJTY2hlbWEiLCJpc1VuZGVmaW5lZCIsIlR5cGVFcnJvciIsImlzU3VwcG9ydGVkU2NoZW1hVHlwZSIsIlNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3IiLCJub3JtYWxpemVkRXh0TmFtZSIsImtlYmFiQ2FzZSIsImdldCIsIlNjaGVtYU5hbWVDb25mbGljdEVycm9yIiwiZ2V0QXJnU3BlYyIsIm5hbWUiLCJ0b0FyZyIsImhhc0FyZ1NwZWMiLCJnZXREZWZhdWx0cyIsImZsYXR0ZW4iLCJTY2hlbWFGaW5hbGl6YXRpb25FcnJvciIsInJlZHVjZXIiLCJkZWZhdWx0cyIsInJldHZhbCIsInZhbHVlcyIsImdldERlZmF1bHRzRm9yRXh0ZW5zaW9uIiwic3BlY3MiLCJmaWx0ZXIiLCJzcGVjIiwicmF3RGVzdCIsImdldFNjaGVtYSIsInN0YWNrIiwicHJlZml4IiwiZmxhdHRlbmVkIiwicGFpcnMiLCJ0b1BhaXJzIiwicHVzaCIsIlNFUlZFUl9QUk9QX05BTUUiLCJyZWZTY2hlbWEiLCJlcnIiLCJTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IiLCJleHRlbnNpb25JbmZvRnJvbVJvb3RTY2hlbWFJZCIsIlJlZmVyZW5jZUVycm9yIiwicmVmIiwiX2dldFZhbGlkYXRvciIsImlkIiwidmFsaWRhdG9yIiwidmFsaWRhdGUiLCJpc0FycmF5IiwiZXJyb3JzIiwiaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbiIsImZpbGVuYW1lIiwicGF0aCIsImV4dG5hbWUiLCJpc1BsYWluT2JqZWN0IiwiJGFzeW5jIiwiY29kZSIsImRhdGEiLCJtc2ciLCJpc0Jvb2xlYW4iLCJKU09OIiwic3RyaW5naWZ5IiwiYXBwaXVtU2NoZW1hIiwiZmluYWxpemVTY2hlbWEiLCJyZXNldFNjaGVtYSIsImZsYXR0ZW5TY2hlbWEiLCJnZXREZWZhdWx0c0ZvclNjaGVtYSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBanYgZnJvbSAnYWp2JztcbmltcG9ydCBhZGRGb3JtYXRzIGZyb20gJ2Fqdi1mb3JtYXRzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7RFJJVkVSX1RZUEUsIFBMVUdJTl9UWVBFfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHtBcHBpdW1Db25maWdKc29uU2NoZW1hfSBmcm9tICdAYXBwaXVtL3NjaGVtYSc7XG5pbXBvcnQge0FQUElVTV9DT05GSUdfU0NIRU1BX0lELCBBcmdTcGVjLCBTRVJWRVJfUFJPUF9OQU1FfSBmcm9tICcuL2FyZy1zcGVjJztcbmltcG9ydCB7a2V5d29yZHN9IGZyb20gJy4va2V5d29yZHMnO1xuXG4vKipcbiAqIEtleS92YWx1ZSBwYWlycyBnbyBpbi4uLiBidXQgdGhleSBkb24ndCBjb21lIG91dC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAZXh0ZW5kcyB7TWFwPEssVj59XG4gKi9cbmV4cG9ydCBjbGFzcyBSb2FjaEhvdGVsTWFwIGV4dGVuZHMgTWFwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7S30ga2V5XG4gICAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAgICovXG4gIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKHRoaXMuaGFzKGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IGlzIGFscmVhZHkgc2V0YCk7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtLfSBrZXlcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBkZWxldGUoa2V5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgUm9hY2hIb3RlbE1hcGApO1xuICB9XG59XG5cbi8qKlxuICogRXh0ZW5zaW9ucyB0aGF0IGFuIGV4dGVuc2lvbiBzY2hlbWEgZmlsZSBjYW4gaGF2ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFMTE9XRURfU0NIRU1BX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmpzb24nLCAnLmpzJywgJy5janMnXSk7XG5cbi8qKlxuICogQSB3cmFwcGVyIGFyb3VuZCBBanYgYW5kIHNjaGVtYS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqXG4gKiBTaG91bGQgaGF2ZSBiZWVuIG5hbWVkIEhpZ2hsYW5kZXIsIGJlY2F1c2UgX3RoZXJlIGNhbiBvbmx5IGJlIG9uZV9cbiAqL1xuY2xhc3MgQXBwaXVtU2NoZW1hIHtcbiAgLyoqXG4gICAqIEEgbWFwcGluZyBvZiB1bmlxdWUgYXJndW1lbnQgSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9cy5cbiAgICpcbiAgICogQW4gXCJhcmd1bWVudFwiIGlzIGEgQ0xJIGFyZ3VtZW50IG9yIGEgY29uZmlnIHByb3BlcnR5LlxuICAgKlxuICAgKiBVc2VkIHRvIHByb3ZpZGUgZWFzeSBsb29rdXBzIG9mIGFyZ3VtZW50IG1ldGFkYXRhIHdoZW4gY29udmVydGluZyBiZXR3ZWVuIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbnMgb2YgdGhvc2UgYXJndW1lbnRzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAdHlwZSB7Um9hY2hIb3RlbE1hcDxzdHJpbmcsQXJnU3BlYz59XG4gICAqL1xuICBfYXJnU3BlY3MgPSBuZXcgUm9hY2hIb3RlbE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBleHRlbnNpb24gdHlwZXMgdG8gZXh0ZW5zaW9uIG5hbWVzIHRvIHNjaGVtYSBvYmplY3RzLlxuICAgKlxuICAgKiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW5zdXJlIHRoZXJlIGFyZSBubyBuYW1pbmcgY29uZmxpY3RzLiBUaGUgc2NoZW1hc1xuICAgKiBhcmUgc3RvcmVkIGhlcmUgaW4gbWVtb3J5IHVudGlsIHRoZSBpbnN0YW5jZSBpcyBfZmluYWxpemVkXy5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge1JlY29yZDxFeHRlbnNpb25UeXBlLE1hcDxzdHJpbmcsU2NoZW1hT2JqZWN0Pj59XG4gICAqL1xuICBfcmVnaXN0ZXJlZFNjaGVtYXMgPSB7W0RSSVZFUl9UWVBFXTogbmV3IE1hcCgpLCBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCl9O1xuXG4gIC8qKlxuICAgKiBBanYgaW5zdGFuY2VcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Fqdn1cbiAgICovXG4gIF9hanY7XG5cbiAgLyoqXG4gICAqIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBfaW5zdGFuY2U7XG5cbiAgLyoqXG4gICAqIExvb2t1cCBvZiBzY2hlbWEgSURzIHRvIGZpbmFsaXplZCBzY2hlbWFzLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgcmVmZXJlbmNlcywgYnV0IHJhdGhlciB0aGUgcm9vdCBzY2hlbWFzIHRoZW1zZWx2ZXMuXG4gICAqIEBwcml2YXRlXG4gICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLFN0cmljdFNjaGVtYU9iamVjdD4/fVxuICAgKi9cbiAgX2ZpbmFsaXplZFNjaGVtYXMgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBBanYsIGFkZHMgc3RhbmRhcmQgZm9ybWF0cyBhbmQgb3VyIGN1c3RvbSBrZXl3b3Jkcy5cbiAgICogQHNlZSBodHRwczovL25wbS5pbS9hanYtZm9ybWF0c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fYWp2ID0gQXBwaXVtU2NoZW1hLl9pbnN0YW50aWF0ZUFqdigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlcy5cbiAgICpcbiAgICogUmV0dXJucyBhIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2UgY3JlYXRlcyBhIG5ldyBvbmUuXG4gICAqIEJpbmRzIHB1YmxpYyBtZXRob2RzIHRvIHRoZSBpbnN0YW5jZS5cbiAgICogQHJldHVybnMge0FwcGl1bVNjaGVtYX1cbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoKSB7XG4gICAgaWYgKCFBcHBpdW1TY2hlbWEuX2luc3RhbmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBBcHBpdW1TY2hlbWEoKTtcbiAgICAgIEFwcGl1bVNjaGVtYS5faW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgIF8uYmluZEFsbChpbnN0YW5jZSwgW1xuICAgICAgICAnZmluYWxpemUnLFxuICAgICAgICAnZmxhdHRlbicsXG4gICAgICAgICdnZXRBbGxBcmdTcGVjcycsXG4gICAgICAgICdnZXRBcmdTcGVjJyxcbiAgICAgICAgJ2dldERlZmF1bHRzJyxcbiAgICAgICAgJ2dldERlZmF1bHRzRm9yRXh0ZW5zaW9uJyxcbiAgICAgICAgJ2dldFNjaGVtYScsXG4gICAgICAgICdoYXNBcmdTcGVjJyxcbiAgICAgICAgJ2lzRmluYWxpemVkJyxcbiAgICAgICAgJ3JlZ2lzdGVyU2NoZW1hJyxcbiAgICAgICAgJ2hhc1JlZ2lzdGVyZWRTY2hlbWEnLFxuICAgICAgICAncmVzZXQnLFxuICAgICAgICAndmFsaWRhdGUnLFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcGl1bVNjaGVtYS5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgYSBzY2hlbWEgaGFzIGJlZW4gcmVnaXN0ZXJlZCB1c2luZyBnaXZlbiBleHRlbnNpb24gdHlwZSBhbmQgbmFtZS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCBkZXBlbmQgb24gd2hldGhlciBvciBub3QgdGhlIGluc3RhbmNlIGhhcyBiZWVuIF9maW5hbGl6ZWRfLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHJlZ2lzdGVyZWRcbiAgICovXG4gIGhhc1JlZ2lzdGVyZWRTY2hlbWEoZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hc1tleHRUeXBlXS5oYXMoZXh0TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGB0cnVlYCBpZiB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplIGZpbmFsaXplfSBoYXMgYmVlbiBjYWxsZWRcbiAgICogc3VjY2Vzc2Z1bGx5IGFuZCB7QGxpbmsgQXBwaXVtU2NoZW1hLnJlc2V0IHJlc2V0fSBoYXMgbm90IGJlZW4gY2FsbGVkIHNpbmNlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gSWYgZmluYWxpemVkXG4gICAqL1xuICBpc0ZpbmFsaXplZCgpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9maW5hbGl6ZWRTY2hlbWFzKTtcbiAgfVxuXG4gIGdldEFsbEFyZ1NwZWNzKCkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIHRoaXMgd2hlbiBubyBtb3JlIHNjaGVtYXMgd2lsbCBiZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBUaGlzIGRvZXMgdGhyZWUgdGhpbmdzOlxuICAgKiAxLiBJdCBjb21iaW5lcyBhbGwgc2NoZW1hcyBmcm9tIGV4dGVuc2lvbnMgaW50byB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEsXG4gICAqICAgIHRoZW4gYWRkcyB0aGUgcmVzdWx0IHRvIHRoZSBgQWp2YCBpbnN0YW5jZS5cbiAgICogMi4gSXQgYWRkcyBzY2hlbWFzIGZvciBfZWFjaF8gYXJndW1lbnQvcHJvcGVydHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMuXG4gICAqICAgIFRoZSBDTEkgdXNlcyB0aGVzZSBzY2hlbWFzIHRvIHZhbGlkYXRlIHNwZWNpZmljIGFyZ3VtZW50cy5cbiAgICogMy4gVGhlIHNjaGVtYXMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IEpTT04gc2NoZW1hIGRyYWZ0LTA3ICh3aGljaCBpcyB0aGVcbiAgICogICAgb25seSBvbmUgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSlcbiAgICpcbiAgICogQW55IG1ldGhvZCBpbiB0aGlzIGluc3RhbmNlIHRoYXQgbmVlZHMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgYEFqdmAgaW5zdGFuY2VcbiAgICogd2lsbCB0aHJvdyBpZiB0aGlzIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBJZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBmaW5hbGl6ZWQsIHRoaXMgaXMgYSBuby1vcC5cbiAgICogQHB1YmxpY1xuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHNjaGVtYSBpcyBub3QgdmFsaWRcbiAgICogQHJldHVybnMge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsU3RyaWN0U2NoZW1hT2JqZWN0Pj59IFJlY29yZCBvZiBzY2hlbWEgSURzIHRvIGZ1bGwgc2NoZW1hIG9iamVjdHNcbiAgICovXG4gIGZpbmFsaXplKCkge1xuICAgIGlmICh0aGlzLmlzRmluYWxpemVkKCkpIHtcbiAgICAgIHJldHVybiAvKiogQHR5cGUge05vbk51bGxhYmxlPHR5cGVvZiB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzPn0gKi8gKHRoaXMuX2ZpbmFsaXplZFNjaGVtYXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGFqdiA9IHRoaXMuX2FqdjtcblxuICAgIC8vIEFqdiB3aWxsIF9tdXRhdGVfIHRoZSBzY2hlbWEsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuXG4gICAgY29uc3QgYmFzZVNjaGVtYSA9IF8uY2xvbmVEZWVwKEFwcGl1bUNvbmZpZ0pzb25TY2hlbWEpO1xuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1NjaGVtYU9iamVjdH0gc2NoZW1hXG4gICAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdXG4gICAgICovXG4gICAgY29uc3QgYWRkQXJnU3BlY3MgPSAoc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKSA9PiB7XG4gICAgICBmb3IgKGxldCBbcHJvcE5hbWUsIHByb3BTY2hlbWFdIG9mIE9iamVjdC5lbnRyaWVzKHNjaGVtYSkpIHtcbiAgICAgICAgY29uc3QgYXJnU3BlYyA9IEFyZ1NwZWMuY3JlYXRlKHByb3BOYW1lLCB7XG4gICAgICAgICAgZGVzdDogcHJvcFNjaGVtYS5hcHBpdW1DbGlEZXN0LFxuICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcFNjaGVtYS5kZWZhdWx0LFxuICAgICAgICAgIGV4dFR5cGUsXG4gICAgICAgICAgZXh0TmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHthcmd9ID0gYXJnU3BlYztcbiAgICAgICAgdGhpcy5fYXJnU3BlY3Muc2V0KGFyZywgYXJnU3BlYyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFkZEFyZ1NwZWNzKF8ub21pdChiYXNlU2NoZW1hLnByb3BlcnRpZXMuc2VydmVyLnByb3BlcnRpZXMsIFtEUklWRVJfVFlQRSwgUExVR0lOX1RZUEVdKSk7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7UmVjb3JkPHN0cmluZyxTdHJpY3RTY2hlbWFPYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IGZpbmFsaXplZFNjaGVtYXMgPSB7fTtcblxuICAgIGNvbnN0IGZpbmFsU2NoZW1hID0gXy5yZWR1Y2UoXG4gICAgICB0aGlzLl9yZWdpc3RlcmVkU2NoZW1hcyxcbiAgICAgIC8qKlxuICAgICAgICogQHBhcmFtIHt0eXBlb2YgYmFzZVNjaGVtYX0gYmFzZVNjaGVtYVxuICAgICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLFNjaGVtYU9iamVjdD59IGV4dGVuc2lvblNjaGVtYXNcbiAgICAgICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gZXh0VHlwZVxuICAgICAgICovXG4gICAgICAoYmFzZVNjaGVtYSwgZXh0ZW5zaW9uU2NoZW1hcywgZXh0VHlwZSkgPT4ge1xuICAgICAgICBleHRlbnNpb25TY2hlbWFzLmZvckVhY2goKHNjaGVtYSwgZXh0TmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyZWYgPSBBcmdTcGVjLnRvU2NoZW1hQmFzZVJlZihleHRUeXBlLCBleHROYW1lKTtcbiAgICAgICAgICBzY2hlbWEuJGlkID0gJHJlZjtcbiAgICAgICAgICBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsgLy8gdGhpcyBtYWtlcyBgc2NoZW1hYCBiZWNvbWUgYSBgU3RyaWN0U2NoZW1hT2JqZWN0YFxuICAgICAgICAgIGJhc2VTY2hlbWEucHJvcGVydGllcy5zZXJ2ZXIucHJvcGVydGllc1tleHRUeXBlXS5wcm9wZXJ0aWVzW2V4dE5hbWVdID0ge1xuICAgICAgICAgICAgJHJlZixcbiAgICAgICAgICAgICRjb21tZW50OiBleHROYW1lLFxuICAgICAgICAgIH07XG4gICAgICAgICAgYWp2LnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgICAgYWRkQXJnU3BlY3Moc2NoZW1hLnByb3BlcnRpZXMsIGV4dFR5cGUsIGV4dE5hbWUpO1xuICAgICAgICAgIGFqdi5hZGRTY2hlbWEoc2NoZW1hLCAkcmVmKTtcbiAgICAgICAgICBmaW5hbGl6ZWRTY2hlbWFzWyRyZWZdID0gLyoqIEB0eXBlIHtTdHJpY3RTY2hlbWFPYmplY3R9ICovIChzY2hlbWEpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJhc2VTY2hlbWE7XG4gICAgICB9LFxuICAgICAgYmFzZVNjaGVtYVxuICAgICk7XG5cbiAgICBhanYuYWRkU2NoZW1hKGZpbmFsU2NoZW1hLCBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCk7XG4gICAgZmluYWxpemVkU2NoZW1hc1tBUFBJVU1fQ09ORklHX1NDSEVNQV9JRF0gPSBmaW5hbFNjaGVtYTtcbiAgICBhanYudmFsaWRhdGVTY2hlbWEoZmluYWxTY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fZmluYWxpemVkU2NoZW1hcyA9IGZpbmFsaXplZFNjaGVtYXM7XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZmluYWxpemVkU2NoZW1hcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBhbmQgY3JlYXRlcyBhbiBBanYgaW5zdGFuY2UuXG4gICAqIEBwcml2YXRlXG4gICAqIEByZXR1cm5zIHtBanZ9XG4gICAqL1xuICBzdGF0aWMgX2luc3RhbnRpYXRlQWp2KCkge1xuICAgIGNvbnN0IGFqdiA9IGFkZEZvcm1hdHMoXG4gICAgICBuZXcgQWp2KHtcbiAgICAgICAgLy8gd2l0aG91dCB0aGlzIG5vdCBtdWNoIHZhbGlkYXRpb24gYWN0dWFsbHkgaGFwcGVuc1xuICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBhZGQgY3VzdG9tIGtleXdvcmRzIHRvIGFqdi4gc2VlIHNjaGVtYS1rZXl3b3Jkcy5qc1xuICAgIF8uZm9yRWFjaChrZXl3b3JkcywgKGtleXdvcmQpID0+IHtcbiAgICAgIGFqdi5hZGRLZXl3b3JkKGtleXdvcmQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFqdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhpcyBpbnN0YW5jZSB0byBpdHMgb3JpZ2luYWwgc3RhdGUuXG4gICAqXG4gICAqIC0gUmVtb3ZlcyBhbGwgYWRkZWQgc2NoZW1hcyBmcm9tIHRoZSBgQWp2YCBpbnN0YW5jZVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHtAbGluayBBcmdTcGVjIEFyZ1NwZWNzfVxuICAgKiAtIFJlc2V0cyB0aGUgbWFwIG9mIHJlZ2lzdGVyZWQgc2NoZW1hc1xuICAgKiAtIFNldHMgdGhlIHtAbGluayBBcHBpdW1TY2hlbWEuX2ZpbmFsaXplZCBfZmluYWxpemVkfSBmbGFnIHRvIGBmYWxzZWBcbiAgICpcbiAgICogSWYgeW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgQXBwaXVtU2NoZW1hLmZpbmFsaXplfSBhZ2FpbiwgeW91J2xsIHdhbnQgdG8gY2FsbCB0aGlzIGZpcnN0LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIGZvciAoY29uc3Qgc2NoZW1hSWQgb2YgT2JqZWN0LmtleXModGhpcy5fZmluYWxpemVkU2NoZW1hcyA/PyB7fSkpIHtcbiAgICAgIHRoaXMuX2Fqdi5yZW1vdmVTY2hlbWEoc2NoZW1hSWQpO1xuICAgIH1cbiAgICB0aGlzLl9hcmdTcGVjcyA9IG5ldyBSb2FjaEhvdGVsTWFwKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXMgPSB7XG4gICAgICBbRFJJVkVSX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgICBbUExVR0lOX1RZUEVdOiBuZXcgTWFwKCksXG4gICAgfTtcbiAgICB0aGlzLl9maW5hbGl6ZWRTY2hlbWFzID0gbnVsbDtcblxuICAgIC8vIEFqdiBzZWVtcyB0byBoYXZlIGFuIG92ZXItZWFnZXIgY2FjaGUsIHNvIHdlIGhhdmUgdG8gZHVtcCB0aGUgb2JqZWN0IGVudGlyZWx5LlxuICAgIHRoaXMuX2FqdiA9IEFwcGl1bVNjaGVtYS5faW5zdGFudGlhdGVBanYoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBzY2hlbWEgZnJvbSBhbiBleHRlbnNpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgXCJmYWlsLWZhc3RcIiBpbiB0aGF0IHRoZSBzY2hlbWEgd2lsbCBpbW1lZGlhdGVseSBiZSB2YWxpZGF0ZWQgYWdhaW5zdCBKU09OIHNjaGVtYSBkcmFmdC0wNyBfb3JfIHdoYXRldmVyIHRoZSB2YWx1ZSBvZiB0aGUgc2NoZW1hJ3MgYCRzY2hlbWFgIHByb3AgaXMuXG4gICAqXG4gICAqIERvZXMgX25vdF8gYWRkIHRoZSBzY2hlbWEgdG8gdGhlIGBhanZgIGluc3RhbmNlICh0aGlzIGlzIGRvbmUgYnkge0BsaW5rIEFwcGl1bVNjaGVtYS5maW5hbGl6ZX0pLlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGUgLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXh0TmFtZSAtIFVuaXF1ZSBleHRlbnNpb24gbmFtZSBmb3IgYHR5cGVgXG4gICAqIEBwYXJhbSB7U2NoZW1hT2JqZWN0fSBzY2hlbWEgLSBTY2hlbWEgb2JqZWN0XG4gICAqIEB0aHJvd3Mge1NjaGVtYU5hbWVDb25mbGljdEVycm9yfSBJZiB0aGUgc2NoZW1hIGlzIGFuIGludmFsaWRcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWdpc3RlclNjaGVtYShleHRUeXBlLCBleHROYW1lLCBzY2hlbWEpIHtcbiAgICBpZiAoIShleHRUeXBlICYmIGV4dE5hbWUpIHx8IF8uaXNVbmRlZmluZWQoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgZXh0ZW5zaW9uIHR5cGUsIGV4dGVuc2lvbiBuYW1lLCBhbmQgYSBkZWZpbmVkIHNjaGVtYScpO1xuICAgIH1cbiAgICBpZiAoIUFwcGl1bVNjaGVtYS5pc1N1cHBvcnRlZFNjaGVtYVR5cGUoc2NoZW1hKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYVVuc3VwcG9ydGVkU2NoZW1hRXJyb3Ioc2NoZW1hLCBleHRUeXBlLCBleHROYW1lKTtcbiAgICB9XG4gICAgY29uc3Qgbm9ybWFsaXplZEV4dE5hbWUgPSBfLmtlYmFiQ2FzZShleHROYW1lKTtcbiAgICBpZiAodGhpcy5oYXNSZWdpc3RlcmVkU2NoZW1hKGV4dFR5cGUsIG5vcm1hbGl6ZWRFeHROYW1lKSkge1xuICAgICAgaWYgKHRoaXMuX3JlZ2lzdGVyZWRTY2hlbWFzW2V4dFR5cGVdLmdldChub3JtYWxpemVkRXh0TmFtZSkgPT09IHNjaGVtYSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgU2NoZW1hTmFtZUNvbmZsaWN0RXJyb3IoZXh0VHlwZSwgZXh0TmFtZSk7XG4gICAgfVxuICAgIHRoaXMuX2Fqdi52YWxpZGF0ZVNjaGVtYShzY2hlbWEsIHRydWUpO1xuXG4gICAgdGhpcy5fcmVnaXN0ZXJlZFNjaGVtYXNbZXh0VHlwZV0uc2V0KG5vcm1hbGl6ZWRFeHROYW1lLCBzY2hlbWEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB7QGxpbmsgQXJnU3BlY30gZm9yIHRoZSBnaXZlbiBhcmd1bWVudCBuYW1lLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENMSSBhcmd1bWVudCBuYW1lXG4gICAqIEBwYXJhbSB7RXh0ZW5zaW9uVHlwZX0gW2V4dFR5cGVdIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtleHROYW1lXSAtIEV4dGVuc2lvbiBuYW1lXG4gICAqIEByZXR1cm5zIHtBcmdTcGVjfHVuZGVmaW5lZH0gQXJnU3BlYyBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmRcbiAgICovXG4gIGdldEFyZ1NwZWMobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5nZXQoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGluc3RhbmNlIGtub3dzIGFib3V0IGFuIGFyZ3VtZW50IGJ5IHRoZSBnaXZlbiBgbmFtZWAuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ0xJIGFyZ3VtZW50IG5hbWVcbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBbZXh0VHlwZV0gLSBFeHRlbnNpb24gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V4dE5hbWVdIC0gRXh0ZW5zaW9uIG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiBzdWNoIGFuIHtAbGluayBBcmdTcGVjfSBleGlzdHNcbiAgICovXG4gIGhhc0FyZ1NwZWMobmFtZSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIHJldHVybiB0aGlzLl9hcmdTcGVjcy5oYXMoQXJnU3BlYy50b0FyZyhuYW1lLCBleHRUeXBlLCBleHROYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGBSZWNvcmRgIG9mIGFyZ3VtZW50IFwiZGVzdFwiIHN0cmluZ3MgdG8gZGVmYXVsdCB2YWx1ZXMuXG4gICAqXG4gICAqIFRoZSBcImRlc3RcIiBzdHJpbmcgaXMgdGhlIHByb3BlcnR5IG5hbWUgaW4gb2JqZWN0IHJldHVybmVkIGJ5XG4gICAqIGBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlclsncGFyc2VfYXJncyddYC5cbiAgICogQHRlbXBsYXRlIHtib29sZWFufHVuZGVmaW5lZH0gRmxhdHRlbmVkXG4gICAqIEBwYXJhbSB7RmxhdHRlbmVkfSBbZmxhdHRlbj10cnVlXSAtIElmIGB0cnVlYCwgZmxhdHRlbnMgdGhlIHJldHVybmVkIG9iamVjdFxuICAgKiB1c2luZyBcImtleXBhdGhcIi1zdHlsZSBrZXlzIG9mIHRoZSBmb3JtYXQgYDxleHRUeXBlPi48ZXh0TmFtZT4uPGFyZ05hbWU+YC5cbiAgICogT3RoZXJ3aXNlLCByZXR1cm5zIGEgbmVzdGVkIG9iamVjdCB1c2luZyBgZXh0VHlwZWAgYW5kIGBleHROYW1lYCBhc1xuICAgKiBwcm9wZXJ0aWVzLiBCYXNlIGFyZ3VtZW50cyAoc2VydmVyIGFyZ3VtZW50cykgYXJlIGFsd2F5cyBhdCB0aGUgdG9wIGxldmVsLlxuICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgKi9cbiAgZ2V0RGVmYXVsdHMoZmxhdHRlbiA9IC8qKiBAdHlwZSB7RmxhdHRlbmVkfSAqLyAodHJ1ZSkpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAY2FsbGJhY2sgRGVmYXVsdFJlZHVjZXJcbiAgICAgKiBAcGFyYW0ge0RlZmF1bHRWYWx1ZXM8RmxhdHRlbmVkPn0gZGVmYXVsdHNcbiAgICAgKiBAcGFyYW0ge0FyZ1NwZWN9IGFyZ1NwZWNcbiAgICAgKiBAcmV0dXJucyB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fVxuICAgICAqL1xuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFJlZHVjZXJ9ICovXG4gICAgY29uc3QgcmVkdWNlciA9IGZsYXR0ZW5cbiAgICAgID8gKGRlZmF1bHRzLCB7ZGVmYXVsdFZhbHVlLCBkZXN0fSkgPT4ge1xuICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgICBkZWZhdWx0c1tkZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGRlZmF1bHRzO1xuICAgICAgICB9XG4gICAgICA6IChkZWZhdWx0cywge2RlZmF1bHRWYWx1ZSwgZGVzdH0pID0+IHtcbiAgICAgICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgICAgXy5zZXQoZGVmYXVsdHMsIGRlc3QsIGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICAgICAgfTtcblxuICAgIC8qKiBAdHlwZSB7RGVmYXVsdFZhbHVlczxGbGF0dGVuZWQ+fSAqL1xuICAgIGNvbnN0IHJldHZhbCA9IHt9O1xuICAgIHJldHVybiBbLi4udGhpcy5fYXJnU3BlY3MudmFsdWVzKCldLnJlZHVjZShyZWR1Y2VyLCByZXR2YWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBmbGF0dGVuZWQgUmVjb3JkIG9mIGRlZmF1bHRzIGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gS2V5cyB3aWxsXG4gICAqIGJlIG9mIGZvcm1hdCBgPGFyZ05hbWU+YC5cbiAgICogQHBhcmFtIHtFeHRlbnNpb25UeXBlfSBleHRUeXBlIC0gRXh0ZW5zaW9uIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWUgLSBFeHRlbnNpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZyxBcmdTcGVjRGVmYXVsdFZhbHVlPn1cbiAgICovXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBpZiAoIXRoaXMuaXNGaW5hbGl6ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFNjaGVtYUZpbmFsaXphdGlvbkVycm9yKCk7XG4gICAgfVxuICAgIGNvbnN0IHNwZWNzID0gWy4uLnRoaXMuX2FyZ1NwZWNzLnZhbHVlcygpXS5maWx0ZXIoXG4gICAgICAoc3BlYykgPT4gc3BlYy5leHRUeXBlID09PSBleHRUeXBlICYmIHNwZWMuZXh0TmFtZSA9PT0gZXh0TmFtZVxuICAgICk7XG4gICAgcmV0dXJuIHNwZWNzLnJlZHVjZSgoZGVmYXVsdHMsIHtkZWZhdWx0VmFsdWUsIHJhd0Rlc3R9KSA9PiB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICBkZWZhdWx0c1tyYXdEZXN0XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9LCB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmxhdHRlbiBzY2hlbWEgaW50byBhbiBhcnJheSBvZiBgU2NoZW1hT2JqZWN0YHMgYW5kIGFzc29jaWF0ZWRcbiAgICoge0BsaW5rIEFyZ1NwZWMgQXJnU3BlY3N9LlxuICAgKlxuICAgKiBDb252ZXJ0cyBuZXN0ZWQgZXh0ZW5zaW9uIHNjaGVtYXMgdG8ga2V5cyBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uIHR5cGUgYW5kXG4gICAqIG5hbWUuIFVzZWQgd2hlbiB0cmFuc2xhdGluZyB0byBgYXJncGFyc2VgIG9wdGlvbnMgb3IgZ2V0dGluZyB0aGUgbGlzdCBvZlxuICAgKiBkZWZhdWx0IHZhbHVlcyAoc2VlIHtAbGluayBBcHBpdW1TY2hlbWEuZ2V0RGVmYXVsdHN9KSBmb3IgQ0xJIG9yIG90aGVyd2lzZS5cbiAgICpcbiAgICogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBpbnRlcm1lZGlhdGUgcmVwcnNlbnRhdGlvbiB1c2VkIGJ5IGBjbGktYXJnc2BcbiAgICogbW9kdWxlJ3MgYHRvUGFyc2VyQXJnc2AsIHdoaWNoIGNvbnZlcnRzIHRoZSBmaW5hbGl6ZWQgc2NoZW1hIHRvIHBhcmFtZXRlcnNcbiAgICogdXNlZCBieSBgYXJncGFyc2VgLlxuICAgKiBAdGhyb3dzIElmIHtAbGluayBBcHBpdW1TY2hlbWEuZmluYWxpemV9IGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0LlxuICAgKiBAcmV0dXJucyB7RmxhdHRlbmVkU2NoZW1hfVxuICAgKi9cbiAgZmxhdHRlbigpIHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpO1xuXG4gICAgLyoqIEB0eXBlIHsge3Byb3BlcnRpZXM6IFNjaGVtYU9iamVjdCwgcHJlZml4OiBzdHJpbmdbXX1bXSB9ICovXG4gICAgY29uc3Qgc3RhY2sgPSBbe3Byb3BlcnRpZXM6IHNjaGVtYS5wcm9wZXJ0aWVzLCBwcmVmaXg6IFtdfV07XG4gICAgLyoqIEB0eXBlIHtGbGF0dGVuZWRTY2hlbWF9ICovXG4gICAgY29uc3QgZmxhdHRlbmVkID0gW107XG5cbiAgICAvLyB0aGlzIGJpdCBpcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0gcmV3cml0dGVuIGFzIGEgZm9yIGxvb3AuXG4gICAgLy8gd2hlbiB3ZSBmaW5kIHNvbWV0aGluZyB3ZSB3YW50IHRvIHRyYXZlcnNlLCB3ZSBhZGQgaXQgdG8gYHN0YWNrYFxuICAgIGZvciAoY29uc3Qge3Byb3BlcnRpZXMsIHByZWZpeH0gb2Ygc3RhY2spIHtcbiAgICAgIGNvbnN0IHBhaXJzID0gXy50b1BhaXJzKHByb3BlcnRpZXMpO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qge3Byb3BlcnRpZXMsICRyZWZ9ID0gdmFsdWU7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBrZXkgPT09IFNFUlZFUl9QUk9QX05BTUUgPyBbXSA6IFsuLi5wcmVmaXgsIGtleV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHJlZikge1xuICAgICAgICAgIGxldCByZWZTY2hlbWE7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlZlNjaGVtYSA9IHRoaXMuZ2V0U2NoZW1hKCRyZWYpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIGlmIGFuIGV4dGVuc2lvbiBzY2hlbWEgc3VwcGxpZXMgYSAkcmVmIHRvIGEgbm9uLWV4aXN0ZW50IHNjaGVtYVxuICAgICAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcigkcmVmKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge25vcm1hbGl6ZWRFeHROYW1lfSA9IEFyZ1NwZWMuZXh0ZW5zaW9uSW5mb0Zyb21Sb290U2NoZW1hSWQoJHJlZik7XG4gICAgICAgICAgaWYgKCFub3JtYWxpemVkRXh0TmFtZSkge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcbiAgICAgICAgICAgICAgYENvdWxkIG5vdCBkZXRlcm1pbmUgZXh0ZW5zaW9uIG5hbWUgZnJvbSBzY2hlbWEgSUQgJHskcmVmfS4gVGhpcyBpcyBhIGJ1Zy5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGFjay5wdXNoKHtcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IHJlZlNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgcHJlZml4OiBbLi4ucHJlZml4LCBrZXksIG5vcm1hbGl6ZWRFeHROYW1lXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT09IERSSVZFUl9UWVBFICYmIGtleSAhPT0gUExVR0lOX1RZUEUpIHtcbiAgICAgICAgICBjb25zdCBbZXh0VHlwZSwgZXh0TmFtZV0gPSBwcmVmaXg7XG4gICAgICAgICAgY29uc3QgYXJnU3BlYyA9IHRoaXMuZ2V0QXJnU3BlYyhrZXksIC8qKiBAdHlwZSB7RXh0ZW5zaW9uVHlwZX0gKi8gKGV4dFR5cGUpLCBleHROYW1lKTtcbiAgICAgICAgICBpZiAoIWFyZ1NwZWMpIHtcbiAgICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBVbmtub3duIGFyZ3VtZW50IHdpdGgga2V5ICR7a2V5fSwgZXh0VHlwZSAke2V4dFR5cGV9IGFuZCBleHROYW1lICR7ZXh0TmFtZX0uIFRoaXMgaXMgYSBidWcuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmxhdHRlbmVkLnB1c2goe3NjaGVtYTogXy5jbG9uZURlZXAodmFsdWUpLCBhcmdTcGVjfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgc2NoZW1hIGl0c2VsZlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcmVmXSAtIFNjaGVtYSBJRFxuICAgKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgaGFzIG5vdCB5ZXQgYmVlbiBmaW5hbGl6ZWRcbiAgICogQHJldHVybnMge1NjaGVtYU9iamVjdH1cbiAgICovXG4gIGdldFNjaGVtYShyZWYgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1NjaGVtYU9iamVjdH0gKi8gKHRoaXMuX2dldFZhbGlkYXRvcihyZWYpLnNjaGVtYSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHNjaGVtYSB2YWxpZGF0b3IgZnVuY3Rpb24gZnJvbSBBanZcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtpZF0gLSBTY2hlbWEgSURcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybnMge2ltcG9ydCgnYWp2JykuVmFsaWRhdGVGdW5jdGlvbn1cbiAgICovXG4gIF9nZXRWYWxpZGF0b3IoaWQgPSBBUFBJVU1fQ09ORklHX1NDSEVNQV9JRCkge1xuICAgIGNvbnN0IHZhbGlkYXRvciA9IHRoaXMuX2Fqdi5nZXRTY2hlbWEoaWQpO1xuICAgIGlmICghdmFsaWRhdG9yKSB7XG4gICAgICBpZiAoaWQgPT09IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgICAgIHRocm93IG5ldyBTY2hlbWFGaW5hbGl6YXRpb25FcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFNjaGVtYVVua25vd25TY2hlbWFFcnJvcihpZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWxpZGF0b3I7XG4gIH1cblxuICAvKipcbiAgICogR2l2ZW4gYW4gb2JqZWN0LCB2YWxpZGF0ZXMgaXQgYWdhaW5zdCB0aGUgQXBwaXVtIGNvbmZpZyBzY2hlbWEuXG4gICAqIElmIGVycm9ycyBvY2N1ciwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgYmUgbm9uLWVtcHR5LlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgKGhvcGVmdWxseSBhbiBvYmplY3QpIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIHNjaGVtYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3JlZl0gLSBTY2hlbWEgSUQgb3IgcmVmLlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoJ2FqdicpLkVycm9yT2JqZWN0W119IEFycmF5IG9mIGVycm9ycywgaWYgYW55LlxuICAgKi9cbiAgdmFsaWRhdGUodmFsdWUsIHJlZiA9IEFQUElVTV9DT05GSUdfU0NIRU1BX0lEKSB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5fZ2V0VmFsaWRhdG9yKHJlZik7XG4gICAgcmV0dXJuICF2YWxpZGF0b3IodmFsdWUpICYmIF8uaXNBcnJheSh2YWxpZGF0b3IuZXJyb3JzKSA/IFsuLi52YWxpZGF0b3IuZXJyb3JzXSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYHRydWVgIGlmIGBmaWxlbmFtZWAncyBmaWxlIGV4dGVuc2lvbiBpcyBhbGxvd2VkIChpbiB7QGxpbmsgQUxMT1dFRF9TQ0hFTUFfRVhURU5TSU9OU30pLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmlsZW5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBzdGF0aWMgaXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbihmaWxlbmFtZSkge1xuICAgIHJldHVybiBBTExPV0VEX1NDSEVNQV9FWFRFTlNJT05TLmhhcyhwYXRoLmV4dG5hbWUoZmlsZW5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiBgc2NoZW1hYCBpcyBhIHBsYWluIG9iamVjdCB3aXRoIGEgbm9uLXRydWUgYCRhc3luY2AgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7YW55fSBzY2hlbWEgLSBTY2hlbWEgdG8gY2hlY2tcbiAgICogQHJldHVybnMge3NjaGVtYSBpcyBTY2hlbWFPYmplY3R9XG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRTY2hlbWFUeXBlKHNjaGVtYSkge1xuICAgIHJldHVybiBfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSAmJiBzY2hlbWEuJGFzeW5jICE9PSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHtAbGluayBBcHBpdW1TY2hlbWF9IGluc3RhbmNlIGhhcyBub3QgeWV0IGJlZW4gZmluYWxpemVkLCBidXRcbiAqIHRoZSBtZXRob2QgY2FsbGVkIHJlcXVpcmVzIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2NoZW1hRmluYWxpemF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9GSU5BTElaQVRJT04nO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdTY2hlbWEgbm90IHlldCBmaW5hbGl6ZWQ7IGBmaW5hbGl6ZSgpYCBtdXN0IGJlIGNhbGxlZCBmaXJzdC4nKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgXCJ1bmlxdWVcIiBzY2hlbWEgSUQgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hIElELlxuICpcbiAqIFRoaXMgaXMgbGlrZWx5IGdvaW5nIHRvIGJlIGNhdXNlZCBieSBhdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIHRoZSBzYW1lIHNjaGVtYSB0d2ljZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYU5hbWVDb25mbGljdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQHR5cGUge1JlYWRvbmx5PHN0cmluZz59XG4gICAqL1xuICBjb2RlID0gJ0FQUElVTUVSUl9TQ0hFTUFfTkFNRV9DT05GTElDVCc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7ZXh0VHlwZTogRXh0ZW5zaW9uVHlwZSwgZXh0TmFtZTogc3RyaW5nfT59XG4gICAqL1xuICBkYXRhO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4dFR5cGUsIGV4dE5hbWUpIHtcbiAgICBzdXBlcihgTmFtZSBmb3IgJHtleHRUeXBlfSBzY2hlbWEgXCIke2V4dE5hbWV9XCIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgc2NoZW1hYCk7XG4gICAgdGhpcy5kYXRhID0ge2V4dFR5cGUsIGV4dE5hbWV9O1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBzY2hlbWEgSUQgd2FzIGV4cGVjdGVkLCBidXQgaXQgZG9lc24ndCBleGlzdCBvbiB0aGUge0BsaW5rIEFqdn0gaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbmtub3duU2NoZW1hRXJyb3IgZXh0ZW5kcyBSZWZlcmVuY2VFcnJvciB7XG4gIC8qKlxuICAgKiBAdHlwZSB7UmVhZG9ubHk8c3RyaW5nPn1cbiAgICovXG4gIGNvZGUgPSAnQVBQSVVNRVJSX1NDSEVNQV9VTktOT1dOX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hSWQ6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNjaGVtYUlkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY2hlbWFJZCkge1xuICAgIHN1cGVyKGBVbmtub3duIHNjaGVtYTogXCIke3NjaGVtYUlkfVwiYCk7XG4gICAgdGhpcy5kYXRhID0ge3NjaGVtYUlkfTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgc2NoZW1hIGlzIHByb3ZpZGVkLCBidXQgaXQncyBvZiBhbiB1bnN1cHBvcnRlZCB0eXBlLlxuICpcbiAqIFwiVmFsaWRcIiBzY2hlbWFzIHdoaWNoIGFyZSB1bnN1cHBvcnRlZCBpbmNsdWRlIGJvb2xlYW4gc2NoZW1hcyBhbmQgYXN5bmMgc2NoZW1hc1xuICogKGhhdmluZyBhIGB0cnVlYCBgJGFzeW5jYCBwcm9wZXJ0eSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBTY2hlbWFVbnN1cHBvcnRlZFNjaGVtYUVycm9yIGV4dGVuZHMgVHlwZUVycm9yIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTxzdHJpbmc+fVxuICAgKi9cbiAgY29kZSA9ICdBUFBJVU1FUlJfU0NIRU1BX1VOU1VQUE9SVEVEX1NDSEVNQSc7XG5cbiAgLyoqXG4gICAqIEB0eXBlIHtSZWFkb25seTx7c2NoZW1hOiBhbnksIGV4dFR5cGU6IEV4dGVuc2lvblR5cGUsIGV4dE5hbWU6IHN0cmluZ30+fVxuICAgKi9cbiAgZGF0YTtcblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHNjaGVtYVxuICAgKiBAcGFyYW0ge0V4dGVuc2lvblR5cGV9IGV4dFR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4dE5hbWVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjaGVtYSwgZXh0VHlwZSwgZXh0TmFtZSkge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvODI3N1xuICAgIHN1cGVyKFxuICAgICAgKCgpID0+IHtcbiAgICAgICAgbGV0IG1zZyA9IGBVbnN1cHBvcnRlZCBzY2hlbWEgZnJvbSAke2V4dFR5cGV9IFwiJHtleHROYW1lfVwiOmA7XG4gICAgICAgIGlmIChfLmlzQm9vbGVhbihzY2hlbWEpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIGNhbm5vdCBiZSBhIGJvb2xlYW5gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmlzUGxhaW5PYmplY3Qoc2NoZW1hKSkge1xuICAgICAgICAgIGlmIChzY2hlbWEuJGFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bXNnfSBzY2hlbWEgY2Fubm90IGJlIGFuIGFzeW5jIHNjaGVtYWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgIGBzY2hlbWEgSVMgc3VwcG9ydGVkOyB0aGlzIGVycm9yIHNob3VsZCBub3QgYmUgdGhyb3duICh0aGlzIGlzIGEgYnVnKS4gdmFsdWUgb2Ygc2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke21zZ30gc2NoZW1hIG11c3QgYmUgYSBwbGFpbiBvYmplY3Qgd2l0aG91dCBhIHRydWUgXCIkYXN5bmNcIiBwcm9wZXJ0eWA7XG4gICAgICB9KSgpXG4gICAgKTtcbiAgICB0aGlzLmRhdGEgPSB7c2NoZW1hLCBleHRUeXBlLCBleHROYW1lfTtcbiAgfVxufVxuXG5jb25zdCBhcHBpdW1TY2hlbWEgPSBBcHBpdW1TY2hlbWEuY3JlYXRlKCk7XG5cbmV4cG9ydCBjb25zdCB7XG4gIHJlZ2lzdGVyU2NoZW1hLFxuICBnZXRBbGxBcmdTcGVjcyxcbiAgZ2V0QXJnU3BlYyxcbiAgaGFzQXJnU3BlYyxcbiAgaXNGaW5hbGl6ZWQsXG4gIGZpbmFsaXplOiBmaW5hbGl6ZVNjaGVtYSxcbiAgcmVzZXQ6IHJlc2V0U2NoZW1hLFxuICB2YWxpZGF0ZSxcbiAgZ2V0U2NoZW1hLFxuICBmbGF0dGVuOiBmbGF0dGVuU2NoZW1hLFxuICBnZXREZWZhdWx0czogZ2V0RGVmYXVsdHNGb3JTY2hlbWEsXG4gIGdldERlZmF1bHRzRm9yRXh0ZW5zaW9uLFxufSA9IGFwcGl1bVNjaGVtYTtcbmV4cG9ydCBjb25zdCB7aXNBbGxvd2VkU2NoZW1hRmlsZUV4dGVuc2lvbn0gPSBBcHBpdW1TY2hlbWE7XG5cbi8qKlxuICogQXBwaXVtIG9ubHkgc3VwcG9ydHMgc2NoZW1hcyB0aGF0IGFyZSBwbGFpbiBvYmplY3RzOyBub3QgYXJyYXlzLlxuICogQHR5cGVkZWYge2ltcG9ydCgnYWp2JykuU2NoZW1hT2JqZWN0ICYge1trZXk6IG51bWJlcl06IG5ldmVyfX0gU2NoZW1hT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7aW1wb3J0KCdAYXBwaXVtL3R5cGVzJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG5cbi8qKlxuICogQW4gb2JqZWN0IGhhdmluZyBwcm9wZXJ0eSBgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlYFxuICogQHR5cGVkZWYgU3RyaWN0UHJvcFxuICogQHByb3BlcnR5IHtmYWxzZX0gYWRkaXRpb25hbFByb3BlcnRpZXNcbiAqL1xuXG4vKipcbiAqIEEge0BsaW5rIFNjaGVtYU9iamVjdH0gd2l0aCBgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlYFxuICogQHR5cGVkZWYge1NjaGVtYU9iamVjdCAmIFN0cmljdFByb3B9IFN0cmljdFNjaGVtYU9iamVjdFxuICovXG5cbi8qKlxuICogQSBsaXN0IG9mIHNjaGVtYXMgYXNzb2NpYXRlZCB3aXRoIHByb3BlcnRpZXMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIEFyZ1NwZWN9IG9iamVjdHMuXG4gKlxuICogSW50ZXJtZWRpYXRlIGRhdGEgc3RydWN0dXJlIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRoZSBlbnRpcmUgc2NoZW1hIGRvd24gdG8gQ0xJIGFyZ3VtZW50cy5cbiAqIEB0eXBlZGVmIHsge3NjaGVtYTogU2NoZW1hT2JqZWN0LCBhcmdTcGVjOiBBcmdTcGVjfVtdIH0gRmxhdHRlbmVkU2NoZW1hXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJnU3BlY1snZGVmYXVsdFZhbHVlJ119IEFyZ1NwZWNEZWZhdWx0VmFsdWVcbiAqL1xuXG4vKipcbiAqIGUuZy4gYHtkcml2ZXI6IHtmb286ICdiYXInfX1gIHdoZXJlIGBmb29gIGlzIHRoZSBhcmcgbmFtZSBhbmQgYGJhcmAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZyxSZWNvcmQ8c3RyaW5nLEFyZ1NwZWNEZWZhdWx0VmFsdWU+Pn0gTmVzdGVkQXJnU3BlY0RlZmF1bHRWYWx1ZVxuICovXG5cbi8qKlxuICogSGVscGVyIHR5cGUgZm9yIHRoZSByZXR1cm4gdmFsdWUgb2Yge0BsaW5rIEFwcGl1bVNjaGVtYS5nZXREZWZhdWx0c31cbiAqIEB0ZW1wbGF0ZSB7Ym9vbGVhbnx1bmRlZmluZWR9IEZsYXR0ZW5lZFxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsRmxhdHRlbmVkIGV4dGVuZHMgdHJ1ZSA/IEFyZ1NwZWNEZWZhdWx0VmFsdWUgOiBBcmdTcGVjRGVmYXVsdFZhbHVlIHwgTmVzdGVkQXJnU3BlY0RlZmF1bHRWYWx1ZT59IERlZmF1bHRWYWx1ZXNcbiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQVFPLE1BQU1BLGFBQU4sU0FBNEJDLEdBQTVCLENBQWdDO0VBS3JDQyxHQUFHLENBQUNDLEdBQUQsRUFBTUMsS0FBTixFQUFhO0lBQ2QsSUFBSSxLQUFLQyxHQUFMLENBQVNGLEdBQVQsQ0FBSixFQUFtQjtNQUNqQixNQUFNLElBQUlHLEtBQUosQ0FBVyxHQUFFSCxHQUFJLGlCQUFqQixDQUFOO0lBQ0Q7O0lBQ0QsT0FBTyxNQUFNRCxHQUFOLENBQVVDLEdBQVYsRUFBZUMsS0FBZixDQUFQO0VBQ0Q7O0VBTURHLE1BQU0sQ0FBQ0osR0FBRCxFQUFNO0lBQ1YsT0FBTyxLQUFQO0VBQ0Q7O0VBRURLLEtBQUssR0FBRztJQUNOLE1BQU0sSUFBSUYsS0FBSixDQUFXLDRCQUFYLENBQU47RUFDRDs7QUF0Qm9DOzs7QUE0QmhDLE1BQU1HLHlCQUF5QixHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDLE9BQUQsRUFBVSxLQUFWLEVBQWlCLE1BQWpCLENBQVIsQ0FBbEM7OztBQU9QLE1BQU1DLFlBQU4sQ0FBbUI7RUFVakJDLFNBQVMsR0FBRyxJQUFJWixhQUFKLEVBQUg7RUFVVGEsa0JBQWtCLEdBQUc7SUFBQyxDQUFDQyxzQkFBRCxHQUFlLElBQUliLEdBQUosRUFBaEI7SUFBMkIsQ0FBQ2Msc0JBQUQsR0FBZSxJQUFJZCxHQUFKO0VBQTFDLENBQUg7RUFRbEJlLElBQUk7RUFPWSxPQUFUQyxTQUFTO0VBU2hCQyxpQkFBaUIsR0FBRyxJQUFI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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":["RoachHotelMap","Map","set","key","value","has","Error","delete","clear","ALLOWED_SCHEMA_EXTENSIONS","Set","AppiumSchema","_argSpecs","_registeredSchemas","DRIVER_TYPE","PLUGIN_TYPE","_ajv","_instance","_finalizedSchemas","constructor","_instantiateAjv","create","instance","_","bindAll","hasRegisteredSchema","extType","extName","isFinalized","Boolean","getAllArgSpecs","finalize","ajv","baseSchema","cloneDeep","AppiumConfigJsonSchema","addArgSpecs","schema","propName","propSchema","Object","entries","argSpec","ArgSpec","dest","appiumCliDest","defaultValue","default","arg","omit","properties","server","finalizedSchemas","finalSchema","reduce","extensionSchemas","forEach","$ref","toSchemaBaseRef","$id","additionalProperties","$comment","validateSchema","addSchema","APPIUM_CONFIG_SCHEMA_ID","freeze","addFormats","Ajv","allErrors","keywords","keyword","addKeyword","reset","schemaId","keys","removeSchema","registerSchema","isUndefined","TypeError","isSupportedSchemaType","SchemaUnsupportedSchemaError","normalizedExtName","kebabCase","get","SchemaNameConflictError","getArgSpec","name","toArg","hasArgSpec","getDefaults","flatten","SchemaFinalizationError","reducer","defaults","retval","values","getDefaultsForExtension","specs","filter","spec","rawDest","getSchema","stack","prefix","flattened","pairs","toPairs","push","SERVER_PROP_NAME","refSchema","err","SchemaUnknownSchemaError","extensionInfoFromRootSchemaId","ReferenceError","ref","_getValidator","id","validator","validate","isArray","errors","isAllowedSchemaFileExtension","filename","path","extname","isPlainObject","$async","code","data","msg","isBoolean","JSON","stringify","appiumSchema","finalizeSchema","resetSchema","flattenSchema","getDefaultsForSchema"],"sources":["../../../lib/schema/schema.js"],"sourcesContent":["import Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\nimport _ from 'lodash';\nimport path from 'path';\nimport {DRIVER_TYPE, PLUGIN_TYPE} from '../constants';\nimport {AppiumConfigJsonSchema} from '@appium/schema';\nimport {APPIUM_CONFIG_SCHEMA_ID, ArgSpec, SERVER_PROP_NAME} from './arg-spec';\nimport {keywords} from './keywords';\n\n/**\n * Key/value pairs go in... but they don't come out.\n *\n * @template K,V\n * @extends {Map<K,V>}\n */\nexport class RoachHotelMap extends Map {\n /**\n * @param {K} key\n * @param {V} value\n */\n set(key, value) {\n if (this.has(key)) {\n throw new Error(`${key} is already set`);\n }\n return super.set(key, value);\n }\n\n /**\n * @param {K} key\n */\n // eslint-disable-next-line no-unused-vars\n delete(key) {\n return false;\n }\n\n clear() {\n throw new Error(`Cannot clear RoachHotelMap`);\n }\n}\n\n/**\n * Extensions that an extension schema file can have.\n */\nexport const ALLOWED_SCHEMA_EXTENSIONS = new Set(['.json', '.js', '.cjs']);\n\n/**\n * A wrapper around Ajv and schema-related functions.\n *\n * Should have been named Highlander, because _there can only be one_\n */\nclass AppiumSchema {\n /**\n * A mapping of unique argument IDs to their corresponding {@link ArgSpec}s.\n *\n * An \"argument\" is a CLI argument or a config property.\n *\n * Used to provide easy lookups of argument metadata when converting between different representations of those arguments.\n * @private\n * @type {RoachHotelMap<string,ArgSpec>}\n */\n _argSpecs = new RoachHotelMap();\n\n /**\n * A map of extension types to extension names to schema objects.\n *\n * This data structure is used to ensure there are no naming conflicts. The schemas\n * are stored here in memory until the instance is _finalized_.\n * @private\n * @type {Record<ExtensionType,Map<string,SchemaObject>>}\n */\n _registeredSchemas = {[DRIVER_TYPE]: new Map(), [PLUGIN_TYPE]: new Map()};\n\n /**\n * Ajv instance\n *\n * @private\n * @type {Ajv}\n */\n _ajv;\n\n /**\n * Singleton instance.\n * @private\n * @type {AppiumSchema}\n */\n static _instance;\n\n /**\n * Lookup of schema IDs to finalized schemas.\n *\n * This does not include references, but rather the root schemas themselves.\n * @private\n * @type {Record<string,StrictSchemaObject>?}\n */\n _finalizedSchemas = null;\n\n /**\n * Initializes Ajv, adds standard formats and our custom keywords.\n * @see https://npm.im/ajv-formats\n * @private\n */\n constructor() {\n this._ajv = AppiumSchema._instantiateAjv();\n }\n\n /**\n * Factory function for {@link AppiumSchema} instances.\n *\n * Returns a singleton instance if one exists, otherwise creates a new one.\n * Binds public methods to the instance.\n * @returns {AppiumSchema}\n */\n static create() {\n if (!AppiumSchema._instance) {\n const instance = new AppiumSchema();\n AppiumSchema._instance = instance;\n _.bindAll(instance, [\n 'finalize',\n 'flatten',\n 'getAllArgSpecs',\n 'getArgSpec',\n 'getDefaults',\n 'getDefaultsForExtension',\n 'getSchema',\n 'hasArgSpec',\n 'isFinalized',\n 'registerSchema',\n 'hasRegisteredSchema',\n 'reset',\n 'validate',\n ]);\n }\n\n return AppiumSchema._instance;\n }\n\n /**\n * Returns `true` if a schema has been registered using given extension type and name.\n *\n * This does not depend on whether or not the instance has been _finalized_.\n * @param {ExtensionType} extType - Extension type\n * @param {string} extName - Name\n * @returns {boolean} If registered\n */\n hasRegisteredSchema(extType, extName) {\n return this._registeredSchemas[extType].has(extName);\n }\n\n /**\n * Return `true` if {@link AppiumSchema.finalize finalize} has been called\n * successfully and {@link AppiumSchema.reset reset} has not been called since.\n * @returns {boolean} If finalized\n */\n isFinalized() {\n return Boolean(this._finalizedSchemas);\n }\n\n getAllArgSpecs() {\n return this._argSpecs;\n }\n\n /**\n * Call this when no more schemas will be registered.\n *\n * This does three things:\n * 1. It combines all schemas from extensions into the Appium config schema,\n * then adds the result to the `Ajv` instance.\n * 2. It adds schemas for _each_ argument/property for validation purposes.\n * The CLI uses these schemas to validate specific arguments.\n * 3. The schemas are validated against JSON schema draft-07 (which is the\n * only one supported at this time)\n *\n * Any method in this instance that needs to interact with the `Ajv` instance\n * will throw if this method has not been called.\n *\n * If the instance has already been finalized, this is a no-op.\n * @public\n * @throws {Error} If the schema is not valid\n * @returns {Readonly<Record<string,StrictSchemaObject>>} Record of schema IDs to full schema objects\n */\n finalize() {\n if (this.isFinalized()) {\n return /** @type {NonNullable<typeof this._finalizedSchemas>} */ (this._finalizedSchemas);\n }\n\n const ajv = this._ajv;\n\n // Ajv will _mutate_ the schema, so we need to clone it.\n const baseSchema = _.cloneDeep(AppiumConfigJsonSchema);\n\n /**\n *\n * @param {SchemaObject} schema\n * @param {ExtensionType} [extType]\n * @param {string} [extName]\n */\n const addArgSpecs = (schema, extType, extName) => {\n for (let [propName, propSchema] of Object.entries(schema)) {\n const argSpec = ArgSpec.create(propName, {\n dest: propSchema.appiumCliDest,\n defaultValue: propSchema.default,\n extType,\n extName,\n });\n const {arg} = argSpec;\n this._argSpecs.set(arg, argSpec);\n }\n };\n\n addArgSpecs(_.omit(baseSchema.properties.server.properties, [DRIVER_TYPE, PLUGIN_TYPE]));\n\n /**\n * @type {Record<string,StrictSchemaObject>}\n */\n const finalizedSchemas = {};\n\n const finalSchema = _.reduce(\n this._registeredSchemas,\n /**\n * @param {typeof baseSchema} baseSchema\n * @param {Map<string,SchemaObject>} extensionSchemas\n * @param {ExtensionType} extType\n */\n (baseSchema, extensionSchemas, extType) => {\n extensionSchemas.forEach((schema, extName) => {\n const $ref = ArgSpec.toSchemaBaseRef(extType, extName);\n schema.$id = $ref;\n schema.additionalProperties = false; // this makes `schema` become a `StrictSchemaObject`\n baseSchema.properties.server.properties[extType].properties[extName] = {\n $ref,\n $comment: extName,\n };\n ajv.validateSchema(schema, true);\n addArgSpecs(schema.properties, extType, extName);\n ajv.addSchema(schema, $ref);\n finalizedSchemas[$ref] = /** @type {StrictSchemaObject} */ (schema);\n });\n return baseSchema;\n },\n baseSchema\n );\n\n ajv.addSchema(finalSchema, APPIUM_CONFIG_SCHEMA_ID);\n finalizedSchemas[APPIUM_CONFIG_SCHEMA_ID] = finalSchema;\n ajv.validateSchema(finalSchema, true);\n\n this._finalizedSchemas = finalizedSchemas;\n return Object.freeze(finalizedSchemas);\n }\n\n /**\n * Configures and creates an Ajv instance.\n * @private\n * @returns {Ajv}\n */\n static _instantiateAjv() {\n const ajv = addFormats(\n new Ajv({\n // without this not much validation actually happens\n allErrors: true,\n })\n );\n\n // add custom keywords to ajv. see schema-keywords.js\n _.forEach(keywords, (keyword) => {\n ajv.addKeyword(keyword);\n });\n\n return ajv;\n }\n\n /**\n * Resets this instance to its original state.\n *\n * - Removes all added schemas from the `Ajv` instance\n * - Resets the map of {@link ArgSpec ArgSpecs}\n * - Resets the map of registered schemas\n * - Sets the {@link AppiumSchema._finalized _finalized} flag to `false`\n *\n * If you need to call {@link AppiumSchema.finalize} again, you'll want to call this first.\n * @returns {void}\n */\n reset() {\n for (const schemaId of Object.keys(this._finalizedSchemas ?? {})) {\n this._ajv.removeSchema(schemaId);\n }\n this._argSpecs = new RoachHotelMap();\n this._registeredSchemas = {\n [DRIVER_TYPE]: new Map(),\n [PLUGIN_TYPE]: new Map(),\n };\n this._finalizedSchemas = null;\n\n // Ajv seems to have an over-eager cache, so we have to dump the object entirely.\n this._ajv = AppiumSchema._instantiateAjv();\n }\n\n /**\n * Registers a schema from an extension.\n *\n * This is \"fail-fast\" in that the schema will immediately be validated against JSON schema draft-07 _or_ whatever the value of the schema's `$schema` prop is.\n *\n * Does _not_ add the schema to the `ajv` instance (this is done by {@link AppiumSchema.finalize}).\n * @param {ExtensionType} extType - Extension type\n * @param {string} extName - Unique extension name for `type`\n * @param {SchemaObject} schema - Schema object\n * @throws {SchemaNameConflictError} If the schema is an invalid\n * @returns {void}\n */\n registerSchema(extType, extName, schema) {\n if (!(extType && extName) || _.isUndefined(schema)) {\n throw new TypeError('Expected extension type, extension name, and a defined schema');\n }\n if (!AppiumSchema.isSupportedSchemaType(schema)) {\n throw new SchemaUnsupportedSchemaError(schema, extType, extName);\n }\n const normalizedExtName = _.kebabCase(extName);\n if (this.hasRegisteredSchema(extType, normalizedExtName)) {\n if (this._registeredSchemas[extType].get(normalizedExtName) === schema) {\n return;\n }\n throw new SchemaNameConflictError(extType, extName);\n }\n this._ajv.validateSchema(schema, true);\n\n this._registeredSchemas[extType].set(normalizedExtName, schema);\n }\n\n /**\n * Returns a {@link ArgSpec} for the given argument name.\n * @param {string} name - CLI argument name\n * @param {ExtensionType} [extType] - Extension type\n * @param {string} [extName] - Extension name\n * @returns {ArgSpec|undefined} ArgSpec or `undefined` if not found\n */\n getArgSpec(name, extType, extName) {\n return this._argSpecs.get(ArgSpec.toArg(name, extType, extName));\n }\n\n /**\n * Returns `true` if the instance knows about an argument by the given `name`.\n * @param {string} name - CLI argument name\n * @param {ExtensionType} [extType] - Extension type\n * @param {string} [extName] - Extension name\n * @returns {boolean} `true` if such an {@link ArgSpec} exists\n */\n hasArgSpec(name, extType, extName) {\n return this._argSpecs.has(ArgSpec.toArg(name, extType, extName));\n }\n\n /**\n * Returns a `Record` of argument \"dest\" strings to default values.\n *\n * The \"dest\" string is the property name in object returned by\n * `argparse.ArgumentParser['parse_args']`.\n * @template {boolean|undefined} Flattened\n * @param {Flattened} [flatten=true] - If `true`, flattens the returned object\n * using \"keypath\"-style keys of the format `<extType>.<extName>.<argName>`.\n * Otherwise, returns a nested object using `extType` and `extName` as\n * properties. Base arguments (server arguments) are always at the top level.\n * @returns {DefaultValues<Flattened>}\n */\n getDefaults(flatten = /** @type {Flattened} */ (true)) {\n if (!this.isFinalized()) {\n throw new SchemaFinalizationError();\n }\n\n /**\n * @private\n * @callback DefaultReducer\n * @param {DefaultValues<Flattened>} defaults\n * @param {ArgSpec} argSpec\n * @returns {DefaultValues<Flattened>}\n */\n /** @type {DefaultReducer} */\n const reducer = flatten\n ? (defaults, {defaultValue, dest}) => {\n if (!_.isUndefined(defaultValue)) {\n defaults[dest] = defaultValue;\n }\n return defaults;\n }\n : (defaults, {defaultValue, dest}) => {\n if (!_.isUndefined(defaultValue)) {\n _.set(defaults, dest, defaultValue);\n }\n return defaults;\n };\n\n /** @type {DefaultValues<Flattened>} */\n const retval = {};\n return [...this._argSpecs.values()].reduce(reducer, retval);\n }\n\n /**\n * Returns a flattened Record of defaults for a specific extension. Keys will\n * be of format `<argName>`.\n * @param {ExtensionType} extType - Extension type\n * @param {string} extName - Extension name\n * @returns {Record<string,ArgSpecDefaultValue>}\n */\n getDefaultsForExtension(extType, extName) {\n if (!this.isFinalized()) {\n throw new SchemaFinalizationError();\n }\n const specs = [...this._argSpecs.values()].filter(\n (spec) => spec.extType === extType && spec.extName === extName\n );\n return specs.reduce((defaults, {defaultValue, rawDest}) => {\n if (!_.isUndefined(defaultValue)) {\n defaults[rawDest] = defaultValue;\n }\n return defaults;\n }, {});\n }\n\n /**\n * Flatten schema into an array of `SchemaObject`s and associated\n * {@link ArgSpec ArgSpecs}.\n *\n * Converts nested extension schemas to keys based on the extension type and\n * name. Used when translating to `argparse` options or getting the list of\n * default values (see {@link AppiumSchema.getDefaults}) for CLI or otherwise.\n *\n * The return value is an intermediate reprsentation used by `cli-args`\n * module's `toParserArgs`, which converts the finalized schema to parameters\n * used by `argparse`.\n * @throws If {@link AppiumSchema.finalize} has not been called yet.\n * @returns {FlattenedSchema}\n */\n flatten() {\n const schema = this.getSchema();\n\n /** @type { {properties: SchemaObject, prefix: string[]}[] } */\n const stack = [{properties: schema.properties, prefix: []}];\n /** @type {FlattenedSchema} */\n const flattened = [];\n\n // this bit is a recursive algorithm rewritten as a for loop.\n // when we find something we want to traverse, we add it to `stack`\n for (const {properties, prefix} of stack) {\n const pairs = _.toPairs(properties);\n for (const [key, value] of pairs) {\n const {properties, $ref} = value;\n if (properties) {\n stack.push({\n properties,\n prefix: key === SERVER_PROP_NAME ? [] : [...prefix, key],\n });\n } else if ($ref) {\n let refSchema;\n try {\n refSchema = this.getSchema($ref);\n } catch (err) {\n // this can happen if an extension schema supplies a $ref to a non-existent schema\n throw new SchemaUnknownSchemaError($ref);\n }\n const {normalizedExtName} = ArgSpec.extensionInfoFromRootSchemaId($ref);\n if (!normalizedExtName) {\n /* istanbul ignore next */\n throw new ReferenceError(\n `Could not determine extension name from schema ID ${$ref}. This is a bug.`\n );\n }\n stack.push({\n properties: refSchema.properties,\n prefix: [...prefix, key, normalizedExtName],\n });\n } else if (key !== DRIVER_TYPE && key !== PLUGIN_TYPE) {\n const [extType, extName] = prefix;\n const argSpec = this.getArgSpec(key, /** @type {ExtensionType} */ (extType), extName);\n if (!argSpec) {\n /* istanbul ignore next */\n throw new ReferenceError(\n `Unknown argument with key ${key}, extType ${extType} and extName ${extName}. This is a bug.`\n );\n }\n flattened.push({schema: _.cloneDeep(value), argSpec});\n }\n }\n }\n\n return flattened;\n }\n\n /**\n * Retrieves the schema itself\n * @public\n * @param {string} [ref] - Schema ID\n * @throws If the schema has not yet been finalized\n * @returns {SchemaObject}\n */\n getSchema(ref = APPIUM_CONFIG_SCHEMA_ID) {\n return /** @type {SchemaObject} */ (this._getValidator(ref).schema);\n }\n\n /**\n * Retrieves schema validator function from Ajv\n * @param {string} [id] - Schema ID\n * @private\n * @returns {import('ajv').ValidateFunction}\n */\n _getValidator(id = APPIUM_CONFIG_SCHEMA_ID) {\n const validator = this._ajv.getSchema(id);\n if (!validator) {\n if (id === APPIUM_CONFIG_SCHEMA_ID) {\n throw new SchemaFinalizationError();\n } else {\n throw new SchemaUnknownSchemaError(id);\n }\n }\n return validator;\n }\n\n /**\n * Given an object, validates it against the Appium config schema.\n * If errors occur, the returned array will be non-empty.\n * @param {any} value - The value (hopefully an object) to validate against the schema\n * @param {string} [ref] - Schema ID or ref.\n * @public\n * @returns {import('ajv').ErrorObject[]} Array of errors, if any.\n */\n validate(value, ref = APPIUM_CONFIG_SCHEMA_ID) {\n const validator = this._getValidator(ref);\n return !validator(value) && _.isArray(validator.errors) ? [...validator.errors] : [];\n }\n\n /**\n * Returns `true` if `filename`'s file extension is allowed (in {@link ALLOWED_SCHEMA_EXTENSIONS}).\n * @param {string} filename\n * @returns {boolean}\n */\n static isAllowedSchemaFileExtension(filename) {\n return ALLOWED_SCHEMA_EXTENSIONS.has(path.extname(filename));\n }\n\n /**\n * Returns `true` if `schema` is a plain object with a non-true `$async` property.\n * @param {any} schema - Schema to check\n * @returns {schema is SchemaObject}\n */\n static isSupportedSchemaType(schema) {\n return _.isPlainObject(schema) && schema.$async !== true;\n }\n}\n\n/**\n * Thrown when the {@link AppiumSchema} instance has not yet been finalized, but\n * the method called requires it.\n */\nexport class SchemaFinalizationError extends Error {\n /**\n * @type {Readonly<string>}\n */\n code = 'APPIUMERR_SCHEMA_FINALIZATION';\n\n constructor() {\n super('Schema not yet finalized; `finalize()` must be called first.');\n }\n}\n\n/**\n * Thrown when a \"unique\" schema ID conflicts with an existing schema ID.\n *\n * This is likely going to be caused by attempting to register the same schema twice.\n */\nexport class SchemaNameConflictError extends Error {\n /**\n * @type {Readonly<string>}\n */\n code = 'APPIUMERR_SCHEMA_NAME_CONFLICT';\n\n /**\n * @type {Readonly<{extType: ExtensionType, extName: string}>}\n */\n data;\n\n /**\n * @param {ExtensionType} extType\n * @param {string} extName\n */\n constructor(extType, extName) {\n super(`Name for ${extType} schema \"${extName}\" conflicts with an existing schema`);\n this.data = {extType, extName};\n }\n}\n\n/**\n * Thrown when a schema ID was expected, but it doesn't exist on the {@link Ajv} instance.\n */\nexport class SchemaUnknownSchemaError extends ReferenceError {\n /**\n * @type {Readonly<string>}\n */\n code = 'APPIUMERR_SCHEMA_UNKNOWN_SCHEMA';\n\n /**\n * @type {Readonly<{schemaId: string}>}\n */\n data;\n\n /**\n * @param {string} schemaId\n */\n constructor(schemaId) {\n super(`Unknown schema: \"${schemaId}\"`);\n this.data = {schemaId};\n }\n}\n\n/**\n * Thrown when a schema is provided, but it's of an unsupported type.\n *\n * \"Valid\" schemas which are unsupported include boolean schemas and async schemas\n * (having a `true` `$async` property).\n */\nexport class SchemaUnsupportedSchemaError extends TypeError {\n /**\n * @type {Readonly<string>}\n */\n code = 'APPIUMERR_SCHEMA_UNSUPPORTED_SCHEMA';\n\n /**\n * @type {Readonly<{schema: any, extType: ExtensionType, extName: string}>}\n */\n data;\n\n /**\n * @param {any} schema\n * @param {ExtensionType} extType\n * @param {string} extName\n */\n constructor(schema, extType, extName) {\n // https://github.com/Microsoft/TypeScript/issues/8277\n super(\n (() => {\n let msg = `Unsupported schema from ${extType} \"${extName}\":`;\n if (_.isBoolean(schema)) {\n return `${msg} schema cannot be a boolean`;\n }\n if (_.isPlainObject(schema)) {\n if (schema.$async) {\n return `${msg} schema cannot be an async schema`;\n }\n /* istanbul ignore next */\n throw new TypeError(\n `schema IS supported; this error should not be thrown (this is a bug). value of schema: ${JSON.stringify(\n schema\n )}`\n );\n }\n return `${msg} schema must be a plain object without a true \"$async\" property`;\n })()\n );\n this.data = {schema, extType, extName};\n }\n}\n\nconst appiumSchema = AppiumSchema.create();\n\nexport const {\n registerSchema,\n getAllArgSpecs,\n getArgSpec,\n hasArgSpec,\n isFinalized,\n finalize: finalizeSchema,\n reset: resetSchema,\n validate,\n getSchema,\n flatten: flattenSchema,\n getDefaults: getDefaultsForSchema,\n getDefaultsForExtension,\n} = appiumSchema;\nexport const {isAllowedSchemaFileExtension} = AppiumSchema;\n\n/**\n * Appium only supports schemas that are plain objects; not arrays.\n * @typedef {import('ajv').SchemaObject & {[key: number]: never}} SchemaObject\n */\n\n/**\n * @typedef {import('@appium/types').ExtensionType} ExtensionType\n */\n\n/**\n * An object having property `additionalProperties: false`\n * @typedef StrictProp\n * @property {false} additionalProperties\n */\n\n/**\n * A {@link SchemaObject} with `additionalProperties: false`\n * @typedef {SchemaObject & StrictProp} StrictSchemaObject\n */\n\n/**\n * A list of schemas associated with properties and their corresponding {@link ArgSpec} objects.\n *\n * Intermediate data structure used when converting the entire schema down to CLI arguments.\n * @typedef { {schema: SchemaObject, argSpec: ArgSpec}[] } FlattenedSchema\n */\n\n/**\n * @typedef {ArgSpec['defaultValue']} ArgSpecDefaultValue\n */\n\n/**\n * e.g. `{driver: {foo: 'bar'}}` where `foo` is the arg name and `bar` is the default value.\n * @typedef {Record<string,Record<string,ArgSpecDefaultValue>>} NestedArgSpecDefaultValue\n */\n\n/**\n * Helper type for the return value of {@link AppiumSchema.getDefaults}\n * @template {boolean|undefined} Flattened\n * @typedef {Record<string,Flattened extends true ? ArgSpecDefaultValue : ArgSpecDefaultValue | NestedArgSpecDefaultValue>} DefaultValues\n */\n"],"mappings":"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"}