appium 2.0.0-beta.25 → 2.0.0-beta.26

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 (124) hide show
  1. package/build/lib/appium-config.schema.json +278 -0
  2. package/build/lib/appium.js +45 -66
  3. package/build/lib/cli/args.js +19 -39
  4. package/build/lib/cli/driver-command.js +5 -9
  5. package/build/lib/cli/extension-command.js +73 -64
  6. package/build/lib/cli/extension.js +10 -23
  7. package/build/lib/cli/parser.js +9 -19
  8. package/build/lib/cli/plugin-command.js +5 -9
  9. package/build/lib/cli/utils.js +2 -4
  10. package/build/lib/config-file.js +2 -4
  11. package/build/lib/config.js +7 -6
  12. package/build/lib/constants.js +60 -0
  13. package/build/lib/extension/driver-config.js +190 -0
  14. package/build/lib/extension/extension-config.js +297 -0
  15. package/build/lib/extension/index.js +77 -0
  16. package/build/lib/extension/manifest.js +246 -0
  17. package/build/lib/extension/package-changed.js +68 -0
  18. package/build/lib/extension/plugin-config.js +87 -0
  19. package/build/lib/grid-register.js +2 -4
  20. package/build/lib/logger.js +2 -4
  21. package/build/lib/logsink.js +2 -4
  22. package/build/lib/main.js +40 -68
  23. package/build/lib/schema/appium-config-schema.js +2 -4
  24. package/build/lib/schema/arg-spec.js +11 -14
  25. package/build/lib/schema/cli-args.js +2 -4
  26. package/build/lib/schema/cli-transformers.js +2 -4
  27. package/build/lib/schema/index.js +2 -4
  28. package/build/lib/schema/keywords.js +2 -4
  29. package/build/lib/schema/schema.js +55 -37
  30. package/build/lib/utils.js +1 -32
  31. package/lib/appium.js +50 -68
  32. package/lib/cli/args.js +19 -23
  33. package/lib/cli/driver-command.js +10 -2
  34. package/lib/cli/extension-command.js +216 -135
  35. package/lib/cli/extension.js +7 -15
  36. package/lib/cli/parser.js +6 -14
  37. package/lib/cli/plugin-command.js +1 -2
  38. package/lib/config-file.js +3 -3
  39. package/lib/config.js +5 -4
  40. package/lib/constants.js +79 -0
  41. package/lib/extension/driver-config.js +230 -0
  42. package/lib/extension/extension-config.js +459 -0
  43. package/lib/extension/index.js +103 -0
  44. package/lib/extension/manifest.js +590 -0
  45. package/lib/extension/package-changed.js +64 -0
  46. package/lib/extension/plugin-config.js +111 -0
  47. package/lib/grid-register.js +4 -4
  48. package/lib/main.js +51 -88
  49. package/lib/schema/arg-spec.js +2 -2
  50. package/lib/schema/cli-args.js +1 -0
  51. package/lib/schema/keywords.js +1 -1
  52. package/lib/schema/schema.js +60 -28
  53. package/lib/utils.js +2 -32
  54. package/package.json +29 -21
  55. package/{postinstall.js → scripts/postinstall.js} +1 -1
  56. package/types/types.d.ts +70 -31
  57. package/bin/ios-webkit-debug-proxy-launcher.js +0 -71
  58. package/build/check-npm-pack-files.js +0 -23
  59. package/build/commands-yml/parse.js +0 -319
  60. package/build/commands-yml/validator.js +0 -130
  61. package/build/index.js +0 -19
  62. package/build/lib/cli/npm.js +0 -220
  63. package/build/lib/driver-config.js +0 -100
  64. package/build/lib/drivers.js +0 -100
  65. package/build/lib/ext-config-io.js +0 -165
  66. package/build/lib/extension-config.js +0 -320
  67. package/build/lib/plugin-config.js +0 -69
  68. package/build/lib/plugins.js +0 -18
  69. package/build/postinstall.js +0 -90
  70. package/build/test/cli/cli-e2e-specs.js +0 -221
  71. package/build/test/cli/cli-helpers.js +0 -86
  72. package/build/test/cli/cli-specs.js +0 -71
  73. package/build/test/cli/fixtures/test-driver/package.json +0 -27
  74. package/build/test/cli/schema-args-specs.js +0 -48
  75. package/build/test/cli/schema-e2e-specs.js +0 -47
  76. package/build/test/config-e2e-specs.js +0 -112
  77. package/build/test/config-file-e2e-specs.js +0 -191
  78. package/build/test/config-file-specs.js +0 -281
  79. package/build/test/config-specs.js +0 -258
  80. package/build/test/driver-e2e-specs.js +0 -435
  81. package/build/test/driver-specs.js +0 -386
  82. package/build/test/ext-config-io-specs.js +0 -181
  83. package/build/test/extension-config-specs.js +0 -365
  84. package/build/test/fixtures/allow-feat.txt +0 -5
  85. package/build/test/fixtures/caps.json +0 -3
  86. package/build/test/fixtures/config/allow-insecure.txt +0 -3
  87. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +0 -5
  88. package/build/test/fixtures/config/appium.config.bad.json +0 -32
  89. package/build/test/fixtures/config/appium.config.ext-good.json +0 -9
  90. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +0 -10
  91. package/build/test/fixtures/config/appium.config.good.js +0 -40
  92. package/build/test/fixtures/config/appium.config.good.json +0 -33
  93. package/build/test/fixtures/config/appium.config.good.yaml +0 -30
  94. package/build/test/fixtures/config/appium.config.invalid.json +0 -31
  95. package/build/test/fixtures/config/appium.config.security-array.json +0 -5
  96. package/build/test/fixtures/config/appium.config.security-delimited.json +0 -5
  97. package/build/test/fixtures/config/appium.config.security-path.json +0 -5
  98. package/build/test/fixtures/config/driver-fake.config.json +0 -8
  99. package/build/test/fixtures/config/nodeconfig.json +0 -3
  100. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  101. package/build/test/fixtures/default-args.js +0 -35
  102. package/build/test/fixtures/deny-feat.txt +0 -5
  103. package/build/test/fixtures/driver.schema.js +0 -20
  104. package/build/test/fixtures/extensions.yaml +0 -27
  105. package/build/test/fixtures/flattened-schema.js +0 -532
  106. package/build/test/fixtures/plugin.schema.js +0 -20
  107. package/build/test/fixtures/schema-with-extensions.js +0 -28
  108. package/build/test/grid-register-specs.js +0 -74
  109. package/build/test/helpers.js +0 -75
  110. package/build/test/logger-specs.js +0 -76
  111. package/build/test/npm-specs.js +0 -20
  112. package/build/test/parser-specs.js +0 -319
  113. package/build/test/plugin-e2e-specs.js +0 -316
  114. package/build/test/schema/arg-spec-specs.js +0 -70
  115. package/build/test/schema/cli-args-specs.js +0 -408
  116. package/build/test/schema/schema-specs.js +0 -407
  117. package/build/test/utils-specs.js +0 -288
  118. package/lib/cli/npm.js +0 -251
  119. package/lib/driver-config.js +0 -101
  120. package/lib/drivers.js +0 -84
  121. package/lib/ext-config-io.js +0 -287
  122. package/lib/extension-config.js +0 -366
  123. package/lib/plugin-config.js +0 -63
  124. package/lib/plugins.js +0 -13
@@ -1,48 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _helpers = require("../helpers");
8
-
9
- var _sinon = _interopRequireDefault(require("sinon"));
10
-
11
- var _schema = require("../../lib/schema/schema");
12
-
13
- const expect = chai.expect;
14
- describe('cli/schema-args', function () {
15
- let schemaArgs;
16
- let sandbox;
17
- beforeEach(function () {
18
- sandbox = _sinon.default.createSandbox();
19
- schemaArgs = _helpers.rewiremock.proxy(() => require('../../lib/schema/cli-args'));
20
- });
21
- afterEach(function () {
22
- sandbox.restore();
23
- });
24
- describe('toParserArgs()', function () {
25
- describe('when called with no parameters', function () {
26
- beforeEach(_schema.finalizeSchema);
27
- afterEach(_schema.resetSchema);
28
- it('should return a Map', function () {
29
- expect(schemaArgs.toParserArgs()).to.be.an.instanceof(Map).and.have.property('size').that.is.above(0);
30
- });
31
- it('should generate metavars in SCREAMING_SNAKE_CASE', function () {
32
- const argDefs = schemaArgs.toParserArgs();
33
- const argDefsWithMetavar = [...argDefs].filter(arg => arg[1].metavar);
34
- expect(argDefsWithMetavar).not.to.be.empty;
35
- expect(argDefsWithMetavar.every(arg => /[A-Z_]+/.test(arg[1].metavar))).to.be.true;
36
- });
37
- });
38
- describe('when schema has not yet been compiled', function () {
39
- it('should throw', function () {
40
- (0, _schema.resetSchema)();
41
- expect(() => schemaArgs.toParserArgs()).to.throw(_schema.SchemaFinalizationError);
42
- });
43
- });
44
- });
45
- });require('source-map-support').install();
46
-
47
-
48
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL3NjaGVtYS1hcmdzLXNwZWNzLmpzIl0sIm5hbWVzIjpbImV4cGVjdCIsImNoYWkiLCJkZXNjcmliZSIsInNjaGVtYUFyZ3MiLCJzYW5kYm94IiwiYmVmb3JlRWFjaCIsInNpbm9uIiwiY3JlYXRlU2FuZGJveCIsInJld2lyZW1vY2siLCJwcm94eSIsInJlcXVpcmUiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwiZmluYWxpemVTY2hlbWEiLCJyZXNldFNjaGVtYSIsIml0IiwidG9QYXJzZXJBcmdzIiwidG8iLCJiZSIsImFuIiwiaW5zdGFuY2VvZiIsIk1hcCIsImFuZCIsImhhdmUiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImFib3ZlIiwiYXJnRGVmcyIsImFyZ0RlZnNXaXRoTWV0YXZhciIsImZpbHRlciIsImFyZyIsIm1ldGF2YXIiLCJub3QiLCJlbXB0eSIsImV2ZXJ5IiwidGVzdCIsInRydWUiLCJ0aHJvdyIsIlNjaGVtYUZpbmFsaXphdGlvbkVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxNQUFNLEdBQUdDLElBQUksQ0FBQ0QsTUFBcEI7QUFFQUUsUUFBUSxDQUFDLGlCQUFELEVBQW9CLFlBQVk7QUFFdEMsTUFBSUMsVUFBSjtBQUtBLE1BQUlDLE9BQUo7QUFFQUMsRUFBQUEsVUFBVSxDQUFDLFlBQVk7QUFDckJELElBQUFBLE9BQU8sR0FBR0UsZUFBTUMsYUFBTixFQUFWO0FBQ0FKLElBQUFBLFVBQVUsR0FBR0ssb0JBQVdDLEtBQVgsQ0FBaUIsTUFBTUMsT0FBTyxDQUFDLDJCQUFELENBQTlCLENBQWI7QUFDRCxHQUhTLENBQVY7QUFLQUMsRUFBQUEsU0FBUyxDQUFDLFlBQVk7QUFDcEJQLElBQUFBLE9BQU8sQ0FBQ1EsT0FBUjtBQUNELEdBRlEsQ0FBVDtBQUlBVixFQUFBQSxRQUFRLENBQUMsZ0JBQUQsRUFBbUIsWUFBWTtBQUNyQ0EsSUFBQUEsUUFBUSxDQUFDLGdDQUFELEVBQW1DLFlBQVk7QUFDckRHLE1BQUFBLFVBQVUsQ0FBQ1Esc0JBQUQsQ0FBVjtBQUVBRixNQUFBQSxTQUFTLENBQUNHLG1CQUFELENBQVQ7QUFFQUMsTUFBQUEsRUFBRSxDQUFDLHFCQUFELEVBQXdCLFlBQVk7QUFDcENmLFFBQUFBLE1BQU0sQ0FBQ0csVUFBVSxDQUFDYSxZQUFYLEVBQUQsQ0FBTixDQUFrQ0MsRUFBbEMsQ0FBcUNDLEVBQXJDLENBQXdDQyxFQUF4QyxDQUEyQ0MsVUFBM0MsQ0FBc0RDLEdBQXRELEVBQTJEQyxHQUEzRCxDQUErREMsSUFBL0QsQ0FBb0VDLFFBQXBFLENBQTZFLE1BQTdFLEVBQXFGQyxJQUFyRixDQUEwRkMsRUFBMUYsQ0FBNkZDLEtBQTdGLENBQW1HLENBQW5HO0FBQ0QsT0FGQyxDQUFGO0FBSUFaLE1BQUFBLEVBQUUsQ0FBQyxrREFBRCxFQUFxRCxZQUFZO0FBQ2pFLGNBQU1hLE9BQU8sR0FBR3pCLFVBQVUsQ0FBQ2EsWUFBWCxFQUFoQjtBQUNBLGNBQU1hLGtCQUFrQixHQUFHLENBQUMsR0FBR0QsT0FBSixFQUFhRSxNQUFiLENBQXFCQyxHQUFELElBQVNBLEdBQUcsQ0FBQyxDQUFELENBQUgsQ0FBT0MsT0FBcEMsQ0FBM0I7QUFDQWhDLFFBQUFBLE1BQU0sQ0FBQzZCLGtCQUFELENBQU4sQ0FBMkJJLEdBQTNCLENBQStCaEIsRUFBL0IsQ0FBa0NDLEVBQWxDLENBQXFDZ0IsS0FBckM7QUFFQWxDLFFBQUFBLE1BQU0sQ0FDSjZCLGtCQUFrQixDQUFDTSxLQUFuQixDQUEwQkosR0FBRCxJQUFTLFVBQVVLLElBQVYsQ0FBZUwsR0FBRyxDQUFDLENBQUQsQ0FBSCxDQUFPQyxPQUF0QixDQUFsQyxDQURJLENBQU4sQ0FFRWYsRUFGRixDQUVLQyxFQUZMLENBRVFtQixJQUZSO0FBR0QsT0FSQyxDQUFGO0FBU0QsS0FsQk8sQ0FBUjtBQW9CQW5DLElBQUFBLFFBQVEsQ0FBQyx1Q0FBRCxFQUEwQyxZQUFZO0FBQzVEYSxNQUFBQSxFQUFFLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQzdCO0FBQ0FmLFFBQUFBLE1BQU0sQ0FBQyxNQUFNRyxVQUFVLENBQUNhLFlBQVgsRUFBUCxDQUFOLENBQXdDQyxFQUF4QyxDQUEyQ3FCLEtBQTNDLENBQ0VDLCtCQURGO0FBR0QsT0FMQyxDQUFGO0FBTUQsS0FQTyxDQUFSO0FBUUQsR0E3Qk8sQ0FBUjtBQThCRCxDQWhETyxDQUFSIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtyZXdpcmVtb2NrfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQge2ZpbmFsaXplU2NoZW1hLCByZXNldFNjaGVtYSwgU2NoZW1hRmluYWxpemF0aW9uRXJyb3J9IGZyb20gJy4uLy4uL2xpYi9zY2hlbWEvc2NoZW1hJztcblxuY29uc3QgZXhwZWN0ID0gY2hhaS5leHBlY3Q7XG5cbmRlc2NyaWJlKCdjbGkvc2NoZW1hLWFyZ3MnLCBmdW5jdGlvbiAoKSB7XG4gIC8qKiBAdHlwZSB7aW1wb3J0KCcuLi8uLi9saWIvc2NoZW1hL2NsaS1hcmdzJyl9ICovXG4gIGxldCBzY2hlbWFBcmdzO1xuXG4gIC8qKlxuICAgKiBAdHlwZSB7aW1wb3J0KCdzaW5vbicpLlNpbm9uU2FuZGJveH1cbiAgICovXG4gIGxldCBzYW5kYm94O1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIHNhbmRib3ggPSBzaW5vbi5jcmVhdGVTYW5kYm94KCk7XG4gICAgc2NoZW1hQXJncyA9IHJld2lyZW1vY2sucHJveHkoKCkgPT4gcmVxdWlyZSgnLi4vLi4vbGliL3NjaGVtYS9jbGktYXJncycpKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICBzYW5kYm94LnJlc3RvcmUoKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RvUGFyc2VyQXJncygpJywgZnVuY3Rpb24gKCkge1xuICAgIGRlc2NyaWJlKCd3aGVuIGNhbGxlZCB3aXRoIG5vIHBhcmFtZXRlcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmVFYWNoKGZpbmFsaXplU2NoZW1hKTtcblxuICAgICAgYWZ0ZXJFYWNoKHJlc2V0U2NoZW1hKTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBNYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChzY2hlbWFBcmdzLnRvUGFyc2VyQXJncygpKS50by5iZS5hbi5pbnN0YW5jZW9mKE1hcCkuYW5kLmhhdmUucHJvcGVydHkoJ3NpemUnKS50aGF0LmlzLmFib3ZlKDApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZ2VuZXJhdGUgbWV0YXZhcnMgaW4gU0NSRUFNSU5HX1NOQUtFX0NBU0UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGFyZ0RlZnMgPSBzY2hlbWFBcmdzLnRvUGFyc2VyQXJncygpO1xuICAgICAgICBjb25zdCBhcmdEZWZzV2l0aE1ldGF2YXIgPSBbLi4uYXJnRGVmc10uZmlsdGVyKChhcmcpID0+IGFyZ1sxXS5tZXRhdmFyKTtcbiAgICAgICAgZXhwZWN0KGFyZ0RlZnNXaXRoTWV0YXZhcikubm90LnRvLmJlLmVtcHR5O1xuICAgICAgICAvLyBpcyB0aGVyZSBhIG1vcmUgaWRpb21hdGljIHdheSB0byBkbyB0aGlzP1xuICAgICAgICBleHBlY3QoXG4gICAgICAgICAgYXJnRGVmc1dpdGhNZXRhdmFyLmV2ZXJ5KChhcmcpID0+IC9bQS1aX10rLy50ZXN0KGFyZ1sxXS5tZXRhdmFyKSksXG4gICAgICAgICkudG8uYmUudHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gc2NoZW1hIGhhcyBub3QgeWV0IGJlZW4gY29tcGlsZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHRocm93JywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXNldFNjaGVtYSgpO1xuICAgICAgICBleHBlY3QoKCkgPT4gc2NoZW1hQXJncy50b1BhcnNlckFyZ3MoKSkudG8udGhyb3coXG4gICAgICAgICAgU2NoZW1hRmluYWxpemF0aW9uRXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2NsaS9zY2hlbWEtYXJncy1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -1,47 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _path = _interopRequireDefault(require("path"));
8
-
9
- var _support = require("@appium/support");
10
-
11
- var _cliHelpers = require("./cli-helpers");
12
-
13
- const {
14
- expect
15
- } = chai;
16
- describe('CLI behavior controlled by schema', function () {
17
- let appiumHome;
18
- before(async function () {
19
- appiumHome = await _support.tempDir.openDir();
20
- });
21
- after(async function () {
22
- await _support.fs.rimraf(appiumHome);
23
- });
24
- describe('keyword', function () {
25
- let help;
26
- before(async function () {
27
- await (0, _cliHelpers.installLocalExtension)(appiumHome, 'driver', _path.default.join(__dirname, 'fixtures', 'test-driver'));
28
- help = await (0, _cliHelpers.runAppium)(appiumHome, ['server', '--help']);
29
- });
30
- describe('appiumCliIgnored', function () {
31
- it('should still support arguments without this keyword', function () {
32
- expect(help).to.match(/oliver-boliver/);
33
- });
34
- it('should cause the argument to be suppressed', function () {
35
- expect(help).not.to.match(/mcmonkey-mcbean/);
36
- });
37
- });
38
- describe('appiumDeprecated', function () {
39
- it('should mark the argument as deprecated', function () {
40
- expect(help).to.match(/\[DEPRECATED\] funkytelechy/);
41
- });
42
- });
43
- });
44
- });require('source-map-support').install();
45
-
46
-
47
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL3NjaGVtYS1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiZXhwZWN0IiwiY2hhaSIsImRlc2NyaWJlIiwiYXBwaXVtSG9tZSIsImJlZm9yZSIsInRlbXBEaXIiLCJvcGVuRGlyIiwiYWZ0ZXIiLCJmcyIsInJpbXJhZiIsImhlbHAiLCJwYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIml0IiwidG8iLCJtYXRjaCIsIm5vdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTTtBQUFDQSxFQUFBQTtBQUFELElBQVdDLElBQWpCO0FBRUFDLFFBQVEsQ0FBQyxtQ0FBRCxFQUFzQyxZQUFZO0FBSXhELE1BQUlDLFVBQUo7QUFFQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkQsSUFBQUEsVUFBVSxHQUFHLE1BQU1FLGlCQUFRQyxPQUFSLEVBQW5CO0FBQ0QsR0FGSyxDQUFOO0FBSUFDLEVBQUFBLEtBQUssQ0FBQyxrQkFBa0I7QUFDdEIsVUFBTUMsWUFBR0MsTUFBSCxDQUFVTixVQUFWLENBQU47QUFDRCxHQUZJLENBQUw7QUFJQUQsRUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFZO0FBSTlCLFFBQUlRLElBQUo7QUFFQU4sSUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QixZQUFNLHVDQUNKRCxVQURJLEVBRUosUUFGSSxFQUdKUSxjQUFLQyxJQUFMLENBQVVDLFNBQVYsRUFBcUIsVUFBckIsRUFBaUMsYUFBakMsQ0FISSxDQUFOO0FBS0FILE1BQUFBLElBQUksR0FBRyxNQUFNLDJCQUFVUCxVQUFWLEVBQXNCLENBQUMsUUFBRCxFQUFXLFFBQVgsQ0FBdEIsQ0FBYjtBQUNELEtBUEssQ0FBTjtBQVNBRCxJQUFBQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtBQUN2Q1ksTUFBQUEsRUFBRSxDQUFDLHFEQUFELEVBQXdELFlBQVk7QUFDcEVkLFFBQUFBLE1BQU0sQ0FBQ1UsSUFBRCxDQUFOLENBQWFLLEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLGdCQUF0QjtBQUNELE9BRkMsQ0FBRjtBQUlBRixNQUFBQSxFQUFFLENBQUMsNENBQUQsRUFBK0MsWUFBWTtBQUMzRGQsUUFBQUEsTUFBTSxDQUFDVSxJQUFELENBQU4sQ0FBYU8sR0FBYixDQUFpQkYsRUFBakIsQ0FBb0JDLEtBQXBCLENBQTBCLGlCQUExQjtBQUNELE9BRkMsQ0FBRjtBQUdELEtBUk8sQ0FBUjtBQVVBZCxJQUFBQSxRQUFRLENBQUMsa0JBQUQsRUFBcUIsWUFBWTtBQUN2Q1ksTUFBQUEsRUFBRSxDQUFDLHdDQUFELEVBQTJDLFlBQVk7QUFDdkRkLFFBQUFBLE1BQU0sQ0FBQ1UsSUFBRCxDQUFOLENBQWFLLEVBQWIsQ0FBZ0JDLEtBQWhCLENBQXNCLDZCQUF0QjtBQUNELE9BRkMsQ0FBRjtBQUdELEtBSk8sQ0FBUjtBQUtELEdBOUJPLENBQVI7QUErQkQsQ0E3Q08sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge2ZzLCB0ZW1wRGlyfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHtpbnN0YWxsTG9jYWxFeHRlbnNpb24sIHJ1bkFwcGl1bX0gZnJvbSAnLi9jbGktaGVscGVycyc7XG5cbmNvbnN0IHtleHBlY3R9ID0gY2hhaTtcblxuZGVzY3JpYmUoJ0NMSSBiZWhhdmlvciBjb250cm9sbGVkIGJ5IHNjaGVtYScsIGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBsZXQgYXBwaXVtSG9tZTtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGFwcGl1bUhvbWUgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgfSk7XG5cbiAgYWZ0ZXIoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGF3YWl0IGZzLnJpbXJhZihhcHBpdW1Ib21lKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2tleXdvcmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBsZXQgaGVscDtcblxuICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBhd2FpdCBpbnN0YWxsTG9jYWxFeHRlbnNpb24oXG4gICAgICAgIGFwcGl1bUhvbWUsXG4gICAgICAgICdkcml2ZXInLFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnZml4dHVyZXMnLCAndGVzdC1kcml2ZXInKSxcbiAgICAgICk7XG4gICAgICBoZWxwID0gYXdhaXQgcnVuQXBwaXVtKGFwcGl1bUhvbWUsIFsnc2VydmVyJywgJy0taGVscCddKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdhcHBpdW1DbGlJZ25vcmVkJywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBzdGlsbCBzdXBwb3J0IGFyZ3VtZW50cyB3aXRob3V0IHRoaXMga2V5d29yZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGhlbHApLnRvLm1hdGNoKC9vbGl2ZXItYm9saXZlci8pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgY2F1c2UgdGhlIGFyZ3VtZW50IHRvIGJlIHN1cHByZXNzZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGV4cGVjdChoZWxwKS5ub3QudG8ubWF0Y2goL21jbW9ua2V5LW1jYmVhbi8pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnYXBwaXVtRGVwcmVjYXRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgbWFyayB0aGUgYXJndW1lbnQgYXMgZGVwcmVjYXRlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZXhwZWN0KGhlbHApLnRvLm1hdGNoKC9cXFtERVBSRUNBVEVEXFxdIGZ1bmt5dGVsZWNoeS8pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY2xpL3NjaGVtYS1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -1,112 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _sinon = _interopRequireDefault(require("sinon"));
8
-
9
- var _config = require("../lib/config");
10
-
11
- var _axios = _interopRequireDefault(require("axios"));
12
-
13
- var _support = require("@appium/support");
14
-
15
- describe('Config', function () {
16
- describe('getGitRev', function () {
17
- it('should get a reasonable git revision', async function () {
18
- let rev = await (0, _config.getGitRev)();
19
- rev.should.be.a('string');
20
- rev.length.should.be.equal(40);
21
- rev.match(/[0-9a-f]+/i)[0].should.eql(rev);
22
- });
23
- });
24
- describe('getBuildInfo', function () {
25
- async function verifyBuildInfoUpdate(useLocalGit) {
26
- const buildInfo = (0, _config.getBuildInfo)();
27
- mockFs.expects('exists').atLeast(1).returns(useLocalGit);
28
- buildInfo['git-sha'] = undefined;
29
- buildInfo.built = undefined;
30
- await (0, _config.updateBuildInfo)(true);
31
- buildInfo.should.be.an('object');
32
- should.exist(buildInfo['git-sha']);
33
- should.exist(buildInfo.built);
34
- should.exist(buildInfo.version);
35
- }
36
-
37
- let mockFs;
38
- let getStub;
39
- beforeEach(function () {
40
- mockFs = _sinon.default.mock(_support.fs);
41
- getStub = _sinon.default.stub(_axios.default, 'get');
42
- });
43
- afterEach(function () {
44
- getStub.restore();
45
- mockFs.restore();
46
- });
47
- it('should get a configuration object if the local git metadata is present', async function () {
48
- await verifyBuildInfoUpdate(true);
49
- });
50
- it('should get a configuration object if the local git metadata is not present', async function () {
51
- getStub.onCall(0).returns({
52
- data: [{
53
- name: `v${_config.APPIUM_VER}`,
54
- zipball_url: 'https://api.github.com/repos/appium/appium/zipball/v1.9.0-beta.1',
55
- tarball_url: 'https://api.github.com/repos/appium/appium/tarball/v1.9.0-beta.1',
56
- commit: {
57
- sha: '3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
58
- url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c'
59
- },
60
- node_id: 'MDM6UmVmNzUzMDU3MDp2MS45LjAtYmV0YS4x'
61
- }, {
62
- name: 'v1.8.2-beta',
63
- zipball_url: 'https://api.github.com/repos/appium/appium/zipball/v1.8.2-beta',
64
- tarball_url: 'https://api.github.com/repos/appium/appium/tarball/v1.8.2-beta',
65
- commit: {
66
- sha: '5b98b9197e75aa85e7507d21d3126c1a63d1ce8f',
67
- url: 'https://api.github.com/repos/appium/appium/commits/5b98b9197e75aa85e7507d21d3126c1a63d1ce8f'
68
- },
69
- node_id: 'MDM6UmVmNzUzMDU3MDp2MS44LjItYmV0YQ=='
70
- }]
71
- });
72
- getStub.onCall(1).returns({
73
- data: {
74
- sha: '3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
75
- node_id: 'MDY6Q29tbWl0NzUzMDU3MDozYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRj',
76
- commit: {
77
- author: {
78
- name: 'Isaac Murchie',
79
- email: 'isaac@saucelabs.com',
80
- date: '2018-08-17T19:48:00Z'
81
- },
82
- committer: {
83
- name: 'Isaac Murchie',
84
- email: 'isaac@saucelabs.com',
85
- date: '2018-08-17T19:48:00Z'
86
- },
87
- message: 'v1.9.0-beta.1',
88
- tree: {
89
- sha: '2c0974727470eba419ea0b9951c52f72f8036b18',
90
- url: 'https://api.github.com/repos/appium/appium/git/trees/2c0974727470eba419ea0b9951c52f72f8036b18'
91
- },
92
- url: 'https://api.github.com/repos/appium/appium/git/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
93
- comment_count: 0,
94
- verification: {
95
- verified: false,
96
- reason: 'unsigned',
97
- signature: null,
98
- payload: null
99
- }
100
- },
101
- url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
102
- html_url: 'https://github.com/appium/appium/commit/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c',
103
- comments_url: 'https://api.github.com/repos/appium/appium/commits/3c2752f9f9c56000705a4ae15b3ba68a5d2e644c/comments'
104
- }
105
- });
106
- await verifyBuildInfoUpdate(false);
107
- });
108
- });
109
- });require('source-map-support').install();
110
-
111
-
112
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWUyZS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsIml0IiwicmV2Iiwic2hvdWxkIiwiYmUiLCJhIiwibGVuZ3RoIiwiZXF1YWwiLCJtYXRjaCIsImVxbCIsInZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSIsInVzZUxvY2FsR2l0IiwiYnVpbGRJbmZvIiwibW9ja0ZzIiwiZXhwZWN0cyIsImF0TGVhc3QiLCJyZXR1cm5zIiwidW5kZWZpbmVkIiwiYnVpbHQiLCJhbiIsImV4aXN0IiwidmVyc2lvbiIsImdldFN0dWIiLCJiZWZvcmVFYWNoIiwic2lub24iLCJtb2NrIiwiZnMiLCJzdHViIiwiYXhpb3MiLCJhZnRlckVhY2giLCJyZXN0b3JlIiwib25DYWxsIiwiZGF0YSIsIm5hbWUiLCJBUFBJVU1fVkVSIiwiemlwYmFsbF91cmwiLCJ0YXJiYWxsX3VybCIsImNvbW1pdCIsInNoYSIsInVybCIsIm5vZGVfaWQiLCJhdXRob3IiLCJlbWFpbCIsImRhdGUiLCJjb21taXR0ZXIiLCJtZXNzYWdlIiwidHJlZSIsImNvbW1lbnRfY291bnQiLCJ2ZXJpZmljYXRpb24iLCJ2ZXJpZmllZCIsInJlYXNvbiIsInNpZ25hdHVyZSIsInBheWxvYWQiLCJodG1sX3VybCIsImNvbW1lbnRzX3VybCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7O0FBQ0E7O0FBTUE7O0FBQ0E7O0FBR0FBLFFBQVEsQ0FBQyxRQUFELEVBQVcsWUFBWTtBQUM3QkEsRUFBQUEsUUFBUSxDQUFDLFdBQUQsRUFBYyxZQUFZO0FBQ2hDQyxJQUFBQSxFQUFFLENBQUMsc0NBQUQsRUFBeUMsa0JBQWtCO0FBQzNELFVBQUlDLEdBQUcsR0FBRyxNQUFNLHdCQUFoQjtBQUNBQSxNQUFBQSxHQUFHLENBQUNDLE1BQUosQ0FBV0MsRUFBWCxDQUFjQyxDQUFkLENBQWdCLFFBQWhCO0FBQ0FILE1BQUFBLEdBQUcsQ0FBQ0ksTUFBSixDQUFXSCxNQUFYLENBQWtCQyxFQUFsQixDQUFxQkcsS0FBckIsQ0FBMkIsRUFBM0I7QUFDQUwsTUFBQUEsR0FBRyxDQUFDTSxLQUFKLENBQVUsWUFBVixFQUF3QixDQUF4QixFQUEyQkwsTUFBM0IsQ0FBa0NNLEdBQWxDLENBQXNDUCxHQUF0QztBQUNELEtBTEMsQ0FBRjtBQU1ELEdBUE8sQ0FBUjtBQVFBRixFQUFBQSxRQUFRLENBQUMsY0FBRCxFQUFpQixZQUFZO0FBQ25DLG1CQUFlVSxxQkFBZixDQUFzQ0MsV0FBdEMsRUFBbUQ7QUFDakQsWUFBTUMsU0FBUyxHQUFHLDJCQUFsQjtBQUNBQyxNQUFBQSxNQUFNLENBQUNDLE9BQVAsQ0FBZSxRQUFmLEVBQXlCQyxPQUF6QixDQUFpQyxDQUFqQyxFQUFvQ0MsT0FBcEMsQ0FBNENMLFdBQTVDO0FBQ0FDLE1BQUFBLFNBQVMsQ0FBQyxTQUFELENBQVQsR0FBdUJLLFNBQXZCO0FBQ0FMLE1BQUFBLFNBQVMsQ0FBQ00sS0FBVixHQUFrQkQsU0FBbEI7QUFDQSxZQUFNLDZCQUFnQixJQUFoQixDQUFOO0FBQ0FMLE1BQUFBLFNBQVMsQ0FBQ1QsTUFBVixDQUFpQkMsRUFBakIsQ0FBb0JlLEVBQXBCLENBQXVCLFFBQXZCO0FBQ0FoQixNQUFBQSxNQUFNLENBQUNpQixLQUFQLENBQWFSLFNBQVMsQ0FBQyxTQUFELENBQXRCO0FBQ0FULE1BQUFBLE1BQU0sQ0FBQ2lCLEtBQVAsQ0FBYVIsU0FBUyxDQUFDTSxLQUF2QjtBQUNBZixNQUFBQSxNQUFNLENBQUNpQixLQUFQLENBQWFSLFNBQVMsQ0FBQ1MsT0FBdkI7QUFDRDs7QUFFRCxRQUFJUixNQUFKO0FBQ0EsUUFBSVMsT0FBSjtBQUNBQyxJQUFBQSxVQUFVLENBQUMsWUFBWTtBQUNyQlYsTUFBQUEsTUFBTSxHQUFHVyxlQUFNQyxJQUFOLENBQVdDLFdBQVgsQ0FBVDtBQUNBSixNQUFBQSxPQUFPLEdBQUdFLGVBQU1HLElBQU4sQ0FBV0MsY0FBWCxFQUFrQixLQUFsQixDQUFWO0FBQ0QsS0FIUyxDQUFWO0FBSUFDLElBQUFBLFNBQVMsQ0FBQyxZQUFZO0FBQ3BCUCxNQUFBQSxPQUFPLENBQUNRLE9BQVI7QUFDQWpCLE1BQUFBLE1BQU0sQ0FBQ2lCLE9BQVA7QUFDRCxLQUhRLENBQVQ7QUFLQTdCLElBQUFBLEVBQUUsQ0FBQyx3RUFBRCxFQUEyRSxrQkFBa0I7QUFDN0YsWUFBTVMscUJBQXFCLENBQUMsSUFBRCxDQUEzQjtBQUNELEtBRkMsQ0FBRjtBQUdBVCxJQUFBQSxFQUFFLENBQUMsNEVBQUQsRUFBK0Usa0JBQWtCO0FBQ2pHcUIsTUFBQUEsT0FBTyxDQUFDUyxNQUFSLENBQWUsQ0FBZixFQUFrQmYsT0FBbEIsQ0FBMEI7QUFDeEJnQixRQUFBQSxJQUFJLEVBQUUsQ0FDSjtBQUNFQyxVQUFBQSxJQUFJLEVBQUcsSUFBR0Msa0JBQVcsRUFEdkI7QUFFRUMsVUFBQUEsV0FBVyxFQUNULGtFQUhKO0FBSUVDLFVBQUFBLFdBQVcsRUFDVCxrRUFMSjtBQU1FQyxVQUFBQSxNQUFNLEVBQUU7QUFDTkMsWUFBQUEsR0FBRyxFQUFFLDBDQURDO0FBRU5DLFlBQUFBLEdBQUcsRUFBRTtBQUZDLFdBTlY7QUFVRUMsVUFBQUEsT0FBTyxFQUFFO0FBVlgsU0FESSxFQWFKO0FBQ0VQLFVBQUFBLElBQUksRUFBRSxhQURSO0FBRUVFLFVBQUFBLFdBQVcsRUFDVCxnRUFISjtBQUlFQyxVQUFBQSxXQUFXLEVBQ1QsZ0VBTEo7QUFNRUMsVUFBQUEsTUFBTSxFQUFFO0FBQ05DLFlBQUFBLEdBQUcsRUFBRSwwQ0FEQztBQUVOQyxZQUFBQSxHQUFHLEVBQUU7QUFGQyxXQU5WO0FBVUVDLFVBQUFBLE9BQU8sRUFBRTtBQVZYLFNBYkk7QUFEa0IsT0FBMUI7QUE0QkFsQixNQUFBQSxPQUFPLENBQUNTLE1BQVIsQ0FBZSxDQUFmLEVBQWtCZixPQUFsQixDQUEwQjtBQUN4QmdCLFFBQUFBLElBQUksRUFBRTtBQUNKTSxVQUFBQSxHQUFHLEVBQUUsMENBREQ7QUFFSkUsVUFBQUEsT0FBTyxFQUNMLDhFQUhFO0FBSUpILFVBQUFBLE1BQU0sRUFBRTtBQUNOSSxZQUFBQSxNQUFNLEVBQUU7QUFDTlIsY0FBQUEsSUFBSSxFQUFFLGVBREE7QUFFTlMsY0FBQUEsS0FBSyxFQUFFLHFCQUZEO0FBR05DLGNBQUFBLElBQUksRUFBRTtBQUhBLGFBREY7QUFNTkMsWUFBQUEsU0FBUyxFQUFFO0FBQ1RYLGNBQUFBLElBQUksRUFBRSxlQURHO0FBRVRTLGNBQUFBLEtBQUssRUFBRSxxQkFGRTtBQUdUQyxjQUFBQSxJQUFJLEVBQUU7QUFIRyxhQU5MO0FBV05FLFlBQUFBLE9BQU8sRUFBRSxlQVhIO0FBWU5DLFlBQUFBLElBQUksRUFBRTtBQUNKUixjQUFBQSxHQUFHLEVBQUUsMENBREQ7QUFFSkMsY0FBQUEsR0FBRyxFQUFFO0FBRkQsYUFaQTtBQWdCTkEsWUFBQUEsR0FBRyxFQUFFLGlHQWhCQztBQWlCTlEsWUFBQUEsYUFBYSxFQUFFLENBakJUO0FBa0JOQyxZQUFBQSxZQUFZLEVBQUU7QUFDWkMsY0FBQUEsUUFBUSxFQUFFLEtBREU7QUFFWkMsY0FBQUEsTUFBTSxFQUFFLFVBRkk7QUFHWkMsY0FBQUEsU0FBUyxFQUFFLElBSEM7QUFJWkMsY0FBQUEsT0FBTyxFQUFFO0FBSkc7QUFsQlIsV0FKSjtBQTZCSmIsVUFBQUEsR0FBRyxFQUFFLDZGQTdCRDtBQThCSmMsVUFBQUEsUUFBUSxFQUNOLGtGQS9CRTtBQWdDSkMsVUFBQUEsWUFBWSxFQUNWO0FBakNFO0FBRGtCLE9BQTFCO0FBcUNBLFlBQU01QyxxQkFBcUIsQ0FBQyxLQUFELENBQTNCO0FBQ0QsS0FuRUMsQ0FBRjtBQW9FRCxHQS9GTyxDQUFSO0FBZ0dELENBekdPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2lub24gZnJvbSAnc2lub24nO1xuaW1wb3J0IHtcbiAgZ2V0R2l0UmV2LFxuICBnZXRCdWlsZEluZm8sXG4gIHVwZGF0ZUJ1aWxkSW5mbyxcbiAgQVBQSVVNX1ZFUixcbn0gZnJvbSAnLi4vbGliL2NvbmZpZyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgZnMgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmRlc2NyaWJlKCdDb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdnZXRHaXRSZXYnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgYSByZWFzb25hYmxlIGdpdCByZXZpc2lvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCByZXYgPSBhd2FpdCBnZXRHaXRSZXYoKTtcbiAgICAgIHJldi5zaG91bGQuYmUuYSgnc3RyaW5nJyk7XG4gICAgICByZXYubGVuZ3RoLnNob3VsZC5iZS5lcXVhbCg0MCk7XG4gICAgICByZXYubWF0Y2goL1swLTlhLWZdKy9pKVswXS5zaG91bGQuZXFsKHJldik7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZ2V0QnVpbGRJbmZvJywgZnVuY3Rpb24gKCkge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSAodXNlTG9jYWxHaXQpIHtcbiAgICAgIGNvbnN0IGJ1aWxkSW5mbyA9IGdldEJ1aWxkSW5mbygpO1xuICAgICAgbW9ja0ZzLmV4cGVjdHMoJ2V4aXN0cycpLmF0TGVhc3QoMSkucmV0dXJucyh1c2VMb2NhbEdpdCk7XG4gICAgICBidWlsZEluZm9bJ2dpdC1zaGEnXSA9IHVuZGVmaW5lZDtcbiAgICAgIGJ1aWxkSW5mby5idWlsdCA9IHVuZGVmaW5lZDtcbiAgICAgIGF3YWl0IHVwZGF0ZUJ1aWxkSW5mbyh0cnVlKTtcbiAgICAgIGJ1aWxkSW5mby5zaG91bGQuYmUuYW4oJ29iamVjdCcpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ1aWxkSW5mb1snZ2l0LXNoYSddKTtcbiAgICAgIHNob3VsZC5leGlzdChidWlsZEluZm8uYnVpbHQpO1xuICAgICAgc2hvdWxkLmV4aXN0KGJ1aWxkSW5mby52ZXJzaW9uKTtcbiAgICB9XG5cbiAgICBsZXQgbW9ja0ZzO1xuICAgIGxldCBnZXRTdHViO1xuICAgIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbW9ja0ZzID0gc2lub24ubW9jayhmcyk7XG4gICAgICBnZXRTdHViID0gc2lub24uc3R1YihheGlvcywgJ2dldCcpO1xuICAgIH0pO1xuICAgIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRTdHViLnJlc3RvcmUoKTtcbiAgICAgIG1vY2tGcy5yZXN0b3JlKCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlmIHRoZSBsb2NhbCBnaXQgbWV0YWRhdGEgaXMgcHJlc2VudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGF3YWl0IHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZSh0cnVlKTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIGdldCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGlmIHRoZSBsb2NhbCBnaXQgbWV0YWRhdGEgaXMgbm90IHByZXNlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBnZXRTdHViLm9uQ2FsbCgwKS5yZXR1cm5zKHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IGB2JHtBUFBJVU1fVkVSfWAsXG4gICAgICAgICAgICB6aXBiYWxsX3VybDpcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS96aXBiYWxsL3YxLjkuMC1iZXRhLjEnLFxuICAgICAgICAgICAgdGFyYmFsbF91cmw6XG4gICAgICAgICAgICAgICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2FwcGl1bS9hcHBpdW0vdGFyYmFsbC92MS45LjAtYmV0YS4xJyxcbiAgICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgICBzaGE6ICczYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvM2MyNzUyZjlmOWM1NjAwMDcwNWE0YWUxNWIzYmE2OGE1ZDJlNjQ0YycsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZV9pZDogJ01ETTZVbVZtTnpVek1EVTNNRHAyTVM0NUxqQXRZbVYwWVM0eCcsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiAndjEuOC4yLWJldGEnLFxuICAgICAgICAgICAgemlwYmFsbF91cmw6XG4gICAgICAgICAgICAgICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2FwcGl1bS9hcHBpdW0vemlwYmFsbC92MS44LjItYmV0YScsXG4gICAgICAgICAgICB0YXJiYWxsX3VybDpcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS90YXJiYWxsL3YxLjguMi1iZXRhJyxcbiAgICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgICBzaGE6ICc1Yjk4YjkxOTdlNzVhYTg1ZTc1MDdkMjFkMzEyNmMxYTYzZDFjZThmJyxcbiAgICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvNWI5OGI5MTk3ZTc1YWE4NWU3NTA3ZDIxZDMxMjZjMWE2M2QxY2U4ZicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbm9kZV9pZDogJ01ETTZVbVZtTnpVek1EVTNNRHAyTVM0NExqSXRZbVYwWVE9PScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgICAgZ2V0U3R1Yi5vbkNhbGwoMSkucmV0dXJucyh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBzaGE6ICczYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICBub2RlX2lkOlxuICAgICAgICAgICAgJ01EWTZRMjl0YldsME56VXpNRFUzTURvell6STNOVEptT1dZNVl6VTJNREF3TnpBMVlUUmhaVEUxWWpOaVlUWTRZVFZrTW1VMk5EUmonLFxuICAgICAgICAgIGNvbW1pdDoge1xuICAgICAgICAgICAgYXV0aG9yOiB7XG4gICAgICAgICAgICAgIG5hbWU6ICdJc2FhYyBNdXJjaGllJyxcbiAgICAgICAgICAgICAgZW1haWw6ICdpc2FhY0BzYXVjZWxhYnMuY29tJyxcbiAgICAgICAgICAgICAgZGF0ZTogJzIwMTgtMDgtMTdUMTk6NDg6MDBaJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21taXR0ZXI6IHtcbiAgICAgICAgICAgICAgbmFtZTogJ0lzYWFjIE11cmNoaWUnLFxuICAgICAgICAgICAgICBlbWFpbDogJ2lzYWFjQHNhdWNlbGFicy5jb20nLFxuICAgICAgICAgICAgICBkYXRlOiAnMjAxOC0wOC0xN1QxOTo0ODowMFonLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICd2MS45LjAtYmV0YS4xJyxcbiAgICAgICAgICAgIHRyZWU6IHtcbiAgICAgICAgICAgICAgc2hhOiAnMmMwOTc0NzI3NDcwZWJhNDE5ZWEwYjk5NTFjNTJmNzJmODAzNmIxOCcsXG4gICAgICAgICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS9naXQvdHJlZXMvMmMwOTc0NzI3NDcwZWJhNDE5ZWEwYjk5NTFjNTJmNzJmODAzNmIxOCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXJsOiAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2dpdC9jb21taXRzLzNjMjc1MmY5ZjljNTYwMDA3MDVhNGFlMTViM2JhNjhhNWQyZTY0NGMnLFxuICAgICAgICAgICAgY29tbWVudF9jb3VudDogMCxcbiAgICAgICAgICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2UsXG4gICAgICAgICAgICAgIHJlYXNvbjogJ3Vuc2lnbmVkJyxcbiAgICAgICAgICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBudWxsLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHVybDogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvYXBwaXVtL2FwcGl1bS9jb21taXRzLzNjMjc1MmY5ZjljNTYwMDA3MDVhNGFlMTViM2JhNjhhNWQyZTY0NGMnLFxuICAgICAgICAgIGh0bWxfdXJsOlxuICAgICAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2NvbW1pdC8zYzI3NTJmOWY5YzU2MDAwNzA1YTRhZTE1YjNiYTY4YTVkMmU2NDRjJyxcbiAgICAgICAgICBjb21tZW50c191cmw6XG4gICAgICAgICAgICAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9hcHBpdW0vYXBwaXVtL2NvbW1pdHMvM2MyNzUyZjlmOWM1NjAwMDcwNWE0YWUxNWIzYmE2OGE1ZDJlNjQ0Yy9jb21tZW50cycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHZlcmlmeUJ1aWxkSW5mb1VwZGF0ZShmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLWUyZS1zcGVjcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLiJ9
@@ -1,191 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- require("source-map-support/register");
6
-
7
- var _configFile = require("../lib/config-file");
8
-
9
- var _schema = require("../lib/schema/schema");
10
-
11
- var _driverSchema = _interopRequireDefault(require("./fixtures/driver.schema.js"));
12
-
13
- var _helpers = require("./helpers");
14
-
15
- describe('config file behavior', function () {
16
- const GOOD_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.good.json');
17
- const BAD_NODECONFIG_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad-nodeconfig.json');
18
- const BAD_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.bad.json');
19
- const INVALID_JSON_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.invalid.json');
20
- const SECURITY_ARRAY_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-array.json');
21
- const SECURITY_DELIMITED_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-delimited.json');
22
- const SECURITY_PATH_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.security-path.json');
23
- const UNKNOWN_PROPS_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.ext-unknown-props.json');
24
- const EXT_PROPS_FILEPATH = (0, _helpers.resolveFixture)('config', 'appium.config.ext-good.json');
25
- beforeEach(function () {
26
- (0, _schema.finalizeSchema)();
27
- });
28
- afterEach(function () {
29
- (0, _schema.resetSchema)();
30
- });
31
- describe('when provided a path to a config file', function () {
32
- describe('when the config file is valid per the schema', function () {
33
- it('should return a valid config object', async function () {
34
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
35
- result.should.deep.equal({
36
- config: require(GOOD_FILEPATH),
37
- filepath: GOOD_FILEPATH,
38
- errors: []
39
- });
40
- });
41
- describe('server.nodeconfig behavior', function () {
42
- describe('when a string', function () {
43
- it('should return errors', async function () {
44
- const result = await (0, _configFile.readConfigFile)(BAD_NODECONFIG_FILEPATH);
45
- result.should.have.nested.property('errors[0].instancePath', '/server/nodeconfig');
46
- });
47
- });
48
- describe('when an object', function () {
49
- it('should return a valid config object', async function () {
50
- const result = await (0, _configFile.readConfigFile)(GOOD_FILEPATH);
51
- result.should.have.property('errors').that.is.empty;
52
- });
53
- });
54
- });
55
- describe('server.allow-insecure behavior', function () {
56
- describe('when a string path', function () {
57
- it('should return errors', async function () {
58
- const result = await (0, _configFile.readConfigFile)(SECURITY_PATH_FILEPATH);
59
- result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
60
- });
61
- });
62
- describe('when a comma-delimited string', function () {
63
- it('should return errors', async function () {
64
- const result = await (0, _configFile.readConfigFile)(SECURITY_DELIMITED_FILEPATH);
65
- result.should.have.nested.property('errors[0].instancePath', '/server/allow-insecure');
66
- });
67
- });
68
- describe('when an array', function () {
69
- it('should return a valid config object', async function () {
70
- const result = await (0, _configFile.readConfigFile)(SECURITY_ARRAY_FILEPATH);
71
- result.should.deep.equal({
72
- config: require(SECURITY_ARRAY_FILEPATH),
73
- filepath: SECURITY_ARRAY_FILEPATH,
74
- errors: []
75
- });
76
- });
77
- });
78
- });
79
- });
80
- describe('when the config file is invalid per the schema', function () {
81
- describe('without extensions', function () {
82
- it('should return an object containing errors', async function () {
83
- const result = await (0, _configFile.readConfigFile)(BAD_FILEPATH);
84
- result.should.have.deep.property('config', (0, _configFile.normalizeConfig)(require(BAD_FILEPATH)));
85
- result.should.have.property('filepath', BAD_FILEPATH);
86
- result.should.have.deep.property('errors').that.contains.members([{
87
- instancePath: '',
88
- schemaPath: '#/additionalProperties',
89
- keyword: 'additionalProperties',
90
- params: {
91
- additionalProperty: 'appium-home'
92
- },
93
- message: 'must NOT have additional properties',
94
- isIdentifierLocation: true
95
- }, {
96
- instancePath: '/server/allow-cors',
97
- schemaPath: '#/properties/server/properties/allow-cors/type',
98
- keyword: 'type',
99
- params: {
100
- type: 'boolean'
101
- },
102
- message: 'must be boolean'
103
- }, {
104
- instancePath: '/server/allow-insecure',
105
- schemaPath: '#/properties/server/properties/allow-insecure/type',
106
- keyword: 'type',
107
- params: {
108
- type: 'array'
109
- },
110
- message: 'must be array'
111
- }, {
112
- instancePath: '/server/callback-port',
113
- schemaPath: '#/properties/server/properties/callback-port/maximum',
114
- keyword: 'maximum',
115
- params: {
116
- comparison: '<=',
117
- limit: 65535
118
- },
119
- message: 'must be <= 65535'
120
- }, {
121
- instancePath: '/server/log-level',
122
- schemaPath: '#/properties/server/properties/log-level/enum',
123
- keyword: 'enum',
124
- params: {
125
- allowedValues: ['info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error']
126
- },
127
- message: 'must be equal to one of the allowed values'
128
- }, {
129
- instancePath: '/server/log-no-colors',
130
- schemaPath: '#/properties/server/properties/log-no-colors/type',
131
- keyword: 'type',
132
- params: {
133
- type: 'boolean'
134
- },
135
- message: 'must be boolean'
136
- }, {
137
- instancePath: '/server/port',
138
- schemaPath: '#/properties/server/properties/port/type',
139
- keyword: 'type',
140
- params: {
141
- type: 'integer'
142
- },
143
- message: 'must be integer'
144
- }]).and.lengthOf(7);
145
- result.should.have.property('reason').that.is.a.string;
146
- });
147
- });
148
- describe('with extensions', function () {
149
- let result;
150
- beforeEach(function () {
151
- (0, _schema.resetSchema)();
152
- (0, _schema.registerSchema)('driver', 'fake', _driverSchema.default);
153
- (0, _schema.finalizeSchema)();
154
- });
155
- describe('when provided a config file with unknown properties', function () {
156
- beforeEach(async function () {
157
- result = await (0, _configFile.readConfigFile)(UNKNOWN_PROPS_FILEPATH);
158
- });
159
- it('should return an object containing errors', function () {
160
- result.should.have.deep.property('errors', [{
161
- instancePath: '/server/driver/fake',
162
- schemaPath: 'driver-fake.json/additionalProperties',
163
- keyword: 'additionalProperties',
164
- params: {
165
- additionalProperty: 'bubb'
166
- },
167
- message: 'must NOT have additional properties',
168
- isIdentifierLocation: true
169
- }]);
170
- });
171
- });
172
- describe('when provided a config file with valid properties', function () {
173
- beforeEach(async function () {
174
- result = await (0, _configFile.readConfigFile)(EXT_PROPS_FILEPATH);
175
- });
176
- it('should return an object containing no errors', function () {
177
- result.should.have.deep.property('errors', []);
178
- });
179
- });
180
- });
181
- });
182
- describe('when the config file is invalid JSON', function () {
183
- it('should reject with a user-friendly error message', async function () {
184
- await (0, _configFile.readConfigFile)(INVALID_JSON_FILEPATH).should.be.rejectedWith(new RegExp(`${INVALID_JSON_FILEPATH} is invalid`));
185
- });
186
- });
187
- });
188
- });require('source-map-support').install();
189
-
190
-
191
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIl0sIm5hbWVzIjpbImRlc2NyaWJlIiwiR09PRF9GSUxFUEFUSCIsIkJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIIiwiQkFEX0ZJTEVQQVRIIiwiSU5WQUxJRF9KU09OX0ZJTEVQQVRIIiwiU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgiLCJTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgiLCJTRUNVUklUWV9QQVRIX0ZJTEVQQVRIIiwiVU5LTk9XTl9QUk9QU19GSUxFUEFUSCIsIkVYVF9QUk9QU19GSUxFUEFUSCIsImJlZm9yZUVhY2giLCJhZnRlckVhY2giLCJpdCIsInJlc3VsdCIsInNob3VsZCIsImRlZXAiLCJlcXVhbCIsImNvbmZpZyIsInJlcXVpcmUiLCJmaWxlcGF0aCIsImVycm9ycyIsImhhdmUiLCJuZXN0ZWQiLCJwcm9wZXJ0eSIsInRoYXQiLCJpcyIsImVtcHR5IiwiY29udGFpbnMiLCJtZW1iZXJzIiwiaW5zdGFuY2VQYXRoIiwic2NoZW1hUGF0aCIsImtleXdvcmQiLCJwYXJhbXMiLCJhZGRpdGlvbmFsUHJvcGVydHkiLCJtZXNzYWdlIiwiaXNJZGVudGlmaWVyTG9jYXRpb24iLCJ0eXBlIiwiY29tcGFyaXNvbiIsImxpbWl0IiwiYWxsb3dlZFZhbHVlcyIsImFuZCIsImxlbmd0aE9mIiwiYSIsInN0cmluZyIsImV4dFNjaGVtYSIsImJlIiwicmVqZWN0ZWRXaXRoIiwiUmVnRXhwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQUEsUUFBUSxDQUFDLHNCQUFELEVBQXlCLFlBQVk7QUFDM0MsUUFBTUMsYUFBYSxHQUFHLDZCQUFlLFFBQWYsRUFBeUIseUJBQXpCLENBQXRCO0FBQ0EsUUFBTUMsdUJBQXVCLEdBQUcsNkJBQzlCLFFBRDhCLEVBRTlCLG1DQUY4QixDQUFoQztBQUlBLFFBQU1DLFlBQVksR0FBRyw2QkFBZSxRQUFmLEVBQXlCLHdCQUF6QixD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TyxDQUFSO0FBc0NELEtBMUlPLENBQVI7QUE0SUF2QixJQUFBQSxRQUFRLENBQUMsc0NBQUQsRUFBeUMsWUFBWTtBQUMzRFksTUFBQUEsRUFBRSxDQUFDLGtEQUFELEVBQXFELGtCQUFrQjtBQUN2RSxjQUFNLGdDQUFlUixxQkFBZixFQUFzQ1UsTUFBdEMsQ0FBNkMrQixFQUE3QyxDQUFnREMsWUFBaEQsQ0FDSixJQUFJQyxNQUFKLENBQVksR0FBRTNDLHFCQUFzQixhQUFwQyxDQURJLENBQU47QUFHRCxPQUpDLENBQUY7QUFLRCxLQU5PLENBQVI7QUFPRCxHQW5OTyxDQUFSO0FBb05ELENBN1BPLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHsgcmVhZENvbmZpZ0ZpbGUsIG5vcm1hbGl6ZUNvbmZpZyB9IGZyb20gJy4uL2xpYi9jb25maWctZmlsZSc7XG5pbXBvcnQgeyBmaW5hbGl6ZVNjaGVtYSwgcmVnaXN0ZXJTY2hlbWEsIHJlc2V0U2NoZW1hIH0gZnJvbSAnLi4vbGliL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IGV4dFNjaGVtYSBmcm9tICcuL2ZpeHR1cmVzL2RyaXZlci5zY2hlbWEuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUZpeHR1cmUgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5kZXNjcmliZSgnY29uZmlnIGZpbGUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IEdPT0RfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZSgnY29uZmlnJywgJ2FwcGl1bS5jb25maWcuZ29vZC5qc29uJyk7XG4gIGNvbnN0IEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuYmFkLW5vZGVjb25maWcuanNvbicsXG4gICk7XG4gIGNvbnN0IEJBRF9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKCdjb25maWcnLCAnYXBwaXVtLmNvbmZpZy5iYWQuanNvbicpO1xuICBjb25zdCBJTlZBTElEX0pTT05fRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5pbnZhbGlkLmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLnNlY3VyaXR5LWFycmF5Lmpzb24nLFxuICApO1xuICBjb25zdCBTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1kZWxpbWl0ZWQuanNvbicsXG4gICk7XG4gIGNvbnN0IFNFQ1VSSVRZX1BBVEhfRklMRVBBVEggPSByZXNvbHZlRml4dHVyZShcbiAgICAnY29uZmlnJyxcbiAgICAnYXBwaXVtLmNvbmZpZy5zZWN1cml0eS1wYXRoLmpzb24nLFxuICApO1xuICBjb25zdCBVTktOT1dOX1BST1BTX0ZJTEVQQVRIID0gcmVzb2x2ZUZpeHR1cmUoXG4gICAgJ2NvbmZpZycsXG4gICAgJ2FwcGl1bS5jb25maWcuZXh0LXVua25vd24tcHJvcHMuanNvbicsXG4gICk7XG4gIGNvbnN0IEVYVF9QUk9QU19GSUxFUEFUSCA9IHJlc29sdmVGaXh0dXJlKFxuICAgICdjb25maWcnLFxuICAgICdhcHBpdW0uY29uZmlnLmV4dC1nb29kLmpzb24nLFxuICApO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gIH0pO1xuXG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRTY2hlbWEoKTtcbiAgfSk7XG5cblxuICBkZXNjcmliZSgnd2hlbiBwcm92aWRlZCBhIHBhdGggdG8gYSBjb25maWcgZmlsZScsIGZ1bmN0aW9uICgpIHtcbiAgICBkZXNjcmliZSgnd2hlbiB0aGUgY29uZmlnIGZpbGUgaXMgdmFsaWQgcGVyIHRoZSBzY2hlbWEnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEdPT0RfRklMRVBBVEgpO1xuICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgIGNvbmZpZzogcmVxdWlyZShHT09EX0ZJTEVQQVRIKSxcbiAgICAgICAgICBmaWxlcGF0aDogR09PRF9GSUxFUEFUSCxcbiAgICAgICAgICBlcnJvcnM6IFtdLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnc2VydmVyLm5vZGVjb25maWcgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGVycm9ycycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9OT0RFQ09ORklHX0ZJTEVQQVRIKTtcbiAgICAgICAgICAgIHJlc3VsdC5zaG91bGQuaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgICAgICAgICAgICdlcnJvcnNbMF0uaW5zdGFuY2VQYXRoJyxcbiAgICAgICAgICAgICAgJy9zZXJ2ZXIvbm9kZWNvbmZpZycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBvYmplY3QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYSB2YWxpZCBjb25maWcgb2JqZWN0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoR09PRF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2Vycm9ycycpLnRoYXQuaXMuZW1wdHk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCdzZXJ2ZXIuYWxsb3ctaW5zZWN1cmUgYmVoYXZpb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgc3RyaW5nIHBhdGgnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoU0VDVVJJVFlfUEFUSF9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUubmVzdGVkLnByb3BlcnR5KFxuICAgICAgICAgICAgICAnZXJyb3JzWzBdLmluc3RhbmNlUGF0aCcsXG4gICAgICAgICAgICAgICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9ERUxJTUlURURfRklMRVBBVEgpO1xuICAgICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShcbiAgICAgICAgICAgICAgJ2Vycm9yc1swXS5pbnN0YW5jZVBhdGgnLFxuICAgICAgICAgICAgICAnL3NlcnZlci9hbGxvdy1pbnNlY3VyZScsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnd2hlbiBhbiBhcnJheScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhIHZhbGlkIGNvbmZpZyBvYmplY3QnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShTRUNVUklUWV9BUlJBWV9GSUxFUEFUSCk7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmRlZXAuZXF1YWwoe1xuICAgICAgICAgICAgICBjb25maWc6IHJlcXVpcmUoU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgpLFxuICAgICAgICAgICAgICBmaWxlcGF0aDogU0VDVVJJVFlfQVJSQVlfRklMRVBBVEgsXG4gICAgICAgICAgICAgIGVycm9yczogW10sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aGVuIHRoZSBjb25maWcgZmlsZSBpcyBpbnZhbGlkIHBlciB0aGUgc2NoZW1hJywgZnVuY3Rpb24gKCkge1xuICAgICAgZGVzY3JpYmUoJ3dpdGhvdXQgZXh0ZW5zaW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgZXJyb3JzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRDb25maWdGaWxlKEJBRF9GSUxFUEFUSCk7XG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLmRlZXAucHJvcGVydHkoJ2NvbmZpZycsIG5vcm1hbGl6ZUNvbmZpZyhyZXF1aXJlKEJBRF9GSUxFUEFUSCkpKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ2ZpbGVwYXRoJywgQkFEX0ZJTEVQQVRIKTtcbiAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJykudGhhdC5jb250YWlucy5tZW1iZXJzKFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvcGVydHk6ICdhcHBpdW0taG9tZScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IE5PVCBoYXZlIGFkZGl0aW9uYWwgcHJvcGVydGllcycsXG4gICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9hbGxvdy1jb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1jb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2FsbG93LWluc2VjdXJlJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9hbGxvdy1pbnNlY3VyZS90eXBlJyxcbiAgICAgICAgICAgICAga2V5d29yZDogJ3R5cGUnLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnYXJyYXknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGFycmF5JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlUGF0aDogJy9zZXJ2ZXIvY2FsbGJhY2stcG9ydCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6XG4gICAgICAgICAgICAgICAgJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9jYWxsYmFjay1wb3J0L21heGltdW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnbWF4aW11bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGNvbXBhcmlzb246ICc8PScsXG4gICAgICAgICAgICAgICAgbGltaXQ6IDY1NTM1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSA8PSA2NTUzNScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL2xvZy1sZXZlbCcsXG4gICAgICAgICAgICAgIHNjaGVtYVBhdGg6ICcjL3Byb3BlcnRpZXMvc2VydmVyL3Byb3BlcnRpZXMvbG9nLWxldmVsL2VudW0nLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAnZW51bScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIGFsbG93ZWRWYWx1ZXM6IFtcbiAgICAgICAgICAgICAgICAgICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmRlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdpbmZvOmluZm8nLFxuICAgICAgICAgICAgICAgICAgJ2luZm86d2FybicsXG4gICAgICAgICAgICAgICAgICAnaW5mbzplcnJvcicsXG4gICAgICAgICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAgICAgICAnd2FybjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnd2FybjppbmZvJyxcbiAgICAgICAgICAgICAgICAgICd3YXJuOndhcm4nLFxuICAgICAgICAgICAgICAgICAgJ3dhcm46ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICdlcnJvcjpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZXJyb3I6ZXJyb3InLFxuICAgICAgICAgICAgICAgICAgJ2RlYnVnJyxcbiAgICAgICAgICAgICAgICAgICdkZWJ1ZzpkZWJ1ZycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6aW5mbycsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6d2FybicsXG4gICAgICAgICAgICAgICAgICAnZGVidWc6ZXJyb3InLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdtdXN0IGJlIGVxdWFsIHRvIG9uZSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9sb2ctbm8tY29sb3JzJyxcbiAgICAgICAgICAgICAgc2NoZW1hUGF0aDogJyMvcHJvcGVydGllcy9zZXJ2ZXIvcHJvcGVydGllcy9sb2ctbm8tY29sb3JzL3R5cGUnLFxuICAgICAgICAgICAgICBrZXl3b3JkOiAndHlwZScsXG4gICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbWVzc2FnZTogJ211c3QgYmUgYm9vbGVhbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnN0YW5jZVBhdGg6ICcvc2VydmVyL3BvcnQnLFxuICAgICAgICAgICAgICBzY2hlbWFQYXRoOiAnIy9wcm9wZXJ0aWVzL3NlcnZlci9wcm9wZXJ0aWVzL3BvcnQvdHlwZScsXG4gICAgICAgICAgICAgIGtleXdvcmQ6ICd0eXBlJyxcbiAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludGVnZXInLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBiZSBpbnRlZ2VyJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSkuYW5kLmxlbmd0aE9mKDcpO1xuXG4gICAgICAgICAgcmVzdWx0LnNob3VsZC5oYXZlLnByb3BlcnR5KCdyZWFzb24nKS50aGF0LmlzLmEuc3RyaW5nO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnd2l0aCBleHRlbnNpb25zJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiogQHR5cGUge2ltcG9ydCgnLi4vbGliL2NvbmZpZy1maWxlJykuUmVhZENvbmZpZ0ZpbGVSZXN1bHR9ICovXG4gICAgICAgIGxldCByZXN1bHQ7XG5cbiAgICAgICAgYmVmb3JlRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVzZXRTY2hlbWEoKTtcbiAgICAgICAgICByZWdpc3RlclNjaGVtYSgnZHJpdmVyJywgJ2Zha2UnLCBleHRTY2hlbWEpO1xuICAgICAgICAgIGZpbmFsaXplU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB1bmtub3duIHByb3BlcnRpZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYmVmb3JlRWFjaChhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZWFkQ29uZmlnRmlsZShVTktOT1dOX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VQYXRoOiAnL3NlcnZlci9kcml2ZXIvZmFrZScsXG4gICAgICAgICAgICAgICAgc2NoZW1hUGF0aDpcbiAgICAgICAgICAgICAgICAgICdkcml2ZXItZmFrZS5qc29uL2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICBrZXl3b3JkOiAnYWRkaXRpb25hbFByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIHBhcmFtczoge2FkZGl0aW9uYWxQcm9wZXJ0eTogJ2J1YmInfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnbXVzdCBOT1QgaGF2ZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMnLFxuICAgICAgICAgICAgICAgIGlzSWRlbnRpZmllckxvY2F0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRlc2NyaWJlKCd3aGVuIHByb3ZpZGVkIGEgY29uZmlnIGZpbGUgd2l0aCB2YWxpZCBwcm9wZXJ0aWVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGJlZm9yZUVhY2goYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVhZENvbmZpZ0ZpbGUoRVhUX1BST1BTX0ZJTEVQQVRIKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBhbiBvYmplY3QgY29udGFpbmluZyBubyBlcnJvcnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXN1bHQuc2hvdWxkLmhhdmUuZGVlcC5wcm9wZXJ0eSgnZXJyb3JzJywgW10pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3doZW4gdGhlIGNvbmZpZyBmaWxlIGlzIGludmFsaWQgSlNPTicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgcmVqZWN0IHdpdGggYSB1c2VyLWZyaWVuZGx5IGVycm9yIG1lc3NhZ2UnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IHJlYWRDb25maWdGaWxlKElOVkFMSURfSlNPTl9GSUxFUEFUSCkuc2hvdWxkLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgICBuZXcgUmVnRXhwKGAke0lOVkFMSURfSlNPTl9GSUxFUEFUSH0gaXMgaW52YWxpZGApLFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXSwiZmlsZSI6InRlc3QvY29uZmlnLWZpbGUtZTJlLXNwZWNzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=