@appium/base-driver 8.2.4 → 8.4.0

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 (206) hide show
  1. package/build/lib/basedriver/capabilities.d.ts +80 -0
  2. package/build/lib/basedriver/capabilities.d.ts.map +1 -0
  3. package/build/lib/basedriver/capabilities.js +12 -13
  4. package/build/lib/basedriver/commands/event.d.ts +9 -0
  5. package/build/lib/basedriver/commands/event.d.ts.map +1 -0
  6. package/build/lib/basedriver/commands/event.js +21 -23
  7. package/build/lib/basedriver/commands/find.d.ts +11 -0
  8. package/build/lib/basedriver/commands/find.d.ts.map +1 -0
  9. package/build/lib/basedriver/commands/find.js +41 -43
  10. package/build/lib/basedriver/commands/index.d.ts +8 -0
  11. package/build/lib/basedriver/commands/index.d.ts.map +1 -0
  12. package/build/lib/basedriver/commands/index.js +17 -16
  13. package/build/lib/basedriver/commands/log.d.ts +12 -0
  14. package/build/lib/basedriver/commands/log.d.ts.map +1 -0
  15. package/build/lib/basedriver/commands/log.js +23 -30
  16. package/build/lib/basedriver/commands/session.d.ts +11 -0
  17. package/build/lib/basedriver/commands/session.d.ts.map +1 -0
  18. package/build/lib/basedriver/commands/session.js +21 -158
  19. package/build/lib/basedriver/commands/settings.d.ts +10 -0
  20. package/build/lib/basedriver/commands/settings.d.ts.map +1 -0
  21. package/build/lib/basedriver/commands/settings.js +18 -22
  22. package/build/lib/basedriver/commands/timeout.d.ts +8 -0
  23. package/build/lib/basedriver/commands/timeout.d.ts.map +1 -0
  24. package/build/lib/basedriver/commands/timeout.js +118 -144
  25. package/build/lib/basedriver/core.d.ts +235 -0
  26. package/build/lib/basedriver/core.d.ts.map +1 -0
  27. package/build/lib/basedriver/core.js +283 -0
  28. package/build/lib/basedriver/desired-caps.d.ts +5 -0
  29. package/build/lib/basedriver/desired-caps.d.ts.map +1 -0
  30. package/build/lib/basedriver/desired-caps.js +2 -4
  31. package/build/lib/basedriver/device-settings.d.ts +32 -0
  32. package/build/lib/basedriver/device-settings.d.ts.map +1 -0
  33. package/build/lib/basedriver/device-settings.js +33 -15
  34. package/build/lib/basedriver/driver.d.ts +83 -0
  35. package/build/lib/basedriver/driver.d.ts.map +1 -0
  36. package/build/lib/basedriver/driver.js +104 -257
  37. package/build/lib/basedriver/helpers.d.ts +132 -0
  38. package/build/lib/basedriver/helpers.d.ts.map +1 -0
  39. package/build/lib/basedriver/helpers.js +24 -10
  40. package/build/lib/basedriver/logger.d.ts +3 -0
  41. package/build/lib/basedriver/logger.d.ts.map +1 -0
  42. package/build/lib/basedriver/logger.js +2 -4
  43. package/build/lib/constants.d.ts +9 -0
  44. package/build/lib/constants.d.ts.map +1 -0
  45. package/build/lib/constants.js +2 -4
  46. package/build/lib/express/crash.d.ts +3 -0
  47. package/build/lib/express/crash.d.ts.map +1 -0
  48. package/build/lib/express/crash.js +2 -4
  49. package/build/lib/express/express-logging.d.ts +3 -0
  50. package/build/lib/express/express-logging.d.ts.map +1 -0
  51. package/build/lib/express/express-logging.js +3 -5
  52. package/build/lib/express/idempotency.d.ts +2 -0
  53. package/build/lib/express/idempotency.d.ts.map +1 -0
  54. package/build/lib/express/idempotency.js +3 -5
  55. package/build/lib/express/logger.d.ts +3 -0
  56. package/build/lib/express/logger.d.ts.map +1 -0
  57. package/build/lib/express/logger.js +2 -4
  58. package/build/lib/express/middleware.d.ts +9 -0
  59. package/build/lib/express/middleware.d.ts.map +1 -0
  60. package/build/lib/express/middleware.js +2 -4
  61. package/build/lib/express/server.d.ts +10 -0
  62. package/build/lib/express/server.d.ts.map +1 -0
  63. package/build/lib/express/server.js +2 -4
  64. package/build/lib/express/static.d.ts +6 -0
  65. package/build/lib/express/static.d.ts.map +1 -0
  66. package/build/lib/express/static.js +2 -4
  67. package/build/lib/express/websocket.d.ts +64 -0
  68. package/build/lib/express/websocket.d.ts.map +1 -0
  69. package/build/lib/express/websocket.js +2 -4
  70. package/build/lib/helpers/capabilities.d.ts +13 -0
  71. package/build/lib/helpers/capabilities.d.ts.map +1 -0
  72. package/build/lib/helpers/capabilities.js +77 -0
  73. package/build/lib/index.d.ts +183 -0
  74. package/build/lib/index.d.ts.map +1 -0
  75. package/build/lib/index.js +41 -25
  76. package/build/lib/jsonwp-proxy/protocol-converter.d.ts +48 -0
  77. package/build/lib/jsonwp-proxy/protocol-converter.d.ts.map +1 -0
  78. package/build/lib/jsonwp-proxy/protocol-converter.js +19 -15
  79. package/build/lib/jsonwp-proxy/proxy.d.ts +41 -0
  80. package/build/lib/jsonwp-proxy/proxy.d.ts.map +1 -0
  81. package/build/lib/jsonwp-proxy/proxy.js +20 -15
  82. package/build/lib/jsonwp-status/status.d.ts +159 -0
  83. package/build/lib/jsonwp-status/status.d.ts.map +1 -0
  84. package/build/lib/jsonwp-status/status.js +2 -4
  85. package/build/lib/protocol/errors.d.ts +310 -0
  86. package/build/lib/protocol/errors.d.ts.map +1 -0
  87. package/build/lib/protocol/errors.js +82 -5
  88. package/build/lib/protocol/helpers.d.ts +22 -0
  89. package/build/lib/protocol/helpers.d.ts.map +1 -0
  90. package/build/lib/protocol/helpers.js +2 -4
  91. package/build/lib/protocol/index.d.ts +16 -0
  92. package/build/lib/protocol/index.d.ts.map +1 -0
  93. package/build/lib/protocol/index.js +8 -10
  94. package/build/lib/protocol/protocol.d.ts +11 -0
  95. package/build/lib/protocol/protocol.d.ts.map +1 -0
  96. package/build/lib/protocol/protocol.js +38 -35
  97. package/build/lib/protocol/routes.d.ts +6 -0
  98. package/build/lib/protocol/routes.d.ts.map +1 -0
  99. package/build/lib/protocol/routes.js +84 -4
  100. package/build/lib/protocol/validators.d.ts +8 -0
  101. package/build/lib/protocol/validators.d.ts.map +1 -0
  102. package/build/lib/protocol/validators.js +2 -4
  103. package/build/test/basedriver/README.md +5 -0
  104. package/build/test/basedriver/driver-e2e-tests.js +2 -4
  105. package/build/test/basedriver/driver-tests.js +41 -19
  106. package/build/test/basedriver/index.js +2 -4
  107. package/build/test/e2e/basedriver/driver.e2e.spec.js +15 -0
  108. package/build/test/e2e/basedriver/helpers.e2e.spec.js +192 -0
  109. package/build/test/e2e/basedriver/websockets.e2e.spec.js +82 -0
  110. package/build/test/e2e/express/server.e2e.spec.js +159 -0
  111. package/build/test/e2e/jsonwp-proxy/proxy.e2e.spec.js +59 -0
  112. package/build/test/e2e/protocol/fake-driver.js +163 -0
  113. package/build/test/e2e/protocol/helpers.js +25 -0
  114. package/build/test/e2e/protocol/protocol.e2e.spec.js +1186 -0
  115. package/build/test/helpers.js +2 -4
  116. package/build/test/unit/basedriver/capabilities.spec.js +672 -0
  117. package/build/test/unit/basedriver/capability.spec.js +353 -0
  118. package/build/test/unit/basedriver/commands/event.spec.js +110 -0
  119. package/build/test/unit/basedriver/commands/log.spec.js +92 -0
  120. package/build/test/unit/basedriver/driver.spec.js +15 -0
  121. package/build/test/unit/basedriver/helpers.spec.js +151 -0
  122. package/build/test/unit/basedriver/timeout.spec.js +135 -0
  123. package/build/test/unit/express/server.spec.js +155 -0
  124. package/build/test/unit/express/static.spec.js +26 -0
  125. package/build/test/unit/jsonwp-proxy/mock-request.js +91 -0
  126. package/build/test/unit/jsonwp-proxy/protocol-converter.spec.js +171 -0
  127. package/build/test/unit/jsonwp-proxy/proxy.spec.js +292 -0
  128. package/build/test/unit/jsonwp-proxy/url.spec.js +165 -0
  129. package/build/test/unit/jsonwp-status/status.spec.js +34 -0
  130. package/build/test/unit/protocol/errors.spec.js +390 -0
  131. package/build/test/unit/protocol/routes.spec.js +80 -0
  132. package/build/test/unit/protocol/validator.spec.js +149 -0
  133. package/build/tsconfig.tsbuildinfo +1 -0
  134. package/lib/basedriver/capabilities.js +49 -10
  135. package/lib/basedriver/commands/event.js +49 -31
  136. package/lib/basedriver/commands/find.js +107 -45
  137. package/lib/basedriver/commands/index.js +25 -19
  138. package/lib/basedriver/commands/log.js +59 -34
  139. package/lib/basedriver/commands/session.js +39 -142
  140. package/lib/basedriver/commands/settings.js +32 -14
  141. package/lib/basedriver/commands/timeout.js +153 -154
  142. package/lib/basedriver/core.js +497 -0
  143. package/lib/basedriver/desired-caps.js +1 -1
  144. package/lib/basedriver/device-settings.js +57 -13
  145. package/lib/basedriver/driver.js +277 -375
  146. package/lib/basedriver/helpers.js +31 -13
  147. package/lib/express/express-logging.js +1 -1
  148. package/lib/express/idempotency.js +1 -1
  149. package/lib/helpers/capabilities.js +84 -0
  150. package/lib/index.js +17 -13
  151. package/lib/jsonwp-proxy/protocol-converter.js +14 -13
  152. package/lib/jsonwp-proxy/proxy.js +16 -12
  153. package/lib/protocol/errors.js +42 -42
  154. package/lib/protocol/index.js +4 -4
  155. package/lib/protocol/protocol.js +35 -32
  156. package/lib/protocol/routes.js +69 -1
  157. package/package.json +37 -24
  158. package/test/basedriver/README.md +5 -0
  159. package/test/basedriver/driver-e2e-tests.js +1 -1
  160. package/test/basedriver/driver-tests.js +43 -9
  161. package/build/lib/protocol/sessions-cache.js +0 -88
  162. package/build/test/basedriver/capabilities-specs.js +0 -632
  163. package/build/test/basedriver/capability-specs.js +0 -396
  164. package/build/test/basedriver/commands/event-specs.js +0 -112
  165. package/build/test/basedriver/commands/log-specs.js +0 -80
  166. package/build/test/basedriver/driver-e2e-specs.js +0 -17
  167. package/build/test/basedriver/driver-specs.js +0 -17
  168. package/build/test/basedriver/helpers-e2e-specs.js +0 -194
  169. package/build/test/basedriver/helpers-specs.js +0 -153
  170. package/build/test/basedriver/timeout-specs.js +0 -139
  171. package/build/test/basedriver/websockets-e2e-specs.js +0 -84
  172. package/build/test/express/server-e2e-specs.js +0 -156
  173. package/build/test/express/server-specs.js +0 -151
  174. package/build/test/express/static-specs.js +0 -23
  175. package/build/test/jsonwp-proxy/mock-request.js +0 -93
  176. package/build/test/jsonwp-proxy/protocol-converter-specs.js +0 -173
  177. package/build/test/jsonwp-proxy/proxy-e2e-specs.js +0 -61
  178. package/build/test/jsonwp-proxy/proxy-specs.js +0 -294
  179. package/build/test/jsonwp-proxy/url-specs.js +0 -167
  180. package/build/test/jsonwp-status/status-specs.js +0 -36
  181. package/build/test/protocol/errors-specs.js +0 -388
  182. package/build/test/protocol/fake-driver.js +0 -168
  183. package/build/test/protocol/helpers.js +0 -27
  184. package/build/test/protocol/protocol-e2e-specs.js +0 -1182
  185. package/build/test/protocol/routes-specs.js +0 -82
  186. package/build/test/protocol/validator-specs.js +0 -151
  187. package/index.d.ts +0 -386
  188. package/lib/protocol/sessions-cache.js +0 -74
  189. package/test/basedriver/capabilities-specs.js +0 -505
  190. package/test/basedriver/capability-specs.js +0 -409
  191. package/test/basedriver/commands/event-specs.js +0 -74
  192. package/test/basedriver/commands/log-specs.js +0 -70
  193. package/test/basedriver/driver-e2e-specs.js +0 -8
  194. package/test/basedriver/driver-specs.js +0 -8
  195. package/test/basedriver/fixtures/BadZippedApp.zip +0 -1
  196. package/test/basedriver/fixtures/FakeAndroidApp.apk +0 -1
  197. package/test/basedriver/fixtures/FakeAndroidApp.asd +0 -0
  198. package/test/basedriver/fixtures/FakeIOSApp.app +0 -1
  199. package/test/basedriver/fixtures/FakeIOSApp.app.zip +0 -0
  200. package/test/basedriver/fixtures/FakeIOSApp.ipa +0 -0
  201. package/test/basedriver/fixtures/custom-element-finder-bad.js +0 -5
  202. package/test/basedriver/fixtures/custom-element-finder.js +0 -29
  203. package/test/basedriver/helpers-e2e-specs.js +0 -187
  204. package/test/basedriver/helpers-specs.js +0 -137
  205. package/test/basedriver/timeout-specs.js +0 -133
  206. package/test/basedriver/websockets-e2e-specs.js +0 -75
@@ -0,0 +1,22 @@
1
+ import { MJSONWP_ELEMENT_KEY } from "../constants";
2
+ import { W3C_ELEMENT_KEY } from "../constants";
3
+ /**
4
+ * Preprocesses the resulting value for API responses,
5
+ * so they have keys for both W3C and JSONWP protocols.
6
+ * The argument value is NOT mutated
7
+ *
8
+ * @param {?Object} resValue The actual response value
9
+ * @returns {?Object} Either modified value or the same one if
10
+ * nothing has been modified
11
+ */
12
+ export function formatResponseValue(resValue: any | null): any | null;
13
+ /**
14
+ * Properly formats the status for API responses,
15
+ * so they are correct for the W3C protocol.
16
+ *
17
+ * @param {Object} responseBody
18
+ * @returns {Object} The fixed response body
19
+ */
20
+ export function formatStatus(responseBody: any): any;
21
+ export { MJSONWP_ELEMENT_KEY, W3C_ELEMENT_KEY };
22
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../lib/protocol/helpers.js"],"names":[],"mappings":";;AAIA;;;;;;;;GAQG;AACH,sEAQC;AAED;;;;;;GAMG;AACH,qDAEC"}
@@ -38,7 +38,5 @@ function formatResponseValue(resValue) {
38
38
 
39
39
  function formatStatus(responseBody) {
40
40
  return _lodash.default.isPlainObject(responseBody) ? _lodash.default.omit(responseBody, ['status']) : responseBody;
41
- }require('source-map-support').install();
42
-
43
-
44
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbImZvcm1hdFJlc3BvbnNlVmFsdWUiLCJyZXNWYWx1ZSIsIl8iLCJpc1VuZGVmaW5lZCIsIk1KU09OV1BfRUxFTUVOVF9LRVkiLCJXM0NfRUxFTUVOVF9LRVkiLCJmb3JtYXRTdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJpc1BsYWluT2JqZWN0Iiwib21pdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBV0EsU0FBU0EsbUJBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDO0FBQ3RDLE1BQUlDLGdCQUFFQyxXQUFGLENBQWNGLFFBQWQsQ0FBSixFQUE2QjtBQUUzQixXQUFPLElBQVA7QUFDRDs7QUFHRCxTQUFPLDRCQUFjQSxRQUFkLEVBQXdCRyw4QkFBeEIsRUFBNkNDLDBCQUE3QyxDQUFQO0FBQ0Q7O0FBU0QsU0FBU0MsWUFBVCxDQUF1QkMsWUFBdkIsRUFBcUM7QUFDbkMsU0FBT0wsZ0JBQUVNLGFBQUYsQ0FBZ0JELFlBQWhCLElBQWdDTCxnQkFBRU8sSUFBRixDQUFPRixZQUFQLEVBQXFCLENBQUMsUUFBRCxDQUFyQixDQUFoQyxHQUFtRUEsWUFBMUU7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkdXBsaWNhdGVLZXlzIH0gZnJvbSAnLi4vYmFzZWRyaXZlci9oZWxwZXJzJztcbmltcG9ydCB7IE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUHJlcHJvY2Vzc2VzIHRoZSByZXN1bHRpbmcgdmFsdWUgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGhhdmUga2V5cyBmb3IgYm90aCBXM0MgYW5kIEpTT05XUCBwcm90b2NvbHMuXG4gKiBUaGUgYXJndW1lbnQgdmFsdWUgaXMgTk9UIG11dGF0ZWRcbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc1ZhbHVlIFRoZSBhY3R1YWwgcmVzcG9uc2UgdmFsdWVcbiAqIEByZXR1cm5zIHs/T2JqZWN0fSBFaXRoZXIgbW9kaWZpZWQgdmFsdWUgb3IgdGhlIHNhbWUgb25lIGlmXG4gKiBub3RoaW5nIGhhcyBiZWVuIG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlVmFsdWUgKHJlc1ZhbHVlKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHJlc1ZhbHVlKSkge1xuICAgIC8vIGNvbnZlcnQgdW5kZWZpbmVkIHRvIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBJZiB0aGUgTUpTT05XUCBlbGVtZW50IGtleSBmb3JtYXQgKEVMRU1FTlQpIHdhcyBwcm92aWRlZCwgYWRkIGEgZHVwbGljYXRlIGtleSAoZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YpXG4gIC8vIElmIHRoZSBXM0MgZWxlbWVudCBrZXkgZm9ybWF0IChlbGVtZW50LTYwNjYtMTFlNC1hNTJlLTRmNzM1NDY2Y2VjZikgd2FzIHByb3ZpZGVkLCBhZGQgYSBkdXBsaWNhdGUga2V5IChFTEVNRU5UKVxuICByZXR1cm4gZHVwbGljYXRlS2V5cyhyZXNWYWx1ZSwgTUpTT05XUF9FTEVNRU5UX0tFWSwgVzNDX0VMRU1FTlRfS0VZKTtcbn1cblxuLyoqXG4gKiBQcm9wZXJseSBmb3JtYXRzIHRoZSBzdGF0dXMgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGFyZSBjb3JyZWN0IGZvciB0aGUgVzNDIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZUJvZHlcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmaXhlZCByZXNwb25zZSBib2R5XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0YXR1cyAocmVzcG9uc2VCb2R5KSB7XG4gIHJldHVybiBfLmlzUGxhaW5PYmplY3QocmVzcG9uc2VCb2R5KSA/IF8ub21pdChyZXNwb25zZUJvZHksIFsnc3RhdHVzJ10pIDogcmVzcG9uc2VCb2R5O1xufVxuXG5cbmV4cG9ydCB7XG4gIE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSwgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
41
+ }
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9oZWxwZXJzLmpzIl0sIm5hbWVzIjpbImZvcm1hdFJlc3BvbnNlVmFsdWUiLCJyZXNWYWx1ZSIsIl8iLCJpc1VuZGVmaW5lZCIsIk1KU09OV1BfRUxFTUVOVF9LRVkiLCJXM0NfRUxFTUVOVF9LRVkiLCJmb3JtYXRTdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJpc1BsYWluT2JqZWN0Iiwib21pdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBV0EsU0FBU0EsbUJBQVQsQ0FBOEJDLFFBQTlCLEVBQXdDO0FBQ3RDLE1BQUlDLGdCQUFFQyxXQUFGLENBQWNGLFFBQWQsQ0FBSixFQUE2QjtBQUUzQixXQUFPLElBQVA7QUFDRDs7QUFHRCxTQUFPLDRCQUFjQSxRQUFkLEVBQXdCRyw4QkFBeEIsRUFBNkNDLDBCQUE3QyxDQUFQO0FBQ0Q7O0FBU0QsU0FBU0MsWUFBVCxDQUF1QkMsWUFBdkIsRUFBcUM7QUFDbkMsU0FBT0wsZ0JBQUVNLGFBQUYsQ0FBZ0JELFlBQWhCLElBQWdDTCxnQkFBRU8sSUFBRixDQUFPRixZQUFQLEVBQXFCLENBQUMsUUFBRCxDQUFyQixDQUFoQyxHQUFtRUEsWUFBMUU7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBkdXBsaWNhdGVLZXlzIH0gZnJvbSAnLi4vYmFzZWRyaXZlci9oZWxwZXJzJztcbmltcG9ydCB7IE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbi8qKlxuICogUHJlcHJvY2Vzc2VzIHRoZSByZXN1bHRpbmcgdmFsdWUgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGhhdmUga2V5cyBmb3IgYm90aCBXM0MgYW5kIEpTT05XUCBwcm90b2NvbHMuXG4gKiBUaGUgYXJndW1lbnQgdmFsdWUgaXMgTk9UIG11dGF0ZWRcbiAqXG4gKiBAcGFyYW0gez9PYmplY3R9IHJlc1ZhbHVlIFRoZSBhY3R1YWwgcmVzcG9uc2UgdmFsdWVcbiAqIEByZXR1cm5zIHs/T2JqZWN0fSBFaXRoZXIgbW9kaWZpZWQgdmFsdWUgb3IgdGhlIHNhbWUgb25lIGlmXG4gKiBub3RoaW5nIGhhcyBiZWVuIG1vZGlmaWVkXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJlc3BvbnNlVmFsdWUgKHJlc1ZhbHVlKSB7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHJlc1ZhbHVlKSkge1xuICAgIC8vIGNvbnZlcnQgdW5kZWZpbmVkIHRvIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBJZiB0aGUgTUpTT05XUCBlbGVtZW50IGtleSBmb3JtYXQgKEVMRU1FTlQpIHdhcyBwcm92aWRlZCwgYWRkIGEgZHVwbGljYXRlIGtleSAoZWxlbWVudC02MDY2LTExZTQtYTUyZS00ZjczNTQ2NmNlY2YpXG4gIC8vIElmIHRoZSBXM0MgZWxlbWVudCBrZXkgZm9ybWF0IChlbGVtZW50LTYwNjYtMTFlNC1hNTJlLTRmNzM1NDY2Y2VjZikgd2FzIHByb3ZpZGVkLCBhZGQgYSBkdXBsaWNhdGUga2V5IChFTEVNRU5UKVxuICByZXR1cm4gZHVwbGljYXRlS2V5cyhyZXNWYWx1ZSwgTUpTT05XUF9FTEVNRU5UX0tFWSwgVzNDX0VMRU1FTlRfS0VZKTtcbn1cblxuLyoqXG4gKiBQcm9wZXJseSBmb3JtYXRzIHRoZSBzdGF0dXMgZm9yIEFQSSByZXNwb25zZXMsXG4gKiBzbyB0aGV5IGFyZSBjb3JyZWN0IGZvciB0aGUgVzNDIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZXNwb25zZUJvZHlcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBmaXhlZCByZXNwb25zZSBib2R5XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFN0YXR1cyAocmVzcG9uc2VCb2R5KSB7XG4gIHJldHVybiBfLmlzUGxhaW5PYmplY3QocmVzcG9uc2VCb2R5KSA/IF8ub21pdChyZXNwb25zZUJvZHksIFsnc3RhdHVzJ10pIDogcmVzcG9uc2VCb2R5O1xufVxuXG5cbmV4cG9ydCB7XG4gIE1KU09OV1BfRUxFTUVOVF9LRVksIFczQ19FTEVNRU5UX0tFWSwgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzXG59O1xuIl19
@@ -0,0 +1,16 @@
1
+ import { routeConfiguringFunction } from "./protocol";
2
+ import { errors } from "./errors";
3
+ import { isErrorType } from "./errors";
4
+ import { errorFromMJSONWPStatusCode } from "./errors";
5
+ import { errorFromW3CJsonCode } from "./errors";
6
+ import { ALL_COMMANDS } from "./routes";
7
+ import { METHOD_MAP } from "./routes";
8
+ import { routeToCommandName } from "./routes";
9
+ import { NO_SESSION_ID_COMMANDS } from "./routes";
10
+ import { isSessionCommand } from "./protocol";
11
+ import { determineProtocol } from "./protocol";
12
+ import { CREATE_SESSION_COMMAND } from "./protocol";
13
+ import { DELETE_SESSION_COMMAND } from "./protocol";
14
+ import { GET_STATUS_COMMAND } from "./protocol";
15
+ export { routeConfiguringFunction, errors, isErrorType, errorFromMJSONWPStatusCode, errorFromW3CJsonCode, ALL_COMMANDS, METHOD_MAP, routeToCommandName, NO_SESSION_ID_COMMANDS, isSessionCommand, determineProtocol, CREATE_SESSION_COMMAND, DELETE_SESSION_COMMAND, GET_STATUS_COMMAND };
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../lib/protocol/index.js"],"names":[],"mappings":""}
@@ -21,22 +21,22 @@ Object.defineProperty(exports, "DELETE_SESSION_COMMAND", {
21
21
  return _protocol.DELETE_SESSION_COMMAND;
22
22
  }
23
23
  });
24
- Object.defineProperty(exports, "METHOD_MAP", {
24
+ Object.defineProperty(exports, "GET_STATUS_COMMAND", {
25
25
  enumerable: true,
26
26
  get: function () {
27
- return _routes.METHOD_MAP;
27
+ return _protocol.GET_STATUS_COMMAND;
28
28
  }
29
29
  });
30
- Object.defineProperty(exports, "NO_SESSION_ID_COMMANDS", {
30
+ Object.defineProperty(exports, "METHOD_MAP", {
31
31
  enumerable: true,
32
32
  get: function () {
33
- return _routes.NO_SESSION_ID_COMMANDS;
33
+ return _routes.METHOD_MAP;
34
34
  }
35
35
  });
36
- Object.defineProperty(exports, "Protocol", {
36
+ Object.defineProperty(exports, "NO_SESSION_ID_COMMANDS", {
37
37
  enumerable: true,
38
38
  get: function () {
39
- return _protocol.Protocol;
39
+ return _routes.NO_SESSION_ID_COMMANDS;
40
40
  }
41
41
  });
42
42
  Object.defineProperty(exports, "determineProtocol", {
@@ -94,7 +94,5 @@ var _protocol = require("./protocol");
94
94
 
95
95
  var _routes = require("./routes");
96
96
 
97
- var _errors = require("./errors");require('source-map-support').install();
98
-
99
-
100
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUlBOztBQUlBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHtcbiAgUHJvdG9jb2wsIGlzU2Vzc2lvbkNvbW1hbmQsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgZGV0ZXJtaW5lUHJvdG9jb2wsXG4gIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsXG59IGZyb20gJy4vcHJvdG9jb2wnO1xuaW1wb3J0IHtcbiAgTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgQUxMX0NPTU1BTkRTLCBNRVRIT0RfTUFQLFxuICByb3V0ZVRvQ29tbWFuZE5hbWVcbn0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlXG59IGZyb20gJy4vZXJyb3JzJztcblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgZXJyb3JzLCBpc0Vycm9yVHlwZSxcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLCBBTExfQ09NTUFORFMsIE1FVEhPRF9NQVAsXG4gIHJvdXRlVG9Db21tYW5kTmFtZSwgTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgaXNTZXNzaW9uQ29tbWFuZCwgZGV0ZXJtaW5lUHJvdG9jb2wsXG4gIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsXG59O1xuIl0sImZpbGUiOiJsaWIvcHJvdG9jb2wvaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
97
+ var _errors = require("./errors");
98
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOztBQUlBOztBQUlBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHJhbnNwaWxlOm1haW5cblxuaW1wb3J0IHtcbiAgaXNTZXNzaW9uQ29tbWFuZCwgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBkZXRlcm1pbmVQcm90b2NvbCxcbiAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCwgREVMRVRFX1NFU1NJT05fQ09NTUFORCwgR0VUX1NUQVRVU19DT01NQU5EXG59IGZyb20gJy4vcHJvdG9jb2wnO1xuaW1wb3J0IHtcbiAgTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgQUxMX0NPTU1BTkRTLCBNRVRIT0RfTUFQLFxuICByb3V0ZVRvQ29tbWFuZE5hbWVcbn0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlXG59IGZyb20gJy4vZXJyb3JzJztcblxuZXhwb3J0IHtcbiAgcm91dGVDb25maWd1cmluZ0Z1bmN0aW9uLCBlcnJvcnMsIGlzRXJyb3JUeXBlLFxuICBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZSwgZXJyb3JGcm9tVzNDSnNvbkNvZGUsIEFMTF9DT01NQU5EUywgTUVUSE9EX01BUCxcbiAgcm91dGVUb0NvbW1hbmROYW1lLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTLCBpc1Nlc3Npb25Db21tYW5kLCBkZXRlcm1pbmVQcm90b2NvbCxcbiAgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCwgREVMRVRFX1NFU1NJT05fQ09NTUFORCwgR0VUX1NUQVRVU19DT01NQU5EXG59O1xuIl19
@@ -0,0 +1,11 @@
1
+ export function routeConfiguringFunction(driver: any): (app: any, { basePath, extraMethodMap }: {
2
+ basePath?: string | undefined;
3
+ extraMethodMap?: {} | undefined;
4
+ }) => void;
5
+ export function isSessionCommand(command: any): boolean;
6
+ export function driverShouldDoJwpProxy(driver: any, req: any, command: any): boolean;
7
+ export function determineProtocol(createSessionArgs: any): string;
8
+ export const CREATE_SESSION_COMMAND: "createSession";
9
+ export const DELETE_SESSION_COMMAND: "deleteSession";
10
+ export const GET_STATUS_COMMAND: "getStatus";
11
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../lib/protocol/protocol.js"],"names":[],"mappings":"AA2MA;;;WAyBC;AA/LD,wDAEC;AAuXD,qFAmBC;AA/ZD,kEAEC;AAND,qDAA+C;AAC/C,qDAA+C;AAC/C,6CAAuC"}
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.Protocol = exports.GET_STATUS_COMMAND = exports.DELETE_SESSION_COMMAND = exports.CREATE_SESSION_COMMAND = void 0;
8
+ exports.GET_STATUS_COMMAND = exports.DELETE_SESSION_COMMAND = exports.CREATE_SESSION_COMMAND = void 0;
9
9
  exports.determineProtocol = determineProtocol;
10
10
  exports.driverShouldDoJwpProxy = driverShouldDoJwpProxy;
11
11
  exports.isSessionCommand = isSessionCommand;
@@ -29,7 +29,7 @@ var _helpers = require("./helpers");
29
29
 
30
30
  var _constants = require("../constants");
31
31
 
32
- var _sessionsCache = _interopRequireDefault(require("./sessions-cache"));
32
+ var _capabilities = require("../helpers/capabilities");
33
33
 
34
34
  const CREATE_SESSION_COMMAND = 'createSession';
35
35
  exports.CREATE_SESSION_COMMAND = CREATE_SESSION_COMMAND;
@@ -38,28 +38,44 @@ exports.DELETE_SESSION_COMMAND = DELETE_SESSION_COMMAND;
38
38
  const GET_STATUS_COMMAND = 'getStatus';
39
39
  exports.GET_STATUS_COMMAND = GET_STATUS_COMMAND;
40
40
 
41
- class Protocol {}
42
-
43
- exports.Protocol = Protocol;
44
-
45
- function determineProtocol(desiredCapabilities, requiredCapabilities, capabilities) {
46
- return _lodash.default.isPlainObject(capabilities) ? _constants.PROTOCOLS.W3C : _constants.PROTOCOLS.MJSONWP;
41
+ function determineProtocol(createSessionArgs) {
42
+ return _lodash.default.some(createSessionArgs, _capabilities.isW3cCaps) ? _constants.PROTOCOLS.W3C : _constants.PROTOCOLS.MJSONWP;
47
43
  }
48
44
 
49
45
  function extractProtocol(driver, sessionId = null) {
46
+ var _dstDriver$protocol;
47
+
50
48
  const dstDriver = _lodash.default.isFunction(driver.driverForSession) ? driver.driverForSession(sessionId) : driver;
51
49
 
52
50
  if (dstDriver === driver) {
53
51
  return driver.protocol;
54
52
  }
55
53
 
56
- return dstDriver ? dstDriver.protocol : _sessionsCache.default.getProtocol(sessionId);
54
+ return (_dstDriver$protocol = dstDriver === null || dstDriver === void 0 ? void 0 : dstDriver.protocol) !== null && _dstDriver$protocol !== void 0 ? _dstDriver$protocol : _constants.PROTOCOLS.W3C;
57
55
  }
58
56
 
59
57
  function isSessionCommand(command) {
60
58
  return !_lodash.default.includes(_routes.NO_SESSION_ID_COMMANDS, command);
61
59
  }
62
60
 
61
+ function getLogger(driver, sessionId = null) {
62
+ var _driver$driverForSess, _dstDriver$log;
63
+
64
+ const dstDriver = sessionId && _lodash.default.isFunction(driver.driverForSession) ? (_driver$driverForSess = driver.driverForSession(sessionId)) !== null && _driver$driverForSess !== void 0 ? _driver$driverForSess : driver : driver;
65
+
66
+ if (_lodash.default.isFunction((_dstDriver$log = dstDriver.log) === null || _dstDriver$log === void 0 ? void 0 : _dstDriver$log.info)) {
67
+ return dstDriver.log;
68
+ }
69
+
70
+ let logPrefix = dstDriver.constructor ? `${dstDriver.constructor.name}@${_support.node.getObjectId(dstDriver).substring(0, 8)}` : 'AppiumDriver';
71
+
72
+ if (sessionId) {
73
+ logPrefix += ` (${sessionId.substring(0, 8)})`;
74
+ }
75
+
76
+ return _support.logger.getLogger(logPrefix);
77
+ }
78
+
63
79
  function wrapParams(paramSets, jsonObj) {
64
80
  let res = jsonObj;
65
81
 
@@ -166,11 +182,11 @@ function makeArgs(requestParams, jsonObj, payloadParams, protocol) {
166
182
 
167
183
  function routeConfiguringFunction(driver) {
168
184
  if (!driver.sessionExists) {
169
- throw new Error('Drivers used with MJSONWP must implement `sessionExists`');
185
+ throw new Error('Drivers must implement `sessionExists` property');
170
186
  }
171
187
 
172
188
  if (!(driver.executeCommand || driver.execute)) {
173
- throw new Error('Drivers used with MJSONWP must implement `executeCommand` or `execute`');
189
+ throw new Error('Drivers must implement `executeCommand` or `execute` method');
174
190
  }
175
191
 
176
192
  return function addRoutes(app, {
@@ -211,8 +227,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
211
227
  return;
212
228
  }
213
229
 
214
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
215
-
230
+ getLogger(driver, req.params.sessionId).debug(`Would have proxied ` + `command directly, but a plugin exists which might require its value, so will let ` + `its value be collected internally and made part of plugin chain`);
216
231
  didPluginOverrideProxy = true;
217
232
  }
218
233
 
@@ -229,7 +244,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
229
244
  }
230
245
 
231
246
  if (spec.command === CREATE_SESSION_COMMAND) {
232
- currentProtocol = determineProtocol(...makeArgs(req.params, jsonObj, spec.payloadParams || {}));
247
+ currentProtocol = determineProtocol(makeArgs(req.params, jsonObj, spec.payloadParams || {}));
233
248
  }
234
249
 
235
250
  checkParams(spec.payloadParams, jsonObj, currentProtocol);
@@ -240,7 +255,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
240
255
  _validators.validators[spec.command](...args);
241
256
  }
242
257
 
243
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Calling ` + `${driver.constructor.name}.${spec.command}() with args: ` + _lodash.default.truncate(JSON.stringify(args), {
258
+ getLogger(driver, req.params.sessionId).debug(`Calling ` + `${driver.constructor.name}.${spec.command}() with args: ` + _lodash.default.truncate(JSON.stringify(args), {
244
259
  length: _constants.MAX_LOG_BODY_LENGTH
245
260
  }));
246
261
 
@@ -265,10 +280,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
265
280
 
266
281
  if (spec.command === CREATE_SESSION_COMMAND) {
267
282
  newSessionId = driverRes[0];
268
-
269
- _sessionsCache.default.putSession(newSessionId, currentProtocol);
270
-
271
- _sessionsCache.default.getLogger(newSessionId, currentProtocol).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
283
+ getLogger(driver, newSessionId).debug(`Cached the protocol value '${currentProtocol}' for the new session ${newSessionId}`);
272
284
 
273
285
  if (currentProtocol === _constants.PROTOCOLS.MJSONWP) {
274
286
  driverRes = driverRes[1];
@@ -282,12 +294,10 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
282
294
  driverRes = (0, _helpers.formatResponseValue)(driverRes);
283
295
 
284
296
  if (spec.command === DELETE_SESSION_COMMAND) {
285
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug(`Received response: ${_lodash.default.truncate(JSON.stringify(driverRes), {
297
+ getLogger(driver, req.params.sessionId).debug(`Received response: ${_lodash.default.truncate(JSON.stringify(driverRes), {
286
298
  length: _constants.MAX_LOG_BODY_LENGTH
287
299
  })}`);
288
-
289
- _sessionsCache.default.getLogger(req.params.sessionId, currentProtocol).debug('But deleting session, so not returning');
290
-
300
+ getLogger(driver, req.params.sessionId).debug('But deleting session, so not returning');
291
301
  driverRes = null;
292
302
  }
293
303
 
@@ -300,14 +310,9 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
300
310
  }
301
311
 
302
312
  httpResBody.value = driverRes;
303
-
304
- _sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
313
+ getLogger(driver, req.params.sessionId || newSessionId).debug(`Responding ` + `to client with driver.${spec.command}() result: ${_lodash.default.truncate(JSON.stringify(driverRes), {
305
314
  length: _constants.MAX_LOG_BODY_LENGTH
306
315
  })}`);
307
-
308
- if (spec.command === DELETE_SESSION_COMMAND) {
309
- _sessionsCache.default.resetLogger(req.params.sessionId);
310
- }
311
316
  } catch (err) {
312
317
  let actualErr = err;
313
318
  currentProtocol = currentProtocol || extractProtocol(driver, req.params.sessionId || newSessionId);
@@ -320,7 +325,7 @@ function buildHandler(app, method, path, spec, driver, isSessCmd) {
320
325
  if ((0, _errors.isErrorType)(err, _errors.errors.ProxyRequestError)) {
321
326
  actualErr = err.getActualError();
322
327
  } else {
323
- _sessionsCache.default.getLogger(req.params.sessionId || newSessionId, currentProtocol).debug(`Encountered internal error running command: ${errMsg}`);
328
+ getLogger(driver, req.params.sessionId || newSessionId).debug(`Encountered internal error running command: ${errMsg}`);
324
329
  }
325
330
 
326
331
  [httpStatus, httpResBody] = (0, _errors.getResponseForW3CError)(actualErr);
@@ -370,7 +375,7 @@ function driverShouldDoJwpProxy(driver, req, command) {
370
375
  }
371
376
 
372
377
  async function doJwpProxy(driver, req, res) {
373
- _sessionsCache.default.getLogger(req.params.sessionId, extractProtocol(driver, req.params.sessionId)).info('Driver proxy active, passing request on via HTTP proxy');
378
+ getLogger(driver, req.params.sessionId).info('Driver proxy active, passing request on via HTTP proxy');
374
379
 
375
380
  if (!driver.canProxy(req.params.sessionId)) {
376
381
  throw new Error('Trying to proxy to a server but the driver is unable to proxy');
@@ -385,7 +390,5 @@ async function doJwpProxy(driver, req, res) {
385
390
  throw new Error(`Could not proxy. Proxy error: ${err.message}`);
386
391
  }
387
392
  }
388
- }require('source-map-support').install();
389
-
390
-
391
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsIlByb3RvY29sIiwiZGV0ZXJtaW5lUHJvdG9jb2wiLCJkZXNpcmVkQ2FwYWJpbGl0aWVzIiwicmVxdWlyZWRDYXBhYmlsaXRpZXMiLCJjYXBhYmlsaXRpZXMiLCJfIiwiaXNQbGFpbk9iamVjdCIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiU0VTU0lPTlNfQ0FDSEUiLCJnZXRQcm90b2NvbCIsImlzU2Vzc2lvbkNvbW1hbmQiLCJjb21tYW5kIiwiaW5jbHVkZXMiLCJOT19TRVNTSU9OX0lEX0NPTU1BTkRTIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJnZXRMb2dnZXIiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwiY29uc3RydWN0b3IiLCJuYW1lIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaGFzIiwiZXJyb3IiLCJ2YWx1ZSIsInB1dFNlc3Npb24iLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsInJlc2V0TG9nZ2VyIiwiZXJyIiwiYWN0dWFsRXJyIiwiZXJyTXNnIiwic3RhY2siLCJQcm94eVJlcXVlc3RFcnJvciIsImdldEFjdHVhbEVycm9yIiwiaXNTdHJpbmciLCJzZW5kIiwianNvbiIsInRvTG93ZXJDYXNlIiwiQiIsInJlc29sdmUiLCJkb25lIiwicHJveHlBY3RpdmUiLCJwcm94eVJvdXRlSXNBdm9pZGVkIiwib3JpZ2luYWxVcmwiLCJpbmZvIiwiY2FuUHJveHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7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XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcixcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBNRVRIT0RfTUFQLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTIH0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzLFxufSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgTUFYX0xPR19CT0RZX0xFTkdUSCwgUFJPVE9DT0xTLCBERUZBVUxUX0JBU0VfUEFUSCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgU0VTU0lPTlNfQ0FDSEUgZnJvbSAnLi9zZXNzaW9ucy1jYWNoZSc7XG5cblxuY29uc3QgQ1JFQVRFX1NFU1NJT05fQ09NTUFORCA9ICdjcmVhdGVTZXNzaW9uJztcbmNvbnN0IERFTEVURV9TRVNTSU9OX0NPTU1BTkQgPSAnZGVsZXRlU2Vzc2lvbic7XG5jb25zdCBHRVRfU1RBVFVTX0NPTU1BTkQgPSAnZ2V0U3RhdHVzJztcblxuY2xhc3MgUHJvdG9jb2wge31cblxuZnVuY3Rpb24gZGV0ZXJtaW5lUHJvdG9jb2wgKGRlc2lyZWRDYXBhYmlsaXRpZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLCBjYXBhYmlsaXRpZXMpIHtcbiAgcmV0dXJuIF8uaXNQbGFpbk9iamVjdChjYXBhYmlsaXRpZXMpID9cbiAgICBQUk9UT0NPTFMuVzNDIDpcbiAgICBQUk9UT0NPTFMuTUpTT05XUDtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sIChkcml2ZXIsIHNlc3Npb25JZCA9IG51bGwpIHtcbiAgY29uc3QgZHN0RHJpdmVyID0gXy5pc0Z1bmN0aW9uKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKVxuICAgID8gZHJpdmVyLmRyaXZlckZvclNlc3Npb24oc2Vzc2lvbklkKVxuICAgIDogZHJpdmVyO1xuICBpZiAoZHN0RHJpdmVyID09PSBkcml2ZXIpIHtcbiAgICAvLyBTaG9ydGNpcmN1aXQgaWYgdGhlIGRyaXZlciBpbnN0YW5jZSBpcyBub3QgYW4gdW1icmVsbGEgZHJpdmVyXG4gICAgLy8gb3IgaXQgaXMgRmFrZSBkcml2ZXIgaW5zdGFuY2UsIHdoZXJlIGBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbmBcbiAgICAvLyBhbHdheXMgcmV0dXJucyBzZWxmIGluc3RhbmNlXG4gICAgcmV0dXJuIGRyaXZlci5wcm90b2NvbDtcbiAgfVxuXG4gIC8vIEV4dHJhY3QgdGhlIHByb3RvY29sIGZvciB0aGUgY3VycmVudCBzZXNzaW9uIGlmIHRoZSBnaXZlbiBkcml2ZXIgaXMgdGhlIHVtYnJlbGxhIG9uZVxuICByZXR1cm4gZHN0RHJpdmVyID8gZHN0RHJpdmVyLnByb3RvY29sIDogU0VTU0lPTlNfQ0FDSEUuZ2V0UHJvdG9jb2woc2Vzc2lvbklkKTtcbn1cblxuZnVuY3Rpb24gaXNTZXNzaW9uQ29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gIV8uaW5jbHVkZXMoTk9fU0VTU0lPTl9JRF9DT01NQU5EUywgY29tbWFuZCk7XG59XG5cbmZ1bmN0aW9uIHdyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBwZXJmb3JtVG91Y2ggd2hpY2ggdGFrZSBhIHNpbmdsZSBwYXJhbWV0ZXIgKHByaW1pdGl2ZSB0eXBlIG9yIGFycmF5KS5cbiAgICogU29tZSBkcml2ZXJzIGNob29zZSB0byBwYXNzIHRoaXMgcGFyYW1ldGVyIGFzIGEgdmFsdWUgKGVnLiBbYWN0aW9uMSwgYWN0aW9uMi4uLl0pIHdoaWxlIG90aGVycyB0b1xuICAgKiB3cmFwIGl0IHdpdGhpbiBhbiBvYmplY3QoZWcnIHtnZXN0dXJlOiAgW2FjdGlvbjEsIGFjdGlvbjIuLi5dfSksIHdoaWNoIG1ha2VzIGl0IGhhcmQgdG8gdmFsaWRhdGUuXG4gICAqIFRoZSB3cmFwIG9wdGlvbiBpbiB0aGUgc3BlYyBlbmZvcmNlIHdyYXBwaW5nIGJlZm9yZSB2YWxpZGF0aW9uLCBzbyB0aGF0IGFsbCBwYXJhbXMgYXJlIHdyYXBwZWQgYXRcbiAgICogdGhlIHRpbWUgdGhleSBhcmUgdmFsaWRhdGVkIGFuZCBsYXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmRzLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzQXJyYXkoanNvbk9iaikgfHwgIV8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICByZXMgPSB7fTtcbiAgICByZXNbcGFyYW1TZXRzLndyYXBdID0ganNvbk9iajtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiB1bndyYXBQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaikge1xuICAvKiBUaGVyZSBhcmUgY29tbWFuZHMgbGlrZSBzZXROZXR3b3JrQ29ubmVjdGlvbiB3aGljaCBzZW5kIHBhcmFtZXRlcnMgd3JhcHBlZCBpbnNpZGUgYSBrZXkgc3VjaCBhc1xuICAgKiBcInBhcmFtZXRlcnNcIi4gVGhpcyBmdW5jdGlvbiB1bndyYXBzIHRoZW0gKGVnLiB7XCJwYXJhbWV0ZXJzXCI6IHtcInR5cGVcIjogMX19IGJlY29tZXMge1widHlwZVwiOiAxfSkuXG4gICAqL1xuICBsZXQgcmVzID0ganNvbk9iajtcbiAgaWYgKF8uaXNPYmplY3QoanNvbk9iaikpIHtcbiAgICAvLyBzb21lIGNsaWVudHMsIGxpa2UgcnVieSwgZG9uJ3Qgd3JhcFxuICAgIGlmIChqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdKSB7XG4gICAgICByZXMgPSBqc29uT2JqW3BhcmFtU2V0cy51bndyYXBdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjaGVja1BhcmFtcyAocGFyYW1TZXRzLCBqc29uT2JqLCBwcm90b2NvbCkge1xuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBbXTtcbiAgbGV0IG9wdGlvbmFsUGFyYW1zID0gW107XG4gIGxldCByZWNlaXZlZFBhcmFtcyA9IF8ua2V5cyhqc29uT2JqKTtcblxuICBpZiAocGFyYW1TZXRzKSB7XG4gICAgaWYgKHBhcmFtU2V0cy5yZXF1aXJlZCkge1xuICAgICAgLy8gd2UgbWlnaHQgaGF2ZSBhbiBhcnJheSBvZiBwYXJhbWV0ZXJzLFxuICAgICAgLy8gb3IgYW4gYXJyYXkgb2YgYXJyYXlzIG9mIHBhcmFtZXRlcnMsIHNvIHN0YW5kYXJkaXplXG4gICAgICBpZiAoIV8uaXNBcnJheShfLmZpcnN0KHBhcmFtU2V0cy5yZXF1aXJlZCkpKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gW3BhcmFtU2V0cy5yZXF1aXJlZF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtU2V0cy5yZXF1aXJlZDtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUganVzdCBhbiBhcnJheVxuICAgIGlmIChwYXJhbVNldHMub3B0aW9uYWwpIHtcbiAgICAgIG9wdGlvbmFsUGFyYW1zID0gcGFyYW1TZXRzLm9wdGlvbmFsO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGFzIHRoZSAndmFsaWRhdGUnIGtleSwgaXQgd2lsbCBoZXJlIGJlIGNhbGxlZCB3aXRoXG4gICAgLy8ganNvbk9iaiBhcyB0aGUgcGFyYW0uIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGZhbHN5LCB2ZXJpZmljYXRpb24gd2lsbCBiZVxuICAgIC8vIGNvbnNpZGVyZWQgdG8gaGF2ZSBwYXNzZWQuIElmIGl0IHJldHVybnMgc29tZXRoaW5nIGVsc2UsIHRoYXQgd2lsbCBiZSB0aGVcbiAgICAvLyBhcmd1bWVudCB0byBhbiBlcnJvciB3aGljaCBpcyB0aHJvd24gdG8gdGhlIHVzZXJcbiAgICBpZiAocGFyYW1TZXRzLnZhbGlkYXRlKSB7XG4gICAgICBsZXQgbWVzc2FnZSA9IHBhcmFtU2V0cy52YWxpZGF0ZShqc29uT2JqLCBwcm90b2NvbCk7XG4gICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihtZXNzYWdlLCBqc29uT2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpZiB3ZSBoYXZlIG5vIHJlcXVpcmVkIHBhcmFtZXRlcnMsIGFsbCBpcyB3ZWxsXG4gIGlmIChyZXF1aXJlZFBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiB0aGUgc2Vzc2lvbiBpZCBpbiB0aGUgcGFyYW1zXG4gIGlmIChvcHRpb25hbFBhcmFtcy5pbmRleE9mKCdzZXNzaW9uSWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdzZXNzaW9uSWQnKTtcbiAgfVxuXG4gIC8vIHNvbWUgY2xpZW50cyBwYXNzIGluIGFuIGVsZW1lbnQgaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignaWQnKSA9PT0gLTEpIHtcbiAgICBvcHRpb25hbFBhcmFtcy5wdXNoKCdpZCcpO1xuICB9XG5cbiAgLy8gZ28gdGhyb3VnaCB0aGUgcmVxdWlyZWQgcGFyYW1ldGVycyBhbmQgY2hlY2sgYWdhaW5zdCBvdXIgYXJndW1lbnRzXG4gIGZvciAobGV0IHBhcmFtcyBvZiByZXF1aXJlZFBhcmFtcykge1xuICAgIGlmIChfLmRpZmZlcmVuY2UocmVjZWl2ZWRQYXJhbXMsIHBhcmFtcywgb3B0aW9uYWxQYXJhbXMpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICBfLmRpZmZlcmVuY2UocGFyYW1zLCByZWNlaXZlZFBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyB3ZSBoYXZlIGEgc2V0IG9mIHBhcmFtZXRlcnMgdGhhdCBpcyBjb3JyZWN0XG4gICAgICAvLyBzbyBzaG9ydC1jaXJjdWl0XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBlcnJvcnMuQmFkUGFyYW1ldGVyc0Vycm9yKHBhcmFtU2V0cywgcmVjZWl2ZWRQYXJhbXMpO1xufVxuXG4vKlxuICogVGhpcyBtZXRob2QgdGFrZXMgMyBwaWVjZXMgb2YgZGF0YTogcmVxdWVzdCBwYXJhbWV0ZXJzICgncmVxdWVzdFBhcmFtcycpLFxuICogYSByZXF1ZXN0IEpTT04gYm9keSAoJ2pzb25PYmonKSwgYW5kICdwYXlsb2FkUGFyYW1zJywgd2hpY2ggaXMgdGhlIHNlY3Rpb25cbiAqIGZyb20gdGhlIHJvdXRlIGRlZmluaXRpb24gZm9yIGEgcGFydGljdWxhciBlbmRwb2ludCB3aGljaCBoYXMgaW5zdHJ1Y3Rpb25zXG4gKiBvbiBoYW5kbGluZyBwYXJhbWV0ZXJzLiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsXG4gKiBiZSBhcHBsaWVkIHRvIGEgY29tbWFuZC5cbiAqL1xuZnVuY3Rpb24gbWFrZUFyZ3MgKHJlcXVlc3RQYXJhbXMsIGpzb25PYmosIHBheWxvYWRQYXJhbXMsIHByb3RvY29sKSB7XG4gIC8vIFdlIHdhbnQgdG8gcGFzcyB0aGUgXCJ1cmxcIiBwYXJhbWV0ZXJzIHRvIHRoZSBjb21tYW5kcyBpbiByZXZlcnNlIG9yZGVyXG4gIC8vIHNpbmNlIHRoZSBjb21tYW5kIHdpbGwgc29tZXRpbWVzIHdhbnQgdG8gaWdub3JlLCBzYXksIHRoZSBzZXNzaW9uSWQuXG4gIC8vIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHV0dGluZyBzZXNzaW9uSWQgbGFzdCwgd2hpY2ggbWVhbnMgaW4gSlMgd2UgY2FuXG4gIC8vIG9taXQgaXQgZnJvbSB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGlmIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgaXQuXG4gIGxldCB1cmxQYXJhbXMgPSBfLmtleXMocmVxdWVzdFBhcmFtcykucmV2ZXJzZSgpO1xuXG4gIC8vIEluIHRoZSBzaW1wbGUgY2FzZSwgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIGEgYmFzaWMgYXJyYXkgaW5cbiAgLy8gcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCwgc28gc3RhcnQgdGhlcmUuIEl0J3MgcG9zc2libGUgdGhhdCB0aGVyZSBhcmVcbiAgLy8gbXVsdGlwbGUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRob3VnaCwgc28gaGFuZGxlIHRoYXQgY2FzZVxuICAvLyB0b28uXG4gIGxldCByZXF1aXJlZFBhcmFtcyA9IHBheWxvYWRQYXJhbXMucmVxdWlyZWQ7XG4gIGlmIChfLmlzQXJyYXkoXy5maXJzdChwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSkpIHtcbiAgICAvLyBJZiB0aGVyZSBhcmUgb3B0aW9uYWwgc2V0cyBvZiByZXF1aXJlZCBwYXJhbXMsIHRoZW4gd2Ugd2lsbCBoYXZlIGFuXG4gICAgLy8gYXJyYXkgb2YgYXJyYXlzIGluIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIGxvb3AgdGhyb3VnaCBlYWNoIHNldCBhbmRcbiAgICAvLyBwaWNrIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHdoaWNoIEpTT04gcGFyYW1zIHdlcmUgYWN0dWFsbHkgc2VudC4gV2UndmVcbiAgICAvLyBhbHJlYWR5IGJlZW4gdGhyb3VnaCB2YWxpZGF0aW9uIHNvIHdlJ3JlIGd1YXJhbnRlZWQgdG8gZmluZCBhIG1hdGNoLlxuICAgIGxldCBrZXlzID0gXy5rZXlzKGpzb25PYmopO1xuICAgIGZvciAobGV0IHBhcmFtcyBvZiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkKSB7XG4gICAgICBpZiAoXy53aXRob3V0KHBhcmFtcywgLi4ua2V5cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlcXVpcmVkUGFyYW1zID0gcGFyYW1zO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBOb3cgd2UgY29uc3RydWN0IG91ciBsaXN0IG9mIGFyZ3VtZW50cyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgY29tbWFuZFxuICBsZXQgYXJncztcbiAgaWYgKF8uaXNGdW5jdGlvbihwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKSkge1xuICAgIC8vIEluIHRoZSByb3V0ZSBzcGVjLCBhIHBhcnRpY3VsYXIgcm91dGUgbWlnaHQgZGVmaW5lIGEgJ21ha2VBcmdzJyBmdW5jdGlvblxuICAgIC8vIGlmIGl0IHdhbnRzIGZ1bGwgY29udHJvbCBvdmVyIGhvdyB0byB0dXJuIEpTT04gcGFyYW1ldGVycyBpbnRvIGNvbW1hbmRcbiAgICAvLyBhcmd1bWVudHMuIFNvIHdlIHBhc3MgaXQgdGhlIEpTT04gcGFyYW1ldGVycyBhbmQgaXQgcmV0dXJucyBhbiBhcnJheVxuICAgIC8vIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgaGFuZGxpbmcgY29tbWFuZC4gRm9yIGV4YW1wbGUgaWYgaXQgcmV0dXJuc1xuICAgIC8vIFsxLCAyLCAzXSwgd2Ugd2lsbCBjYWxsIGBjb21tYW5kKDEsIDIsIDMsIC4uLilgICh1cmwgcGFyYW1zIGFyZSBzZXBhcmF0ZVxuICAgIC8vIGZyb20gSlNPTiBwYXJhbXMgYW5kIGdldCBjb25jYXRlbmF0ZWQgYmVsb3cpLlxuICAgIGFyZ3MgPSBwYXlsb2FkUGFyYW1zLm1ha2VBcmdzKGpzb25PYmosIHByb3RvY29sKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIGNvbGxlY3QgYWxsIHRoZSByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1zIGFuZCBmbGF0dGVuIHRoZW1cbiAgICAvLyBpbnRvIGFuIGFyZ3VtZW50IGFycmF5XG4gICAgYXJncyA9IF8uZmxhdHRlbihyZXF1aXJlZFBhcmFtcykubWFwKChwKSA9PiBqc29uT2JqW3BdKTtcbiAgICBpZiAocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkge1xuICAgICAgYXJncyA9IGFyZ3MuY29uY2F0KF8uZmxhdHRlbihwYXlsb2FkUGFyYW1zLm9wdGlvbmFsKS5tYXAoKHApID0+IGpzb25PYmpbcF0pKTtcbiAgICB9XG4gIH1cbiAgLy8gRmluYWxseSwgZ2V0IG91ciB1cmwgcGFyYW1zIChzZXNzaW9uIGlkLCBlbGVtZW50IGlkLCBldGMuLi4pIG9uIHRoZSBlbmQgb2ZcbiAgLy8gdGhlIGxpc3RcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVybFBhcmFtcy5tYXAoKHUpID0+IHJlcXVlc3RQYXJhbXNbdV0pKTtcbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmZ1bmN0aW9uIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiAoZHJpdmVyKSB7XG4gIGlmICghZHJpdmVyLnNlc3Npb25FeGlzdHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0RyaXZlcnMgdXNlZCB3aXRoIE1KU09OV1AgbXVzdCBpbXBsZW1lbnQgYHNlc3Npb25FeGlzdHNgJyk7XG4gIH1cblxuICBpZiAoIShkcml2ZXIuZXhlY3V0ZUNvbW1hbmQgfHwgZHJpdmVyLmV4ZWN1dGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIHVzZWQgd2l0aCBNSlNPTldQIG11c3QgaW1wbGVtZW50IGBleGVjdXRlQ29tbWFuZGAgb3IgYGV4ZWN1dGVgJyk7XG4gIH1cblxuICAvLyByZXR1cm4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIGFkZCBhbGwgdGhlIHJvdXRlcyB0byB0aGUgZHJpdmVyLiBIZXJlIGV4dHJhTWV0aG9kcyBtaWdodCBiZVxuICAvLyBwYXNzZWQgaW4gYXMgZGVmaW5lZCBieSBBcHBpdW0gcGx1Z2lucywgc28gd2UgbmVlZCB0byBhZGQgdGhvc2UgdG8gdGhlIGRlZmF1bHQgbGlzdFxuICByZXR1cm4gZnVuY3Rpb24gYWRkUm91dGVzIChhcHAsIHtiYXNlUGF0aCA9IERFRkFVTFRfQkFTRV9QQVRILCBleHRyYU1ldGhvZE1hcCA9IHt9fSkge1xuICAgIC8vIHN0b3JlIGJhc2VQYXRoIG9uIHRoZSBkcml2ZXIgaW5zdGFuY2Ugc28gaXQgY2FuIHVzZSBpdCBpZiBuZWNlc3NhcnlcbiAgICAvLyBmb3IgZXhhbXBsZSBpbiBkZXRlcm1pbmluZyBwcm94eSBhdm9pZGFuY2VcbiAgICBkcml2ZXIuYmFzZVBhdGggPSBiYXNlUGF0aDtcblxuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB7Li4uTUVUSE9EX01BUCwgLi4uZXh0cmFNZXRob2RNYXB9O1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgbWV0aG9kc10gb2YgXy50b1BhaXJzKGFsbE1ldGhvZHMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2QsIHNwZWNdIG9mIF8udG9QYWlycyhtZXRob2RzKSkge1xuICAgICAgICAvLyBzZXQgdXAgdGhlIGV4cHJlc3Mgcm91dGUgaGFuZGxlclxuICAgICAgICBidWlsZEhhbmRsZXIoYXBwLCBtZXRob2QsIGAke2Jhc2VQYXRofSR7cGF0aH1gLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc2lvbkNvbW1hbmQoc3BlYy5jb21tYW5kKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEhhbmRsZXIgKGFwcCwgbWV0aG9kLCBwYXRoLCBzcGVjLCBkcml2ZXIsIGlzU2Vzc0NtZCkge1xuICBsZXQgYXN5bmNIYW5kbGVyID0gYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgbGV0IGpzb25PYmogPSByZXEuYm9keTtcbiAgICBsZXQgaHR0cFJlc0JvZHkgPSB7fTtcbiAgICBsZXQgaHR0cFN0YXR1cyA9IDIwMDtcbiAgICBsZXQgbmV3U2Vzc2lvbklkO1xuICAgIGxldCBjdXJyZW50UHJvdG9jb2wgPSBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gaWYgdGhpcyBpcyBhIHNlc3Npb24gY29tbWFuZCBidXQgd2UgZG9uJ3QgaGF2ZSBhIHNlc3Npb24sXG4gICAgICAvLyBlcnJvciBvdXQgZWFybHkgKGVzcGVjaWFsbHkgYmVmb3JlIHByb3h5aW5nKVxuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhZHJpdmVyLnNlc3Npb25FeGlzdHMocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm9TdWNoRHJpdmVyRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIGRyaXZlciBpcyBjdXJyZW50bHkgcHJveHlpbmcgY29tbWFuZHMgdG8gYW5vdGhlciBKU09OV1Agc2VydmVyLCBieXBhc3MgYWxsIG91clxuICAgICAgLy8gY2hlY2tzIGFuZCBhc3N1bWUgdGhlIHVwc3RyZWFtIHNlcnZlciBrbm93cyB3aGF0IGl0J3MgZG9pbmcuIEJ1dCBrZWVwIHRoaXMgaW4gdGhlXG4gICAgICAvLyB0cnkvY2F0Y2ggYmxvY2sgc28gaWYgcHJveHlpbmcgaXRzZWxmIGZhaWxzLCB3ZSBnaXZlIGEgbWVzc2FnZSB0byB0aGUgY2xpZW50LiBPZiBjb3Vyc2Ugd2VcbiAgICAgIC8vIG9ubHkgd2FudCB0byBkbyB0aGVzZSB3aGVuIHdlIGhhdmUgYSBzZXNzaW9uIGNvbW1hbmQ7IHRoZSBBcHBpdW0gZHJpdmVyIG11c3QgYmVcbiAgICAgIC8vIHJlc3BvbnNpYmxlIGZvciBzdGFydC9zdG9wIHNlc3Npb24sIGV0Yy4uLiBXZSBhbHNvIGFsbG93IHRoZSBjb21tYW5kIHNwZWMgdG8gZGVjbGFyZSB0aGF0XG4gICAgICAvLyB0aGlzIGNvbW1hbmQgc2hvdWxkIG5ldmVyIGJlIHByb3hpZWQgKHdoaWNoIGlzIHVzZWZ1bCBmb3IgcGx1Z2luIGRldmVsb3BlcnMgd2hvIGFkZFxuICAgICAgLy8gY29tbWFuZHMgYW5kIGdlbmVyYWxseSB3b3VsZCBub3Qgd2FudCB0aGF0IGNvbW1hbmQgdG8gYmUgcHJveGllZCBpbnN0ZWFkIG9mIGhhbmRsZWQgYnkgdGhlXG4gICAgICAvLyBwbHVnaW4pXG4gICAgICBsZXQgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IGZhbHNlO1xuICAgICAgaWYgKGlzU2Vzc0NtZCAmJiAhc3BlYy5uZXZlclByb3h5ICYmIGRyaXZlclNob3VsZERvSndwUHJveHkoZHJpdmVyLCByZXEsIHNwZWMuY29tbWFuZCkpIHtcbiAgICAgICAgaWYgKCFkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kIHx8XG4gICAgICAgICAgICBkcml2ZXIucGx1Z2luc1RvSGFuZGxlQ21kKHNwZWMuY29tbWFuZCwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGF3YWl0IGRvSndwUHJveHkoZHJpdmVyLCByZXEsIHJlcyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZyhgV291bGQgaGF2ZSBwcm94aWVkIGAgK1xuICAgICAgICAgIGBjb21tYW5kIGRpcmVjdGx5LCBidXQgYSBwbHVnaW4gZXhpc3RzIHdoaWNoIG1pZ2h0IHJlcXVpcmUgaXRzIHZhbHVlLCBzbyB3aWxsIGxldCBgICtcbiAgICAgICAgICBgaXRzIHZhbHVlIGJlIGNvbGxlY3RlZCBpbnRlcm5hbGx5IGFuZCBtYWRlIHBhcnQgb2YgcGx1Z2luIGNoYWluYCk7XG4gICAgICAgIGRpZFBsdWdpbk92ZXJyaWRlUHJveHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhIGNvbW1hbmQgaXMgbm90IGluIG91ciBtZXRob2QgbWFwLCBpdCdzIGJlY2F1c2Ugd2VcbiAgICAgIC8vIGhhdmUgbm8gcGxhbnMgdG8gZXZlciBpbXBsZW1lbnQgaXRcbiAgICAgIGlmICghc3BlYy5jb21tYW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnMuTm90SW1wbGVtZW50ZWRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyB3cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLndyYXApIHtcbiAgICAgICAganNvbk9iaiA9IHdyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgLy8gdW53cmFwIHBhcmFtcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChzcGVjLnBheWxvYWRQYXJhbXMgJiYgc3BlYy5wYXlsb2FkUGFyYW1zLnVud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gdW53cmFwUGFyYW1zKHNwZWMucGF5bG9hZFBhcmFtcywganNvbk9iaik7XG4gICAgICB9XG5cbiAgICAgIGlmIChzcGVjLmNvbW1hbmQgPT09IENSRUFURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICAgICAgLy8gdHJ5IHRvIGRldGVybWluZSBwcm90b2NvbCBieSBzZXNzaW9uIGNyZWF0aW9uIGFyZ3MsIHNvIHdlIGNhbiB0aHJvdyBhXG4gICAgICAgIC8vIHByb3Blcmx5IGZvcm1hdHRlZCBlcnJvciBpZiBhcmd1bWVudHMgdmFsaWRhdGlvbiBmYWlsc1xuICAgICAgICBjdXJyZW50UHJvdG9jb2wgPSBkZXRlcm1pbmVQcm90b2NvbCguLi5tYWtlQXJncyhyZXEucGFyYW1zLCBqc29uT2JqLCBzcGVjLnBheWxvYWRQYXJhbXMgfHwge30pKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW5zdXJlIHRoYXQgdGhlIGpzb24gcGF5bG9hZCBjb25mb3JtcyB0byB0aGUgc3BlY1xuICAgICAgY2hlY2tQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqLCBjdXJyZW50UHJvdG9jb2wpO1xuXG4gICAgICAvLyB0dXJuIHRoZSBjb21tYW5kIGFuZCBqc29uIHBheWxvYWQgaW50byBhbiBhcmd1bWVudCBsaXN0IGZvclxuICAgICAgLy8gdGhlIGRyaXZlciBtZXRob2RzXG4gICAgICBsZXQgYXJncyA9IG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSwgY3VycmVudFByb3RvY29sKTtcbiAgICAgIGxldCBkcml2ZXJSZXM7XG4gICAgICAvLyB2YWxpZGF0ZSBjb21tYW5kIGFyZ3MgYWNjb3JkaW5nIHRvIE1KU09OV1BcbiAgICAgIGlmICh2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0pIHtcbiAgICAgICAgdmFsaWRhdG9yc1tzcGVjLmNvbW1hbmRdKC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvLyBydW4gdGhlIGRyaXZlciBjb21tYW5kIHdyYXBwZWQgaW5zaWRlIHRoZSBhcmd1bWVudCB2YWxpZGF0b3JzXG4gICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYENhbGxpbmcgYCArXG4gICAgICAgIGAke2RyaXZlci5jb25zdHJ1Y3Rvci5uYW1lfS4ke3NwZWMuY29tbWFuZH0oKSB3aXRoIGFyZ3M6IGAgK1xuICAgICAgICBfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGFyZ3MpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSkpO1xuXG4gICAgICBpZiAoZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSkge1xuICAgICAgICAvLyBUT0RPIGZvciBub3cgd2UgYWRkIHRoaXMgaW5mb3JtYXRpb24gb24gdGhlIGFyZ3MgbGlzdCwgYnV0IHRoYXQncyBtaXhpbmcgcHVycG9zZXMgaGVyZS5cbiAgICAgICAgLy8gV2UgcmVhbGx5IHNob3VsZCBhZGQgYW5vdGhlciAnb3B0aW9ucycgcGFyYW1ldGVyIHRvICdleGVjdXRlQ29tbWFuZCcsIGJ1dCB0aGlzIHdvdWxkIGJlXG4gICAgICAgIC8vIGEgYnJlYWtpbmcgY2hhbmdlIGZvciBhbGwgZHJpdmVycyBzbyB3b3VsZCBuZWVkIHRvIGJlIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICAgICAgICBhcmdzLnB1c2goe3JlcUZvclByb3h5OiByZXF9KTtcbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKHNwZWMuY29tbWFuZCwgLi4uYXJncyk7XG5cbiAgICAgIC8vIEdldCB0aGUgcHJvdG9jb2wgYWZ0ZXIgZXhlY3V0ZUNvbW1hbmRcbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKSB8fCBjdXJyZW50UHJvdG9jb2w7XG5cbiAgICAgIC8vIElmIGBleGVjdXRlQ29tbWFuZGAgd2FzIG92ZXJyaWRkZW4gYW5kIHRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3RcbiAgICAgIC8vIHdpdGggYSBwcm90b2NvbCBhbmQgdmFsdWUvZXJyb3IgcHJvcGVydHksIHJlLWFzc2lnbiB0aGUgcHJvdG9jb2xcbiAgICAgIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzKSAmJiBfLmhhcyhkcml2ZXJSZXMsICdwcm90b2NvbCcpKSB7XG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRyaXZlclJlcy5wcm90b2NvbCB8fCBjdXJyZW50UHJvdG9jb2w7XG4gICAgICAgIGlmIChkcml2ZXJSZXMuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBkcml2ZXJSZXMuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyB1bnBhY2sgY3JlYXRlU2Vzc2lvbiByZXNwb25zZVxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBuZXdTZXNzaW9uSWQgPSBkcml2ZXJSZXNbMF07XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLnB1dFNlc3Npb24obmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIobmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBDYWNoZWQgdGhlIHByb3RvY29sIHZhbHVlICcke2N1cnJlbnRQcm90b2NvbH0nIGZvciB0aGUgbmV3IHNlc3Npb24gJHtuZXdTZXNzaW9uSWR9YCk7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5NSlNPTldQKSB7XG4gICAgICAgICAgZHJpdmVyUmVzID0gZHJpdmVyUmVzWzFdO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICAgIGRyaXZlclJlcyA9IHtcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogZHJpdmVyUmVzWzFdLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZHJpdmVyUmVzID0gZm9ybWF0UmVzcG9uc2VWYWx1ZShkcml2ZXJSZXMpO1xuXG4gICAgICAvLyBkZWxldGUgc2hvdWxkIG5vdCByZXR1cm4gYW55dGhpbmcgZXZlbiBpZiBzdWNjZXNzZnVsXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKVxuICAgICAgICAgIC5kZWJ1ZyhgUmVjZWl2ZWQgcmVzcG9uc2U6ICR7Xy50cnVuY2F0ZShKU09OLnN0cmluZ2lmeShkcml2ZXJSZXMpLCB7bGVuZ3RoOiBNQVhfTE9HX0JPRFlfTEVOR1RIfSl9YCk7XG4gICAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgY3VycmVudFByb3RvY29sKS5kZWJ1ZygnQnV0IGRlbGV0aW5nIHNlc3Npb24sIHNvIG5vdCByZXR1cm5pbmcnKTtcbiAgICAgICAgZHJpdmVyUmVzID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgdGhlIHN0YXR1cyBpcyBub3QgMCwgIHRocm93IHRoZSBhcHByb3ByaWF0ZSBlcnJvciBmb3Igc3RhdHVzIGNvZGUuXG4gICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMpKSB7XG4gICAgICAgIGlmICh1dGlsLmhhc1ZhbHVlKGRyaXZlclJlcy5zdGF0dXMpICYmICFpc05hTihkcml2ZXJSZXMuc3RhdHVzKSAmJiBwYXJzZUludChkcml2ZXJSZXMuc3RhdHVzLCAxMCkgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21NSlNPTldQU3RhdHVzQ29kZShkcml2ZXJSZXMuc3RhdHVzLCBkcml2ZXJSZXMudmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMudmFsdWUpICYmIGRyaXZlclJlcy52YWx1ZS5lcnJvcikge1xuICAgICAgICAgIHRocm93IGVycm9yRnJvbVczQ0pzb25Db2RlKGRyaXZlclJlcy52YWx1ZS5lcnJvciwgZHJpdmVyUmVzLnZhbHVlLm1lc3NhZ2UsIGRyaXZlclJlcy52YWx1ZS5zdGFja3RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keS52YWx1ZSA9IGRyaXZlclJlcztcbiAgICAgIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQsIGN1cnJlbnRQcm90b2NvbCkuZGVidWcoYFJlc3BvbmRpbmcgYCArXG4gICAgICAgIGB0byBjbGllbnQgd2l0aCBkcml2ZXIuJHtzcGVjLmNvbW1hbmR9KCkgcmVzdWx0OiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2VlcCB0aGUgbG9nZ2VyIGluc3RhbmNlIGluIHRoZSBjYWNoZVxuICAgICAgICAvLyBhZnRlciB0aGUgc2Vzc2lvbiBpcyBkZWxldGVkLCBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBsb2dnaW5nIGhpc3RvcnlcbiAgICAgICAgLy8gYW5kIGNvbnN1bWVzIHRoZSBtZW1vcnlcbiAgICAgICAgU0VTU0lPTlNfQ0FDSEUucmVzZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgZmlndXJlIG91dCB3aGF0IG91ciByZXNwb25zZSBzaG91bGQgYmVcbiAgICAgIC8vIGJhc2VkIG9uIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgd2UgZW5jb3VudGVyZWRcbiAgICAgIGxldCBhY3R1YWxFcnIgPSBlcnI7XG5cbiAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGN1cnJlbnRQcm90b2NvbCB8fCBleHRyYWN0UHJvdG9jb2woZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpO1xuXG4gICAgICBsZXQgZXJyTXNnID0gZXJyLnN0YWNrdHJhY2UgfHwgZXJyLnN0YWNrO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKGVyck1zZywgZXJyLm1lc3NhZ2UpKSB7XG4gICAgICAgIC8vIGlmIHRoZSBtZXNzYWdlIGhhcyBtb3JlIGluZm9ybWF0aW9uLCBhZGQgaXQuIGJ1dCBvZnRlbiB0aGUgbWVzc2FnZVxuICAgICAgICAvLyBpcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgc3RhY2sgdHJhY2VcbiAgICAgICAgZXJyTXNnID0gYCR7ZXJyLm1lc3NhZ2V9JHtlcnJNc2cgPyAoJ1xcbicgKyBlcnJNc2cpIDogJyd9YDtcbiAgICAgIH1cbiAgICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgICAgYWN0dWFsRXJyID0gZXJyLmdldEFjdHVhbEVycm9yKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTRVNTSU9OU19DQUNIRS5nZXRMb2dnZXIocmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkLCBjdXJyZW50UHJvdG9jb2wpXG4gICAgICAgICAgLmRlYnVnKGBFbmNvdW50ZXJlZCBpbnRlcm5hbCBlcnJvciBydW5uaW5nIGNvbW1hbmQ6ICR7ZXJyTXNnfWApO1xuICAgICAgfVxuXG4gICAgICBbaHR0cFN0YXR1cywgaHR0cFJlc0JvZHldID0gZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcihhY3R1YWxFcnIpO1xuICAgIH1cblxuICAgIC8vIGRlY29kZSB0aGUgcmVzcG9uc2UsIHdoaWNoIGlzIGVpdGhlciBhIHN0cmluZyBvciBqc29uXG4gICAgaWYgKF8uaXNTdHJpbmcoaHR0cFJlc0JvZHkpKSB7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLnNlbmQoaHR0cFJlc0JvZHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobmV3U2Vzc2lvbklkKSB7XG4gICAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBodHRwUmVzQm9keS52YWx1ZS5zZXNzaW9uSWQgPSBuZXdTZXNzaW9uSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodHRwUmVzQm9keS5zZXNzaW9uSWQgPSByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBudWxsO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBzZXNzaW9uSWQgaW4gVzNDIHJlc3BvbnNlc1xuICAgICAgaWYgKGN1cnJlbnRQcm90b2NvbCA9PT0gUFJPVE9DT0xTLlczQykge1xuICAgICAgICBkZWxldGUgaHR0cFJlc0JvZHkuc2Vzc2lvbklkO1xuICAgICAgfVxuXG4gICAgICBodHRwUmVzQm9keSA9IGZvcm1hdFN0YXR1cyhodHRwUmVzQm9keSk7XG4gICAgICByZXMuc3RhdHVzKGh0dHBTdGF0dXMpLmpzb24oaHR0cFJlc0JvZHkpO1xuICAgIH1cbiAgfTtcbiAgLy8gYWRkIHRoZSBtZXRob2QgdG8gdGhlIGFwcFxuICBhcHBbbWV0aG9kLnRvTG93ZXJDYXNlKCldKHBhdGgsIChyZXEsIHJlcykgPT4ge1xuICAgIEIucmVzb2x2ZShhc3luY0hhbmRsZXIocmVxLCByZXMpKS5kb25lKCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkcml2ZXJTaG91bGREb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgY29tbWFuZCkge1xuICAvLyBkcml2ZXJzIG5lZWQgdG8gZXhwbGljaXRseSBzYXkgd2hlbiB0aGUgcHJveHkgaXMgYWN0aXZlXG4gIGlmICghZHJpdmVyLnByb3h5QWN0aXZlKHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHdlIHNob3VsZCBuZXZlciBwcm94eSBkZWxldGVTZXNzaW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBnaXZlIHRoZSBjb250YWluaW5nXG4gIC8vIGRyaXZlciBhbiBvcHBvcnR1bml0eSB0byBjbGVhbiBpdHNlbGYgdXBcbiAgaWYgKGNvbW1hbmQgPT09IERFTEVURV9TRVNTSU9OX0NPTU1BTkQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB2YWxpZGF0ZSBhdm9pZGFuY2Ugc2NoZW1hLCBhbmQgc2F5IHdlIHNob3VsZG4ndCBwcm94eSBpZiBhbnl0aGluZyBpbiB0aGVcbiAgLy8gYXZvaWQgbGlzdCBtYXRjaGVzIG91ciByZXFcbiAgaWYgKGRyaXZlci5wcm94eVJvdXRlSXNBdm9pZGVkKHJlcS5wYXJhbXMuc2Vzc2lvbklkLCByZXEubWV0aG9kLCByZXEub3JpZ2luYWxVcmwsIHJlcS5ib2R5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkb0p3cFByb3h5IChkcml2ZXIsIHJlcSwgcmVzKSB7XG4gIFNFU1NJT05TX0NBQ0hFLmdldExvZ2dlcihyZXEucGFyYW1zLnNlc3Npb25JZCwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpKVxuICAgIC5pbmZvKCdEcml2ZXIgcHJveHkgYWN0aXZlLCBwYXNzaW5nIHJlcXVlc3Qgb24gdmlhIEhUVFAgcHJveHknKTtcblxuICAvLyBjaGVjayB0aGF0IHRoZSBpbm5lciBkcml2ZXIgaGFzIGEgcHJveHkgZnVuY3Rpb25cbiAgaWYgKCFkcml2ZXIuY2FuUHJveHkocmVxLnBhcmFtcy5zZXNzaW9uSWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUcnlpbmcgdG8gcHJveHkgdG8gYSBzZXJ2ZXIgYnV0IHRoZSBkcml2ZXIgaXMgdW5hYmxlIHRvIHByb3h5Jyk7XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoJ3Byb3h5UmVxUmVzJywgcmVxLCByZXMsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGlzRXJyb3JUeXBlKGVyciwgZXJyb3JzLlByb3h5UmVxdWVzdEVycm9yKSkge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBwcm94eS4gUHJveHkgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG59XG5cblxuZXhwb3J0IHtcbiAgUHJvdG9jb2wsIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXSwiZmlsZSI6ImxpYi9wcm90b2NvbC9wcm90b2NvbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
393
+ }
394
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9wcm90b2NvbC9wcm90b2NvbC5qcyJdLCJuYW1lcyI6WyJDUkVBVEVfU0VTU0lPTl9DT01NQU5EIiwiREVMRVRFX1NFU1NJT05fQ09NTUFORCIsIkdFVF9TVEFUVVNfQ09NTUFORCIsImRldGVybWluZVByb3RvY29sIiwiY3JlYXRlU2Vzc2lvbkFyZ3MiLCJfIiwic29tZSIsImlzVzNjQ2FwcyIsIlBST1RPQ09MUyIsIlczQyIsIk1KU09OV1AiLCJleHRyYWN0UHJvdG9jb2wiLCJkcml2ZXIiLCJzZXNzaW9uSWQiLCJkc3REcml2ZXIiLCJpc0Z1bmN0aW9uIiwiZHJpdmVyRm9yU2Vzc2lvbiIsInByb3RvY29sIiwiaXNTZXNzaW9uQ29tbWFuZCIsImNvbW1hbmQiLCJpbmNsdWRlcyIsIk5PX1NFU1NJT05fSURfQ09NTUFORFMiLCJnZXRMb2dnZXIiLCJsb2ciLCJpbmZvIiwibG9nUHJlZml4IiwiY29uc3RydWN0b3IiLCJuYW1lIiwibm9kZSIsImdldE9iamVjdElkIiwic3Vic3RyaW5nIiwibG9nZ2VyIiwid3JhcFBhcmFtcyIsInBhcmFtU2V0cyIsImpzb25PYmoiLCJyZXMiLCJpc0FycmF5IiwiaXNPYmplY3QiLCJ3cmFwIiwidW53cmFwUGFyYW1zIiwidW53cmFwIiwiY2hlY2tQYXJhbXMiLCJyZXF1aXJlZFBhcmFtcyIsIm9wdGlvbmFsUGFyYW1zIiwicmVjZWl2ZWRQYXJhbXMiLCJrZXlzIiwicmVxdWlyZWQiLCJmaXJzdCIsIm9wdGlvbmFsIiwidmFsaWRhdGUiLCJtZXNzYWdlIiwiZXJyb3JzIiwiQmFkUGFyYW1ldGVyc0Vycm9yIiwibGVuZ3RoIiwiaW5kZXhPZiIsInB1c2giLCJwYXJhbXMiLCJkaWZmZXJlbmNlIiwibWFrZUFyZ3MiLCJyZXF1ZXN0UGFyYW1zIiwicGF5bG9hZFBhcmFtcyIsInVybFBhcmFtcyIsInJldmVyc2UiLCJ3aXRob3V0IiwiYXJncyIsImZsYXR0ZW4iLCJtYXAiLCJwIiwiY29uY2F0IiwidSIsInJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiIsInNlc3Npb25FeGlzdHMiLCJFcnJvciIsImV4ZWN1dGVDb21tYW5kIiwiZXhlY3V0ZSIsImFkZFJvdXRlcyIsImFwcCIsImJhc2VQYXRoIiwiREVGQVVMVF9CQVNFX1BBVEgiLCJleHRyYU1ldGhvZE1hcCIsImFsbE1ldGhvZHMiLCJNRVRIT0RfTUFQIiwicGF0aCIsIm1ldGhvZHMiLCJ0b1BhaXJzIiwibWV0aG9kIiwic3BlYyIsImJ1aWxkSGFuZGxlciIsImlzU2Vzc0NtZCIsImFzeW5jSGFuZGxlciIsInJlcSIsImJvZHkiLCJodHRwUmVzQm9keSIsImh0dHBTdGF0dXMiLCJuZXdTZXNzaW9uSWQiLCJjdXJyZW50UHJvdG9jb2wiLCJOb1N1Y2hEcml2ZXJFcnJvciIsImRpZFBsdWdpbk92ZXJyaWRlUHJveHkiLCJuZXZlclByb3h5IiwiZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSIsInBsdWdpbnNUb0hhbmRsZUNtZCIsImRvSndwUHJveHkiLCJkZWJ1ZyIsIk5vdEltcGxlbWVudGVkRXJyb3IiLCJkcml2ZXJSZXMiLCJ2YWxpZGF0b3JzIiwidHJ1bmNhdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiTUFYX0xPR19CT0RZX0xFTkdUSCIsInJlcUZvclByb3h5IiwiaXNQbGFpbk9iamVjdCIsImhhcyIsImVycm9yIiwidmFsdWUiLCJjYXBhYmlsaXRpZXMiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzdGF0dXMiLCJpc05hTiIsInBhcnNlSW50Iiwic3RhY2t0cmFjZSIsImVyciIsImFjdHVhbEVyciIsImVyck1zZyIsInN0YWNrIiwiUHJveHlSZXF1ZXN0RXJyb3IiLCJnZXRBY3R1YWxFcnJvciIsImlzU3RyaW5nIiwic2VuZCIsImpzb24iLCJ0b0xvd2VyQ2FzZSIsIkIiLCJyZXNvbHZlIiwiZG9uZSIsInByb3h5QWN0aXZlIiwicHJveHlSb3V0ZUlzQXZvaWRlZCIsIm9yaWdpbmFsVXJsIiwiY2FuUHJveHkiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztB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REFBVixDQUFOO0FBQ0Q7O0FBQ0QsTUFBSTtBQUNGLFVBQU01RCxNQUFNLENBQUM2RCxjQUFQLENBQXNCLGFBQXRCLEVBQXFDaUIsR0FBckMsRUFBMEN2RCxHQUExQyxFQUErQ3VELEdBQUcsQ0FBQ2xDLE1BQUosQ0FBVzNDLFNBQTFELENBQU47QUFDRCxHQUZELENBRUUsT0FBTzZHLEdBQVAsRUFBWTtBQUNaLFFBQUkseUJBQVlBLEdBQVosRUFBaUJ2RSxlQUFPMkUsaUJBQXhCLENBQUosRUFBZ0Q7QUFDOUMsWUFBTUosR0FBTjtBQUNELEtBRkQsTUFFTztBQUNMLFlBQU0sSUFBSWxELEtBQUosQ0FBVyxpQ0FBZ0NrRCxHQUFHLENBQUN4RSxPQUFRLEVBQXZELENBQU47QUFDRDtBQUNGO0FBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCwgbG9nZ2VyLCBub2RlIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHZhbGlkYXRvcnMgfSBmcm9tICcuL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtcbiAgZXJyb3JzLCBpc0Vycm9yVHlwZSwgZ2V0UmVzcG9uc2VGb3JXM0NFcnJvcixcbiAgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUsIGVycm9yRnJvbVczQ0pzb25Db2RlLFxufSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBNRVRIT0RfTUFQLCBOT19TRVNTSU9OX0lEX0NPTU1BTkRTIH0gZnJvbSAnLi9yb3V0ZXMnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgZm9ybWF0UmVzcG9uc2VWYWx1ZSwgZm9ybWF0U3RhdHVzIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IE1BWF9MT0dfQk9EWV9MRU5HVEgsIFBST1RPQ09MUywgREVGQVVMVF9CQVNFX1BBVEggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNXM2NDYXBzIH0gZnJvbSAnLi4vaGVscGVycy9jYXBhYmlsaXRpZXMnO1xuXG5cbmNvbnN0IENSRUFURV9TRVNTSU9OX0NPTU1BTkQgPSAnY3JlYXRlU2Vzc2lvbic7XG5jb25zdCBERUxFVEVfU0VTU0lPTl9DT01NQU5EID0gJ2RlbGV0ZVNlc3Npb24nO1xuY29uc3QgR0VUX1NUQVRVU19DT01NQU5EID0gJ2dldFN0YXR1cyc7XG5cbmZ1bmN0aW9uIGRldGVybWluZVByb3RvY29sIChjcmVhdGVTZXNzaW9uQXJncykge1xuICByZXR1cm4gXy5zb21lKGNyZWF0ZVNlc3Npb25BcmdzLCBpc1czY0NhcHMpID8gUFJPVE9DT0xTLlczQyA6IFBST1RPQ09MUy5NSlNPTldQO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wgKGRyaXZlciwgc2Vzc2lvbklkID0gbnVsbCkge1xuICBjb25zdCBkc3REcml2ZXIgPSBfLmlzRnVuY3Rpb24oZHJpdmVyLmRyaXZlckZvclNlc3Npb24pXG4gICAgPyBkcml2ZXIuZHJpdmVyRm9yU2Vzc2lvbihzZXNzaW9uSWQpXG4gICAgOiBkcml2ZXI7XG4gIGlmIChkc3REcml2ZXIgPT09IGRyaXZlcikge1xuICAgIC8vIFNob3J0Y2lyY3VpdCBpZiB0aGUgZHJpdmVyIGluc3RhbmNlIGlzIG5vdCBhbiB1bWJyZWxsYSBkcml2ZXJcbiAgICAvLyBvciBpdCBpcyBGYWtlIGRyaXZlciBpbnN0YW5jZSwgd2hlcmUgYGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uYFxuICAgIC8vIGFsd2F5cyByZXR1cm5zIHNlbGYgaW5zdGFuY2VcbiAgICByZXR1cm4gZHJpdmVyLnByb3RvY29sO1xuICB9XG5cbiAgLy8gRXh0cmFjdCB0aGUgcHJvdG9jb2wgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24gaWYgdGhlIGdpdmVuIGRyaXZlciBpcyB0aGUgdW1icmVsbGEgb25lXG4gIHJldHVybiBkc3REcml2ZXI/LnByb3RvY29sID8/IFBST1RPQ09MUy5XM0M7XG59XG5cbmZ1bmN0aW9uIGlzU2Vzc2lvbkNvbW1hbmQgKGNvbW1hbmQpIHtcbiAgcmV0dXJuICFfLmluY2x1ZGVzKE5PX1NFU1NJT05fSURfQ09NTUFORFMsIGNvbW1hbmQpO1xufVxuXG5mdW5jdGlvbiBnZXRMb2dnZXIgKGRyaXZlciwgc2Vzc2lvbklkID0gbnVsbCkge1xuICBjb25zdCBkc3REcml2ZXIgPSBzZXNzaW9uSWQgJiYgXy5pc0Z1bmN0aW9uKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKVxuICAgID8gKGRyaXZlci5kcml2ZXJGb3JTZXNzaW9uKHNlc3Npb25JZCkgPz8gZHJpdmVyKVxuICAgIDogZHJpdmVyO1xuICBpZiAoXy5pc0Z1bmN0aW9uKGRzdERyaXZlci5sb2c/LmluZm8pKSB7XG4gICAgcmV0dXJuIGRzdERyaXZlci5sb2c7XG4gIH1cblxuICBsZXQgbG9nUHJlZml4ID0gZHN0RHJpdmVyLmNvbnN0cnVjdG9yXG4gICAgPyBgJHtkc3REcml2ZXIuY29uc3RydWN0b3IubmFtZX1AJHtub2RlLmdldE9iamVjdElkKGRzdERyaXZlcikuc3Vic3RyaW5nKDAsIDgpfWBcbiAgICA6ICdBcHBpdW1Ecml2ZXInO1xuICBpZiAoc2Vzc2lvbklkKSB7XG4gICAgbG9nUHJlZml4ICs9IGAgKCR7c2Vzc2lvbklkLnN1YnN0cmluZygwLCA4KX0pYDtcbiAgfVxuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihsb2dQcmVmaXgpO1xufVxuXG5mdW5jdGlvbiB3cmFwUGFyYW1zIChwYXJhbVNldHMsIGpzb25PYmopIHtcbiAgLyogVGhlcmUgYXJlIGNvbW1hbmRzIGxpa2UgcGVyZm9ybVRvdWNoIHdoaWNoIHRha2UgYSBzaW5nbGUgcGFyYW1ldGVyIChwcmltaXRpdmUgdHlwZSBvciBhcnJheSkuXG4gICAqIFNvbWUgZHJpdmVycyBjaG9vc2UgdG8gcGFzcyB0aGlzIHBhcmFtZXRlciBhcyBhIHZhbHVlIChlZy4gW2FjdGlvbjEsIGFjdGlvbjIuLi5dKSB3aGlsZSBvdGhlcnMgdG9cbiAgICogd3JhcCBpdCB3aXRoaW4gYW4gb2JqZWN0KGVnJyB7Z2VzdHVyZTogIFthY3Rpb24xLCBhY3Rpb24yLi4uXX0pLCB3aGljaCBtYWtlcyBpdCBoYXJkIHRvIHZhbGlkYXRlLlxuICAgKiBUaGUgd3JhcCBvcHRpb24gaW4gdGhlIHNwZWMgZW5mb3JjZSB3cmFwcGluZyBiZWZvcmUgdmFsaWRhdGlvbiwgc28gdGhhdCBhbGwgcGFyYW1zIGFyZSB3cmFwcGVkIGF0XG4gICAqIHRoZSB0aW1lIHRoZXkgYXJlIHZhbGlkYXRlZCBhbmQgbGF0ZXIgcGFzc2VkIHRvIHRoZSBjb21tYW5kcy5cbiAgICovXG4gIGxldCByZXMgPSBqc29uT2JqO1xuICBpZiAoXy5pc0FycmF5KGpzb25PYmopIHx8ICFfLmlzT2JqZWN0KGpzb25PYmopKSB7XG4gICAgcmVzID0ge307XG4gICAgcmVzW3BhcmFtU2V0cy53cmFwXSA9IGpzb25PYmo7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gdW53cmFwUGFyYW1zIChwYXJhbVNldHMsIGpzb25PYmopIHtcbiAgLyogVGhlcmUgYXJlIGNvbW1hbmRzIGxpa2Ugc2V0TmV0d29ya0Nvbm5lY3Rpb24gd2hpY2ggc2VuZCBwYXJhbWV0ZXJzIHdyYXBwZWQgaW5zaWRlIGEga2V5IHN1Y2ggYXNcbiAgICogXCJwYXJhbWV0ZXJzXCIuIFRoaXMgZnVuY3Rpb24gdW53cmFwcyB0aGVtIChlZy4ge1wicGFyYW1ldGVyc1wiOiB7XCJ0eXBlXCI6IDF9fSBiZWNvbWVzIHtcInR5cGVcIjogMX0pLlxuICAgKi9cbiAgbGV0IHJlcyA9IGpzb25PYmo7XG4gIGlmIChfLmlzT2JqZWN0KGpzb25PYmopKSB7XG4gICAgLy8gc29tZSBjbGllbnRzLCBsaWtlIHJ1YnksIGRvbid0IHdyYXBcbiAgICBpZiAoanNvbk9ialtwYXJhbVNldHMudW53cmFwXSkge1xuICAgICAgcmVzID0ganNvbk9ialtwYXJhbVNldHMudW53cmFwXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gY2hlY2tQYXJhbXMgKHBhcmFtU2V0cywganNvbk9iaiwgcHJvdG9jb2wpIHtcbiAgbGV0IHJlcXVpcmVkUGFyYW1zID0gW107XG4gIGxldCBvcHRpb25hbFBhcmFtcyA9IFtdO1xuICBsZXQgcmVjZWl2ZWRQYXJhbXMgPSBfLmtleXMoanNvbk9iaik7XG5cbiAgaWYgKHBhcmFtU2V0cykge1xuICAgIGlmIChwYXJhbVNldHMucmVxdWlyZWQpIHtcbiAgICAgIC8vIHdlIG1pZ2h0IGhhdmUgYW4gYXJyYXkgb2YgcGFyYW1ldGVycyxcbiAgICAgIC8vIG9yIGFuIGFycmF5IG9mIGFycmF5cyBvZiBwYXJhbWV0ZXJzLCBzbyBzdGFuZGFyZGl6ZVxuICAgICAgaWYgKCFfLmlzQXJyYXkoXy5maXJzdChwYXJhbVNldHMucmVxdWlyZWQpKSkge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IFtwYXJhbVNldHMucmVxdWlyZWRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVxdWlyZWRQYXJhbXMgPSBwYXJhbVNldHMucmVxdWlyZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGp1c3QgYW4gYXJyYXlcbiAgICBpZiAocGFyYW1TZXRzLm9wdGlvbmFsKSB7XG4gICAgICBvcHRpb25hbFBhcmFtcyA9IHBhcmFtU2V0cy5vcHRpb25hbDtcbiAgICB9XG5cbiAgICAvLyBJZiBhIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCBhcyB0aGUgJ3ZhbGlkYXRlJyBrZXksIGl0IHdpbGwgaGVyZSBiZSBjYWxsZWQgd2l0aFxuICAgIC8vIGpzb25PYmogYXMgdGhlIHBhcmFtLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBmYWxzeSwgdmVyaWZpY2F0aW9uIHdpbGwgYmVcbiAgICAvLyBjb25zaWRlcmVkIHRvIGhhdmUgcGFzc2VkLiBJZiBpdCByZXR1cm5zIHNvbWV0aGluZyBlbHNlLCB0aGF0IHdpbGwgYmUgdGhlXG4gICAgLy8gYXJndW1lbnQgdG8gYW4gZXJyb3Igd2hpY2ggaXMgdGhyb3duIHRvIHRoZSB1c2VyXG4gICAgaWYgKHBhcmFtU2V0cy52YWxpZGF0ZSkge1xuICAgICAgbGV0IG1lc3NhZ2UgPSBwYXJhbVNldHMudmFsaWRhdGUoanNvbk9iaiwgcHJvdG9jb2wpO1xuICAgICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5CYWRQYXJhbWV0ZXJzRXJyb3IobWVzc2FnZSwganNvbk9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgd2UgaGF2ZSBubyByZXF1aXJlZCBwYXJhbWV0ZXJzLCBhbGwgaXMgd2VsbFxuICBpZiAocmVxdWlyZWRQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc29tZSBjbGllbnRzIHBhc3MgaW4gdGhlIHNlc3Npb24gaWQgaW4gdGhlIHBhcmFtc1xuICBpZiAob3B0aW9uYWxQYXJhbXMuaW5kZXhPZignc2Vzc2lvbklkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnc2Vzc2lvbklkJyk7XG4gIH1cblxuICAvLyBzb21lIGNsaWVudHMgcGFzcyBpbiBhbiBlbGVtZW50IGlkIGluIHRoZSBwYXJhbXNcbiAgaWYgKG9wdGlvbmFsUGFyYW1zLmluZGV4T2YoJ2lkJykgPT09IC0xKSB7XG4gICAgb3B0aW9uYWxQYXJhbXMucHVzaCgnaWQnKTtcbiAgfVxuXG4gIC8vIGdvIHRocm91Z2ggdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYW5kIGNoZWNrIGFnYWluc3Qgb3VyIGFyZ3VtZW50c1xuICBmb3IgKGxldCBwYXJhbXMgb2YgcmVxdWlyZWRQYXJhbXMpIHtcbiAgICBpZiAoXy5kaWZmZXJlbmNlKHJlY2VpdmVkUGFyYW1zLCBwYXJhbXMsIG9wdGlvbmFsUGFyYW1zKS5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgXy5kaWZmZXJlbmNlKHBhcmFtcywgcmVjZWl2ZWRQYXJhbXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gd2UgaGF2ZSBhIHNldCBvZiBwYXJhbWV0ZXJzIHRoYXQgaXMgY29ycmVjdFxuICAgICAgLy8gc28gc2hvcnQtY2lyY3VpdFxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgZXJyb3JzLkJhZFBhcmFtZXRlcnNFcnJvcihwYXJhbVNldHMsIHJlY2VpdmVkUGFyYW1zKTtcbn1cblxuLypcbiAqIFRoaXMgbWV0aG9kIHRha2VzIDMgcGllY2VzIG9mIGRhdGE6IHJlcXVlc3QgcGFyYW1ldGVycyAoJ3JlcXVlc3RQYXJhbXMnKSxcbiAqIGEgcmVxdWVzdCBKU09OIGJvZHkgKCdqc29uT2JqJyksIGFuZCAncGF5bG9hZFBhcmFtcycsIHdoaWNoIGlzIHRoZSBzZWN0aW9uXG4gKiBmcm9tIHRoZSByb3V0ZSBkZWZpbml0aW9uIGZvciBhIHBhcnRpY3VsYXIgZW5kcG9pbnQgd2hpY2ggaGFzIGluc3RydWN0aW9uc1xuICogb24gaGFuZGxpbmcgcGFyYW1ldGVycy4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBhcnJheSBvZiBhcmd1bWVudHMgd2hpY2ggd2lsbFxuICogYmUgYXBwbGllZCB0byBhIGNvbW1hbmQuXG4gKi9cbmZ1bmN0aW9uIG1ha2VBcmdzIChyZXF1ZXN0UGFyYW1zLCBqc29uT2JqLCBwYXlsb2FkUGFyYW1zLCBwcm90b2NvbCkge1xuICAvLyBXZSB3YW50IHRvIHBhc3MgdGhlIFwidXJsXCIgcGFyYW1ldGVycyB0byB0aGUgY29tbWFuZHMgaW4gcmV2ZXJzZSBvcmRlclxuICAvLyBzaW5jZSB0aGUgY29tbWFuZCB3aWxsIHNvbWV0aW1lcyB3YW50IHRvIGlnbm9yZSwgc2F5LCB0aGUgc2Vzc2lvbklkLlxuICAvLyBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHB1dHRpbmcgc2Vzc2lvbklkIGxhc3QsIHdoaWNoIG1lYW5zIGluIEpTIHdlIGNhblxuICAvLyBvbWl0IGl0IGZyb20gdGhlIGZ1bmN0aW9uIHNpZ25hdHVyZSBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gdXNlIGl0LlxuICBsZXQgdXJsUGFyYW1zID0gXy5rZXlzKHJlcXVlc3RQYXJhbXMpLnJldmVyc2UoKTtcblxuICAvLyBJbiB0aGUgc2ltcGxlIGNhc2UsIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXJzIGFyZSBhIGJhc2ljIGFycmF5IGluXG4gIC8vIHBheWxvYWRQYXJhbXMucmVxdWlyZWQsIHNvIHN0YXJ0IHRoZXJlLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlcmUgYXJlXG4gIC8vIG11bHRpcGxlIG9wdGlvbmFsIHNldHMgb2YgcmVxdWlyZWQgcGFyYW1zLCB0aG91Z2gsIHNvIGhhbmRsZSB0aGF0IGNhc2VcbiAgLy8gdG9vLlxuICBsZXQgcmVxdWlyZWRQYXJhbXMgPSBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkO1xuICBpZiAoXy5pc0FycmF5KF8uZmlyc3QocGF5bG9hZFBhcmFtcy5yZXF1aXJlZCkpKSB7XG4gICAgLy8gSWYgdGhlcmUgYXJlIG9wdGlvbmFsIHNldHMgb2YgcmVxdWlyZWQgcGFyYW1zLCB0aGVuIHdlIHdpbGwgaGF2ZSBhblxuICAgIC8vIGFycmF5IG9mIGFycmF5cyBpbiBwYXlsb2FkUGFyYW1zLnJlcXVpcmVkLCBzbyBsb29wIHRocm91Z2ggZWFjaCBzZXQgYW5kXG4gICAgLy8gcGljayB0aGUgb25lIHRoYXQgbWF0Y2hlcyB3aGljaCBKU09OIHBhcmFtcyB3ZXJlIGFjdHVhbGx5IHNlbnQuIFdlJ3ZlXG4gICAgLy8gYWxyZWFkeSBiZWVuIHRocm91Z2ggdmFsaWRhdGlvbiBzbyB3ZSdyZSBndWFyYW50ZWVkIHRvIGZpbmQgYSBtYXRjaC5cbiAgICBsZXQga2V5cyA9IF8ua2V5cyhqc29uT2JqKTtcbiAgICBmb3IgKGxldCBwYXJhbXMgb2YgcGF5bG9hZFBhcmFtcy5yZXF1aXJlZCkge1xuICAgICAgaWYgKF8ud2l0aG91dChwYXJhbXMsIC4uLmtleXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXF1aXJlZFBhcmFtcyA9IHBhcmFtcztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTm93IHdlIGNvbnN0cnVjdCBvdXIgbGlzdCBvZiBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmRcbiAgbGV0IGFyZ3M7XG4gIGlmIChfLmlzRnVuY3Rpb24ocGF5bG9hZFBhcmFtcy5tYWtlQXJncykpIHtcbiAgICAvLyBJbiB0aGUgcm91dGUgc3BlYywgYSBwYXJ0aWN1bGFyIHJvdXRlIG1pZ2h0IGRlZmluZSBhICdtYWtlQXJncycgZnVuY3Rpb25cbiAgICAvLyBpZiBpdCB3YW50cyBmdWxsIGNvbnRyb2wgb3ZlciBob3cgdG8gdHVybiBKU09OIHBhcmFtZXRlcnMgaW50byBjb21tYW5kXG4gICAgLy8gYXJndW1lbnRzLiBTbyB3ZSBwYXNzIGl0IHRoZSBKU09OIHBhcmFtZXRlcnMgYW5kIGl0IHJldHVybnMgYW4gYXJyYXlcbiAgICAvLyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGhhbmRsaW5nIGNvbW1hbmQuIEZvciBleGFtcGxlIGlmIGl0IHJldHVybnNcbiAgICAvLyBbMSwgMiwgM10sIHdlIHdpbGwgY2FsbCBgY29tbWFuZCgxLCAyLCAzLCAuLi4pYCAodXJsIHBhcmFtcyBhcmUgc2VwYXJhdGVcbiAgICAvLyBmcm9tIEpTT04gcGFyYW1zIGFuZCBnZXQgY29uY2F0ZW5hdGVkIGJlbG93KS5cbiAgICBhcmdzID0gcGF5bG9hZFBhcmFtcy5tYWtlQXJncyhqc29uT2JqLCBwcm90b2NvbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCBjb2xsZWN0IGFsbCB0aGUgcmVxdWlyZWQgYW5kIG9wdGlvbmFsIHBhcmFtcyBhbmQgZmxhdHRlbiB0aGVtXG4gICAgLy8gaW50byBhbiBhcmd1bWVudCBhcnJheVxuICAgIGFyZ3MgPSBfLmZsYXR0ZW4ocmVxdWlyZWRQYXJhbXMpLm1hcCgocCkgPT4ganNvbk9ialtwXSk7XG4gICAgaWYgKHBheWxvYWRQYXJhbXMub3B0aW9uYWwpIHtcbiAgICAgIGFyZ3MgPSBhcmdzLmNvbmNhdChfLmZsYXR0ZW4ocGF5bG9hZFBhcmFtcy5vcHRpb25hbCkubWFwKChwKSA9PiBqc29uT2JqW3BdKSk7XG4gICAgfVxuICB9XG4gIC8vIEZpbmFsbHksIGdldCBvdXIgdXJsIHBhcmFtcyAoc2Vzc2lvbiBpZCwgZWxlbWVudCBpZCwgZXRjLi4uKSBvbiB0aGUgZW5kIG9mXG4gIC8vIHRoZSBsaXN0XG4gIGFyZ3MgPSBhcmdzLmNvbmNhdCh1cmxQYXJhbXMubWFwKCh1KSA9PiByZXF1ZXN0UGFyYW1zW3VdKSk7XG4gIHJldHVybiBhcmdzO1xufVxuXG5mdW5jdGlvbiByb3V0ZUNvbmZpZ3VyaW5nRnVuY3Rpb24gKGRyaXZlcikge1xuICBpZiAoIWRyaXZlci5zZXNzaW9uRXhpc3RzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEcml2ZXJzIG11c3QgaW1wbGVtZW50IGBzZXNzaW9uRXhpc3RzYCBwcm9wZXJ0eScpO1xuICB9XG5cbiAgaWYgKCEoZHJpdmVyLmV4ZWN1dGVDb21tYW5kIHx8IGRyaXZlci5leGVjdXRlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignRHJpdmVycyBtdXN0IGltcGxlbWVudCBgZXhlY3V0ZUNvbW1hbmRgIG9yIGBleGVjdXRlYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8vIHJldHVybiBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYWRkIGFsbCB0aGUgcm91dGVzIHRvIHRoZSBkcml2ZXIuIEhlcmUgZXh0cmFNZXRob2RzIG1pZ2h0IGJlXG4gIC8vIHBhc3NlZCBpbiBhcyBkZWZpbmVkIGJ5IEFwcGl1bSBwbHVnaW5zLCBzbyB3ZSBuZWVkIHRvIGFkZCB0aG9zZSB0byB0aGUgZGVmYXVsdCBsaXN0XG4gIHJldHVybiBmdW5jdGlvbiBhZGRSb3V0ZXMgKGFwcCwge2Jhc2VQYXRoID0gREVGQVVMVF9CQVNFX1BBVEgsIGV4dHJhTWV0aG9kTWFwID0ge319KSB7XG4gICAgLy8gc3RvcmUgYmFzZVBhdGggb24gdGhlIGRyaXZlciBpbnN0YW5jZSBzbyBpdCBjYW4gdXNlIGl0IGlmIG5lY2Vzc2FyeVxuICAgIC8vIGZvciBleGFtcGxlIGluIGRldGVybWluaW5nIHByb3h5IGF2b2lkYW5jZVxuICAgIGRyaXZlci5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuXG4gICAgY29uc3QgYWxsTWV0aG9kcyA9IHsuLi5NRVRIT0RfTUFQLCAuLi5leHRyYU1ldGhvZE1hcH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBtZXRob2RzXSBvZiBfLnRvUGFpcnMoYWxsTWV0aG9kcykpIHtcbiAgICAgIGZvciAoY29uc3QgW21ldGhvZCwgc3BlY10gb2YgXy50b1BhaXJzKG1ldGhvZHMpKSB7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZXhwcmVzcyByb3V0ZSBoYW5kbGVyXG4gICAgICAgIGJ1aWxkSGFuZGxlcihhcHAsIG1ldGhvZCwgYCR7YmFzZVBhdGh9JHtwYXRofWAsIHNwZWMsIGRyaXZlciwgaXNTZXNzaW9uQ29tbWFuZChzcGVjLmNvbW1hbmQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkSGFuZGxlciAoYXBwLCBtZXRob2QsIHBhdGgsIHNwZWMsIGRyaXZlciwgaXNTZXNzQ21kKSB7XG4gIGxldCBhc3luY0hhbmRsZXIgPSBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBsZXQganNvbk9iaiA9IHJlcS5ib2R5O1xuICAgIGxldCBodHRwUmVzQm9keSA9IHt9O1xuICAgIGxldCBodHRwU3RhdHVzID0gMjAwO1xuICAgIGxldCBuZXdTZXNzaW9uSWQ7XG4gICAgbGV0IGN1cnJlbnRQcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbChkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBpZiB0aGlzIGlzIGEgc2Vzc2lvbiBjb21tYW5kIGJ1dCB3ZSBkb24ndCBoYXZlIGEgc2Vzc2lvbixcbiAgICAgIC8vIGVycm9yIG91dCBlYXJseSAoZXNwZWNpYWxseSBiZWZvcmUgcHJveHlpbmcpXG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFkcml2ZXIuc2Vzc2lvbkV4aXN0cyhyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hEcml2ZXJFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZHJpdmVyIGlzIGN1cnJlbnRseSBwcm94eWluZyBjb21tYW5kcyB0byBhbm90aGVyIEpTT05XUCBzZXJ2ZXIsIGJ5cGFzcyBhbGwgb3VyXG4gICAgICAvLyBjaGVja3MgYW5kIGFzc3VtZSB0aGUgdXBzdHJlYW0gc2VydmVyIGtub3dzIHdoYXQgaXQncyBkb2luZy4gQnV0IGtlZXAgdGhpcyBpbiB0aGVcbiAgICAgIC8vIHRyeS9jYXRjaCBibG9jayBzbyBpZiBwcm94eWluZyBpdHNlbGYgZmFpbHMsIHdlIGdpdmUgYSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIE9mIGNvdXJzZSB3ZVxuICAgICAgLy8gb25seSB3YW50IHRvIGRvIHRoZXNlIHdoZW4gd2UgaGF2ZSBhIHNlc3Npb24gY29tbWFuZDsgdGhlIEFwcGl1bSBkcml2ZXIgbXVzdCBiZVxuICAgICAgLy8gcmVzcG9uc2libGUgZm9yIHN0YXJ0L3N0b3Agc2Vzc2lvbiwgZXRjLi4uIFdlIGFsc28gYWxsb3cgdGhlIGNvbW1hbmQgc3BlYyB0byBkZWNsYXJlIHRoYXRcbiAgICAgIC8vIHRoaXMgY29tbWFuZCBzaG91bGQgbmV2ZXIgYmUgcHJveGllZCAod2hpY2ggaXMgdXNlZnVsIGZvciBwbHVnaW4gZGV2ZWxvcGVycyB3aG8gYWRkXG4gICAgICAvLyBjb21tYW5kcyBhbmQgZ2VuZXJhbGx5IHdvdWxkIG5vdCB3YW50IHRoYXQgY29tbWFuZCB0byBiZSBwcm94aWVkIGluc3RlYWQgb2YgaGFuZGxlZCBieSB0aGVcbiAgICAgIC8vIHBsdWdpbilcbiAgICAgIGxldCBkaWRQbHVnaW5PdmVycmlkZVByb3h5ID0gZmFsc2U7XG4gICAgICBpZiAoaXNTZXNzQ21kICYmICFzcGVjLm5ldmVyUHJveHkgJiYgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgc3BlYy5jb21tYW5kKSkge1xuICAgICAgICBpZiAoIWRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQgfHxcbiAgICAgICAgICAgIGRyaXZlci5wbHVnaW5zVG9IYW5kbGVDbWQoc3BlYy5jb21tYW5kLCByZXEucGFyYW1zLnNlc3Npb25JZCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYXdhaXQgZG9Kd3BQcm94eShkcml2ZXIsIHJlcSwgcmVzKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpLmRlYnVnKGBXb3VsZCBoYXZlIHByb3hpZWQgYCArXG4gICAgICAgICAgYGNvbW1hbmQgZGlyZWN0bHksIGJ1dCBhIHBsdWdpbiBleGlzdHMgd2hpY2ggbWlnaHQgcmVxdWlyZSBpdHMgdmFsdWUsIHNvIHdpbGwgbGV0IGAgK1xuICAgICAgICAgIGBpdHMgdmFsdWUgYmUgY29sbGVjdGVkIGludGVybmFsbHkgYW5kIG1hZGUgcGFydCBvZiBwbHVnaW4gY2hhaW5gKTtcbiAgICAgICAgZGlkUGx1Z2luT3ZlcnJpZGVQcm94eSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIGEgY29tbWFuZCBpcyBub3QgaW4gb3VyIG1ldGhvZCBtYXAsIGl0J3MgYmVjYXVzZSB3ZVxuICAgICAgLy8gaGF2ZSBubyBwbGFucyB0byBldmVyIGltcGxlbWVudCBpdFxuICAgICAgaWYgKCFzcGVjLmNvbW1hbmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5Ob3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIHdyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMud3JhcCkge1xuICAgICAgICBqc29uT2JqID0gd3JhcFBhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmopO1xuICAgICAgfVxuXG4gICAgICAvLyB1bndyYXAgcGFyYW1zIGlmIG5lY2Vzc2FyeVxuICAgICAgaWYgKHNwZWMucGF5bG9hZFBhcmFtcyAmJiBzcGVjLnBheWxvYWRQYXJhbXMudW53cmFwKSB7XG4gICAgICAgIGpzb25PYmogPSB1bndyYXBQYXJhbXMoc3BlYy5wYXlsb2FkUGFyYW1zLCBqc29uT2JqKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gQ1JFQVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICAvLyB0cnkgdG8gZGV0ZXJtaW5lIHByb3RvY29sIGJ5IHNlc3Npb24gY3JlYXRpb24gYXJncywgc28gd2UgY2FuIHRocm93IGFcbiAgICAgICAgLy8gcHJvcGVybHkgZm9ybWF0dGVkIGVycm9yIGlmIGFyZ3VtZW50cyB2YWxpZGF0aW9uIGZhaWxzXG4gICAgICAgIGN1cnJlbnRQcm90b2NvbCA9IGRldGVybWluZVByb3RvY29sKG1ha2VBcmdzKHJlcS5wYXJhbXMsIGpzb25PYmosIHNwZWMucGF5bG9hZFBhcmFtcyB8fCB7fSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUganNvbiBwYXlsb2FkIGNvbmZvcm1zIHRvIHRoZSBzcGVjXG4gICAgICBjaGVja1BhcmFtcyhzcGVjLnBheWxvYWRQYXJhbXMsIGpzb25PYmosIGN1cnJlbnRQcm90b2NvbCk7XG5cbiAgICAgIC8vIHR1cm4gdGhlIGNvbW1hbmQgYW5kIGpzb24gcGF5bG9hZCBpbnRvIGFuIGFyZ3VtZW50IGxpc3QgZm9yXG4gICAgICAvLyB0aGUgZHJpdmVyIG1ldGhvZHNcbiAgICAgIGxldCBhcmdzID0gbWFrZUFyZ3MocmVxLnBhcmFtcywganNvbk9iaiwgc3BlYy5wYXlsb2FkUGFyYW1zIHx8IHt9LCBjdXJyZW50UHJvdG9jb2wpO1xuICAgICAgbGV0IGRyaXZlclJlcztcbiAgICAgIC8vIHZhbGlkYXRlIGNvbW1hbmQgYXJncyBhY2NvcmRpbmcgdG8gTUpTT05XUFxuICAgICAgaWYgKHZhbGlkYXRvcnNbc3BlYy5jb21tYW5kXSkge1xuICAgICAgICB2YWxpZGF0b3JzW3NwZWMuY29tbWFuZF0oLi4uYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJ1biB0aGUgZHJpdmVyIGNvbW1hbmQgd3JhcHBlZCBpbnNpZGUgdGhlIGFyZ3VtZW50IHZhbGlkYXRvcnNcbiAgICAgIGdldExvZ2dlcihkcml2ZXIsIHJlcS5wYXJhbXMuc2Vzc2lvbklkKS5kZWJ1ZyhgQ2FsbGluZyBgICtcbiAgICAgICAgYCR7ZHJpdmVyLmNvbnN0cnVjdG9yLm5hbWV9LiR7c3BlYy5jb21tYW5kfSgpIHdpdGggYXJnczogYCArXG4gICAgICAgIF8udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoYXJncyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KSk7XG5cbiAgICAgIGlmIChkaWRQbHVnaW5PdmVycmlkZVByb3h5KSB7XG4gICAgICAgIC8vIFRPRE8gZm9yIG5vdyB3ZSBhZGQgdGhpcyBpbmZvcm1hdGlvbiBvbiB0aGUgYXJncyBsaXN0LCBidXQgdGhhdCdzIG1peGluZyBwdXJwb3NlcyBoZXJlLlxuICAgICAgICAvLyBXZSByZWFsbHkgc2hvdWxkIGFkZCBhbm90aGVyICdvcHRpb25zJyBwYXJhbWV0ZXIgdG8gJ2V4ZWN1dGVDb21tYW5kJywgYnV0IHRoaXMgd291bGQgYmVcbiAgICAgICAgLy8gYSBicmVha2luZyBjaGFuZ2UgZm9yIGFsbCBkcml2ZXJzIHNvIHdvdWxkIG5lZWQgdG8gYmUgaGFuZGxlZCBjYXJlZnVsbHkuXG4gICAgICAgIGFyZ3MucHVzaCh7cmVxRm9yUHJveHk6IHJlcX0pO1xuICAgICAgfVxuXG4gICAgICBkcml2ZXJSZXMgPSBhd2FpdCBkcml2ZXIuZXhlY3V0ZUNvbW1hbmQoc3BlYy5jb21tYW5kLCAuLi5hcmdzKTtcblxuICAgICAgLy8gR2V0IHRoZSBwcm90b2NvbCBhZnRlciBleGVjdXRlQ29tbWFuZFxuICAgICAgY3VycmVudFByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQpIHx8IGN1cnJlbnRQcm90b2NvbDtcblxuICAgICAgLy8gSWYgYGV4ZWN1dGVDb21tYW5kYCB3YXMgb3ZlcnJpZGRlbiBhbmQgdGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdFxuICAgICAgLy8gd2l0aCBhIHByb3RvY29sIGFuZCB2YWx1ZS9lcnJvciBwcm9wZXJ0eSwgcmUtYXNzaWduIHRoZSBwcm90b2NvbFxuICAgICAgaWYgKF8uaXNQbGFpbk9iamVjdChkcml2ZXJSZXMpICYmIF8uaGFzKGRyaXZlclJlcywgJ3Byb3RvY29sJykpIHtcbiAgICAgICAgY3VycmVudFByb3RvY29sID0gZHJpdmVyUmVzLnByb3RvY29sIHx8IGN1cnJlbnRQcm90b2NvbDtcbiAgICAgICAgaWYgKGRyaXZlclJlcy5lcnJvcikge1xuICAgICAgICAgIHRocm93IGRyaXZlclJlcy5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBkcml2ZXJSZXMgPSBkcml2ZXJSZXMudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIHVucGFjayBjcmVhdGVTZXNzaW9uIHJlc3BvbnNlXG4gICAgICBpZiAoc3BlYy5jb21tYW5kID09PSBDUkVBVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgICAgIG5ld1Nlc3Npb25JZCA9IGRyaXZlclJlc1swXTtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgbmV3U2Vzc2lvbklkKVxuICAgICAgICAgIC5kZWJ1ZyhgQ2FjaGVkIHRoZSBwcm90b2NvbCB2YWx1ZSAnJHtjdXJyZW50UHJvdG9jb2x9JyBmb3IgdGhlIG5ldyBzZXNzaW9uICR7bmV3U2Vzc2lvbklkfWApO1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuTUpTT05XUCkge1xuICAgICAgICAgIGRyaXZlclJlcyA9IGRyaXZlclJlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgICBkcml2ZXJSZXMgPSB7XG4gICAgICAgICAgICBjYXBhYmlsaXRpZXM6IGRyaXZlclJlc1sxXSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGRyaXZlclJlcyA9IGZvcm1hdFJlc3BvbnNlVmFsdWUoZHJpdmVyUmVzKTtcblxuICAgICAgLy8gZGVsZXRlIHNob3VsZCBub3QgcmV0dXJuIGFueXRoaW5nIGV2ZW4gaWYgc3VjY2Vzc2Z1bFxuICAgICAgaWYgKHNwZWMuY29tbWFuZCA9PT0gREVMRVRFX1NFU1NJT05fQ09NTUFORCkge1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZClcbiAgICAgICAgICAuZGVidWcoYFJlY2VpdmVkIHJlc3BvbnNlOiAke18udHJ1bmNhdGUoSlNPTi5zdHJpbmdpZnkoZHJpdmVyUmVzKSwge2xlbmd0aDogTUFYX0xPR19CT0RZX0xFTkdUSH0pfWApO1xuICAgICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCkuZGVidWcoJ0J1dCBkZWxldGluZyBzZXNzaW9uLCBzbyBub3QgcmV0dXJuaW5nJyk7XG4gICAgICAgIGRyaXZlclJlcyA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZSBzdGF0dXMgaXMgbm90IDAsICB0aHJvdyB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgZm9yIHN0YXR1cyBjb2RlLlxuICAgICAgaWYgKHV0aWwuaGFzVmFsdWUoZHJpdmVyUmVzKSkge1xuICAgICAgICBpZiAodXRpbC5oYXNWYWx1ZShkcml2ZXJSZXMuc3RhdHVzKSAmJiAhaXNOYU4oZHJpdmVyUmVzLnN0YXR1cykgJiYgcGFyc2VJbnQoZHJpdmVyUmVzLnN0YXR1cywgMTApICE9PSAwKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3JGcm9tTUpTT05XUFN0YXR1c0NvZGUoZHJpdmVyUmVzLnN0YXR1cywgZHJpdmVyUmVzLnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChfLmlzUGxhaW5PYmplY3QoZHJpdmVyUmVzLnZhbHVlKSAmJiBkcml2ZXJSZXMudmFsdWUuZXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvckZyb21XM0NKc29uQ29kZShkcml2ZXJSZXMudmFsdWUuZXJyb3IsIGRyaXZlclJlcy52YWx1ZS5tZXNzYWdlLCBkcml2ZXJSZXMudmFsdWUuc3RhY2t0cmFjZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkudmFsdWUgPSBkcml2ZXJSZXM7XG4gICAgICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZCB8fCBuZXdTZXNzaW9uSWQpLmRlYnVnKGBSZXNwb25kaW5nIGAgK1xuICAgICAgICBgdG8gY2xpZW50IHdpdGggZHJpdmVyLiR7c3BlYy5jb21tYW5kfSgpIHJlc3VsdDogJHtfLnRydW5jYXRlKEpTT04uc3RyaW5naWZ5KGRyaXZlclJlcyksIHtsZW5ndGg6IE1BWF9MT0dfQk9EWV9MRU5HVEh9KX1gKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGZpZ3VyZSBvdXQgd2hhdCBvdXIgcmVzcG9uc2Ugc2hvdWxkIGJlXG4gICAgICAvLyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBlcnJvciB0aGF0IHdlIGVuY291bnRlcmVkXG4gICAgICBsZXQgYWN0dWFsRXJyID0gZXJyO1xuXG4gICAgICBjdXJyZW50UHJvdG9jb2wgPSBjdXJyZW50UHJvdG9jb2wgfHwgZXh0cmFjdFByb3RvY29sKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKTtcblxuICAgICAgbGV0IGVyck1zZyA9IGVyci5zdGFja3RyYWNlIHx8IGVyci5zdGFjaztcbiAgICAgIGlmICghXy5pbmNsdWRlcyhlcnJNc2csIGVyci5tZXNzYWdlKSkge1xuICAgICAgICAvLyBpZiB0aGUgbWVzc2FnZSBoYXMgbW9yZSBpbmZvcm1hdGlvbiwgYWRkIGl0LiBidXQgb2Z0ZW4gdGhlIG1lc3NhZ2VcbiAgICAgICAgLy8gaXMgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlXG4gICAgICAgIGVyck1zZyA9IGAke2Vyci5tZXNzYWdlfSR7ZXJyTXNnID8gKCdcXG4nICsgZXJyTXNnKSA6ICcnfWA7XG4gICAgICB9XG4gICAgICBpZiAoaXNFcnJvclR5cGUoZXJyLCBlcnJvcnMuUHJveHlSZXF1ZXN0RXJyb3IpKSB7XG4gICAgICAgIGFjdHVhbEVyciA9IGVyci5nZXRBY3R1YWxFcnJvcigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0TG9nZ2VyKGRyaXZlciwgcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbmV3U2Vzc2lvbklkKVxuICAgICAgICAgIC5kZWJ1ZyhgRW5jb3VudGVyZWQgaW50ZXJuYWwgZXJyb3IgcnVubmluZyBjb21tYW5kOiAke2Vyck1zZ31gKTtcbiAgICAgIH1cblxuICAgICAgW2h0dHBTdGF0dXMsIGh0dHBSZXNCb2R5XSA9IGdldFJlc3BvbnNlRm9yVzNDRXJyb3IoYWN0dWFsRXJyKTtcbiAgICB9XG5cbiAgICAvLyBkZWNvZGUgdGhlIHJlc3BvbnNlLCB3aGljaCBpcyBlaXRoZXIgYSBzdHJpbmcgb3IganNvblxuICAgIGlmIChfLmlzU3RyaW5nKGh0dHBSZXNCb2R5KSkge1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5zZW5kKGh0dHBSZXNCb2R5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5ld1Nlc3Npb25JZCkge1xuICAgICAgICBpZiAoY3VycmVudFByb3RvY29sID09PSBQUk9UT0NPTFMuVzNDKSB7XG4gICAgICAgICAgaHR0cFJlc0JvZHkudmFsdWUuc2Vzc2lvbklkID0gbmV3U2Vzc2lvbklkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGh0dHBSZXNCb2R5LnNlc3Npb25JZCA9IG5ld1Nlc3Npb25JZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHR0cFJlc0JvZHkuc2Vzc2lvbklkID0gcmVxLnBhcmFtcy5zZXNzaW9uSWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IGluY2x1ZGUgc2Vzc2lvbklkIGluIFczQyByZXNwb25zZXNcbiAgICAgIGlmIChjdXJyZW50UHJvdG9jb2wgPT09IFBST1RPQ09MUy5XM0MpIHtcbiAgICAgICAgZGVsZXRlIGh0dHBSZXNCb2R5LnNlc3Npb25JZDtcbiAgICAgIH1cblxuICAgICAgaHR0cFJlc0JvZHkgPSBmb3JtYXRTdGF0dXMoaHR0cFJlc0JvZHkpO1xuICAgICAgcmVzLnN0YXR1cyhodHRwU3RhdHVzKS5qc29uKGh0dHBSZXNCb2R5KTtcbiAgICB9XG4gIH07XG4gIC8vIGFkZCB0aGUgbWV0aG9kIHRvIHRoZSBhcHBcbiAgYXBwW21ldGhvZC50b0xvd2VyQ2FzZSgpXShwYXRoLCAocmVxLCByZXMpID0+IHtcbiAgICBCLnJlc29sdmUoYXN5bmNIYW5kbGVyKHJlcSwgcmVzKSkuZG9uZSgpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSAoZHJpdmVyLCByZXEsIGNvbW1hbmQpIHtcbiAgLy8gZHJpdmVycyBuZWVkIHRvIGV4cGxpY2l0bHkgc2F5IHdoZW4gdGhlIHByb3h5IGlzIGFjdGl2ZVxuICBpZiAoIWRyaXZlci5wcm94eUFjdGl2ZShyZXEucGFyYW1zLnNlc3Npb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyB3ZSBzaG91bGQgbmV2ZXIgcHJveHkgZGVsZXRlU2Vzc2lvbiBiZWNhdXNlIHdlIG5lZWQgdG8gZ2l2ZSB0aGUgY29udGFpbmluZ1xuICAvLyBkcml2ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gY2xlYW4gaXRzZWxmIHVwXG4gIGlmIChjb21tYW5kID09PSBERUxFVEVfU0VTU0lPTl9DT01NQU5EKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gdmFsaWRhdGUgYXZvaWRhbmNlIHNjaGVtYSwgYW5kIHNheSB3ZSBzaG91bGRuJ3QgcHJveHkgaWYgYW55dGhpbmcgaW4gdGhlXG4gIC8vIGF2b2lkIGxpc3QgbWF0Y2hlcyBvdXIgcmVxXG4gIGlmIChkcml2ZXIucHJveHlSb3V0ZUlzQXZvaWRlZChyZXEucGFyYW1zLnNlc3Npb25JZCwgcmVxLm1ldGhvZCwgcmVxLm9yaWdpbmFsVXJsLCByZXEuYm9keSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZG9Kd3BQcm94eSAoZHJpdmVyLCByZXEsIHJlcykge1xuICBnZXRMb2dnZXIoZHJpdmVyLCByZXEucGFyYW1zLnNlc3Npb25JZClcbiAgICAuaW5mbygnRHJpdmVyIHByb3h5IGFjdGl2ZSwgcGFzc2luZyByZXF1ZXN0IG9uIHZpYSBIVFRQIHByb3h5Jyk7XG5cbiAgLy8gY2hlY2sgdGhhdCB0aGUgaW5uZXIgZHJpdmVyIGhhcyBhIHByb3h5IGZ1bmN0aW9uXG4gIGlmICghZHJpdmVyLmNhblByb3h5KHJlcS5wYXJhbXMuc2Vzc2lvbklkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHByb3h5IHRvIGEgc2VydmVyIGJ1dCB0aGUgZHJpdmVyIGlzIHVuYWJsZSB0byBwcm94eScpO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgZHJpdmVyLmV4ZWN1dGVDb21tYW5kKCdwcm94eVJlcVJlcycsIHJlcSwgcmVzLCByZXEucGFyYW1zLnNlc3Npb25JZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmIChpc0Vycm9yVHlwZShlcnIsIGVycm9ycy5Qcm94eVJlcXVlc3RFcnJvcikpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJveHkuIFByb3h5IGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxufVxuXG5cbmV4cG9ydCB7XG4gIHJvdXRlQ29uZmlndXJpbmdGdW5jdGlvbiwgaXNTZXNzaW9uQ29tbWFuZCxcbiAgZHJpdmVyU2hvdWxkRG9Kd3BQcm94eSwgZGV0ZXJtaW5lUHJvdG9jb2wsIENSRUFURV9TRVNTSU9OX0NPTU1BTkQsXG4gIERFTEVURV9TRVNTSU9OX0NPTU1BTkQsIEdFVF9TVEFUVVNfQ09NTUFORCxcbn07XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /** @type {import('@appium/types').MethodMap} */
2
+ export const METHOD_MAP: import('@appium/types').MethodMap;
3
+ export let ALL_COMMANDS: any[];
4
+ export const NO_SESSION_ID_COMMANDS: string[];
5
+ export function routeToCommandName(endpoint: any, method: any, basePath?: string): keyof import("@appium/types").ExternalDriver | undefined;
6
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../lib/protocol/routes.js"],"names":[],"mappings":"AAkBA,gDAAgD;AAChD,yBADW,OAAO,eAAe,EAAE,SAAS,CAmvB1C;AAGF,+BAAsB;AAyEtB,8CAA6E;AAjC7E,4IA8BC"}