appium 2.0.0-beta.19 → 2.0.0-beta.22

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 (105) hide show
  1. package/build/check-npm-pack-files.js +23 -0
  2. package/build/commands-yml/parse.js +319 -0
  3. package/build/commands-yml/validator.js +130 -0
  4. package/build/index.js +19 -0
  5. package/build/lib/appium-config.schema.json +0 -0
  6. package/build/lib/appium.js +84 -69
  7. package/build/lib/cli/args.js +87 -223
  8. package/build/lib/cli/extension-command.js +2 -2
  9. package/build/lib/cli/extension.js +14 -6
  10. package/build/lib/cli/parser.js +146 -106
  11. package/build/lib/config-file.js +141 -0
  12. package/build/lib/config.js +28 -77
  13. package/build/lib/driver-config.js +41 -20
  14. package/build/lib/ext-config-io.js +165 -0
  15. package/build/lib/extension-config.js +110 -60
  16. package/build/lib/grid-register.js +19 -21
  17. package/build/lib/main.js +135 -72
  18. package/build/lib/plugin-config.js +18 -9
  19. package/build/lib/schema/appium-config-schema.js +253 -0
  20. package/build/lib/schema/arg-spec.js +120 -0
  21. package/build/lib/schema/cli-args.js +188 -0
  22. package/build/lib/schema/cli-transformers.js +76 -0
  23. package/build/lib/schema/index.js +36 -0
  24. package/build/lib/schema/keywords.js +72 -0
  25. package/build/lib/schema/schema.js +357 -0
  26. package/build/lib/utils.js +24 -33
  27. package/build/postinstall.js +90 -0
  28. package/build/test/cli/cli-e2e-specs.js +221 -0
  29. package/build/test/cli/cli-helpers.js +86 -0
  30. package/build/test/cli/cli-specs.js +71 -0
  31. package/build/test/cli/fixtures/test-driver/package.json +27 -0
  32. package/build/test/cli/schema-args-specs.js +48 -0
  33. package/build/test/cli/schema-e2e-specs.js +47 -0
  34. package/build/test/config-e2e-specs.js +112 -0
  35. package/build/test/config-file-e2e-specs.js +209 -0
  36. package/build/test/config-file-specs.js +281 -0
  37. package/build/test/config-specs.js +159 -0
  38. package/build/test/driver-e2e-specs.js +435 -0
  39. package/build/test/driver-specs.js +321 -0
  40. package/build/test/ext-config-io-specs.js +181 -0
  41. package/build/test/extension-config-specs.js +365 -0
  42. package/build/test/fixtures/allow-feat.txt +5 -0
  43. package/build/test/fixtures/caps.json +3 -0
  44. package/build/test/fixtures/config/allow-insecure.txt +3 -0
  45. package/build/test/fixtures/config/appium.config.bad-nodeconfig.json +5 -0
  46. package/build/test/fixtures/config/appium.config.bad.json +32 -0
  47. package/build/test/fixtures/config/appium.config.ext-good.json +9 -0
  48. package/build/test/fixtures/config/appium.config.ext-unknown-props.json +10 -0
  49. package/build/test/fixtures/config/appium.config.good.js +40 -0
  50. package/build/test/fixtures/config/appium.config.good.json +33 -0
  51. package/build/test/fixtures/config/appium.config.good.yaml +30 -0
  52. package/build/test/fixtures/config/appium.config.invalid.json +31 -0
  53. package/build/test/fixtures/config/appium.config.security-array.json +5 -0
  54. package/build/test/fixtures/config/appium.config.security-delimited.json +5 -0
  55. package/build/test/fixtures/config/appium.config.security-path.json +5 -0
  56. package/build/test/fixtures/config/driver-fake.config.json +8 -0
  57. package/build/test/fixtures/config/nodeconfig.json +3 -0
  58. package/build/test/fixtures/config/plugin-fake.config.json +0 -0
  59. package/build/test/fixtures/default-args.js +35 -0
  60. package/build/test/fixtures/deny-feat.txt +5 -0
  61. package/build/test/fixtures/driver.schema.js +20 -0
  62. package/build/test/fixtures/extensions.yaml +27 -0
  63. package/build/test/fixtures/flattened-schema.js +504 -0
  64. package/build/test/fixtures/plugin.schema.js +20 -0
  65. package/build/test/fixtures/schema-with-extensions.js +28 -0
  66. package/build/test/grid-register-specs.js +74 -0
  67. package/build/test/helpers.js +75 -0
  68. package/build/test/logger-specs.js +76 -0
  69. package/build/test/npm-specs.js +20 -0
  70. package/build/test/parser-specs.js +314 -0
  71. package/build/test/plugin-e2e-specs.js +316 -0
  72. package/build/test/schema/arg-spec-specs.js +70 -0
  73. package/build/test/schema/cli-args-specs.js +431 -0
  74. package/build/test/schema/schema-specs.js +389 -0
  75. package/build/test/utils-specs.js +266 -0
  76. package/index.js +11 -0
  77. package/lib/appium-config.schema.json +278 -0
  78. package/lib/appium.js +99 -75
  79. package/lib/cli/args.js +138 -335
  80. package/lib/cli/extension-command.js +7 -6
  81. package/lib/cli/extension.js +12 -4
  82. package/lib/cli/parser.js +251 -96
  83. package/lib/config-file.js +227 -0
  84. package/lib/config.js +63 -79
  85. package/lib/driver-config.js +66 -11
  86. package/lib/ext-config-io.js +287 -0
  87. package/lib/extension-config.js +209 -66
  88. package/lib/grid-register.js +24 -21
  89. package/lib/main.js +145 -71
  90. package/lib/plugin-config.js +33 -3
  91. package/lib/schema/appium-config-schema.js +287 -0
  92. package/lib/schema/arg-spec.js +222 -0
  93. package/lib/schema/cli-args.js +285 -0
  94. package/lib/schema/cli-transformers.js +123 -0
  95. package/lib/schema/index.js +2 -0
  96. package/lib/schema/keywords.js +135 -0
  97. package/lib/schema/schema.js +577 -0
  98. package/lib/utils.js +29 -52
  99. package/package.json +17 -16
  100. package/types/appium-config.d.ts +197 -0
  101. package/types/types.d.ts +201 -0
  102. package/build/lib/cli/argparse-actions.js +0 -104
  103. package/build/lib/cli/parser-helpers.js +0 -106
  104. package/lib/cli/argparse-actions.js +0 -77
  105. package/lib/cli/parser-helpers.js +0 -106
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ require("source-map-support/register");
5
+
6
+ async function main() {
7
+ const driverEnv = process.env.npm_config_drivers;
8
+ const pluginEnv = process.env.npm_config_plugins;
9
+
10
+ if (!driverEnv && !pluginEnv) {
11
+ console.log('Not auto-installing any drivers or plugins');
12
+ return;
13
+ }
14
+
15
+ let extension;
16
+
17
+ try {
18
+ extension = require('./build/lib/cli/extension');
19
+ } catch (e) {
20
+ throw new Error(`Could not load extension CLI file; has the project been transpiled? ` + `(${e.message})`);
21
+ }
22
+
23
+ const {
24
+ DEFAULT_APPIUM_HOME,
25
+ DRIVER_TYPE,
26
+ PLUGIN_TYPE
27
+ } = require('./build/lib/extension-config');
28
+
29
+ const {
30
+ runExtensionCommand
31
+ } = extension;
32
+ const appiumHome = process.env.npm_config_appium_home || DEFAULT_APPIUM_HOME;
33
+ const specs = [[DRIVER_TYPE, driverEnv], [PLUGIN_TYPE, pluginEnv]];
34
+
35
+ for (const [type, extEnv] of specs) {
36
+ if (extEnv) {
37
+ for (const ext of extEnv.split(',')) {
38
+ try {
39
+ await checkAndInstallExtension({
40
+ runExtensionCommand,
41
+ appiumHome,
42
+ type,
43
+ ext
44
+ });
45
+ } catch (e) {
46
+ console.log(`There was an error checking and installing ${type} ${ext}: ${e.message}`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ async function checkAndInstallExtension({
54
+ runExtensionCommand,
55
+ appiumHome,
56
+ type,
57
+ ext
58
+ }) {
59
+ const extList = await runExtensionCommand({
60
+ appiumHome,
61
+ [`${type}Command`]: 'list',
62
+ showInstalled: true,
63
+ suppressOutput: true
64
+ }, type);
65
+
66
+ if (extList[ext]) {
67
+ console.log(`The ${type} ${ext} was already installed, skipping...`);
68
+ return;
69
+ }
70
+
71
+ console.log(`Installing the ${type} ${ext}...`);
72
+ await runExtensionCommand({
73
+ appiumHome,
74
+ [`${type}Command`]: 'install',
75
+ [type]: ext,
76
+ suppressOutput: true
77
+ }, type);
78
+ }
79
+
80
+ if (require.main === module) {
81
+ main().then(() => {
82
+ process.exit(0);
83
+ }).catch(e => {
84
+ console.error(e);
85
+ process.exit(1);
86
+ });
87
+ }require('source-map-support').install();
88
+
89
+
90
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBvc3RpbnN0YWxsLmpzIl0sIm5hbWVzIjpbIm1haW4iLCJkcml2ZXJFbnYiLCJwcm9jZXNzIiwiZW52IiwibnBtX2NvbmZpZ19kcml2ZXJzIiwicGx1Z2luRW52IiwibnBtX2NvbmZpZ19wbHVnaW5zIiwiY29uc29sZSIsImxvZyIsImV4dGVuc2lvbiIsInJlcXVpcmUiLCJlIiwiRXJyb3IiLCJtZXNzYWdlIiwiREVGQVVMVF9BUFBJVU1fSE9NRSIsIkRSSVZFUl9UWVBFIiwiUExVR0lOX1RZUEUiLCJydW5FeHRlbnNpb25Db21tYW5kIiwiYXBwaXVtSG9tZSIsIm5wbV9jb25maWdfYXBwaXVtX2hvbWUiLCJzcGVjcyIsInR5cGUiLCJleHRFbnYiLCJleHQiLCJzcGxpdCIsImNoZWNrQW5kSW5zdGFsbEV4dGVuc2lvbiIsImV4dExpc3QiLCJzaG93SW5zdGFsbGVkIiwic3VwcHJlc3NPdXRwdXQiLCJtb2R1bGUiLCJ0aGVuIiwiZXhpdCIsImNhdGNoIiwiZXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7OztBQUdBLGVBQWVBLElBQWYsR0FBdUI7QUFDckIsUUFBTUMsU0FBUyxHQUFHQyxPQUFPLENBQUNDLEdBQVIsQ0FBWUMsa0JBQTlCO0FBQ0EsUUFBTUMsU0FBUyxHQUFHSCxPQUFPLENBQUNDLEdBQVIsQ0FBWUcsa0JBQTlCOztBQUVBLE1BQUksQ0FBQ0wsU0FBRCxJQUFjLENBQUNJLFNBQW5CLEVBQThCO0FBQzVCRSxJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSw0Q0FBWjtBQUNBO0FBQ0Q7O0FBRUQsTUFBSUMsU0FBSjs7QUFDQSxNQUFJO0FBQ0ZBLElBQUFBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLDJCQUFELENBQW5CO0FBQ0QsR0FGRCxDQUVFLE9BQU9DLENBQVAsRUFBVTtBQUNWLFVBQU0sSUFBSUMsS0FBSixDQUFXLHNFQUFELEdBQ0MsSUFBR0QsQ0FBQyxDQUFDRSxPQUFRLEdBRHhCLENBQU47QUFFRDs7QUFFRCxRQUFNO0FBQUNDLElBQUFBLG1CQUFEO0FBQXNCQyxJQUFBQSxXQUF0QjtBQUFtQ0MsSUFBQUE7QUFBbkMsTUFBa0ROLE9BQU8sQ0FBQyw4QkFBRCxDQUEvRDs7QUFDQSxRQUFNO0FBQUNPLElBQUFBO0FBQUQsTUFBd0JSLFNBQTlCO0FBQ0EsUUFBTVMsVUFBVSxHQUFHaEIsT0FBTyxDQUFDQyxHQUFSLENBQVlnQixzQkFBWixJQUFzQ0wsbUJBQXpEO0FBQ0EsUUFBTU0sS0FBSyxHQUFHLENBQUMsQ0FBQ0wsV0FBRCxFQUFjZCxTQUFkLENBQUQsRUFBMkIsQ0FBQ2UsV0FBRCxFQUFjWCxTQUFkLENBQTNCLENBQWQ7O0FBRUEsT0FBSyxNQUFNLENBQUNnQixJQUFELEVBQU9DLE1BQVAsQ0FBWCxJQUE2QkYsS0FBN0IsRUFBb0M7QUFDbEMsUUFBSUUsTUFBSixFQUFZO0FBQ1YsV0FBSyxNQUFNQyxHQUFYLElBQWtCRCxNQUFNLENBQUNFLEtBQVAsQ0FBYSxHQUFiLENBQWxCLEVBQXFDO0FBQ25DLFlBQUk7QUFDRixnQkFBTUMsd0JBQXdCLENBQUM7QUFBQ1IsWUFBQUEsbUJBQUQ7QUFBc0JDLFlBQUFBLFVBQXRCO0FBQWtDRyxZQUFBQSxJQUFsQztBQUF3Q0UsWUFBQUE7QUFBeEMsV0FBRCxDQUE5QjtBQUNELFNBRkQsQ0FFRSxPQUFPWixDQUFQLEVBQVU7QUFDVkosVUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsOENBQTZDYSxJQUFLLElBQUdFLEdBQUksS0FBSVosQ0FBQyxDQUFDRSxPQUFRLEVBQXBGO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7QUFDRjs7QUFFRCxlQUFlWSx3QkFBZixDQUF5QztBQUN2Q1IsRUFBQUEsbUJBRHVDO0FBRXZDQyxFQUFBQSxVQUZ1QztBQUd2Q0csRUFBQUEsSUFIdUM7QUFJdkNFLEVBQUFBO0FBSnVDLENBQXpDLEVBS0c7QUFDRCxRQUFNRyxPQUFPLEdBQUcsTUFBTVQsbUJBQW1CLENBQUM7QUFDeENDLElBQUFBLFVBRHdDO0FBRXhDLEtBQUUsR0FBRUcsSUFBSyxTQUFULEdBQW9CLE1BRm9CO0FBR3hDTSxJQUFBQSxhQUFhLEVBQUUsSUFIeUI7QUFJeENDLElBQUFBLGNBQWMsRUFBRTtBQUp3QixHQUFELEVBS3RDUCxJQUxzQyxDQUF6Qzs7QUFNQSxNQUFJSyxPQUFPLENBQUNILEdBQUQsQ0FBWCxFQUFrQjtBQUNoQmhCLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLE9BQU1hLElBQUssSUFBR0UsR0FBSSxxQ0FBL0I7QUFDQTtBQUNEOztBQUNEaEIsRUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsa0JBQWlCYSxJQUFLLElBQUdFLEdBQUksS0FBMUM7QUFDQSxRQUFNTixtQkFBbUIsQ0FBQztBQUN4QkMsSUFBQUEsVUFEd0I7QUFFeEIsS0FBRSxHQUFFRyxJQUFLLFNBQVQsR0FBb0IsU0FGSTtBQUd4QixLQUFDQSxJQUFELEdBQVFFLEdBSGdCO0FBSXhCSyxJQUFBQSxjQUFjLEVBQUU7QUFKUSxHQUFELEVBS3RCUCxJQUxzQixDQUF6QjtBQU1EOztBQUVELElBQUlYLE9BQU8sQ0FBQ1YsSUFBUixLQUFpQjZCLE1BQXJCLEVBQTZCO0FBQzNCN0IsRUFBQUEsSUFBSSxHQUFHOEIsSUFBUCxDQUFZLE1BQU07QUFDaEI1QixJQUFBQSxPQUFPLENBQUM2QixJQUFSLENBQWEsQ0FBYjtBQUNELEdBRkQsRUFFR0MsS0FGSCxDQUVVckIsQ0FBRCxJQUFPO0FBQ2RKLElBQUFBLE9BQU8sQ0FBQzBCLEtBQVIsQ0FBY3RCLENBQWQ7QUFDQVQsSUFBQUEsT0FBTyxDQUFDNkIsSUFBUixDQUFhLENBQWI7QUFDRCxHQUxEO0FBTUQiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlLCBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuICovXG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4gKCkge1xuICBjb25zdCBkcml2ZXJFbnYgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2RyaXZlcnM7XG4gIGNvbnN0IHBsdWdpbkVudiA9IHByb2Nlc3MuZW52Lm5wbV9jb25maWdfcGx1Z2lucztcblxuICBpZiAoIWRyaXZlckVudiAmJiAhcGx1Z2luRW52KSB7XG4gICAgY29uc29sZS5sb2coJ05vdCBhdXRvLWluc3RhbGxpbmcgYW55IGRyaXZlcnMgb3IgcGx1Z2lucycpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBleHRlbnNpb247XG4gIHRyeSB7XG4gICAgZXh0ZW5zaW9uID0gcmVxdWlyZSgnLi9idWlsZC9saWIvY2xpL2V4dGVuc2lvbicpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgbG9hZCBleHRlbnNpb24gQ0xJIGZpbGU7IGhhcyB0aGUgcHJvamVjdCBiZWVuIHRyYW5zcGlsZWQ/IGAgK1xuICAgICAgICAgICAgICAgICAgICBgKCR7ZS5tZXNzYWdlfSlgKTtcbiAgfVxuXG4gIGNvbnN0IHtERUZBVUxUX0FQUElVTV9IT01FLCBEUklWRVJfVFlQRSwgUExVR0lOX1RZUEV9ID0gcmVxdWlyZSgnLi9idWlsZC9saWIvZXh0ZW5zaW9uLWNvbmZpZycpO1xuICBjb25zdCB7cnVuRXh0ZW5zaW9uQ29tbWFuZH0gPSBleHRlbnNpb247XG4gIGNvbnN0IGFwcGl1bUhvbWUgPSBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2FwcGl1bV9ob21lIHx8IERFRkFVTFRfQVBQSVVNX0hPTUU7XG4gIGNvbnN0IHNwZWNzID0gW1tEUklWRVJfVFlQRSwgZHJpdmVyRW52XSwgW1BMVUdJTl9UWVBFLCBwbHVnaW5FbnZdXTtcblxuICBmb3IgKGNvbnN0IFt0eXBlLCBleHRFbnZdIG9mIHNwZWNzKSB7XG4gICAgaWYgKGV4dEVudikge1xuICAgICAgZm9yIChjb25zdCBleHQgb2YgZXh0RW52LnNwbGl0KCcsJykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBjaGVja0FuZEluc3RhbGxFeHRlbnNpb24oe3J1bkV4dGVuc2lvbkNvbW1hbmQsIGFwcGl1bUhvbWUsIHR5cGUsIGV4dH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFRoZXJlIHdhcyBhbiBlcnJvciBjaGVja2luZyBhbmQgaW5zdGFsbGluZyAke3R5cGV9ICR7ZXh0fTogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2hlY2tBbmRJbnN0YWxsRXh0ZW5zaW9uICh7XG4gIHJ1bkV4dGVuc2lvbkNvbW1hbmQsXG4gIGFwcGl1bUhvbWUsXG4gIHR5cGUsXG4gIGV4dCxcbn0pIHtcbiAgY29uc3QgZXh0TGlzdCA9IGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoe1xuICAgIGFwcGl1bUhvbWUsXG4gICAgW2Ake3R5cGV9Q29tbWFuZGBdOiAnbGlzdCcsXG4gICAgc2hvd0luc3RhbGxlZDogdHJ1ZSxcbiAgICBzdXBwcmVzc091dHB1dDogdHJ1ZSxcbiAgfSwgdHlwZSk7XG4gIGlmIChleHRMaXN0W2V4dF0pIHtcbiAgICBjb25zb2xlLmxvZyhgVGhlICR7dHlwZX0gJHtleHR9IHdhcyBhbHJlYWR5IGluc3RhbGxlZCwgc2tpcHBpbmcuLi5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc29sZS5sb2coYEluc3RhbGxpbmcgdGhlICR7dHlwZX0gJHtleHR9Li4uYCk7XG4gIGF3YWl0IHJ1bkV4dGVuc2lvbkNvbW1hbmQoe1xuICAgIGFwcGl1bUhvbWUsXG4gICAgW2Ake3R5cGV9Q29tbWFuZGBdOiAnaW5zdGFsbCcsXG4gICAgW3R5cGVdOiBleHQsXG4gICAgc3VwcHJlc3NPdXRwdXQ6IHRydWUsXG4gIH0sIHR5cGUpO1xufVxuXG5pZiAocmVxdWlyZS5tYWluID09PSBtb2R1bGUpIHtcbiAgbWFpbigpLnRoZW4oKCkgPT4ge1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG59XG4iXSwiZmlsZSI6InBvc3RpbnN0YWxsLmpzIiwic291cmNlUm9vdCI6Ii4uIn0=
@@ -0,0 +1,221 @@
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 _drivers = require("../../lib/drivers");
12
+
13
+ var _helpers = require("../helpers");
14
+
15
+ var _cliHelpers = require("./cli-helpers");
16
+
17
+ describe('CLI', function () {
18
+ let appiumHome;
19
+ let run;
20
+ before(async function () {
21
+ appiumHome = await _support.tempDir.openDir();
22
+ const runner = (0, _cliHelpers.runAppium)(appiumHome);
23
+
24
+ run = async (extCommand, args = [], raw = false, ext = 'driver') => await runner([ext, extCommand, ...args], {
25
+ raw
26
+ });
27
+ });
28
+ after(async function () {
29
+ await _support.fs.rimraf(appiumHome);
30
+ });
31
+
32
+ async function clear() {
33
+ await _support.fs.rimraf(appiumHome);
34
+ await (0, _support.mkdirp)(appiumHome);
35
+ }
36
+
37
+ describe('Driver CLI', function () {
38
+ const localFakeDriverPath = _path.default.join(_helpers.PROJECT_ROOT, 'packages', 'fake-driver');
39
+
40
+ describe('list', function () {
41
+ it('should list available drivers', async function () {
42
+ const stdout = await run('list');
43
+
44
+ for (const d of Object.keys(_drivers.KNOWN_DRIVERS)) {
45
+ stdout.should.match(new RegExp(`${d}.+[not installed]`));
46
+ }
47
+ });
48
+ it('should list available drivers in json format', async function () {
49
+ const driverData = JSON.parse(await run('list', ['--json']));
50
+
51
+ for (const d of Object.keys(_drivers.KNOWN_DRIVERS)) {
52
+ driverData[d].should.eql({
53
+ installed: false,
54
+ pkgName: _drivers.KNOWN_DRIVERS[d]
55
+ });
56
+ }
57
+ });
58
+ it('should allow filtering by installed drivers', async function () {
59
+ const out = await run('list', ['--installed', '--json']);
60
+ JSON.parse(out).should.eql({});
61
+ });
62
+ it('should show updates for installed drivers with --updates', async function () {
63
+ const penultimateFakeDriverVersionAsOfRightNow = '3.0.4';
64
+ await clear();
65
+ await run('install', [`@appium/fake-driver@${penultimateFakeDriverVersionAsOfRightNow}`, '--source', 'npm', '--json']);
66
+ const {
67
+ fake
68
+ } = JSON.parse(await run('list', ['--updates', '--json']));
69
+ _support.util.compareVersions(fake.updateVersion, '>', penultimateFakeDriverVersionAsOfRightNow).should.be.true;
70
+ const stdout = await run('list', ['--updates']);
71
+ stdout.should.match(new RegExp(`fake.+[${fake.updateVersion} available]`));
72
+ });
73
+ });
74
+ describe('install', function () {
75
+ it('should install a driver from the list of known drivers', async function () {
76
+ await clear();
77
+ const ret = JSON.parse(await run('install', ['uiautomator2', '--json']));
78
+ ret.uiautomator2.pkgName.should.eql('appium-uiautomator2-driver');
79
+ ret.uiautomator2.installType.should.eql('npm');
80
+ ret.uiautomator2.installSpec.should.eql('uiautomator2');
81
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
82
+ delete list.uiautomator2.installed;
83
+ list.should.eql(ret);
84
+ });
85
+ it('should install a driver from npm', async function () {
86
+ await clear();
87
+ const ret = JSON.parse(await run('install', ['@appium/fake-driver', '--source', 'npm', '--json']));
88
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
89
+ ret.fake.installType.should.eql('npm');
90
+ ret.fake.installSpec.should.eql('@appium/fake-driver');
91
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
92
+ delete list.fake.installed;
93
+ list.should.eql(ret);
94
+ });
95
+ it('should install a driver from npm with a specific version/tag', async function () {
96
+ const currentFakeDriverVersionAsOfRightNow = '3.0.5';
97
+ await clear();
98
+ const installSpec = `@appium/fake-driver@${currentFakeDriverVersionAsOfRightNow}`;
99
+ const ret = JSON.parse(await run('install', [installSpec, '--source', 'npm', '--json']));
100
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
101
+ ret.fake.installType.should.eql('npm');
102
+ ret.fake.installSpec.should.eql(installSpec);
103
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
104
+ delete list.fake.installed;
105
+ list.should.eql(ret);
106
+ });
107
+ it('should install a driver from github', async function () {
108
+ await clear();
109
+ const ret = JSON.parse(await run('install', ['appium/appium-fake-driver', '--source', 'github', '--package', 'appium-fake-driver', '--json']));
110
+ ret.fake.pkgName.should.eql('appium-fake-driver');
111
+ ret.fake.installType.should.eql('github');
112
+ ret.fake.installSpec.should.eql('appium/appium-fake-driver');
113
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
114
+ delete list.fake.installed;
115
+ list.should.eql(ret);
116
+ });
117
+ it('should install a driver from a local git repo', async function () {
118
+ await clear();
119
+ const ret = JSON.parse(await run('install', [localFakeDriverPath, '--source', 'git', '--package', '@appium/fake-driver', '--json']));
120
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
121
+ ret.fake.installType.should.eql('git');
122
+ ret.fake.installSpec.should.eql(localFakeDriverPath);
123
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
124
+ delete list.fake.installed;
125
+ list.should.eql(ret);
126
+ });
127
+ it('should install a driver from a remote git repo', async function () {
128
+ await clear();
129
+ const ret = JSON.parse(await run('install', ['git+https://github.com/appium/appium-fake-driver.git', '--source', 'git', '--package', 'appium-fake-driver', '--json']));
130
+ ret.fake.pkgName.should.eql('appium-fake-driver');
131
+ ret.fake.installType.should.eql('git');
132
+ ret.fake.installSpec.should.eql('git+https://github.com/appium/appium-fake-driver');
133
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
134
+ delete list.fake.installed;
135
+ list.should.eql(ret);
136
+ });
137
+ it('should install a driver from a local npm module', async function () {
138
+ await clear();
139
+ const ret = JSON.parse(await run('install', [localFakeDriverPath, '--source', 'local', '--json']));
140
+ ret.fake.pkgName.should.eql('@appium/fake-driver');
141
+ ret.fake.installType.should.eql('local');
142
+ ret.fake.installSpec.should.eql(localFakeDriverPath);
143
+ const list = JSON.parse(await run('list', ['--installed', '--json']));
144
+ delete list.fake.installed;
145
+ list.should.eql(ret);
146
+ });
147
+ });
148
+ describe('uninstall', function () {
149
+ it('should uninstall a driver based on its driver name', async function () {
150
+ await clear();
151
+ const ret = JSON.parse(await run('install', ['@appium/fake-driver', '--source', 'npm', '--json']));
152
+
153
+ const installPath = _path.default.resolve(appiumHome, ret.fake.installPath);
154
+
155
+ await _support.fs.exists(installPath).should.eventually.be.true;
156
+ let list = JSON.parse(await run('list', ['--installed', '--json']));
157
+ list.fake.installed.should.be.true;
158
+ const uninstall = JSON.parse(await run('uninstall', ['fake', '--json']));
159
+ uninstall.should.not.have.key('fake');
160
+ await _support.fs.exists(installPath).should.eventually.be.false;
161
+ });
162
+ });
163
+ describe('run', function () {
164
+ before(async function () {
165
+ await clear();
166
+ await run('install', [localFakeDriverPath, '--source', 'local', '--json']);
167
+ });
168
+ it('should run a valid driver, valid script, and result in success', async function () {
169
+ const driverName = 'fake';
170
+ const scriptName = 'fake-success';
171
+ const out = JSON.parse(await run('run', [driverName, scriptName, '--json']));
172
+ out.should.not.include.key('error');
173
+ });
174
+ it('should run a valid driver, valid error prone script, and return error in json', async function () {
175
+ const driverName = 'fake';
176
+ const out = JSON.parse(await run('run', [driverName, 'fake-error', '--json']));
177
+ out.should.include.key('error');
178
+ });
179
+ it('should take a valid driver, invalid script, and throw an error', async function () {
180
+ const driverName = 'fake';
181
+ await chai.expect(run('run', [driverName, 'foo', '--json'])).to.eventually.be.rejectedWith(Error);
182
+ });
183
+ it('should take an invalid driver, invalid script, and throw an error', async function () {
184
+ const driverName = 'foo';
185
+ await chai.expect(run('run', [driverName, 'bar', '--json'])).to.eventually.be.rejectedWith(Error);
186
+ });
187
+ });
188
+ });
189
+ describe('Plugin CLI', function () {
190
+ const fakePluginDir = _path.default.dirname(require.resolve('@appium/fake-plugin/package.json'));
191
+
192
+ const ext = 'plugin';
193
+ describe('run', function () {
194
+ before(async function () {
195
+ await clear();
196
+ await run('install', [fakePluginDir, '--source', 'local', '--json'], false, ext);
197
+ });
198
+ it('should run a valid plugin, valid script, and result in success', async function () {
199
+ const pluginName = 'fake';
200
+ const scriptName = 'fake-success';
201
+ const out = JSON.parse(await run('run', [pluginName, scriptName, '--json'], false, ext));
202
+ out.should.not.include.key('error');
203
+ });
204
+ it('should run a valid plugin, valid error prone script, and return error in json', async function () {
205
+ const pluginName = 'fake';
206
+ const out = JSON.parse(await run('run', [pluginName, 'fake-error', '--json'], false, ext));
207
+ out.should.include.key('error');
208
+ });
209
+ it('should take a valid plugin, invalid script, and throw an error', async function () {
210
+ const pluginName = 'fake';
211
+ await chai.expect(run('run', [pluginName, 'foo', '--json'], false, ext)).to.eventually.be.rejectedWith(Error);
212
+ });
213
+ it('should take an invalid plugin, invalid script, and throw an error', async function () {
214
+ await chai.expect(run('run', ['foo', 'bar', '--json'], false, ext)).to.eventually.be.rejectedWith(Error);
215
+ });
216
+ });
217
+ });
218
+ });require('source-map-support').install();
219
+
220
+
221
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1lMmUtc3BlY3MuanMiXSwibmFtZXMiOlsiZGVzY3JpYmUiLCJhcHBpdW1Ib21lIiwicnVuIiwiYmVmb3JlIiwidGVtcERpciIsIm9wZW5EaXIiLCJydW5uZXIiLCJleHRDb21tYW5kIiwiYXJncyIsInJhdyIsImV4dCIsImFmdGVyIiwiZnMiLCJyaW1yYWYiLCJjbGVhciIsImxvY2FsRmFrZURyaXZlclBhdGgiLCJwYXRoIiwiam9pbiIsIlBST0pFQ1RfUk9PVCIsIml0Iiwic3Rkb3V0IiwiZCIsIk9iamVjdCIsImtleXMiLCJLTk9XTl9EUklWRVJTIiwic2hvdWxkIiwibWF0Y2giLCJSZWdFeHAiLCJkcml2ZXJEYXRhIiwiSlNPTiIsInBhcnNlIiwiZXFsIiwiaW5zdGFsbGVkIiwicGtnTmFtZSIsIm91dCIsInBlbnVsdGltYXRlRmFrZURyaXZlclZlcnNpb25Bc09mUmlnaHROb3ciLCJmYWtlIiwidXRpbCIsImNvbXBhcmVWZXJzaW9ucyIsInVwZGF0ZVZlcnNpb24iLCJiZSIsInRydWUiLCJyZXQiLCJ1aWF1dG9tYXRvcjIiLCJpbnN0YWxsVHlwZSIsImluc3RhbGxTcGVjIiwibGlzdCIsImN1cnJlbnRGYWtlRHJpdmVyVmVyc2lvbkFzT2ZSaWdodE5vdyIsImluc3RhbGxQYXRoIiwicmVzb2x2ZSIsImV4aXN0cyIsImV2ZW50dWFsbHkiLCJ1bmluc3RhbGwiLCJub3QiLCJoYXZlIiwia2V5IiwiZmFsc2UiLCJkcml2ZXJOYW1lIiwic2NyaXB0TmFtZSIsImluY2x1ZGUiLCJjaGFpIiwiZXhwZWN0IiwidG8iLCJyZWplY3RlZFdpdGgiLCJFcnJvciIsImZha2VQbHVnaW5EaXIiLCJkaXJuYW1lIiwicmVxdWlyZSIsInBsdWdpbk5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBQSxRQUFRLENBQUMsS0FBRCxFQUFRLFlBQVk7QUFJMUIsTUFBSUMsVUFBSjtBQUtBLE1BQUlDLEdBQUo7QUFFQUMsRUFBQUEsTUFBTSxDQUFDLGtCQUFrQjtBQUN2QkYsSUFBQUEsVUFBVSxHQUFHLE1BQU1HLGlCQUFRQyxPQUFSLEVBQW5CO0FBQ0EsVUFBTUMsTUFBTSxHQUFHLDJCQUFVTCxVQUFWLENBQWY7O0FBQ0FDLElBQUFBLEdBQUcsR0FBRyxPQUFPSyxVQUFQLEVBQW1CQyxJQUFJLEdBQUcsRUFBMUIsRUFBOEJDLEdBQUcsR0FBRyxLQUFwQyxFQUEyQ0MsR0FBRyxHQUFHLFFBQWpELEtBQThELE1BQU1KLE1BQU0sQ0FBQyxDQUFDSSxHQUFELEVBQU1ILFVBQU4sRUFBa0IsR0FBR0MsSUFBckIsQ0FBRCxFQUE2QjtBQUFDQyxNQUFBQTtBQUFELEtBQTdCLENBQWhGO0FBQ0QsR0FKSyxDQUFOO0FBTUFFLEVBQUFBLEtBQUssQ0FBQyxrQkFBa0I7QUFDdEIsVUFBTUMsWUFBR0MsTUFBSCxDQUFVWixVQUFWLENBQU47QUFDRCxHQUZJLENBQUw7O0FBSUEsaUJBQWVhLEtBQWYsR0FBd0I7QUFDdEIsVUFBTUYsWUFBR0MsTUFBSCxDQUFVWixVQUFWLENBQU47QUFDQSxVQUFNLHFCQUFPQSxVQUFQLENBQU47QUFDRDs7QUFFREQsRUFBQUEsUUFBUSxDQUFDLFlBQUQsRUFBZSxZQUFZO0FBQ2pDLFVBQU1lLG1CQUFtQixHQUFHQyxjQUFLQyxJQUFMLENBQVVDLHFCQUFWLEVBQXdCLFVBQXhCLEVBQW9DLGFBQXBDLENBQTVCOztBQUNBbEIsSUFBQUEsUUFBUSxDQUFDLE1BQUQsRUFBUyxZQUFZO0FBQzNCbUIsTUFBQUEsRUFBRSxDQUFDLCtCQUFELEVBQWtDLGtCQUFrQjtBQUNwRCxjQUFNQyxNQUFNLEdBQUcsTUFBTWxCLEdBQUcsQ0FBQyxNQUFELENBQXhCOztBQUNBLGFBQUssTUFBTW1CLENBQVgsSUFBZ0JDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZQyxzQkFBWixDQUFoQixFQUE0QztBQUMxQ0osVUFBQUEsTUFBTSxDQUFDSyxNQUFQLENBQWNDLEtBQWQsQ0FBb0IsSUFBSUMsTUFBSixDQUFZLEdBQUVOLENBQUUsbUJBQWhCLENBQXBCO0FBQ0Q7QUFDRixPQUxDLENBQUY7QUFNQUYsTUFBQUEsRUFBRSxDQUFDLDhDQUFELEVBQWlELGtCQUFrQjtBQUNuRSxjQUFNUyxVQUFVLEdBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsTUFBRCxFQUFTLENBQUMsUUFBRCxDQUFULENBQXBCLENBQW5COztBQUNBLGFBQUssTUFBTW1CLENBQVgsSUFBZ0JDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZQyxzQkFBWixDQUFoQixFQUE0QztBQUMxQ0ksVUFBQUEsVUFBVSxDQUFDUCxDQUFELENBQVYsQ0FBY0ksTUFBZCxDQUFxQk0sR0FBckIsQ0FBeUI7QUFBQ0MsWUFBQUEsU0FBUyxFQUFFLEtBQVo7QUFBbUJDLFlBQUFBLE9BQU8sRUFBRVQsdUJBQWNILENBQWQ7QUFBNUIsV0FBekI7QUFDRDtBQUNGLE9BTEMsQ0FBRjtBQU1BRixNQUFBQSxFQUFFLENBQUMsNkNBQUQsRUFBZ0Qsa0JBQWtCO0FBQ2xFLGNBQU1lLEdBQUcsR0FBRyxNQUFNaEMsR0FBRyxDQUFDLE1BQUQsRUFBUyxDQUFDLGFBQUQsRUFBZ0IsUUFBaEIsQ0FBVCxDQUFyQjtBQUNBMkIsUUFBQUEsSUFBSSxDQUFDQyxLQUFMLENBQVdJLEdBQVgsRUFBZ0JULE1BQWhCLENBQXVCTSxHQUF2QixDQUEyQixFQUEzQjtBQUNELE9BSEMsQ0FBRjtBQUlBWixNQUFBQSxFQUFFLENBQUMsMERBQUQsRUFBNkQsa0JBQWtCO0FBQy9FLGNBQU1nQix3Q0FBd0MsR0FBRyxPQUFqRDtBQUNBLGNBQU1yQixLQUFLLEVBQVg7QUFDQSxjQUFNWixHQUFHLENBQUMsU0FBRCxFQUFZLENBQUUsdUJBQXNCaUMsd0NBQXlDLEVBQWpFLEVBQW9FLFVBQXBFLEVBQWdGLEtBQWhGLEVBQXVGLFFBQXZGLENBQVosQ0FBVDtBQUNBLGNBQU07QUFBQ0MsVUFBQUE7QUFBRCxZQUFTUCxJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLE1BQUQsRUFBUyxDQUFDLFdBQUQsRUFBYyxRQUFkLENBQVQsQ0FBcEIsQ0FBZjtBQUNBbUMsc0JBQUtDLGVBQUwsQ0FBcUJGLElBQUksQ0FBQ0csYUFBMUIsRUFBeUMsR0FBekMsRUFBOENKLHdDQUE5QyxFQUF3RlYsTUFBeEYsQ0FBK0ZlLEVBQS9GLENBQWtHQyxJQUFsRztBQUNBLGNBQU1yQixNQUFNLEdBQUcsTUFBTWxCLEdBQUcsQ0FBQyxNQUFELEVBQVMsQ0FBQyxXQUFELENBQVQsQ0FBeEI7QUFDQWtCLFFBQUFBLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjQyxLQUFkLENBQW9CLElBQUlDLE1BQUosQ0FBWSxVQUFTUyxJQUFJLENBQUNHLGFBQWMsYUFBeEMsQ0FBcEI7QUFDRCxPQVJDLENBQUY7QUFTRCxLQTFCTyxDQUFSO0FBNEJBdkMsSUFBQUEsUUFBUSxDQUFDLFNBQUQsRUFBWSxZQUFZO0FBQzlCbUIsTUFBQUEsRUFBRSxDQUFDLHdEQUFELEVBQTJELGtCQUFrQjtBQUM3RSxjQUFNTCxLQUFLLEVBQVg7QUFDQSxjQUFNNEIsR0FBRyxHQUFHYixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLFNBQUQsRUFBWSxDQUFDLGNBQUQsRUFBaUIsUUFBakIsQ0FBWixDQUFwQixDQUFaO0FBQ0F3QyxRQUFBQSxHQUFHLENBQUNDLFlBQUosQ0FBaUJWLE9BQWpCLENBQXlCUixNQUF6QixDQUFnQ00sR0FBaEMsQ0FBb0MsNEJBQXBDO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ0MsWUFBSixDQUFpQkMsV0FBakIsQ0FBNkJuQixNQUE3QixDQUFvQ00sR0FBcEMsQ0FBd0MsS0FBeEM7QUFDQVcsUUFBQUEsR0FBRyxDQUFDQyxZQUFKLENBQWlCRSxXQUFqQixDQUE2QnBCLE1BQTdCLENBQW9DTSxHQUFwQyxDQUF3QyxjQUF4QztBQUNBLGNBQU1lLElBQUksR0FBR2pCLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsTUFBRCxFQUFTLENBQUMsYUFBRCxFQUFnQixRQUFoQixDQUFULENBQXBCLENBQWI7QUFDQSxlQUFPNEMsSUFBSSxDQUFDSCxZQUFMLENBQWtCWCxTQUF6QjtBQUNBYyxRQUFBQSxJQUFJLENBQUNyQixNQUFMLENBQVlNLEdBQVosQ0FBZ0JXLEdBQWhCO0FBQ0QsT0FUQyxDQUFGO0FBVUF2QixNQUFBQSxFQUFFLENBQUMsa0NBQUQsRUFBcUMsa0JBQWtCO0FBQ3ZELGNBQU1MLEtBQUssRUFBWDtBQUNBLGNBQU00QixHQUFHLEdBQUdiLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsU0FBRCxFQUFZLENBQUMscUJBQUQsRUFBd0IsVUFBeEIsRUFBb0MsS0FBcEMsRUFBMkMsUUFBM0MsQ0FBWixDQUFwQixDQUFaO0FBQ0F3QyxRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU0gsT0FBVCxDQUFpQlIsTUFBakIsQ0FBd0JNLEdBQXhCLENBQTRCLHFCQUE1QjtBQUNBVyxRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU1EsV0FBVCxDQUFxQm5CLE1BQXJCLENBQTRCTSxHQUE1QixDQUFnQyxLQUFoQztBQUNBVyxRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU1MsV0FBVCxDQUFxQnBCLE1BQXJCLENBQTRCTSxHQUE1QixDQUFnQyxxQkFBaEM7QUFDQSxjQUFNZSxJQUFJLEdBQUdqQixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLE1BQUQsRUFBUyxDQUFDLGFBQUQsRUFBZ0IsUUFBaEIsQ0FBVCxDQUFwQixDQUFiO0FBQ0EsZUFBTzRDLElBQUksQ0FBQ1YsSUFBTCxDQUFVSixTQUFqQjtBQUNBYyxRQUFBQSxJQUFJLENBQUNyQixNQUFMLENBQVlNLEdBQVosQ0FBZ0JXLEdBQWhCO0FBQ0QsT0FUQyxDQUFGO0FBVUF2QixNQUFBQSxFQUFFLENBQUMsOERBQUQsRUFBaUUsa0JBQWtCO0FBQ25GLGNBQU00QixvQ0FBb0MsR0FBRyxPQUE3QztBQUNBLGNBQU1qQyxLQUFLLEVBQVg7QUFDQSxjQUFNK0IsV0FBVyxHQUFJLHVCQUFzQkUsb0NBQXFDLEVBQWhGO0FBQ0EsY0FBTUwsR0FBRyxHQUFHYixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLFNBQUQsRUFBWSxDQUFDMkMsV0FBRCxFQUFjLFVBQWQsRUFBMEIsS0FBMUIsRUFBaUMsUUFBakMsQ0FBWixDQUFwQixDQUFaO0FBQ0FILFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTSCxPQUFULENBQWlCUixNQUFqQixDQUF3Qk0sR0FBeEIsQ0FBNEIscUJBQTVCO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUSxXQUFULENBQXFCbkIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDLEtBQWhDO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUyxXQUFULENBQXFCcEIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDYyxXQUFoQztBQUNBLGNBQU1DLElBQUksR0FBR2pCLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsTUFBRCxFQUFTLENBQUMsYUFBRCxFQUFnQixRQUFoQixDQUFULENBQXBCLENBQWI7QUFDQSxlQUFPNEMsSUFBSSxDQUFDVixJQUFMLENBQVVKLFNBQWpCO0FBQ0FjLFFBQUFBLElBQUksQ0FBQ3JCLE1BQUwsQ0FBWU0sR0FBWixDQUFnQlcsR0FBaEI7QUFDRCxPQVhDLENBQUY7QUFZQXZCLE1BQUFBLEVBQUUsQ0FBQyxxQ0FBRCxFQUF3QyxrQkFBa0I7QUFDMUQsY0FBTUwsS0FBSyxFQUFYO0FBQ0EsY0FBTTRCLEdBQUcsR0FBR2IsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxTQUFELEVBQVksQ0FBQywyQkFBRCxFQUE4QixVQUE5QixFQUMxQyxRQUQwQyxFQUNoQyxXQURnQyxFQUNuQixvQkFEbUIsRUFDRyxRQURILENBQVosQ0FBcEIsQ0FBWjtBQUVBd0MsUUFBQUEsR0FBRyxDQUFDTixJQUFKLENBQVNILE9BQVQsQ0FBaUJSLE1BQWpCLENBQXdCTSxHQUF4QixDQUE0QixvQkFBNUI7QUFDQVcsUUFBQUEsR0FBRyxDQUFDTixJQUFKLENBQVNRLFdBQVQsQ0FBcUJuQixNQUFyQixDQUE0Qk0sR0FBNUIsQ0FBZ0MsUUFBaEM7QUFDQVcsUUFBQUEsR0FBRyxDQUFDTixJQUFKLENBQVNTLFdBQVQsQ0FBcUJwQixNQUFyQixDQUE0Qk0sR0FBNUIsQ0FBZ0MsMkJBQWhDO0FBQ0EsY0FBTWUsSUFBSSxHQUFHakIsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxNQUFELEVBQVMsQ0FBQyxhQUFELEVBQWdCLFFBQWhCLENBQVQsQ0FBcEIsQ0FBYjtBQUNBLGVBQU80QyxJQUFJLENBQUNWLElBQUwsQ0FBVUosU0FBakI7QUFDQWMsUUFBQUEsSUFBSSxDQUFDckIsTUFBTCxDQUFZTSxHQUFaLENBQWdCVyxHQUFoQjtBQUNELE9BVkMsQ0FBRjtBQVdBdkIsTUFBQUEsRUFBRSxDQUFDLCtDQUFELEVBQWtELGtCQUFrQjtBQUNwRSxjQUFNTCxLQUFLLEVBQVg7QUFDQSxjQUFNNEIsR0FBRyxHQUFHYixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLFNBQUQsRUFBWSxDQUFDYSxtQkFBRCxFQUMxQyxVQUQwQyxFQUM5QixLQUQ4QixFQUN2QixXQUR1QixFQUNWLHFCQURVLEVBQ2EsUUFEYixDQUFaLENBQXBCLENBQVo7QUFFQTJCLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTSCxPQUFULENBQWlCUixNQUFqQixDQUF3Qk0sR0FBeEIsQ0FBNEIscUJBQTVCO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUSxXQUFULENBQXFCbkIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDLEtBQWhDO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUyxXQUFULENBQXFCcEIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDaEIsbUJBQWhDO0FBQ0EsY0FBTStCLElBQUksR0FBR2pCLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsTUFBRCxFQUFTLENBQUMsYUFBRCxFQUFnQixRQUFoQixDQUFULENBQXBCLENBQWI7QUFDQSxlQUFPNEMsSUFBSSxDQUFDVixJQUFMLENBQVVKLFNBQWpCO0FBQ0FjLFFBQUFBLElBQUksQ0FBQ3JCLE1BQUwsQ0FBWU0sR0FBWixDQUFnQlcsR0FBaEI7QUFDRCxPQVZDLENBQUY7QUFXQXZCLE1BQUFBLEVBQUUsQ0FBQyxnREFBRCxFQUFtRCxrQkFBa0I7QUFDckUsY0FBTUwsS0FBSyxFQUFYO0FBQ0EsY0FBTTRCLEdBQUcsR0FBR2IsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxTQUFELEVBQVksQ0FBQyxzREFBRCxFQUMxQyxVQUQwQyxFQUM5QixLQUQ4QixFQUN2QixXQUR1QixFQUNWLG9CQURVLEVBQ1ksUUFEWixDQUFaLENBQXBCLENBQVo7QUFFQXdDLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTSCxPQUFULENBQWlCUixNQUFqQixDQUF3Qk0sR0FBeEIsQ0FBNEIsb0JBQTVCO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUSxXQUFULENBQXFCbkIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDLEtBQWhDO0FBQ0FXLFFBQUFBLEdBQUcsQ0FBQ04sSUFBSixDQUFTUyxXQUFULENBQXFCcEIsTUFBckIsQ0FBNEJNLEdBQTVCLENBQWdDLGtEQUFoQztBQUNBLGNBQU1lLElBQUksR0FBR2pCLElBQUksQ0FBQ0MsS0FBTCxDQUFXLE1BQU01QixHQUFHLENBQUMsTUFBRCxFQUFTLENBQUMsYUFBRCxFQUFnQixRQUFoQixDQUFULENBQXBCLENBQWI7QUFDQSxlQUFPNEMsSUFBSSxDQUFDVixJQUFMLENBQVVKLFNBQWpCO0FBQ0FjLFFBQUFBLElBQUksQ0FBQ3JCLE1BQUwsQ0FBWU0sR0FBWixDQUFnQlcsR0FBaEI7QUFDRCxPQVZDLENBQUY7QUFXQXZCLE1BQUFBLEVBQUUsQ0FBQyxpREFBRCxFQUFvRCxrQkFBa0I7QUFDdEUsY0FBTUwsS0FBSyxFQUFYO0FBR0EsY0FBTTRCLEdBQUcsR0FBR2IsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxTQUFELEVBQVksQ0FBQ2EsbUJBQUQsRUFBc0IsVUFBdEIsRUFBa0MsT0FBbEMsRUFBMkMsUUFBM0MsQ0FBWixDQUFwQixDQUFaO0FBQ0EyQixRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU0gsT0FBVCxDQUFpQlIsTUFBakIsQ0FBd0JNLEdBQXhCLENBQTRCLHFCQUE1QjtBQUNBVyxRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU1EsV0FBVCxDQUFxQm5CLE1BQXJCLENBQTRCTSxHQUE1QixDQUFnQyxPQUFoQztBQUNBVyxRQUFBQSxHQUFHLENBQUNOLElBQUosQ0FBU1MsV0FBVCxDQUFxQnBCLE1BQXJCLENBQTRCTSxHQUE1QixDQUFnQ2hCLG1CQUFoQztBQUNBLGNBQU0rQixJQUFJLEdBQUdqQixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLE1BQUQsRUFBUyxDQUFDLGFBQUQsRUFBZ0IsUUFBaEIsQ0FBVCxDQUFwQixDQUFiO0FBQ0EsZUFBTzRDLElBQUksQ0FBQ1YsSUFBTCxDQUFVSixTQUFqQjtBQUNBYyxRQUFBQSxJQUFJLENBQUNyQixNQUFMLENBQVlNLEdBQVosQ0FBZ0JXLEdBQWhCO0FBQ0QsT0FYQyxDQUFGO0FBWUQsS0E5RU8sQ0FBUjtBQWdGQTFDLElBQUFBLFFBQVEsQ0FBQyxXQUFELEVBQWMsWUFBWTtBQUNoQ21CLE1BQUFBLEVBQUUsQ0FBQyxvREFBRCxFQUF1RCxrQkFBa0I7QUFDekUsY0FBTUwsS0FBSyxFQUFYO0FBQ0EsY0FBTTRCLEdBQUcsR0FBR2IsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxTQUFELEVBQVksQ0FBQyxxQkFBRCxFQUF3QixVQUF4QixFQUFvQyxLQUFwQyxFQUEyQyxRQUEzQyxDQUFaLENBQXBCLENBQVo7O0FBQ0EsY0FBTThDLFdBQVcsR0FBR2hDLGNBQUtpQyxPQUFMLENBQWFoRCxVQUFiLEVBQXlCeUMsR0FBRyxDQUFDTixJQUFKLENBQVNZLFdBQWxDLENBQXBCOztBQUNBLGNBQU1wQyxZQUFHc0MsTUFBSCxDQUFVRixXQUFWLEVBQXVCdkIsTUFBdkIsQ0FBOEIwQixVQUE5QixDQUF5Q1gsRUFBekMsQ0FBNENDLElBQWxEO0FBQ0EsWUFBSUssSUFBSSxHQUFHakIsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxNQUFELEVBQVMsQ0FBQyxhQUFELEVBQWdCLFFBQWhCLENBQVQsQ0FBcEIsQ0FBWDtBQUNBNEMsUUFBQUEsSUFBSSxDQUFDVixJQUFMLENBQVVKLFNBQVYsQ0FBb0JQLE1BQXBCLENBQTJCZSxFQUEzQixDQUE4QkMsSUFBOUI7QUFDQSxjQUFNVyxTQUFTLEdBQUd2QixJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLFdBQUQsRUFBYyxDQUFDLE1BQUQsRUFBUyxRQUFULENBQWQsQ0FBcEIsQ0FBbEI7QUFDQWtELFFBQUFBLFNBQVMsQ0FBQzNCLE1BQVYsQ0FBaUI0QixHQUFqQixDQUFxQkMsSUFBckIsQ0FBMEJDLEdBQTFCLENBQThCLE1BQTlCO0FBQ0EsY0FBTTNDLFlBQUdzQyxNQUFILENBQVVGLFdBQVYsRUFBdUJ2QixNQUF2QixDQUE4QjBCLFVBQTlCLENBQXlDWCxFQUF6QyxDQUE0Q2dCLEtBQWxEO0FBQ0QsT0FWQyxDQUFGO0FBV0QsS0FaTyxDQUFSO0FBY0F4RCxJQUFBQSxRQUFRLENBQUMsS0FBRCxFQUFRLFlBQVk7QUFDMUJHLE1BQUFBLE1BQU0sQ0FBQyxrQkFBa0I7QUFDdkIsY0FBTVcsS0FBSyxFQUFYO0FBQ0EsY0FBTVosR0FBRyxDQUFDLFNBQUQsRUFBWSxDQUFDYSxtQkFBRCxFQUFzQixVQUF0QixFQUFrQyxPQUFsQyxFQUEyQyxRQUEzQyxDQUFaLENBQVQ7QUFDRCxPQUhLLENBQU47QUFJQUksTUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLGtCQUFrQjtBQUNyRixjQUFNc0MsVUFBVSxHQUFHLE1BQW5CO0FBQ0EsY0FBTUMsVUFBVSxHQUFHLGNBQW5CO0FBQ0EsY0FBTXhCLEdBQUcsR0FBR0wsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxLQUFELEVBQVEsQ0FBQ3VELFVBQUQsRUFBYUMsVUFBYixFQUF5QixRQUF6QixDQUFSLENBQXBCLENBQVo7QUFDQXhCLFFBQUFBLEdBQUcsQ0FBQ1QsTUFBSixDQUFXNEIsR0FBWCxDQUFlTSxPQUFmLENBQXVCSixHQUF2QixDQUEyQixPQUEzQjtBQUNELE9BTEMsQ0FBRjtBQU1BcEMsTUFBQUEsRUFBRSxDQUFDLCtFQUFELEVBQWtGLGtCQUFrQjtBQUNwRyxjQUFNc0MsVUFBVSxHQUFHLE1BQW5CO0FBQ0EsY0FBTXZCLEdBQUcsR0FBR0wsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxLQUFELEVBQVEsQ0FBQ3VELFVBQUQsRUFBYSxZQUFiLEVBQTJCLFFBQTNCLENBQVIsQ0FBcEIsQ0FBWjtBQUNBdkIsUUFBQUEsR0FBRyxDQUFDVCxNQUFKLENBQVdrQyxPQUFYLENBQW1CSixHQUFuQixDQUF1QixPQUF2QjtBQUNELE9BSkMsQ0FBRjtBQUtBcEMsTUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLGtCQUFrQjtBQUNyRixjQUFNc0MsVUFBVSxHQUFHLE1BQW5CO0FBQ0EsY0FBTUcsSUFBSSxDQUFDQyxNQUFMLENBQVkzRCxHQUFHLENBQUMsS0FBRCxFQUFRLENBQUN1RCxVQUFELEVBQWEsS0FBYixFQUFvQixRQUFwQixDQUFSLENBQWYsRUFBdURLLEVBQXZELENBQTBEWCxVQUExRCxDQUFxRVgsRUFBckUsQ0FBd0V1QixZQUF4RSxDQUFxRkMsS0FBckYsQ0FBTjtBQUNELE9BSEMsQ0FBRjtBQUlBN0MsTUFBQUEsRUFBRSxDQUFDLG1FQUFELEVBQXNFLGtCQUFrQjtBQUN4RixjQUFNc0MsVUFBVSxHQUFHLEtBQW5CO0FBQ0EsY0FBTUcsSUFBSSxDQUFDQyxNQUFMLENBQVkzRCxHQUFHLENBQUMsS0FBRCxFQUFRLENBQUN1RCxVQUFELEVBQWEsS0FBYixFQUFvQixRQUFwQixDQUFSLENBQWYsRUFBdURLLEVBQXZELENBQTBEWCxVQUExRCxDQUFxRVgsRUFBckUsQ0FBd0V1QixZQUF4RSxDQUFxRkMsS0FBckYsQ0FBTjtBQUNELE9BSEMsQ0FBRjtBQUlELEtBeEJPLENBQVI7QUF5QkQsR0FySk8sQ0FBUjtBQXVKQWhFLEVBQUFBLFFBQVEsQ0FBQyxZQUFELEVBQWUsWUFBWTtBQUNqQyxVQUFNaUUsYUFBYSxHQUFHakQsY0FBS2tELE9BQUwsQ0FBYUMsT0FBTyxDQUFDbEIsT0FBUixDQUFnQixrQ0FBaEIsQ0FBYixDQUF0Qjs7QUFDQSxVQUFNdkMsR0FBRyxHQUFHLFFBQVo7QUFDQVYsSUFBQUEsUUFBUSxDQUFDLEtBQUQsRUFBUSxZQUFZO0FBQzFCRyxNQUFBQSxNQUFNLENBQUMsa0JBQWtCO0FBQ3ZCLGNBQU1XLEtBQUssRUFBWDtBQUNBLGNBQU1aLEdBQUcsQ0FBQyxTQUFELEVBQVksQ0FBQytELGFBQUQsRUFBZ0IsVUFBaEIsRUFBNEIsT0FBNUIsRUFBcUMsUUFBckMsQ0FBWixFQUE0RCxLQUE1RCxFQUFtRXZELEdBQW5FLENBQVQ7QUFDRCxPQUhLLENBQU47QUFJQVMsTUFBQUEsRUFBRSxDQUFDLGdFQUFELEVBQW1FLGtCQUFrQjtBQUNyRixjQUFNaUQsVUFBVSxHQUFHLE1BQW5CO0FBQ0EsY0FBTVYsVUFBVSxHQUFHLGNBQW5CO0FBQ0EsY0FBTXhCLEdBQUcsR0FBR0wsSUFBSSxDQUFDQyxLQUFMLENBQVcsTUFBTTVCLEdBQUcsQ0FBQyxLQUFELEVBQVEsQ0FBQ2tFLFVBQUQsRUFBYVYsVUFBYixFQUF5QixRQUF6QixDQUFSLEVBQTRDLEtBQTVDLEVBQW1EaEQsR0FBbkQsQ0FBcEIsQ0FBWjtBQUNBd0IsUUFBQUEsR0FBRyxDQUFDVCxNQUFKLENBQVc0QixHQUFYLENBQWVNLE9BQWYsQ0FBdUJKLEdBQXZCLENBQTJCLE9BQTNCO0FBQ0QsT0FMQyxDQUFGO0FBTUFwQyxNQUFBQSxFQUFFLENBQUMsK0VBQUQsRUFBa0Ysa0JBQWtCO0FBQ3BHLGNBQU1pRCxVQUFVLEdBQUcsTUFBbkI7QUFDQSxjQUFNbEMsR0FBRyxHQUFHTCxJQUFJLENBQUNDLEtBQUwsQ0FBVyxNQUFNNUIsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDa0UsVUFBRCxFQUFhLFlBQWIsRUFBMkIsUUFBM0IsQ0FBUixFQUE4QyxLQUE5QyxFQUFxRDFELEdBQXJELENBQXBCLENBQVo7QUFDQXdCLFFBQUFBLEdBQUcsQ0FBQ1QsTUFBSixDQUFXa0MsT0FBWCxDQUFtQkosR0FBbkIsQ0FBdUIsT0FBdkI7QUFDRCxPQUpDLENBQUY7QUFLQXBDLE1BQUFBLEVBQUUsQ0FBQyxnRUFBRCxFQUFtRSxrQkFBa0I7QUFDckYsY0FBTWlELFVBQVUsR0FBRyxNQUFuQjtBQUNBLGNBQU1SLElBQUksQ0FBQ0MsTUFBTCxDQUFZM0QsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDa0UsVUFBRCxFQUFhLEtBQWIsRUFBb0IsUUFBcEIsQ0FBUixFQUF1QyxLQUF2QyxFQUE4QzFELEdBQTlDLENBQWYsRUFBbUVvRCxFQUFuRSxDQUFzRVgsVUFBdEUsQ0FBaUZYLEVBQWpGLENBQW9GdUIsWUFBcEYsQ0FBaUdDLEtBQWpHLENBQU47QUFDRCxPQUhDLENBQUY7QUFJQTdDLE1BQUFBLEVBQUUsQ0FBQyxtRUFBRCxFQUFzRSxrQkFBa0I7QUFDeEYsY0FBTXlDLElBQUksQ0FBQ0MsTUFBTCxDQUFZM0QsR0FBRyxDQUFDLEtBQUQsRUFBUSxDQUFDLEtBQUQsRUFBUSxLQUFSLEVBQWUsUUFBZixDQUFSLEVBQWtDLEtBQWxDLEVBQXlDUSxHQUF6QyxDQUFmLEVBQThEb0QsRUFBOUQsQ0FBaUVYLFVBQWpFLENBQTRFWCxFQUE1RSxDQUErRXVCLFlBQS9FLENBQTRGQyxLQUE1RixDQUFOO0FBQ0QsT0FGQyxDQUFGO0FBR0QsS0F2Qk8sQ0FBUjtBQXdCRCxHQTNCTyxDQUFSO0FBNEJELENBN01PLENBQVIiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdGVtcERpciwgZnMsIG1rZGlycCwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBLTk9XTl9EUklWRVJTIH0gZnJvbSAnLi4vLi4vbGliL2RyaXZlcnMnO1xuaW1wb3J0IHsgUFJPSkVDVF9ST09UIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBydW5BcHBpdW0gfSBmcm9tICcuL2NsaS1oZWxwZXJzJztcblxuZGVzY3JpYmUoJ0NMSScsIGZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIEB0eXBlIHtzdHJpbmd9XG4gICAqL1xuICBsZXQgYXBwaXVtSG9tZTtcblxuICAvKipcbiAgICogQHR5cGUgeyhleHRDb21tYW5kOiBzdHJpbmcsIGFyZ3M/OiBzdHJpbmdbXSwgcmF3PzogYm9vbGVhbiwgZXh0PzogRXh0ZW5zaW9uVHlwZSkgPT4gUHJvbWlzZTxzdHJpbmd8aW1wb3J0KCcuL2NsaS1oZWxwZXJzJykuVGVlblByb2Nlc3NFeGVjUmVzdWx0Pn1cbiAgICovXG4gIGxldCBydW47XG5cbiAgYmVmb3JlKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhcHBpdW1Ib21lID0gYXdhaXQgdGVtcERpci5vcGVuRGlyKCk7XG4gICAgY29uc3QgcnVubmVyID0gcnVuQXBwaXVtKGFwcGl1bUhvbWUpO1xuICAgIHJ1biA9IGFzeW5jIChleHRDb21tYW5kLCBhcmdzID0gW10sIHJhdyA9IGZhbHNlLCBleHQgPSAnZHJpdmVyJykgPT4gYXdhaXQgcnVubmVyKFtleHQsIGV4dENvbW1hbmQsIC4uLmFyZ3NdLCB7cmF3fSk7XG4gIH0pO1xuXG4gIGFmdGVyKGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwaXVtSG9tZSk7XG4gIH0pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsZWFyICgpIHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoYXBwaXVtSG9tZSk7XG4gICAgYXdhaXQgbWtkaXJwKGFwcGl1bUhvbWUpO1xuICB9XG5cbiAgZGVzY3JpYmUoJ0RyaXZlciBDTEknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9jYWxGYWtlRHJpdmVyUGF0aCA9IHBhdGguam9pbihQUk9KRUNUX1JPT1QsICdwYWNrYWdlcycsICdmYWtlLWRyaXZlcicpO1xuICAgIGRlc2NyaWJlKCdsaXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgaXQoJ3Nob3VsZCBsaXN0IGF2YWlsYWJsZSBkcml2ZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBydW4oJ2xpc3QnKTtcbiAgICAgICAgZm9yIChjb25zdCBkIG9mIE9iamVjdC5rZXlzKEtOT1dOX0RSSVZFUlMpKSB7XG4gICAgICAgICAgc3Rkb3V0LnNob3VsZC5tYXRjaChuZXcgUmVnRXhwKGAke2R9Litbbm90IGluc3RhbGxlZF1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBsaXN0IGF2YWlsYWJsZSBkcml2ZXJzIGluIGpzb24gZm9ybWF0JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJEYXRhID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0tanNvbiddKSk7XG4gICAgICAgIGZvciAoY29uc3QgZCBvZiBPYmplY3Qua2V5cyhLTk9XTl9EUklWRVJTKSkge1xuICAgICAgICAgIGRyaXZlckRhdGFbZF0uc2hvdWxkLmVxbCh7aW5zdGFsbGVkOiBmYWxzZSwgcGtnTmFtZTogS05PV05fRFJJVkVSU1tkXX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgYWxsb3cgZmlsdGVyaW5nIGJ5IGluc3RhbGxlZCBkcml2ZXJzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBvdXQgPSBhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKTtcbiAgICAgICAgSlNPTi5wYXJzZShvdXQpLnNob3VsZC5lcWwoe30pO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHNob3cgdXBkYXRlcyBmb3IgaW5zdGFsbGVkIGRyaXZlcnMgd2l0aCAtLXVwZGF0ZXMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBlbnVsdGltYXRlRmFrZURyaXZlclZlcnNpb25Bc09mUmlnaHROb3cgPSAnMy4wLjQnO1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBhd2FpdCBydW4oJ2luc3RhbGwnLCBbYEBhcHBpdW0vZmFrZS1kcml2ZXJAJHtwZW51bHRpbWF0ZUZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93fWAsICctLXNvdXJjZScsICducG0nLCAnLS1qc29uJ10pO1xuICAgICAgICBjb25zdCB7ZmFrZX0gPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS11cGRhdGVzJywgJy0tanNvbiddKSk7XG4gICAgICAgIHV0aWwuY29tcGFyZVZlcnNpb25zKGZha2UudXBkYXRlVmVyc2lvbiwgJz4nLCBwZW51bHRpbWF0ZUZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93KS5zaG91bGQuYmUudHJ1ZTtcbiAgICAgICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgcnVuKCdsaXN0JywgWyctLXVwZGF0ZXMnXSk7XG4gICAgICAgIHN0ZG91dC5zaG91bGQubWF0Y2gobmV3IFJlZ0V4cChgZmFrZS4rWyR7ZmFrZS51cGRhdGVWZXJzaW9ufSBhdmFpbGFibGVdYCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgaW5zdGFsbCBhIGRyaXZlciBmcm9tIHRoZSBsaXN0IG9mIGtub3duIGRyaXZlcnMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHJldCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdpbnN0YWxsJywgWyd1aWF1dG9tYXRvcjInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LnVpYXV0b21hdG9yMi5wa2dOYW1lLnNob3VsZC5lcWwoJ2FwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyJyk7XG4gICAgICAgIHJldC51aWF1dG9tYXRvcjIuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnbnBtJyk7XG4gICAgICAgIHJldC51aWF1dG9tYXRvcjIuaW5zdGFsbFNwZWMuc2hvdWxkLmVxbCgndWlhdXRvbWF0b3IyJyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS1pbnN0YWxsZWQnLCAnLS1qc29uJ10pKTtcbiAgICAgICAgZGVsZXRlIGxpc3QudWlhdXRvbWF0b3IyLmluc3RhbGxlZDtcbiAgICAgICAgbGlzdC5zaG91bGQuZXFsKHJldCk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgaW5zdGFsbCBhIGRyaXZlciBmcm9tIG5wbScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1zb3VyY2UnLCAnbnBtJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsVHlwZS5zaG91bGQuZXFsKCducG0nKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFNwZWMuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gbnBtIHdpdGggYSBzcGVjaWZpYyB2ZXJzaW9uL3RhZycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudEZha2VEcml2ZXJWZXJzaW9uQXNPZlJpZ2h0Tm93ID0gJzMuMC41JztcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgaW5zdGFsbFNwZWMgPSBgQGFwcGl1bS9mYWtlLWRyaXZlckAke2N1cnJlbnRGYWtlRHJpdmVyVmVyc2lvbkFzT2ZSaWdodE5vd31gO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFtpbnN0YWxsU3BlYywgJy0tc291cmNlJywgJ25wbScsICctLWpzb24nXSkpO1xuICAgICAgICByZXQuZmFrZS5wa2dOYW1lLnNob3VsZC5lcWwoJ0BhcHBpdW0vZmFrZS1kcml2ZXInKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnbnBtJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxTcGVjLnNob3VsZC5lcWwoaW5zdGFsbFNwZWMpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gZ2l0aHViJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFsnYXBwaXVtL2FwcGl1bS1mYWtlLWRyaXZlcicsICctLXNvdXJjZScsXG4gICAgICAgICAgJ2dpdGh1YicsICctLXBhY2thZ2UnLCAnYXBwaXVtLWZha2UtZHJpdmVyJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnYXBwaXVtLWZha2UtZHJpdmVyJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxUeXBlLnNob3VsZC5lcWwoJ2dpdGh1YicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKCdhcHBpdW0vYXBwaXVtLWZha2UtZHJpdmVyJyk7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignbGlzdCcsIFsnLS1pbnN0YWxsZWQnLCAnLS1qc29uJ10pKTtcbiAgICAgICAgZGVsZXRlIGxpc3QuZmFrZS5pbnN0YWxsZWQ7XG4gICAgICAgIGxpc3Quc2hvdWxkLmVxbChyZXQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGluc3RhbGwgYSBkcml2ZXIgZnJvbSBhIGxvY2FsIGdpdCByZXBvJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBjb25zdCByZXQgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bignaW5zdGFsbCcsIFtsb2NhbEZha2VEcml2ZXJQYXRoLFxuICAgICAgICAgICctLXNvdXJjZScsICdnaXQnLCAnLS1wYWNrYWdlJywgJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LmZha2UucGtnTmFtZS5zaG91bGQuZXFsKCdAYXBwaXVtL2Zha2UtZHJpdmVyJyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxUeXBlLnNob3VsZC5lcWwoJ2dpdCcpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKGxvY2FsRmFrZURyaXZlclBhdGgpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gYSByZW1vdGUgZ2l0IHJlcG8nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGNvbnN0IHJldCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdpbnN0YWxsJywgWydnaXQraHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0tZmFrZS1kcml2ZXIuZ2l0JyxcbiAgICAgICAgICAnLS1zb3VyY2UnLCAnZ2l0JywgJy0tcGFja2FnZScsICdhcHBpdW0tZmFrZS1kcml2ZXInLCAnLS1qc29uJ10pKTtcbiAgICAgICAgcmV0LmZha2UucGtnTmFtZS5zaG91bGQuZXFsKCdhcHBpdW0tZmFrZS1kcml2ZXInKTtcbiAgICAgICAgcmV0LmZha2UuaW5zdGFsbFR5cGUuc2hvdWxkLmVxbCgnZ2l0Jyk7XG4gICAgICAgIHJldC5mYWtlLmluc3RhbGxTcGVjLnNob3VsZC5lcWwoJ2dpdCtodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS1mYWtlLWRyaXZlcicpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBpbnN0YWxsIGEgZHJpdmVyIGZyb20gYSBsb2NhbCBucG0gbW9kdWxlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICAvLyB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdlIGtub3cgd2UgaGF2ZSBmYWtlIGRyaXZlciBpbnN0YWxsZWQgYXMgYSBkZXBlbmRlbmN5IGluXG4gICAgICAgIC8vIHRoaXMgbW9kdWxlLCBzbyB3ZSBrbm93IGl0cyBsb2NhbCBwYXRoIG9uIGRpc2tcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbbG9jYWxGYWtlRHJpdmVyUGF0aCwgJy0tc291cmNlJywgJ2xvY2FsJywgJy0tanNvbiddKSk7XG4gICAgICAgIHJldC5mYWtlLnBrZ05hbWUuc2hvdWxkLmVxbCgnQGFwcGl1bS9mYWtlLWRyaXZlcicpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsVHlwZS5zaG91bGQuZXFsKCdsb2NhbCcpO1xuICAgICAgICByZXQuZmFrZS5pbnN0YWxsU3BlYy5zaG91bGQuZXFsKGxvY2FsRmFrZURyaXZlclBhdGgpO1xuICAgICAgICBjb25zdCBsaXN0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2xpc3QnLCBbJy0taW5zdGFsbGVkJywgJy0tanNvbiddKSk7XG4gICAgICAgIGRlbGV0ZSBsaXN0LmZha2UuaW5zdGFsbGVkO1xuICAgICAgICBsaXN0LnNob3VsZC5lcWwocmV0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3VuaW5zdGFsbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGl0KCdzaG91bGQgdW5pbnN0YWxsIGEgZHJpdmVyIGJhc2VkIG9uIGl0cyBkcml2ZXIgbmFtZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2xlYXIoKTtcbiAgICAgICAgY29uc3QgcmV0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ2luc3RhbGwnLCBbJ0BhcHBpdW0vZmFrZS1kcml2ZXInLCAnLS1zb3VyY2UnLCAnbnBtJywgJy0tanNvbiddKSk7XG4gICAgICAgIGNvbnN0IGluc3RhbGxQYXRoID0gcGF0aC5yZXNvbHZlKGFwcGl1bUhvbWUsIHJldC5mYWtlLmluc3RhbGxQYXRoKTtcbiAgICAgICAgYXdhaXQgZnMuZXhpc3RzKGluc3RhbGxQYXRoKS5zaG91bGQuZXZlbnR1YWxseS5iZS50cnVlO1xuICAgICAgICBsZXQgbGlzdCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdsaXN0JywgWyctLWluc3RhbGxlZCcsICctLWpzb24nXSkpO1xuICAgICAgICBsaXN0LmZha2UuaW5zdGFsbGVkLnNob3VsZC5iZS50cnVlO1xuICAgICAgICBjb25zdCB1bmluc3RhbGwgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bigndW5pbnN0YWxsJywgWydmYWtlJywgJy0tanNvbiddKSk7XG4gICAgICAgIHVuaW5zdGFsbC5zaG91bGQubm90LmhhdmUua2V5KCdmYWtlJyk7XG4gICAgICAgIGF3YWl0IGZzLmV4aXN0cyhpbnN0YWxsUGF0aCkuc2hvdWxkLmV2ZW50dWFsbHkuYmUuZmFsc2U7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdydW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBhd2FpdCBjbGVhcigpO1xuICAgICAgICBhd2FpdCBydW4oJ2luc3RhbGwnLCBbbG9jYWxGYWtlRHJpdmVyUGF0aCwgJy0tc291cmNlJywgJ2xvY2FsJywgJy0tanNvbiddKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBydW4gYSB2YWxpZCBkcml2ZXIsIHZhbGlkIHNjcmlwdCwgYW5kIHJlc3VsdCBpbiBzdWNjZXNzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJOYW1lID0gJ2Zha2UnO1xuICAgICAgICBjb25zdCBzY3JpcHROYW1lID0gJ2Zha2Utc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IG91dCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgc2NyaXB0TmFtZSwgJy0tanNvbiddKSk7XG4gICAgICAgIG91dC5zaG91bGQubm90LmluY2x1ZGUua2V5KCdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJ1biBhIHZhbGlkIGRyaXZlciwgdmFsaWQgZXJyb3IgcHJvbmUgc2NyaXB0LCBhbmQgcmV0dXJuIGVycm9yIGluIGpzb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRyaXZlck5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGNvbnN0IG91dCA9IEpTT04ucGFyc2UoYXdhaXQgcnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgJ2Zha2UtZXJyb3InLCAnLS1qc29uJ10pKTtcbiAgICAgICAgb3V0LnNob3VsZC5pbmNsdWRlLmtleSgnZXJyb3InKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB0YWtlIGEgdmFsaWQgZHJpdmVyLCBpbnZhbGlkIHNjcmlwdCwgYW5kIHRocm93IGFuIGVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkcml2ZXJOYW1lID0gJ2Zha2UnO1xuICAgICAgICBhd2FpdCBjaGFpLmV4cGVjdChydW4oJ3J1bicsIFtkcml2ZXJOYW1lLCAnZm9vJywgJy0tanNvbiddKSkudG8uZXZlbnR1YWxseS5iZS5yZWplY3RlZFdpdGgoRXJyb3IpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHRha2UgYW4gaW52YWxpZCBkcml2ZXIsIGludmFsaWQgc2NyaXB0LCBhbmQgdGhyb3cgYW4gZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IGRyaXZlck5hbWUgPSAnZm9vJztcbiAgICAgICAgYXdhaXQgY2hhaS5leHBlY3QocnVuKCdydW4nLCBbZHJpdmVyTmFtZSwgJ2JhcicsICctLWpzb24nXSkpLnRvLmV2ZW50dWFsbHkuYmUucmVqZWN0ZWRXaXRoKEVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUGx1Z2luIENMSScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBmYWtlUGx1Z2luRGlyID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZSgnQGFwcGl1bS9mYWtlLXBsdWdpbi9wYWNrYWdlLmpzb24nKSk7XG4gICAgY29uc3QgZXh0ID0gJ3BsdWdpbic7XG4gICAgZGVzY3JpYmUoJ3J1bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJlZm9yZShhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGF3YWl0IGNsZWFyKCk7XG4gICAgICAgIGF3YWl0IHJ1bignaW5zdGFsbCcsIFtmYWtlUGx1Z2luRGlyLCAnLS1zb3VyY2UnLCAnbG9jYWwnLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHJ1biBhIHZhbGlkIHBsdWdpbiwgdmFsaWQgc2NyaXB0LCBhbmQgcmVzdWx0IGluIHN1Y2Nlc3MnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGNvbnN0IHNjcmlwdE5hbWUgPSAnZmFrZS1zdWNjZXNzJztcbiAgICAgICAgY29uc3Qgb3V0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ3J1bicsIFtwbHVnaW5OYW1lLCBzY3JpcHROYW1lLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKTtcbiAgICAgICAgb3V0LnNob3VsZC5ub3QuaW5jbHVkZS5rZXkoJ2Vycm9yJyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgcnVuIGEgdmFsaWQgcGx1Z2luLCB2YWxpZCBlcnJvciBwcm9uZSBzY3JpcHQsIGFuZCByZXR1cm4gZXJyb3IgaW4ganNvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgcGx1Z2luTmFtZSA9ICdmYWtlJztcbiAgICAgICAgY29uc3Qgb3V0ID0gSlNPTi5wYXJzZShhd2FpdCBydW4oJ3J1bicsIFtwbHVnaW5OYW1lLCAnZmFrZS1lcnJvcicsICctLWpzb24nXSwgZmFsc2UsIGV4dCkpO1xuICAgICAgICBvdXQuc2hvdWxkLmluY2x1ZGUua2V5KCdlcnJvcicpO1xuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHRha2UgYSB2YWxpZCBwbHVnaW4sIGludmFsaWQgc2NyaXB0LCBhbmQgdGhyb3cgYW4gZXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk5hbWUgPSAnZmFrZSc7XG4gICAgICAgIGF3YWl0IGNoYWkuZXhwZWN0KHJ1bigncnVuJywgW3BsdWdpbk5hbWUsICdmb28nLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKS50by5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChFcnJvcik7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgdGFrZSBhbiBpbnZhbGlkIHBsdWdpbiwgaW52YWxpZCBzY3JpcHQsIGFuZCB0aHJvdyBhbiBlcnJvcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYXdhaXQgY2hhaS5leHBlY3QocnVuKCdydW4nLCBbJ2ZvbycsICdiYXInLCAnLS1qc29uJ10sIGZhbHNlLCBleHQpKS50by5ldmVudHVhbGx5LmJlLnJlamVjdGVkV2l0aChFcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoJy4uLy4uL2xpYi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gRXh0ZW5zaW9uVHlwZVxuICovXG4iXSwiZmlsZSI6InRlc3QvY2xpL2NsaS1lMmUtc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.runAppiumRaw = exports.runAppiumJson = exports.runAppium = exports.installLocalExtension = exports.EXECUTABLE = void 0;
9
+
10
+ require("source-map-support/register");
11
+
12
+ var _lodash = _interopRequireDefault(require("lodash"));
13
+
14
+ var _teen_process = require("teen_process");
15
+
16
+ var _helpers = require("../helpers");
17
+
18
+ var _path = _interopRequireDefault(require("path"));
19
+
20
+ const EXECUTABLE = _path.default.join(_helpers.PROJECT_ROOT, 'packages', 'appium', 'build', 'lib', 'main.js');
21
+
22
+ exports.EXECUTABLE = EXECUTABLE;
23
+
24
+ async function run(appiumHome, args) {
25
+ const env = {
26
+ APPIUM_HOME: appiumHome,
27
+ PATH: process.env.PATH
28
+ };
29
+
30
+ try {
31
+ return await (0, _teen_process.exec)(process.execPath, [EXECUTABLE, ...args], {
32
+ cwd: _helpers.PROJECT_ROOT,
33
+ env
34
+ });
35
+ } catch (err) {
36
+ const {
37
+ stdout,
38
+ stderr
39
+ } = err;
40
+ const runErr = Object.assign(err, {
41
+ originalMessage: err.message,
42
+ message: `${stdout.trim()}\n\n${stderr.trim()}`,
43
+ command: `${process.execPath} ${EXECUTABLE} ${args.join(' ')}`,
44
+ env,
45
+ cwd: _helpers.PROJECT_ROOT
46
+ });
47
+ throw runErr;
48
+ }
49
+ }
50
+
51
+ const runAppium = _lodash.default.curry(async (appiumHome, args) => {
52
+ const {
53
+ stdout
54
+ } = await run(appiumHome, args);
55
+ return stdout;
56
+ });
57
+
58
+ exports.runAppium = runAppium;
59
+
60
+ const runAppiumRaw = _lodash.default.curry(async (appiumHome, args) => await run(appiumHome, args));
61
+
62
+ exports.runAppiumRaw = runAppiumRaw;
63
+
64
+ const runAppiumJson = _lodash.default.curry(async (appiumHome, args) => {
65
+ if (!args.includes('--json')) {
66
+ args.push('--json');
67
+ }
68
+
69
+ const result = await runAppium(appiumHome, args);
70
+
71
+ try {
72
+ return JSON.parse(result);
73
+ } catch (err) {
74
+ err.message = `Error parsing JSON. Contents of STDOUT: ${result}`;
75
+ throw err;
76
+ }
77
+ });
78
+
79
+ exports.runAppiumJson = runAppiumJson;
80
+
81
+ const installLocalExtension = _lodash.default.curry(async (appiumHome, type, pathToExtension) => await runAppiumJson(appiumHome, [type, 'install', '--source', 'local', pathToExtension]));
82
+
83
+ exports.installLocalExtension = installLocalExtension;require('source-map-support').install();
84
+
85
+
86
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1oZWxwZXJzLmpzIl0sIm5hbWVzIjpbIkVYRUNVVEFCTEUiLCJwYXRoIiwiam9pbiIsIlBST0pFQ1RfUk9PVCIsInJ1biIsImFwcGl1bUhvbWUiLCJhcmdzIiwiZW52IiwiQVBQSVVNX0hPTUUiLCJQQVRIIiwicHJvY2VzcyIsImV4ZWNQYXRoIiwiY3dkIiwiZXJyIiwic3Rkb3V0Iiwic3RkZXJyIiwicnVuRXJyIiwiT2JqZWN0IiwiYXNzaWduIiwib3JpZ2luYWxNZXNzYWdlIiwibWVzc2FnZSIsInRyaW0iLCJjb21tYW5kIiwicnVuQXBwaXVtIiwiXyIsImN1cnJ5IiwicnVuQXBwaXVtUmF3IiwicnVuQXBwaXVtSnNvbiIsImluY2x1ZGVzIiwicHVzaCIsInJlc3VsdCIsIkpTT04iLCJwYXJzZSIsImluc3RhbGxMb2NhbEV4dGVuc2lvbiIsInR5cGUiLCJwYXRoVG9FeHRlbnNpb24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBS08sTUFBTUEsVUFBVSxHQUFHQyxjQUFLQyxJQUFMLENBQ3hCQyxxQkFEd0IsRUFFeEIsVUFGd0IsRUFHeEIsUUFId0IsRUFJeEIsT0FKd0IsRUFLeEIsS0FMd0IsRUFNeEIsU0FOd0IsQ0FBbkI7Ozs7QUFpQlAsZUFBZUMsR0FBZixDQUFvQkMsVUFBcEIsRUFBZ0NDLElBQWhDLEVBQXNDO0FBQ3BDLFFBQU1DLEdBQUcsR0FBRztBQUNWQyxJQUFBQSxXQUFXLEVBQUVILFVBREg7QUFFVkksSUFBQUEsSUFBSSxFQUFFQyxPQUFPLENBQUNILEdBQVIsQ0FBWUU7QUFGUixHQUFaOztBQUlBLE1BQUk7QUFJRixXQUFPLE1BQU0sd0JBQUtDLE9BQU8sQ0FBQ0MsUUFBYixFQUF1QixDQUFDWCxVQUFELEVBQWEsR0FBR00sSUFBaEIsQ0FBdkIsRUFBOEM7QUFDekRNLE1BQUFBLEdBQUcsRUFBRVQscUJBRG9EO0FBRXpESSxNQUFBQTtBQUZ5RCxLQUE5QyxDQUFiO0FBSUQsR0FSRCxDQVFFLE9BQU9NLEdBQVAsRUFBWTtBQUNaLFVBQU07QUFBQ0MsTUFBQUEsTUFBRDtBQUFTQyxNQUFBQTtBQUFULFFBQXVERixHQUE3RDtBQUlBLFVBQU1HLE1BQU0sR0FBR0MsTUFBTSxDQUFDQyxNQUFQLENBQ2JMLEdBRGEsRUFFYjtBQUNFTSxNQUFBQSxlQUFlLEVBQUVOLEdBQUcsQ0FBQ08sT0FEdkI7QUFFRUEsTUFBQUEsT0FBTyxFQUFHLEdBQUVOLE1BQU0sQ0FBQ08sSUFBUCxFQUFjLE9BQU1OLE1BQU0sQ0FBQ00sSUFBUCxFQUFjLEVBRmhEO0FBR0VDLE1BQUFBLE9BQU8sRUFBRyxHQUFFWixPQUFPLENBQUNDLFFBQVMsSUFBR1gsVUFBVyxJQUFHTSxJQUFJLENBQUNKLElBQUwsQ0FBVSxHQUFWLENBQWUsRUFIL0Q7QUFJRUssTUFBQUEsR0FKRjtBQUtFSyxNQUFBQSxHQUFHLEVBQUVUO0FBTFAsS0FGYSxDQUFmO0FBU0EsVUFBTWEsTUFBTjtBQUNEO0FBQ0Y7O0FBT00sTUFBTU8sU0FBUyxHQUFHQyxnQkFBRUMsS0FBRixDQU12QixPQUFPcEIsVUFBUCxFQUFtQkMsSUFBbkIsS0FBNEI7QUFDMUIsUUFBTTtBQUFDUSxJQUFBQTtBQUFELE1BQVcsTUFBTVYsR0FBRyxDQUFDQyxVQUFELEVBQWFDLElBQWIsQ0FBMUI7QUFDQSxTQUFPUSxNQUFQO0FBQ0QsQ0FUc0IsQ0FBbEI7Ozs7QUFnQkEsTUFBTVksWUFBWSxHQUFHRixnQkFBRUMsS0FBRixDQU0xQixPQUFPcEIsVUFBUCxFQUFtQkMsSUFBbkIsS0FBNEIsTUFBTUYsR0FBRyxDQUFDQyxVQUFELEVBQWFDLElBQWIsQ0FOWCxDQUFyQjs7OztBQWFBLE1BQU1xQixhQUFhLEdBQUdILGdCQUFFQyxLQUFGLENBTTNCLE9BQU9wQixVQUFQLEVBQW1CQyxJQUFuQixLQUE0QjtBQUMxQixNQUFJLENBQUNBLElBQUksQ0FBQ3NCLFFBQUwsQ0FBYyxRQUFkLENBQUwsRUFBOEI7QUFDNUJ0QixJQUFBQSxJQUFJLENBQUN1QixJQUFMLENBQVUsUUFBVjtBQUNEOztBQUNELFFBQU1DLE1BQU0sR0FBRyxNQUFNUCxTQUFTLENBQUNsQixVQUFELEVBQWFDLElBQWIsQ0FBOUI7O0FBQ0EsTUFBSTtBQUNGLFdBQU95QixJQUFJLENBQUNDLEtBQUwsQ0FBV0YsTUFBWCxDQUFQO0FBQ0QsR0FGRCxDQUVFLE9BQU9qQixHQUFQLEVBQVk7QUFDWkEsSUFBQUEsR0FBRyxDQUFDTyxPQUFKLEdBQWUsMkNBQTBDVSxNQUFPLEVBQWhFO0FBQ0EsVUFBTWpCLEdBQU47QUFDRDtBQUNGLENBakIwQixDQUF0Qjs7OztBQXVCQSxNQUFNb0IscUJBQXFCLEdBQUdULGdCQUFFQyxLQUFGLENBT25DLE9BQU9wQixVQUFQLEVBQW1CNkIsSUFBbkIsRUFBeUJDLGVBQXpCLEtBQ0UsTUFBTVIsYUFBYSxDQUFDdEIsVUFBRCxFQUFhLENBQzlCNkIsSUFEOEIsRUFFOUIsU0FGOEIsRUFHOUIsVUFIOEIsRUFJOUIsT0FKOEIsRUFLOUJDLGVBTDhCLENBQWIsQ0FSYyxDQUE5QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtleGVjfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHtQUk9KRUNUX1JPT1R9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbi8qKlxuICogUGF0aCB0byB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZS4gU29ydCBvZi5cbiAqL1xuZXhwb3J0IGNvbnN0IEVYRUNVVEFCTEUgPSBwYXRoLmpvaW4oXG4gIFBST0pFQ1RfUk9PVCxcbiAgJ3BhY2thZ2VzJyxcbiAgJ2FwcGl1bScsXG4gICdidWlsZCcsXG4gICdsaWInLFxuICAnbWFpbi5qcycsXG4pO1xuXG4vKipcbiAqIFJ1bnMgdGhlIGBhcHBpdW1gIGV4ZWN1dGFibGUgd2l0aCB0aGUgZ2l2ZW4gYXJncy5cbiAqXG4gKiBJZiB0aGUgcHJvY2VzcyBleGl0cyB3aXRoIGEgbm9uemVybyBjb2RlLCB0aGUgZXJyb3Igd2lsbCBiZSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBwaXVtSG9tZSAtIFBhdGggdG8gYEFQUElVTV9IT01FYFxuICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICogQHJldHVybnMge1Byb21pc2U8VGVlblByb2Nlc3NFeGVjUmVzdWx0Pn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuIChhcHBpdW1Ib21lLCBhcmdzKSB7XG4gIGNvbnN0IGVudiA9IHtcbiAgICBBUFBJVU1fSE9NRTogYXBwaXVtSG9tZSxcbiAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICB9O1xuICB0cnkge1xuICAgIC8qKlxuICAgICAqIEB0eXBlIHtUZWVuUHJvY2Vzc0V4ZWNSZXN1bHR9XG4gICAgICovXG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMocHJvY2Vzcy5leGVjUGF0aCwgW0VYRUNVVEFCTEUsIC4uLmFyZ3NdLCB7XG4gICAgICBjd2Q6IFBST0pFQ1RfUk9PVCxcbiAgICAgIGVudixcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc3Qge3N0ZG91dCwgc3RkZXJyfSA9IC8qKiBAdHlwZSB7VGVlblByb2Nlc3NFeGVjRXJyb3J9ICovKGVycik7XG4gICAgLyoqXG4gICAgICogQHR5cGUge0FwcGl1bVJ1bkVycm9yfVxuICAgICAqL1xuICAgIGNvbnN0IHJ1bkVyciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBlcnIsXG4gICAgICB7XG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgIG1lc3NhZ2U6IGAke3N0ZG91dC50cmltKCl9XFxuXFxuJHtzdGRlcnIudHJpbSgpfWAsXG4gICAgICAgIGNvbW1hbmQ6IGAke3Byb2Nlc3MuZXhlY1BhdGh9ICR7RVhFQ1VUQUJMRX0gJHthcmdzLmpvaW4oJyAnKX1gLFxuICAgICAgICBlbnYsXG4gICAgICAgIGN3ZDogUFJPSkVDVF9ST09ULFxuICAgICAgfSk7XG4gICAgdGhyb3cgcnVuRXJyO1xuICB9XG59XG5cbi8qKlxuICogUnVucyB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZSB3aXRoIHRoZSBnaXZlbiBhcmdzIGFuZCByZXR1cm5zIGNvbnRlbnRzIG9mIGBTVERPVVRgLlxuICpcbiAqIERvIG5vdCB1c2UgdGhpcyB3aGVuIHRlc3RpbmcgZXJyb3Igb3V0cHV0LCBhcyBpdCB3aWxsIGxpa2VseSBiZSBpbiBgU1RERVJSYC4gVXNlIHtAbGluayBydW5BcHBpdW1SYXd9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW0gPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBQYXRoIHRvIGBBUFBJVU1fSE9NRWBcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBDb250ZW50cyBvZiBgYFNURE9VVGBgXG4gICAqL1xuICBhc3luYyAoYXBwaXVtSG9tZSwgYXJncykgPT4ge1xuICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgcnVuKGFwcGl1bUhvbWUsIGFyZ3MpO1xuICAgIHJldHVybiBzdGRvdXQ7XG4gIH0sXG4pO1xuXG4vKipcbiAqIFJ1bnMgdGhlIGBhcHBpdW1gIGV4ZWN1dGFibGUgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQgcmV0dXJucyB0aGUgZW50aXJlXG4gKiB7QGxpbmsgVGVlblByb2Nlc3NFeGVjUmVzdWx0fSBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW1SYXcgPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWUgLSBQYXRoIHRvIGBBUFBJVU1fSE9NRWBcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gYXJncyAtIEFyZ3MsIGluY2x1ZGluZyBjb21tYW5kc1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUZWVuUHJvY2Vzc0V4ZWNSZXN1bHQ+fSBSYXcgcmVzdWx0IG9mIGBleGVjYFxuICAgKi9cbiAgYXN5bmMgKGFwcGl1bUhvbWUsIGFyZ3MpID0+IGF3YWl0IHJ1bihhcHBpdW1Ib21lLCBhcmdzKSxcbik7XG5cbi8qKlxuICogUnVucyB0aGUgYGFwcGl1bWAgZXhlY3V0YWJsZSB3aXRoIHRoZSBnaXZlbiBhcmdzIGluIEpTT04gbW9kZS5cbiAqIFdpbGwgcmVqZWN0IHdpdGggdGhlIGNvbnRlbnRzIG9mIGBTVERPVVRgICh3aGljaCB3ZXJlIHRvIGJlIHBhc3JlZCkgaWYgcGFyc2luZyBpbnRvIEpTT04gZmFpbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBydW5BcHBpdW1Kc29uID0gXy5jdXJyeShcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBpdW1Ib21lIC0gUGF0aCB0byBgQVBQSVVNX0hPTUVgXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IGFyZ3MgLSBBcmdzLCBpbmNsdWRpbmcgY29tbWFuZHNcbiAgICogQHJldHVybnMge1Byb21pc2U8VGVlblByb2Nlc3NFeGVjUmVzdWx0Pn0gUmF3IHJlc3VsdCBvZiBgZXhlY2BcbiAgICovXG4gIGFzeW5jIChhcHBpdW1Ib21lLCBhcmdzKSA9PiB7XG4gICAgaWYgKCFhcmdzLmluY2x1ZGVzKCctLWpzb24nKSkge1xuICAgICAgYXJncy5wdXNoKCctLWpzb24nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuQXBwaXVtKGFwcGl1bUhvbWUsIGFyZ3MpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgZXJyLm1lc3NhZ2UgPSBgRXJyb3IgcGFyc2luZyBKU09OLiBDb250ZW50cyBvZiBTVERPVVQ6ICR7cmVzdWx0fWA7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9LFxuKTtcblxuLyoqXG4gKiBHaXZlbiBhIHBhdGggdG8gYSBsb2NhbCBleHRlbnNpb24sIGluc3RhbGwgaXQgaW50byBgQVBQSVVNX0hPTUVgIHZpYSBDTEkuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsTG9jYWxFeHRlbnNpb24gPSBfLmN1cnJ5KFxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGl1bUhvbWVcbiAgICogQHBhcmFtIHtpbXBvcnQoJy4uLy4uL2xpYi9leHQtY29uZmlnLWlvJykuRXh0ZW5zaW9uVHlwZX0gdHlwZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFRvRXh0ZW5zaW9uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gICAqL1xuICBhc3luYyAoYXBwaXVtSG9tZSwgdHlwZSwgcGF0aFRvRXh0ZW5zaW9uKSA9PlxuICAgIGF3YWl0IHJ1bkFwcGl1bUpzb24oYXBwaXVtSG9tZSwgW1xuICAgICAgdHlwZSxcbiAgICAgICdpbnN0YWxsJyxcbiAgICAgICctLXNvdXJjZScsXG4gICAgICAnbG9jYWwnLFxuICAgICAgcGF0aFRvRXh0ZW5zaW9uLFxuICAgIF0pLFxuKTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcnVuQXBwaXVtfS5cbiAqIEBwcml2YXRlXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBSdW5BcHBpdW1PcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyYXddIC0gV2hldGhlciB0byByZXR1cm4gdGhlIHJhdyBvdXRwdXQgZnJvbSBgdGVlbl9wcm9jZXNzYFxuICovXG5cbi8qKlxuICogUmVzdWx0IGZyb20gYSBub24temVyby1leGl0IGV4ZWN1dGlvbiBvZiBgYXBwaXVtYFxuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NFeGVjUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3Rkb3V0IC0gU3Rkb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gU3RkZXJyXG4gKiBAcHJvcGVydHkge251bWJlcj99IGNvZGUgLSBFeGl0IGNvZGVcbiAqL1xuXG4vKipcbiAqIEV4dHJhIHByb3BzIGB0ZWVuX3Byb2Nlc3MuZXhlY2AgYWRkcyB0byBpdHMgZXJyb3Igb2JqZWN0c1xuICogQHR5cGVkZWYge09iamVjdH0gVGVlblByb2Nlc3NFeGVjRXJyb3JQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZG91dCAtIFNURE9VVFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0ZGVyciAtIFNUREVSUlxuICogQHByb3BlcnR5IHtudW1iZXI/fSBjb2RlIC0gRXhpdCBjb2RlXG4gKi9cblxuLyoqXG4gKiBFcnJvciB0aHJvd24gYnkgYHRlZW5fcHJvY2Vzcy5leGVjYFxuICogQHR5cGVkZWYge0Vycm9yICYgVGVlblByb2Nlc3NFeGVjRXJyb3JQcm9wc30gVGVlblByb2Nlc3NFeGVjRXJyb3JcbiAqL1xuXG4vKipcbiAqIEVycm9yIHRocm93biBieSBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgd2hpY2ggZXhlY3V0ZSBgYXBwaXVtYC5cbiAqIEB0eXBlZGVmIHtFcnJvciAmIEFwcGl1bVJ1bkVycm9yUHJvcHMgJiBUZWVuUHJvY2Vzc0V4ZWNFcnJvclByb3BzfSBBcHBpdW1SdW5FcnJvclxuICovXG5cbi8qKlxuICogV3JhcHMgdGhlIGVycm9yIHJldHVybmVkIGJ5IHtAbGluayBleGVjfS5cbiAqIEB0eXBlZGVmIHtPYmplY3R9IEFwcGl1bVJ1bkVycm9yUHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcmlnaW5hbE1lc3NhZ2UgLSBPcmlnaW5hbCBlcnJvciBtZXNzYWdlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29tbWFuZCAtIENvbW1hbmQgdGhhdCB3YXMgcnVuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW52IC0gRW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY3dkIC0gQ3VycmVudCB3b3JraW5nIGRpcmVjdG9yeVxuICovXG4iXSwiZmlsZSI6InRlc3QvY2xpL2NsaS1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ require("source-map-support/register");
6
+
7
+ var _extensionConfig = require("../../lib/extension-config");
8
+
9
+ var _driverConfig = _interopRequireDefault(require("../../lib/driver-config"));
10
+
11
+ var _driverCommand = _interopRequireDefault(require("../../lib/cli/driver-command"));
12
+
13
+ var _sinon = _interopRequireDefault(require("sinon"));
14
+
15
+ describe('DriverCommand', function () {
16
+ const config = new _driverConfig.default(_extensionConfig.DEFAULT_APPIUM_HOME);
17
+ const driver = 'fake';
18
+ const pkgName = '@appium/fake-driver';
19
+ config.installedExtensions = {
20
+ [driver]: {
21
+ version: '1.0.0',
22
+ pkgName
23
+ }
24
+ };
25
+ const dc = new _driverCommand.default({
26
+ config,
27
+ json: true
28
+ });
29
+ describe('#checkForExtensionUpdate', function () {
30
+ let npmMock;
31
+ beforeEach(function () {
32
+ npmMock = _sinon.default.mock(dc.npm);
33
+ });
34
+
35
+ function setupDriverUpdate(curVersion, latestVersion, latestSafeVersion) {
36
+ npmMock.expects('getLatestVersion').once().withExactArgs(pkgName).returns(latestVersion);
37
+ npmMock.expects('getLatestSafeUpgradeVersion').once().withExactArgs(pkgName, curVersion).returns(latestSafeVersion);
38
+ }
39
+
40
+ it('should not return an unsafe update if it is same as safe update', async function () {
41
+ setupDriverUpdate('1.0.0', '1.1.0', '1.1.0');
42
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
43
+ current: '1.0.0',
44
+ safeUpdate: '1.1.0',
45
+ unsafeUpdate: null
46
+ });
47
+ npmMock.verify();
48
+ });
49
+ it('should not return a safe update if there is not one', async function () {
50
+ setupDriverUpdate('1.0.0', '2.0.0', null);
51
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
52
+ current: '1.0.0',
53
+ safeUpdate: null,
54
+ unsafeUpdate: '2.0.0'
55
+ });
56
+ npmMock.verify();
57
+ });
58
+ it('should return both safe and unsafe update', async function () {
59
+ setupDriverUpdate('1.0.0', '2.0.0', '1.5.3');
60
+ await dc.checkForExtensionUpdate('fake').should.eventually.eql({
61
+ current: '1.0.0',
62
+ safeUpdate: '1.5.3',
63
+ unsafeUpdate: '2.0.0'
64
+ });
65
+ npmMock.verify();
66
+ });
67
+ });
68
+ });require('source-map-support').install();
69
+
70
+
71
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QvY2xpL2NsaS1zcGVjcy5qcyJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImNvbmZpZyIsIkRyaXZlckNvbmZpZyIsIkRFRkFVTFRfQVBQSVVNX0hPTUUiLCJkcml2ZXIiLCJwa2dOYW1lIiwiaW5zdGFsbGVkRXh0ZW5zaW9ucyIsInZlcnNpb24iLCJkYyIsIkRyaXZlckNvbW1hbmQiLCJqc29uIiwibnBtTW9jayIsImJlZm9yZUVhY2giLCJzaW5vbiIsIm1vY2siLCJucG0iLCJzZXR1cERyaXZlclVwZGF0ZSIsImN1clZlcnNpb24iLCJsYXRlc3RWZXJzaW9uIiwibGF0ZXN0U2FmZVZlcnNpb24iLCJleHBlY3RzIiwib25jZSIsIndpdGhFeGFjdEFyZ3MiLCJyZXR1cm5zIiwiaXQiLCJjaGVja0ZvckV4dGVuc2lvblVwZGF0ZSIsInNob3VsZCIsImV2ZW50dWFsbHkiLCJlcWwiLCJjdXJyZW50Iiwic2FmZVVwZGF0ZSIsInVuc2FmZVVwZGF0ZSIsInZlcmlmeSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBR0FBLFFBQVEsQ0FBQyxlQUFELEVBQWtCLFlBQVk7QUFDcEMsUUFBTUMsTUFBTSxHQUFHLElBQUlDLHFCQUFKLENBQWlCQyxvQ0FBakIsQ0FBZjtBQUNBLFFBQU1DLE1BQU0sR0FBRyxNQUFmO0FBQ0EsUUFBTUMsT0FBTyxHQUFHLHFCQUFoQjtBQUNBSixFQUFBQSxNQUFNLENBQUNLLG1CQUFQLEdBQTZCO0FBQUMsS0FBQ0YsTUFBRCxHQUFVO0FBQUNHLE1BQUFBLE9BQU8sRUFBRSxPQUFWO0FBQW1CRixNQUFBQTtBQUFuQjtBQUFYLEdBQTdCO0FBQ0EsUUFBTUcsRUFBRSxHQUFHLElBQUlDLHNCQUFKLENBQWtCO0FBQUNSLElBQUFBLE1BQUQ7QUFBU1MsSUFBQUEsSUFBSSxFQUFFO0FBQWYsR0FBbEIsQ0FBWDtBQUVBVixFQUFBQSxRQUFRLENBQUMsMEJBQUQsRUFBNkIsWUFBWTtBQUMvQyxRQUFJVyxPQUFKO0FBRUFDLElBQUFBLFVBQVUsQ0FBQyxZQUFZO0FBQ3JCRCxNQUFBQSxPQUFPLEdBQUdFLGVBQU1DLElBQU4sQ0FBV04sRUFBRSxDQUFDTyxHQUFkLENBQVY7QUFDRCxLQUZTLENBQVY7O0FBSUEsYUFBU0MsaUJBQVQsQ0FBNEJDLFVBQTVCLEVBQXdDQyxhQUF4QyxFQUF1REMsaUJBQXZELEVBQTBFO0FBQ3hFUixNQUFBQSxPQUFPLENBQUNTLE9BQVIsQ0FBZ0Isa0JBQWhCLEVBQ0dDLElBREgsR0FFR0MsYUFGSCxDQUVpQmpCLE9BRmpCLEVBR0drQixPQUhILENBR1dMLGFBSFg7QUFJQVAsTUFBQUEsT0FBTyxDQUFDUyxPQUFSLENBQWdCLDZCQUFoQixFQUNHQyxJQURILEdBRUdDLGFBRkgsQ0FFaUJqQixPQUZqQixFQUUwQlksVUFGMUIsRUFHR00sT0FISCxDQUdXSixpQkFIWDtBQUlEOztBQUVESyxJQUFBQSxFQUFFLENBQUMsaUVBQUQsRUFBb0Usa0JBQWtCO0FBQ3RGUixNQUFBQSxpQkFBaUIsQ0FBQyxPQUFELEVBQVUsT0FBVixFQUFtQixPQUFuQixDQUFqQjtBQUNBLFlBQU1SLEVBQUUsQ0FBQ2lCLHVCQUFILENBQTJCLE1BQTNCLEVBQW1DQyxNQUFuQyxDQUEwQ0MsVUFBMUMsQ0FBcURDLEdBQXJELENBQXlEO0FBQzdEQyxRQUFBQSxPQUFPLEVBQUUsT0FEb0Q7QUFFN0RDLFFBQUFBLFVBQVUsRUFBRSxPQUZpRDtBQUc3REMsUUFBQUEsWUFBWSxFQUFFO0FBSCtDLE9BQXpELENBQU47QUFLQXBCLE1BQUFBLE9BQU8sQ0FBQ3FCLE1BQVI7QUFDRCxLQVJDLENBQUY7QUFVQVIsSUFBQUEsRUFBRSxDQUFDLHFEQUFELEVBQXdELGtCQUFrQjtBQUMxRVIsTUFBQUEsaUJBQWlCLENBQUMsT0FBRCxFQUFVLE9BQVYsRUFBbUIsSUFBbkIsQ0FBakI7QUFDQSxZQUFNUixFQUFFLENBQUNpQix1QkFBSCxDQUEyQixNQUEzQixFQUFtQ0MsTUFBbkMsQ0FBMENDLFVBQTFDLENBQXFEQyxHQUFyRCxDQUF5RDtBQUM3REMsUUFBQUEsT0FBTyxFQUFFLE9BRG9EO0FBRTdEQyxRQUFBQSxVQUFVLEVBQUUsSUFGaUQ7QUFHN0RDLFFBQUFBLFlBQVksRUFBRTtBQUgrQyxPQUF6RCxDQUFOO0FBS0FwQixNQUFBQSxPQUFPLENBQUNxQixNQUFSO0FBQ0QsS0FSQyxDQUFGO0FBVUFSLElBQUFBLEVBQUUsQ0FBQywyQ0FBRCxFQUE4QyxrQkFBa0I7QUFDaEVSLE1BQUFBLGlCQUFpQixDQUFDLE9BQUQsRUFBVSxPQUFWLEVBQW1CLE9BQW5CLENBQWpCO0FBQ0EsWUFBTVIsRUFBRSxDQUFDaUIsdUJBQUgsQ0FBMkIsTUFBM0IsRUFBbUNDLE1BQW5DLENBQTBDQyxVQUExQyxDQUFxREMsR0FBckQsQ0FBeUQ7QUFDN0RDLFFBQUFBLE9BQU8sRUFBRSxPQURvRDtBQUU3REMsUUFBQUEsVUFBVSxFQUFFLE9BRmlEO0FBRzdEQyxRQUFBQSxZQUFZLEVBQUU7QUFIK0MsT0FBekQsQ0FBTjtBQUtBcEIsTUFBQUEsT0FBTyxDQUFDcUIsTUFBUjtBQUNELEtBUkMsQ0FBRjtBQVNELEdBL0NPLENBQVI7QUFnREQsQ0F2RE8sQ0FBUiIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRyYW5zcGlsZTptb2NoYVxuXG5pbXBvcnQgeyBERUZBVUxUX0FQUElVTV9IT01FIH0gZnJvbSAnLi4vLi4vbGliL2V4dGVuc2lvbi1jb25maWcnO1xuaW1wb3J0IERyaXZlckNvbmZpZyBmcm9tICcuLi8uLi9saWIvZHJpdmVyLWNvbmZpZyc7XG5pbXBvcnQgRHJpdmVyQ29tbWFuZCBmcm9tICcuLi8uLi9saWIvY2xpL2RyaXZlci1jb21tYW5kJztcbmltcG9ydCBzaW5vbiBmcm9tICdzaW5vbic7XG5cblxuZGVzY3JpYmUoJ0RyaXZlckNvbW1hbmQnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbmZpZyA9IG5ldyBEcml2ZXJDb25maWcoREVGQVVMVF9BUFBJVU1fSE9NRSk7XG4gIGNvbnN0IGRyaXZlciA9ICdmYWtlJztcbiAgY29uc3QgcGtnTmFtZSA9ICdAYXBwaXVtL2Zha2UtZHJpdmVyJztcbiAgY29uZmlnLmluc3RhbGxlZEV4dGVuc2lvbnMgPSB7W2RyaXZlcl06IHt2ZXJzaW9uOiAnMS4wLjAnLCBwa2dOYW1lfX07XG4gIGNvbnN0IGRjID0gbmV3IERyaXZlckNvbW1hbmQoe2NvbmZpZywganNvbjogdHJ1ZX0pO1xuXG4gIGRlc2NyaWJlKCcjY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG5wbU1vY2s7XG5cbiAgICBiZWZvcmVFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5wbU1vY2sgPSBzaW5vbi5tb2NrKGRjLm5wbSk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzZXR1cERyaXZlclVwZGF0ZSAoY3VyVmVyc2lvbiwgbGF0ZXN0VmVyc2lvbiwgbGF0ZXN0U2FmZVZlcnNpb24pIHtcbiAgICAgIG5wbU1vY2suZXhwZWN0cygnZ2V0TGF0ZXN0VmVyc2lvbicpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLndpdGhFeGFjdEFyZ3MocGtnTmFtZSlcbiAgICAgICAgLnJldHVybnMobGF0ZXN0VmVyc2lvbik7XG4gICAgICBucG1Nb2NrLmV4cGVjdHMoJ2dldExhdGVzdFNhZmVVcGdyYWRlVmVyc2lvbicpXG4gICAgICAgIC5vbmNlKClcbiAgICAgICAgLndpdGhFeGFjdEFyZ3MocGtnTmFtZSwgY3VyVmVyc2lvbilcbiAgICAgICAgLnJldHVybnMobGF0ZXN0U2FmZVZlcnNpb24pO1xuICAgIH1cblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhbiB1bnNhZmUgdXBkYXRlIGlmIGl0IGlzIHNhbWUgYXMgc2FmZSB1cGRhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXR1cERyaXZlclVwZGF0ZSgnMS4wLjAnLCAnMS4xLjAnLCAnMS4xLjAnKTtcbiAgICAgIGF3YWl0IGRjLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKCdmYWtlJykuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHtcbiAgICAgICAgY3VycmVudDogJzEuMC4wJyxcbiAgICAgICAgc2FmZVVwZGF0ZTogJzEuMS4wJyxcbiAgICAgICAgdW5zYWZlVXBkYXRlOiBudWxsLFxuICAgICAgfSk7XG4gICAgICBucG1Nb2NrLnZlcmlmeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIGEgc2FmZSB1cGRhdGUgaWYgdGhlcmUgaXMgbm90IG9uZScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNldHVwRHJpdmVyVXBkYXRlKCcxLjAuMCcsICcyLjAuMCcsIG51bGwpO1xuICAgICAgYXdhaXQgZGMuY2hlY2tGb3JFeHRlbnNpb25VcGRhdGUoJ2Zha2UnKS5zaG91bGQuZXZlbnR1YWxseS5lcWwoe1xuICAgICAgICBjdXJyZW50OiAnMS4wLjAnLFxuICAgICAgICBzYWZlVXBkYXRlOiBudWxsLFxuICAgICAgICB1bnNhZmVVcGRhdGU6ICcyLjAuMCcsXG4gICAgICB9KTtcbiAgICAgIG5wbU1vY2sudmVyaWZ5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBib3RoIHNhZmUgYW5kIHVuc2FmZSB1cGRhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXR1cERyaXZlclVwZGF0ZSgnMS4wLjAnLCAnMi4wLjAnLCAnMS41LjMnKTtcbiAgICAgIGF3YWl0IGRjLmNoZWNrRm9yRXh0ZW5zaW9uVXBkYXRlKCdmYWtlJykuc2hvdWxkLmV2ZW50dWFsbHkuZXFsKHtcbiAgICAgICAgY3VycmVudDogJzEuMC4wJyxcbiAgICAgICAgc2FmZVVwZGF0ZTogJzEuNS4zJyxcbiAgICAgICAgdW5zYWZlVXBkYXRlOiAnMi4wLjAnLFxuICAgICAgfSk7XG4gICAgICBucG1Nb2NrLnZlcmlmeSgpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl0sImZpbGUiOiJ0ZXN0L2NsaS9jbGktc3BlY3MuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "test-driver",
3
+ "version": "1.0",
4
+ "private": true,
5
+ "appium": {
6
+ "driverName": "test",
7
+ "automationName": "Test",
8
+ "platformNames": [
9
+ "Test"
10
+ ],
11
+ "mainClass": "TestDriver",
12
+ "schema": {
13
+ "type": "object",
14
+ "properties": {
15
+ "mcmonkey-mcbean": {
16
+ "type": "string",
17
+ "appiumCliIgnored": true
18
+ },
19
+ "oliver-boliver": {
20
+ "type": "number",
21
+ "appiumDeprecated": true,
22
+ "description": "funkytelechy"
23
+ }
24
+ }
25
+ }
26
+ }
27
+ }