oxygen-cli 1.41.0 → 1.42.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 (285) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/core/OxygenCore.js +41 -274
  3. package/build/core/OxygenEvents.js +2 -12
  4. package/build/core/OxygenModule.js +1 -16
  5. package/build/core/OxygenService.js +1 -12
  6. package/build/core/OxygenSubModule.js +1 -10
  7. package/build/core/WebDriverModule.js +2 -32
  8. package/build/core/utils.js +2 -21
  9. package/build/errors/HookError.js +2 -8
  10. package/build/errors/ModuleError.js +2 -8
  11. package/build/errors/ModuleUnavailableError.js +1 -3
  12. package/build/errors/OxygenError.js +3 -36
  13. package/build/errors/ScriptNotFound.js +2 -8
  14. package/build/errors/helper.js +50 -82
  15. package/build/index.js +8 -22
  16. package/build/lib/cli-util.js +35 -105
  17. package/build/lib/cli.js +3 -30
  18. package/build/lib/debugger.js +2 -145
  19. package/build/lib/img-merge.js +2 -16
  20. package/build/lib/launcher.js +3 -31
  21. package/build/lib/moduleRequire.js +1 -4
  22. package/build/lib/parallel-launcher.js +44 -84
  23. package/build/lib/param-manager.js +2 -29
  24. package/build/lib/param-reader-csv.js +1 -15
  25. package/build/lib/param-reader-excel.js +1 -14
  26. package/build/lib/param-reader-json.js +1 -10
  27. package/build/lib/text-to-image.js +5 -26
  28. package/build/lib/util.js +4 -75
  29. package/build/model/case-result.js +1 -2
  30. package/build/model/failure.js +1 -2
  31. package/build/model/status.js +1 -2
  32. package/build/model/step-result.js +1 -2
  33. package/build/model/suite-result.js +1 -2
  34. package/build/model/test-result.js +1 -2
  35. package/build/model/testcase.js +1 -2
  36. package/build/model/testsuite.js +1 -2
  37. package/build/ox_modules/index.js +20 -41
  38. package/build/ox_modules/module-assert.js +9 -28
  39. package/build/ox_modules/module-date.js +3 -8
  40. package/build/ox_modules/module-db.js +8 -29
  41. package/build/ox_modules/module-email.js +14 -45
  42. package/build/ox_modules/module-eyes.js +6 -47
  43. package/build/ox_modules/module-http/ntlm-util.js +3 -7
  44. package/build/ox_modules/module-http/ntlm.js +9 -78
  45. package/build/ox_modules/module-http.js +69 -172
  46. package/build/ox_modules/module-log.js +10 -23
  47. package/build/ox_modules/module-mailinator.js +11 -33
  48. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
  49. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
  50. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
  51. package/build/ox_modules/module-mob/commands/assertText.js +1 -4
  52. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
  53. package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
  54. package/build/ox_modules/module-mob/commands/back.js +1 -3
  55. package/build/ox_modules/module-mob/commands/clear.js +1 -5
  56. package/build/ox_modules/module-mob/commands/click.js +3 -5
  57. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
  58. package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
  59. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
  60. package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
  61. package/build/ox_modules/module-mob/commands/debug.js +2 -3
  62. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
  63. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
  64. package/build/ox_modules/module-mob/commands/execute.js +1 -3
  65. package/build/ox_modules/module-mob/commands/findElement.js +1 -4
  66. package/build/ox_modules/module-mob/commands/findElements.js +1 -5
  67. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
  68. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
  69. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
  70. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
  71. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
  72. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
  73. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
  74. package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
  75. package/build/ox_modules/module-mob/commands/getSource.js +1 -3
  76. package/build/ox_modules/module-mob/commands/getText.js +1 -5
  77. package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
  78. package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
  79. package/build/ox_modules/module-mob/commands/getValue.js +5 -10
  80. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
  81. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
  82. package/build/ox_modules/module-mob/commands/index.js +1 -148
  83. package/build/ox_modules/module-mob/commands/installApp.js +1 -3
  84. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
  85. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
  87. package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isExist.js +1 -4
  89. package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
  90. package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
  91. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
  92. package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
  93. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
  94. package/build/ox_modules/module-mob/commands/open.js +1 -4
  95. package/build/ox_modules/module-mob/commands/pause.js +1 -3
  96. package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
  97. package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
  98. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
  99. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
  100. package/build/ox_modules/module-mob/commands/select.js +1 -5
  101. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
  102. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
  103. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
  104. package/build/ox_modules/module-mob/commands/setContext.js +1 -3
  105. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
  106. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
  107. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
  108. package/build/ox_modules/module-mob/commands/shake.js +1 -3
  109. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
  110. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
  111. package/build/ox_modules/module-mob/commands/swipe.js +1 -3
  112. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
  113. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
  114. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
  115. package/build/ox_modules/module-mob/commands/tap.js +1 -3
  116. package/build/ox_modules/module-mob/commands/type.js +3 -8
  117. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
  118. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
  119. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
  120. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
  121. package/build/ox_modules/module-mob.js +74 -216
  122. package/build/ox_modules/module-mongo.js +14 -51
  123. package/build/ox_modules/module-pdf.js +24 -65
  124. package/build/ox_modules/module-proxy.js +9 -69
  125. package/build/ox_modules/module-serial.js +8 -33
  126. package/build/ox_modules/module-shell.js +10 -30
  127. package/build/ox_modules/module-soap.js +17 -52
  128. package/build/ox_modules/module-twilio.js +11 -54
  129. package/build/ox_modules/module-utils.js +22 -58
  130. package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
  131. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
  133. package/build/ox_modules/module-web/commands/assertExist.js +1 -3
  134. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
  135. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
  136. package/build/ox_modules/module-web/commands/assertText.js +1 -4
  137. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
  138. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
  139. package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
  140. package/build/ox_modules/module-web/commands/assertValue.js +1 -4
  141. package/build/ox_modules/module-web/commands/back.js +1 -3
  142. package/build/ox_modules/module-web/commands/clear.js +1 -6
  143. package/build/ox_modules/module-web/commands/click.js +4 -15
  144. package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
  145. package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
  146. package/build/ox_modules/module-web/commands/debug.js +2 -3
  147. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
  148. package/build/ox_modules/module-web/commands/deselect.js +1 -3
  149. package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
  150. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
  151. package/build/ox_modules/module-web/commands/execute.js +1 -3
  152. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
  153. package/build/ox_modules/module-web/commands/findElement.js +1 -4
  154. package/build/ox_modules/module-web/commands/findElements.js +1 -5
  155. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
  156. package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
  157. package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
  158. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
  159. package/build/ox_modules/module-web/commands/getCookies.js +1 -3
  160. package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
  161. package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
  162. package/build/ox_modules/module-web/commands/getHTML.js +1 -3
  163. package/build/ox_modules/module-web/commands/getSource.js +1 -3
  164. package/build/ox_modules/module-web/commands/getText.js +1 -5
  165. package/build/ox_modules/module-web/commands/getTitle.js +1 -3
  166. package/build/ox_modules/module-web/commands/getUrl.js +1 -3
  167. package/build/ox_modules/module-web/commands/getValue.js +1 -6
  168. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
  169. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
  170. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
  171. package/build/ox_modules/module-web/commands/index.js +1 -184
  172. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
  173. package/build/ox_modules/module-web/commands/isChecked.js +1 -3
  174. package/build/ox_modules/module-web/commands/isExist.js +1 -4
  175. package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
  176. package/build/ox_modules/module-web/commands/isSelected.js +1 -3
  177. package/build/ox_modules/module-web/commands/isVisible.js +1 -4
  178. package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
  179. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
  180. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
  181. package/build/ox_modules/module-web/commands/mock.js +1 -3
  182. package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
  183. package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
  184. package/build/ox_modules/module-web/commands/newWindow.js +1 -3
  185. package/build/ox_modules/module-web/commands/open.js +1 -5
  186. package/build/ox_modules/module-web/commands/pause.js +1 -3
  187. package/build/ox_modules/module-web/commands/point.js +1 -3
  188. package/build/ox_modules/module-web/commands/pointJS.js +2 -9
  189. package/build/ox_modules/module-web/commands/refresh.js +1 -3
  190. package/build/ox_modules/module-web/commands/rightClick.js +3 -9
  191. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
  192. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
  193. package/build/ox_modules/module-web/commands/select.js +1 -6
  194. package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
  195. package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
  196. package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
  197. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
  198. package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
  199. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
  200. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
  201. package/build/ox_modules/module-web/commands/type.js +1 -6
  202. package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
  203. package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
  204. package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
  205. package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
  206. package/build/ox_modules/module-web/commands/verifyText.js +1 -4
  207. package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
  208. package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
  209. package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
  210. package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
  211. package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
  212. package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
  213. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
  214. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
  215. package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
  216. package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
  217. package/build/ox_modules/module-web/commands/waitForText.js +1 -4
  218. package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
  219. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
  220. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
  221. package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
  222. package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
  223. package/build/ox_modules/module-web.js +112 -232
  224. package/build/ox_modules/module-win/commands/assertText.js +1 -4
  225. package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
  226. package/build/ox_modules/module-win/commands/assertValue.js +9 -17
  227. package/build/ox_modules/module-win/commands/back.js +1 -3
  228. package/build/ox_modules/module-win/commands/clear.js +1 -5
  229. package/build/ox_modules/module-win/commands/click.js +1 -3
  230. package/build/ox_modules/module-win/commands/clickLong.js +1 -3
  231. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
  232. package/build/ox_modules/module-win/commands/findElement.js +1 -4
  233. package/build/ox_modules/module-win/commands/findElements.js +1 -5
  234. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
  235. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
  236. package/build/ox_modules/module-win/commands/getLocation.js +1 -3
  237. package/build/ox_modules/module-win/commands/getSource.js +1 -3
  238. package/build/ox_modules/module-win/commands/getText.js +1 -5
  239. package/build/ox_modules/module-win/commands/getValue.js +5 -10
  240. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
  241. package/build/ox_modules/module-win/commands/index.js +1 -74
  242. package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
  243. package/build/ox_modules/module-win/commands/isChecked.js +1 -3
  244. package/build/ox_modules/module-win/commands/isClickable.js +1 -3
  245. package/build/ox_modules/module-win/commands/isExist.js +1 -4
  246. package/build/ox_modules/module-win/commands/isSelected.js +1 -3
  247. package/build/ox_modules/module-win/commands/isVisible.js +1 -4
  248. package/build/ox_modules/module-win/commands/open.js +1 -3
  249. package/build/ox_modules/module-win/commands/pause.js +1 -3
  250. package/build/ox_modules/module-win/commands/rightClick.js +1 -3
  251. package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
  252. package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
  253. package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
  254. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
  255. package/build/ox_modules/module-win/commands/tap.js +1 -3
  256. package/build/ox_modules/module-win/commands/type.js +1 -5
  257. package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
  258. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
  259. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
  260. package/build/ox_modules/module-win.js +54 -95
  261. package/build/ox_modules/utils.js +91 -79
  262. package/build/ox_reporters/reporter-excel.js +2 -59
  263. package/build/ox_reporters/reporter-html.js +2 -29
  264. package/build/ox_reporters/reporter-json.js +2 -15
  265. package/build/ox_reporters/reporter-junit.js +2 -25
  266. package/build/ox_reporters/reporter-pdf.js +2 -20
  267. package/build/ox_reporters/reporter-rp.js +2 -91
  268. package/build/ox_reporters/reporter-xml.js +2 -18
  269. package/build/ox_services/service-devtools/submodule-network.js +4 -86
  270. package/build/ox_services/service-devtools.js +2 -24
  271. package/build/reporter/FileReporterBase.js +6 -45
  272. package/build/reporter/ReportAggregator.js +7 -121
  273. package/build/reporter/ReporterBase.js +1 -6
  274. package/build/reporter/WebSocketReporter.js +1 -39
  275. package/build/runners/WorkerProcess.js +2 -107
  276. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  277. package/build/runners/cucumber/CucumberReporter.js +2 -57
  278. package/build/runners/cucumber/CucumberWorker.js +3 -69
  279. package/build/runners/cucumber/index.js +2 -31
  280. package/build/runners/cucumber/worker.js +2 -19
  281. package/build/runners/index.js +4 -11
  282. package/build/runners/oxygen/OxygenWorker.js +3 -61
  283. package/build/runners/oxygen/index.js +18 -179
  284. package/build/runners/oxygen/worker.js +3 -27
  285. package/package.json +3 -1
@@ -6,35 +6,26 @@
6
6
  * the Free Software Foundation, either version 3 of the License, or
7
7
  * (at your option) any later version.
8
8
  */
9
+
9
10
  'use strict';
11
+
10
12
  /**
11
13
  * @name proxy
12
14
  * @description Provides methods for intercepting network traffic via mitmproxy.
13
15
  */
14
-
15
16
  Object.defineProperty(exports, "__esModule", {
16
17
  value: true
17
18
  });
18
19
  exports.default = void 0;
19
-
20
20
  require("source-map-support/register");
21
-
22
21
  var _util = _interopRequireDefault(require("../lib/util"));
23
-
24
22
  var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
25
-
26
23
  var _helper = _interopRequireDefault(require("../errors/helper"));
27
-
28
24
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
29
-
30
25
  var _utils = _interopRequireDefault(require("./utils"));
31
-
32
26
  var _mitmproxyNode = _interopRequireDefault(require("@oxygenhq/mitmproxy-node"));
33
-
34
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
35
-
27
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
36
28
  const MODULE_NAME = 'proxy';
37
-
38
29
  class ProxyModule extends _OxygenModule.default {
39
30
  constructor(options, context, rs, logger, modules, services) {
40
31
  super(options, context, rs, logger, modules, services);
@@ -46,10 +37,10 @@ class ProxyModule extends _OxygenModule.default {
46
37
  this._proxyExternalyLaunched = true;
47
38
  this._isInitialized = false;
48
39
  }
49
-
50
40
  get name() {
51
41
  return MODULE_NAME;
52
42
  }
43
+
53
44
  /**
54
45
  * @function init
55
46
  * @summary Initializes proxy.
@@ -61,8 +52,6 @@ class ProxyModule extends _OxygenModule.default {
61
52
  * @example <caption>[shell] Launching mitmproxy manually</caption>
62
53
  * mitmdump --anticache -s mitmproxy-node\scripts\proxy.py --ssl-insecure --set httpCommPort=8765
63
54
  */
64
-
65
-
66
55
  async init(proxyPort, proxyCommPort = null, saveRequestBody = false, saveResponseBody = false) {
67
56
  this._saveRequestBody = saveRequestBody;
68
57
  this._saveResponseBody = saveResponseBody;
@@ -72,12 +61,11 @@ class ProxyModule extends _OxygenModule.default {
72
61
  this._proxyExternalyLaunched = !!proxyCommPort;
73
62
  return true;
74
63
  }
64
+
75
65
  /**
76
66
  * @function dispose
77
67
  * @summary Disposes this module.
78
68
  */
79
-
80
-
81
69
  async dispose(status) {
82
70
  try {
83
71
  if (this._proxy) {
@@ -87,7 +75,6 @@ class ProxyModule extends _OxygenModule.default {
87
75
  } catch (e) {
88
76
  console.log('Failed to dispose the proxy', e);
89
77
  }
90
-
91
78
  this._proxy = null;
92
79
  this._networkTraffic = [];
93
80
  super.dispose();
@@ -113,8 +100,6 @@ class ProxyModule extends _OxygenModule.default {
113
100
  * return request.status === '200' && request.url === 'https://www.yourwebsite.com/foo/bar';
114
101
  * });
115
102
  */
116
-
117
-
118
103
  start() {
119
104
  this._collectData = true;
120
105
  this._networkTraffic = [];
@@ -123,8 +108,6 @@ class ProxyModule extends _OxygenModule.default {
123
108
  * @summary Stop collecting network requests.
124
109
  * @function stop
125
110
  */
126
-
127
-
128
111
  stop() {
129
112
  this._collectData = false;
130
113
  }
@@ -133,8 +116,6 @@ class ProxyModule extends _OxygenModule.default {
133
116
  * @function getRequests
134
117
  * @return {Object[]} Array containing network requests.
135
118
  */
136
-
137
-
138
119
  getRequests() {
139
120
  return this._networkTraffic;
140
121
  }
@@ -145,35 +126,27 @@ class ProxyModule extends _OxygenModule.default {
145
126
  * @param {Number=} timeout - Timeout. Default is 60 seconds.
146
127
  * @return {Object} Network request details if the network request was found.
147
128
  */
148
-
149
-
150
129
  async waitForUrl(pattern, timeout = 60 * 1000) {
151
130
  if (!this._isInitialized) {
152
131
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
153
132
  }
154
-
155
133
  if (!this._collectData) {
156
134
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
157
135
  }
158
-
159
136
  _utils.default.assertArgument(pattern, 'pattern');
160
-
161
137
  _utils.default.assertArgumentTimeout(timeout, 'timeout');
162
-
163
138
  const start = Date.now();
164
-
165
139
  while (Date.now() - start < timeout) {
166
140
  for (let req of this._networkTraffic) {
167
141
  if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
168
142
  return req;
169
143
  }
170
144
  }
171
-
172
145
  await _util.default.sleep(500);
173
146
  }
174
-
175
147
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
176
148
  }
149
+
177
150
  /**
178
151
  * @summary Wait for a network request.
179
152
  * @function waitFor
@@ -181,35 +154,27 @@ class ProxyModule extends _OxygenModule.default {
181
154
  * @param {Number=} timeout - Timeout. Default is 60 seconds.
182
155
  * @return {Object} Network request details if the network request was found.
183
156
  */
184
-
185
-
186
157
  async waitFor(matcher, timeout = 60 * 1000) {
187
158
  if (!this._isInitialized || !this._parent) {
188
159
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
189
160
  }
190
-
191
161
  if (!this._collectData) {
192
162
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
193
163
  }
194
-
195
164
  this._parent.helpers.assertArgument(matcher, 'matcher');
196
-
197
165
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
198
-
199
166
  const start = Date.now();
200
-
201
167
  while (Date.now() - start < timeout) {
202
168
  for (var req of this._networkTraffic) {
203
169
  if (matcher(req)) {
204
170
  return req;
205
171
  }
206
172
  }
207
-
208
173
  await _util.default.sleep(500);
209
174
  }
210
-
211
175
  throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
212
176
  }
177
+
213
178
  /**
214
179
  * @summary Assert if network request matching the specified URL.
215
180
  * @function assertUrl
@@ -217,35 +182,27 @@ class ProxyModule extends _OxygenModule.default {
217
182
  * @param {Number=} timeout - Timeout. Default is 60 seconds.
218
183
  * @return {Object} Network request details if the network request was found.
219
184
  */
220
-
221
-
222
185
  async assertUrl(url, timeout = 60 * 1000) {
223
186
  if (!this._isInitialized || !this._parent) {
224
187
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
225
188
  }
226
-
227
189
  if (!this._collectData) {
228
190
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
229
191
  }
230
-
231
192
  this._parent.helpers.assertArgument(url, 'url');
232
-
233
193
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
234
-
235
194
  const start = Date.now();
236
-
237
195
  while (Date.now() - start < timeout) {
238
196
  for (let req of this._networkTraffic) {
239
197
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
240
198
  return req;
241
199
  }
242
200
  }
243
-
244
201
  await _util.default.sleep(500);
245
202
  }
246
-
247
203
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
248
204
  }
205
+
249
206
  /**
250
207
  * @summary Assert whether HTTP response status code matches the specified value.
251
208
  * @function assertStatusCode
@@ -255,26 +212,18 @@ class ProxyModule extends _OxygenModule.default {
255
212
  * @param {Number=} timeout - Timeout. Default is 60 seconds.
256
213
  * @return {Object} Network request details if the network request was found.
257
214
  */
258
-
259
-
260
215
  async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
261
216
  if (!this._isInitialized || !this._parent) {
262
217
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
263
218
  }
264
-
265
219
  if (!this._collectData) {
266
220
  throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
267
221
  }
268
-
269
222
  this._parent.helpers.assertArgument(url, 'url');
270
-
271
223
  this._parent.helpers.assertArgument(statusCode, 'statusCode');
272
-
273
224
  this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
274
-
275
225
  const start = Date.now();
276
226
  let matchedReq = null;
277
-
278
227
  while (Date.now() - start < timeout && !matchedReq) {
279
228
  for (let req of this._networkTraffic) {
280
229
  if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
@@ -282,20 +231,16 @@ class ProxyModule extends _OxygenModule.default {
282
231
  break;
283
232
  }
284
233
  }
285
-
286
234
  !matchedReq && (await _util.default.sleep(500));
287
235
  }
288
-
289
236
  if (!matchedReq) {
290
237
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
291
238
  }
292
-
293
239
  if (statusCode !== matchedReq.status) {
294
240
  const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
295
241
  throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
296
242
  }
297
243
  }
298
-
299
244
  _onNetworkIntercept(msg) {
300
245
  if (this._collectData) {
301
246
  let obj = {
@@ -305,20 +250,15 @@ class ProxyModule extends _OxygenModule.default {
305
250
  requestHeaders: msg.request.headers,
306
251
  responseHeaders: msg.response.headers
307
252
  };
308
-
309
253
  if (this._saveRequestBody) {
310
254
  obj.requestBody = msg.request.body;
311
255
  }
312
-
313
256
  if (this._saveResponseBody) {
314
257
  obj.responseBody = msg.response.body;
315
258
  }
316
-
317
259
  this._networkTraffic.push(obj);
318
260
  }
319
261
  }
320
-
321
262
  }
322
-
323
263
  exports.default = ProxyModule;
324
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlByb3h5TW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX25ldHdvcmtUcmFmZmljIiwiX2NvbGxlY3REYXRhIiwiX3NhdmVSZXF1ZXN0Qm9keSIsIl9zYXZlUmVzcG9uc2VCb2R5IiwiX3Byb3h5IiwiX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJpbml0IiwicHJveHlQb3J0IiwicHJveHlDb21tUG9ydCIsInNhdmVSZXF1ZXN0Qm9keSIsInNhdmVSZXNwb25zZUJvZHkiLCJNSVRNUHJveHkiLCJDcmVhdGUiLCJfb25OZXR3b3JrSW50ZXJjZXB0IiwiYmluZCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTWl0bSIsInNodXRkb3duIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLE9BQXBCOztBQUVlLE1BQU1DLFdBQU4sU0FBMEJDLHFCQUExQixDQUF1QztBQUNsREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFBN0M7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsS0FBekI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLHVCQUFMLEdBQStCLElBQS9CO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNIOztBQUVPLE1BQUpDLElBQUksR0FBRztBQUNQLFdBQU9qQixXQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYyxRQUFKa0IsSUFBSSxDQUFDQyxTQUFELEVBQVlDLGFBQWEsR0FBRyxJQUE1QixFQUFrQ0MsZUFBZSxHQUFHLEtBQXBELEVBQTJEQyxnQkFBZ0IsR0FBRyxLQUE5RSxFQUFxRjtBQUMzRixTQUFLVixn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QjtBQUN2QnNELFFBQUFBLEdBQUcsQ0FBQ1EsV0FBSixHQUFrQlQsR0FBRyxDQUFDRSxPQUFKLENBQVlRLElBQTlCO0FBQ0g7O0FBRUQsVUFBSSxLQUFLOUQsaUJBQVQsRUFBNEI7QUFDeEJxRCxRQUFBQSxHQUFHLENBQUNVLFlBQUosR0FBbUJYLEdBQUcsQ0FBQ0ksUUFBSixDQUFhTSxJQUFoQztBQUNIOztBQUVELFdBQUtqRSxlQUFMLENBQXFCbUUsSUFBckIsQ0FBMEJYLEdBQTFCO0FBQ0g7QUFDSjs7QUF4UGlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSBwcm94eVxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgaW50ZXJjZXB0aW5nIG5ldHdvcmsgdHJhZmZpYyB2aWEgbWl0bXByb3h5LlxyXG4gKi9cclxuXHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgaGVscGVycyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IE1JVE1Qcm94eSBmcm9tICdAb3h5Z2VuaHEvbWl0bXByb3h5LW5vZGUnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAncHJveHknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJveHlNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXNwb25zZUJvZHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBwcm94eS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm94eVBvcnQgLSBQcm94eSBwb3J0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwcm94eUNvbW1Qb3J0IC0gUG9ydCBmb3IgaW50ZXJuYWwgcHJveHkgY29tbXVuaWNhdGlvbi4gSWYgc3BlY2lmaWVkLCB0aGVuIG1pdG1wcm94eSBzaG91bGQgYmUgbGF1bmNoZWQgbWFudWFsbHkuXHJcbiAgICAgKiBPdGhlcndpc2UgbWl0bXBveHkgd2lsbCBiZSBsYXVuY2hlZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlcXVlc3RCb2R5IC0gU2F2ZSByZXF1ZXN0IGJvZGllcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHNhdmVSZXNwb25zZUJvZHkgLSBTYXZlIHJlc3BvbnNlIGJvZGllcy5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltzaGVsbF0gTGF1bmNoaW5nIG1pdG1wcm94eSBtYW51YWxseTwvY2FwdGlvbj5cclxuICAgICAqIG1pdG1kdW1wIC0tYW50aWNhY2hlIC1zIG1pdG1wcm94eS1ub2RlXFxzY3JpcHRzXFxwcm94eS5weSAtLXNzbC1pbnNlY3VyZSAtLXNldCBodHRwQ29tbVBvcnQ9ODc2NVxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KHByb3h5UG9ydCwgcHJveHlDb21tUG9ydCA9IG51bGwsIHNhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlLCBzYXZlUmVzcG9uc2VCb2R5ID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLl9zYXZlUmVxdWVzdEJvZHkgPSBzYXZlUmVxdWVzdEJvZHk7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlc3BvbnNlQm9keSA9IHNhdmVSZXNwb25zZUJvZHk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gYXdhaXQgTUlUTVByb3h5LkNyZWF0ZSh0aGlzLl9vbk5ldHdvcmtJbnRlcmNlcHQuYmluZCh0aGlzKSwgcHJveHlQb3J0LCBwcm94eUNvbW1Qb3J0LCBbJy9ldmFsJ10sIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQgPSAhIXByb3h5Q29tbVBvcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRGlzcG9zZXMgdGhpcyBtb2R1bGUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlTWl0bSA9ICF0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJveHkuc2h1dGRvd24oZGlzcG9zZU1pdG0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGRpc3Bvc2UgdGhlIHByb3h5JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEJlZ2luIGNvbGxlY3RpbmcgbmV0d29yayByZXF1ZXN0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBBbnkgcHJldmlvdXNseSBjb2xsZWN0ZWQgcmVxdWVzdHMgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RhcnRcclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogcHJveHkuaW5pdCg4MDgwKTtcclxuICAgICAqIHByb3h5LnN0YXJ0KCk7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gcHJveHkuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogcHJveHkud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gJzIwMCcgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uZXR3b3JrVHJhZmZpYztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHtwYXR0ZXJufVwiIHdhcyBmb3VuZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsICdObyByZXF1ZXN0IGZvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBtYXRjaGVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFVybCh1cmwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9vbk5ldHdvcmtJbnRlcmNlcHQobXNnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IG1zZy5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbXNnLnJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBtc2cucmVzcG9uc2Uuc3RhdHVzX2NvZGUsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogbXNnLnJlcXVlc3QuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogbXNnLnJlc3BvbnNlLmhlYWRlcnNcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVxdWVzdEJvZHkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5yZXF1ZXN0Qm9keSA9IG1zZy5yZXF1ZXN0LmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVzcG9uc2VCb2R5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmoucmVzcG9uc2VCb2R5ID0gbXNnLnJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
264
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJyZXF1aXJlIiwiX3V0aWwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX094eWdlbk1vZHVsZSIsIl9oZWxwZXIiLCJfT3h5Z2VuRXJyb3IiLCJfdXRpbHMiLCJfbWl0bXByb3h5Tm9kZSIsImUiLCJfX2VzTW9kdWxlIiwiTU9EVUxFX05BTUUiLCJQcm94eU1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9uZXR3b3JrVHJhZmZpYyIsIl9jb2xsZWN0RGF0YSIsIl9zYXZlUmVxdWVzdEJvZHkiLCJfc2F2ZVJlc3BvbnNlQm9keSIsIl9wcm94eSIsIl9wcm94eUV4dGVybmFseUxhdW5jaGVkIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwiaW5pdCIsInByb3h5UG9ydCIsInByb3h5Q29tbVBvcnQiLCJzYXZlUmVxdWVzdEJvZHkiLCJzYXZlUmVzcG9uc2VCb2R5IiwiTUlUTVByb3h5IiwiQ3JlYXRlIiwiX29uTmV0d29ya0ludGVyY2VwdCIsImJpbmQiLCJkaXNwb3NlIiwic3RhdHVzIiwiZGlzcG9zZU1pdG0iLCJzaHV0ZG93biIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEBuYW1lIHByb3h5XHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBpbnRlcmNlcHRpbmcgbmV0d29yayB0cmFmZmljIHZpYSBtaXRtcHJveHkuXHJcbiAqL1xyXG5cclxuaW1wb3J0IGxpYlV0aWxzIGZyb20gJy4uL2xpYi91dGlsJztcclxuaW1wb3J0IE94eWdlbk1vZHVsZSBmcm9tICcuLi9jb3JlL094eWdlbk1vZHVsZSc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgTUlUTVByb3h5IGZyb20gJ0BveHlnZW5ocS9taXRtcHJveHktbm9kZSc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdwcm94eSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm94eU1vZHVsZSBleHRlbmRzIE94eWdlbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLl9uZXR3b3JrVHJhZmZpYyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlcXVlc3RCb2R5ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlc3BvbnNlQm9keSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHByb3h5LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3h5UG9ydCAtIFByb3h5IHBvcnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHByb3h5Q29tbVBvcnQgLSBQb3J0IGZvciBpbnRlcm5hbCBwcm94eSBjb21tdW5pY2F0aW9uLiBJZiBzcGVjaWZpZWQsIHRoZW4gbWl0bXByb3h5IHNob3VsZCBiZSBsYXVuY2hlZCBtYW51YWxseS5cclxuICAgICAqIE90aGVyd2lzZSBtaXRtcG94eSB3aWxsIGJlIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBzYXZlUmVxdWVzdEJvZHkgLSBTYXZlIHJlcXVlc3QgYm9kaWVzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlc3BvbnNlQm9keSAtIFNhdmUgcmVzcG9uc2UgYm9kaWVzLlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W3NoZWxsXSBMYXVuY2hpbmcgbWl0bXByb3h5IG1hbnVhbGx5PC9jYXB0aW9uPlxyXG4gICAgICogbWl0bWR1bXAgLS1hbnRpY2FjaGUgLXMgbWl0bXByb3h5LW5vZGVcXHNjcmlwdHNcXHByb3h5LnB5IC0tc3NsLWluc2VjdXJlIC0tc2V0IGh0dHBDb21tUG9ydD04NzY1XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQocHJveHlQb3J0LCBwcm94eUNvbW1Qb3J0ID0gbnVsbCwgc2F2ZVJlcXVlc3RCb2R5ID0gZmFsc2UsIHNhdmVSZXNwb25zZUJvZHkgPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSA9IHNhdmVSZXF1ZXN0Qm9keTtcclxuICAgICAgICB0aGlzLl9zYXZlUmVzcG9uc2VCb2R5ID0gc2F2ZVJlc3BvbnNlQm9keTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJveHkgPSBhd2FpdCBNSVRNUHJveHkuQ3JlYXRlKHRoaXMuX29uTmV0d29ya0ludGVyY2VwdC5iaW5kKHRoaXMpLCBwcm94eVBvcnQsIHByb3h5Q29tbVBvcnQsIFsnL2V2YWwnXSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9ICEhcHJveHlDb21tUG9ydDtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBEaXNwb3NlcyB0aGlzIG1vZHVsZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcHJveHkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2VNaXRtID0gIXRoaXMuX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQ7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm94eS5zaHV0ZG93bihkaXNwb3NlTWl0bSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gZGlzcG9zZSB0aGUgcHJveHknLCBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9uZXR3b3JrVHJhZmZpYyA9IFtdO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiBwcm94eS5pbml0KDgwODApO1xyXG4gICAgICogcHJveHkuc3RhcnQoKTtcclxuICAgICAqIC8vIHByaW50IHRoZSBjb2xsZWN0ZWQgcmVxdWVzdCBzbyBmYXI6XHJcbiAgICAgKiBsZXQgcmVxdWVzdHMgPSBwcm94eS5nZXRSZXF1ZXN0cygpO1xyXG4gICAgICogZm9yIChsZXQgcmVxIG9mIHJlcXVlc3RzKSB7XHJcbiAgICAgKiAgIGxvZy5pbmZvKHJlcSk7XHJcbiAgICAgKiB9XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSB2ZXJiYXRpbSBVUkwgbWF0Y2g6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKCdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2JhcicpO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uIFVSTCBtYXRjaDpcclxuICAgICAqIHByb3h5LndhaXRGb3JVcmwoL2h0dHBzOlxcL1xcLy4qXFwvZm9vXFwvYmFyLyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSBjdXN0b20gbWF0Y2hlcjpcclxuICAgICAqIHByb3h5LndhaXRGb3IoZnVuY3Rpb24gKHJlcXVlc3QpIHtcclxuICAgICAqICAgcmV0dXJuIHJlcXVlc3Quc3RhdHVzID09PSAnMjAwJyAmJiByZXF1ZXN0LnVybCA9PT0gJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJztcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RvcFxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybiBhbGwgdGhlIGNvbGxlY3RlZCBuZXR3b3JrIHJlcXVlc3RzIHNvIGZhci5cclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXF1ZXN0c1xyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IGNvbnRhaW5pbmcgbmV0d29yayByZXF1ZXN0cy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVxdWVzdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldHdvcmtUcmFmZmljO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXYWl0IGZvciBhIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gLSBBbiBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yVXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eWAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5LnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYHByb3h5YCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgdGhpcy5fbmV0d29ya1RyYWZmaWMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWF0Y2hlciAtIE1hdGNoaW5nIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIHRydWUgb24gbWF0Y2gsIG9yIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3IobWF0Y2hlciwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChtYXRjaGVyLCAnbWF0Y2hlcicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciByZXEgb2YgdGhpcy5fbmV0d29ya1RyYWZmaWMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyKHJlcSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNDb2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0U3RhdHVzQ29kZSh1cmwsIHN0YXR1c0NvZGUsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPT0gbWF0Y2hlZFJlcS5zdGF0dXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBUaGUgZXhwZWN0ZWQgc3RhdHVzIGNvZGUgXCIke3N0YXR1c0NvZGV9XCIgZG9lcyBub3QgbWF0Y2ggXCIke21hdGNoZWRSZXEuc3RhdHVzfVwiLmA7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uTmV0d29ya0ludGVyY2VwdChtc2cpIHtcclxuICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogbXNnLnJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtc2cucmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IG1zZy5yZXNwb25zZS5zdGF0dXNfY29kZSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiBtc2cucmVxdWVzdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiBtc2cucmVzcG9uc2UuaGVhZGVyc1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSkge1xyXG4gICAgICAgICAgICAgICAgb2JqLnJlcXVlc3RCb2R5ID0gbXNnLnJlcXVlc3QuYm9keTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhdmVSZXNwb25zZUJvZHkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5yZXNwb25zZUJvZHkgPSBtc2cucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFIQUEsTUFBQSxDQUFBQyxjQUFBLENBQUFDLE9BQUE7RUFBQUMsS0FBQTtBQUFBO0FBQUFELE9BQUEsQ0FBQUUsT0FBQTtBQUFBQyxPQUFBO0FBS0EsSUFBQUMsS0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsYUFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksT0FBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssWUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sY0FBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQWlELFNBQUFFLHVCQUFBTSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQVQsT0FBQSxFQUFBUyxDQUFBO0FBRWpELE1BQU1FLFdBQVcsR0FBRyxPQUFPO0FBRVosTUFBTUMsV0FBVyxTQUFTQyxxQkFBWSxDQUFDO0VBQ2xEQyxXQUFXQSxDQUFDQyxPQUFPLEVBQUVDLE9BQU8sRUFBRUMsRUFBRSxFQUFFQyxNQUFNLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxFQUFFO0lBQ3pELEtBQUssQ0FBQ0wsT0FB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
@@ -1,13 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  require("source-map-support/register");
4
-
5
4
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
6
-
7
5
  var _util = _interopRequireDefault(require("../lib/util"));
8
-
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
-
6
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
7
  /*
12
8
  * Copyright (C) 2015-present CloudBeat Limited
13
9
  *
@@ -21,19 +17,17 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
17
  * @name serial
22
18
  * @description Provides methods for working with serial ports.
23
19
  */
24
- var errHelper = require('../errors/helper');
25
20
 
21
+ var errHelper = require('../errors/helper');
26
22
  module.exports = function () {
27
23
  var SerialPort = require('serialport');
28
-
29
24
  var utils = require('./utils');
30
-
31
25
  var serialPort;
32
26
  var stringBuffer;
33
-
34
27
  module.isInitialized = function () {
35
28
  return serialPort !== undefined;
36
29
  };
30
+
37
31
  /**
38
32
  * @summary Returns list of available ports.
39
33
  * @description See https://github.com/EmergingTechnologyAdvisors/node-serialport#module_serialport--SerialPort.list
@@ -41,11 +35,10 @@ module.exports = function () {
41
35
  * @function list
42
36
  * @return {Object[]} Array of port descriptions.
43
37
  */
44
-
45
-
46
38
  module.list = async function () {
47
39
  return await SerialPort.list();
48
40
  };
41
+
49
42
  /**
50
43
  * @summary Opens a serial port.
51
44
  * @description Data from the opened port will be automatically read line by line into a circular buffer.
@@ -68,12 +61,9 @@ module.exports = function () {
68
61
  * xany: false
69
62
  * }
70
63
  */
71
-
72
-
73
64
  module.open = function (port, opts, bufferSize = 65536) {
74
65
  utils.assertArgumentNonEmptyString(port, 'port');
75
66
  utils.assertArgumentNumberNonNegative(bufferSize, 'bufferSize');
76
-
77
67
  if (port) {
78
68
  return new Promise((resolve, reject) => {
79
69
  serialPort = new SerialPort(port, opts);
@@ -91,6 +81,7 @@ module.exports = function () {
91
81
  });
92
82
  }
93
83
  };
84
+
94
85
  /**
95
86
  * @summary Waits for text to appear in the input data buffer.
96
87
  * @description Text pattern can be any of the supported
@@ -99,34 +90,28 @@ module.exports = function () {
99
90
  * @param {String} pattern - Text pattern.
100
91
  * @param {Number=} timeout - Timeout in milliseconds. Default is 60 seconds.
101
92
  */
102
-
103
-
104
93
  module.waitForText = async function (pattern, timeout = 60000) {
105
94
  utils.assertArgumentNonEmptyString(pattern, 'pattern');
106
95
  utils.assertArgumentNumberNonNegative(timeout, 'timeout');
107
-
108
96
  if (stringBuffer) {
109
97
  var now = new Date().getTime();
110
98
  let done = false;
111
-
112
99
  while (!done && Date.now() - now < timeout) {
113
100
  var i;
114
-
115
101
  for (i = stringBuffer.length; i >= 0; i--) {
116
102
  if (utils.matchPattern(stringBuffer[i], pattern)) {
117
103
  done = true;
118
104
  break;
119
105
  }
120
106
  }
121
-
122
107
  await _util.default.sleep(500);
123
108
  }
124
-
125
109
  if (new Date().getTime() - now >= timeout) {
126
110
  throw new _OxygenError.default(errHelper.errorCode.TIMEOUT);
127
111
  }
128
112
  }
129
113
  };
114
+
130
115
  /**
131
116
  * @summary Write data to the port.
132
117
  * @function write
@@ -134,11 +119,8 @@ module.exports = function () {
134
119
  * @example <caption>[javascript] Usage example</caption>
135
120
  * serial.write('Hello\r\n');
136
121
  */
137
-
138
-
139
122
  module.write = function (data) {
140
123
  utils.assertArgument(data, 'data');
141
-
142
124
  if (serialPort) {
143
125
  return new Promise((resolve, reject) => {
144
126
  serialPort.write(data);
@@ -148,40 +130,33 @@ module.exports = function () {
148
130
  });
149
131
  }
150
132
  };
133
+
151
134
  /**
152
135
  * @summary Return data buffer.
153
136
  * @function getBuffer
154
137
  * @return {CircularStringBuffer} Data buffer.
155
138
  */
156
-
157
-
158
139
  module.getBuffer = function () {
159
140
  return stringBuffer;
160
141
  };
161
-
162
142
  module.dispose = function () {
163
143
  if (serialPort) {
164
144
  serialPort.close();
165
145
  }
166
146
  };
167
-
168
147
  function CircularStringBuffer(maxSize) {
169
148
  this.maxSize = maxSize;
170
149
  this.size = 0;
171
150
  }
172
-
173
151
  CircularStringBuffer.prototype = Object.create(Array.prototype);
174
-
175
152
  CircularStringBuffer.prototype.push = function (string) {
176
153
  while (this.size + string.length > this.maxSize) {
177
154
  this.size -= string.length;
178
155
  this.shift();
179
156
  }
180
-
181
157
  Array.prototype.push.call(this, string);
182
158
  this.size += string.length;
183
159
  };
184
-
185
160
  return module;
186
161
  };
187
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1zZXJpYWwuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJTZXJpYWxQb3J0IiwidXRpbHMiLCJzZXJpYWxQb3J0Iiwic3RyaW5nQnVmZmVyIiwiaXNJbml0aWFsaXplZCIsInVuZGVmaW5lZCIsImxpc3QiLCJvcGVuIiwicG9ydCIsIm9wdHMiLCJidWZmZXJTaXplIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZXJyIiwiT3hFcnJvciIsImVycm9yQ29kZSIsIlNFUklBTF9QT1JUX0VSUk9SIiwibWVzc2FnZSIsInBhcnNlciIsInBpcGUiLCJwYXJzZXJzIiwiUmVhZGxpbmUiLCJDaXJjdWxhclN0cmluZ0J1ZmZlciIsImRhdGEiLCJwdXNoIiwidG9TdHJpbmciLCJ3YWl0Rm9yVGV4dCIsInBhdHRlcm4iLCJ0aW1lb3V0Iiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJkb25lIiwiaSIsImxlbmd0aCIsIm1hdGNoUGF0dGVybiIsImxpYlV0aWxzIiwic2xlZXAiLCJUSU1FT1VUIiwid3JpdGUiLCJhc3NlcnRBcmd1bWVudCIsImRyYWluIiwiZ2V0QnVmZmVyIiwiZGlzcG9zZSIsImNsb3NlIiwibWF4U2l6ZSIsInNpemUiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJBcnJheSIsInN0cmluZyIsInNoaWZ0IiwiY2FsbCJdLCJtYXBwaW5ncyI6Ijs7OztBQWFBOztBQUVBOzs7O0FBZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGtCQUFELENBQXZCOztBQUdBQyxNQUFNLENBQUNDLE9BQVAsR0FB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QUFDeEIsUUFBSTdDLFVBQUosRUFBZ0I7QUFDWkEsTUFBQUEsVUFBVSxDQUFDOEMsS0FBWDtBQUNIO0FBQ0osR0FKRDs7QUFNQSxXQUFTdEIsb0JBQVQsQ0FBOEJ1QixPQUE5QixFQUF1QztBQUNuQyxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxJQUFMLEdBQVksQ0FBWjtBQUNIOztBQUVEeEIsRUFBQUEsb0JBQW9CLENBQUN5QixTQUFyQixHQUFpQ0MsTUFBTSxDQUFDQyxNQUFQLENBQWNDLEtBQUssQ0FBQ0gsU0FBcEIsQ0FBakM7O0FBRUF6QixFQUFBQSxvQkFBb0IsQ0FBQ3lCLFNBQXJCLENBQStCdkIsSUFBL0IsR0FBc0MsVUFBUzJCLE1BQVQsRUFBaUI7QUFDbkQsV0FBTyxLQUFLTCxJQUFMLEdBQVlLLE1BQU0sQ0FBQ2pCLE1BQW5CLEdBQTRCLEtBQUtXLE9BQXhDLEVBQWlEO0FBQzdDLFdBQUtDLElBQUwsSUFBYUssTUFBTSxDQUFDakIsTUFBcEI7QUFDQSxXQUFLa0IsS0FBTDtBQUNIOztBQUNERixJQUFBQSxLQUFLLENBQUNILFNBQU4sQ0FBZ0J2QixJQUFoQixDQUFxQjZCLElBQXJCLENBQTBCLElBQTFCLEVBQWdDRixNQUFoQztBQUNBLFNBQUtMLElBQUwsSUFBYUssTUFBTSxDQUFDakIsTUFBcEI7QUFDSCxHQVBEOztBQVNBLFNBQU94QyxNQUFQO0FBQ0gsQ0EzSkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBzZXJpYWxcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBzZXJpYWwgcG9ydHMuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG52YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBTZXJpYWxQb3J0ID0gcmVxdWlyZSgnc2VyaWFscG9ydCcpO1xyXG4gICAgdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xyXG5cclxuICAgIHZhciBzZXJpYWxQb3J0O1xyXG4gICAgdmFyIHN0cmluZ0J1ZmZlcjtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBzZXJpYWxQb3J0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBwb3J0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0VtZXJnaW5nVGVjaG5vbG9neUFkdmlzb3JzL25vZGUtc2VyaWFscG9ydCNtb2R1bGVfc2VyaWFscG9ydC0tU2VyaWFsUG9ydC5saXN0XHJcbiAgICAgKiAgICAgICAgICAgICAgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiByZXR1cm5lZCB2YWx1ZXMuXHJcbiAgICAgKiBAZnVuY3Rpb24gbGlzdFxyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IG9mIHBvcnQgZGVzY3JpcHRpb25zLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUubGlzdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBTZXJpYWxQb3J0Lmxpc3QoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBhIHNlcmlhbCBwb3J0LlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERhdGEgZnJvbSB0aGUgb3BlbmVkIHBvcnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlYWQgbGluZSBieSBsaW5lIGludG8gYSBjaXJjdWxhciBidWZmZXIuXHJcbiAgICAgKiAgICAgICAgICAgICAgT25jZSB0aGUgYnVmZmVyIHJlYWNoZXMgaXQncyBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmllZCBieSBgYnVmZmVyU2l6ZWAgYXJndW1lbnQsIGVsZGVzdCBlbnRyaWVzIGFyZSBcclxuICAgICAqICAgICAgICAgICAgICBldmljdGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGRhdGEuXHJcbiAgICAgKiBAZnVuY3Rpb24gb3BlblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBvcnQgLSBQYXRoIHRvIHNlcmlhbCBwb3J0LiBFLmcuICcvZGV2L3R0eS11c2JzZXJpYWwxJywgJ0NPTTUnLCBldGMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFBvcnQgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gYnVmZmVyU2l6ZSAtIFNpemUgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLiBEZWZhdWx0IGlzIDY1NTM2IGJ5dGVzLlxyXG4gICAgICogQHJldHVybiB7U2VyaWFsUG9ydH0gU2VyaWFsUG9ydCBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gU2VyaWFsIHBvcnQgcHJvcGVydGllcyB3aXRoIGRlZmF1bHQgdmFsdWVzPC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBiYXVkUmF0ZTogOTYwMCxcclxuICAgICAqICAgZGF0YUJpdHM6IDgsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogOCwgNywgNiwgb3IgNS5cclxuICAgICAqICAgc3RvcEJpdHM6IDEsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogMSBvciAyLlxyXG4gICAgICogICBwYXJpdHk6ICdub25lJyAgICAgIC8vIE11c3QgYmUgb25lIG9mOiAnbm9uZScsICdldmVuJywgJ21hcmsnLCAnb2RkJywgJ3NwYWNlJy5cclxuICAgICAqICAgcnRzY3RzOiBmYWxzZSxcclxuICAgICAqICAgeG9uOiBmYWxzZSxcclxuICAgICAqICAgeG9mZjogZmFsc2UsXHJcbiAgICAgKiAgIHhhbnk6IGZhbHNlXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5vcGVuID0gZnVuY3Rpb24ocG9ydCwgb3B0cywgYnVmZmVyU2l6ZSA9IDY1NTM2KSB7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhwb3J0LCAncG9ydCcpO1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUoYnVmZmVyU2l6ZSwgJ2J1ZmZlclNpemUnKTtcclxuXHJcbiAgICAgICAgaWYgKHBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmlhbFBvcnQgPSBuZXcgU2VyaWFsUG9ydChwb3J0LCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdvcGVuJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VyaWFsUG9ydCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TRVJJQUxfUE9SVF9FUlJPUiwgZXJyLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBzZXJpYWxQb3J0LnBpcGUobmV3IFNlcmlhbFBvcnQucGFyc2Vycy5SZWFkbGluZSgpKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlciA9IG5ldyBDaXJjdWxhclN0cmluZ0J1ZmZlcihidWZmZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIHBhcnNlci5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLnB1c2goZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXRzIGZvciB0ZXh0IHRvIGFwcGVhciBpbiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGV4dCBwYXR0ZXJuIGNhbiBiZSBhbnkgb2YgdGhlIHN1cHBvcnRlZCBcclxuICAgICAqICBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnMob24gdGhlIHRvcCBvZiBwYWdlKS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBUZXh0IHBhdHRlcm4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUud2FpdEZvclRleHQgPSBhc3luYyBmdW5jdGlvbihwYXR0ZXJuLCB0aW1lb3V0ID0gNjAwMDApIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG5cclxuICAgICAgICBpZiAoc3RyaW5nQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSAobmV3IERhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFkb25lICYmIChEYXRlLm5vdygpIC0gbm93KSA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gc3RyaW5nQnVmZmVyLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMubWF0Y2hQYXR0ZXJuKHN0cmluZ0J1ZmZlcltpXSwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoKG5ldyBEYXRlKS5nZXRUaW1lKCkgLSBub3cgPj0gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXcml0ZSBkYXRhIHRvIHRoZSBwb3J0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0geyhTdHJpbmd8QXJyYXkpfSBkYXRhIC0gRGF0YSB0byBzZW5kLiBFaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHNlcmlhbC53cml0ZSgnSGVsbG9cXHJcXG4nKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50KGRhdGEsICdkYXRhJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0LndyaXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc2VyaWFsUG9ydC5kcmFpbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0QnVmZmVyXHJcbiAgICAgKiBAcmV0dXJuIHtDaXJjdWxhclN0cmluZ0J1ZmZlcn0gRGF0YSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHNlcmlhbFBvcnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIENpcmN1bGFyU3RyaW5nQnVmZmVyKG1heFNpemUpIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgQ2lyY3VsYXJTdHJpbmdCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xyXG5cclxuICAgIENpcmN1bGFyU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuc2l6ZSArIHN0cmluZy5sZW5ndGggPiB0aGlzLm1heFNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplIC09IHN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSArPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXX0=
162
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuRXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl91dGlsIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiZXJySGVscGVyIiwibW9kdWxlIiwiZXhwb3J0cyIsIlNlcmlhbFBvcnQiLCJ1dGlscyIsInNlcmlhbFBvcnQiLCJzdHJpbmdCdWZmZXIiLCJpc0luaXRpYWxpemVkIiwidW5kZWZpbmVkIiwibGlzdCIsIm9wZW4iLCJwb3J0Iiwib3B0cyIsImJ1ZmZlclNpemUiLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJlcnIiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiU0VSSUFMX1BPUlRfRVJST1IiLCJtZXNzYWdlIiwicGFyc2VyIiwicGlwZSIsInBhcnNlcnMiLCJSZWFkbGluZSIsIkNpcmN1bGFyU3RyaW5nQnVmZmVyIiwiZGF0YSIsInB1c2giLCJ0b1N0cmluZyIsIndhaXRGb3JUZXh0IiwicGF0dGVybiIsInRpbWVvdXQiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsImRvbmUiLCJpIiwibGVuZ3RoIiwibWF0Y2hQYXR0ZXJuIiwibGliVXRpbHMiLCJzbGVlcCIsIlRJTUVPVVQiLCJ3cml0ZSIsImFzc2VydEFyZ3VtZW50IiwiZHJhaW4iLCJnZXRCdWZmZXIiLCJkaXNwb3NlIiwiY2xvc2UiLCJtYXhTaXplIiwic2l6ZSIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIkFycmF5Iiwic3RyaW5nIiwic2hpZnQiLCJjYWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL294X21vZHVsZXMvbW9kdWxlLXNlcmlhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBzZXJpYWxcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBzZXJpYWwgcG9ydHMuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG52YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBTZXJpYWxQb3J0ID0gcmVxdWlyZSgnc2VyaWFscG9ydCcpO1xyXG4gICAgdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xyXG5cclxuICAgIHZhciBzZXJpYWxQb3J0O1xyXG4gICAgdmFyIHN0cmluZ0J1ZmZlcjtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBzZXJpYWxQb3J0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBwb3J0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0VtZXJnaW5nVGVjaG5vbG9neUFkdmlzb3JzL25vZGUtc2VyaWFscG9ydCNtb2R1bGVfc2VyaWFscG9ydC0tU2VyaWFsUG9ydC5saXN0XHJcbiAgICAgKiAgICAgICAgICAgICAgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiByZXR1cm5lZCB2YWx1ZXMuXHJcbiAgICAgKiBAZnVuY3Rpb24gbGlzdFxyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IG9mIHBvcnQgZGVzY3JpcHRpb25zLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUubGlzdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBTZXJpYWxQb3J0Lmxpc3QoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBhIHNlcmlhbCBwb3J0LlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERhdGEgZnJvbSB0aGUgb3BlbmVkIHBvcnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlYWQgbGluZSBieSBsaW5lIGludG8gYSBjaXJjdWxhciBidWZmZXIuXHJcbiAgICAgKiAgICAgICAgICAgICAgT25jZSB0aGUgYnVmZmVyIHJlYWNoZXMgaXQncyBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmllZCBieSBgYnVmZmVyU2l6ZWAgYXJndW1lbnQsIGVsZGVzdCBlbnRyaWVzIGFyZSBcclxuICAgICAqICAgICAgICAgICAgICBldmljdGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGRhdGEuXHJcbiAgICAgKiBAZnVuY3Rpb24gb3BlblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBvcnQgLSBQYXRoIHRvIHNlcmlhbCBwb3J0LiBFLmcuICcvZGV2L3R0eS11c2JzZXJpYWwxJywgJ0NPTTUnLCBldGMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFBvcnQgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gYnVmZmVyU2l6ZSAtIFNpemUgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLiBEZWZhdWx0IGlzIDY1NTM2IGJ5dGVzLlxyXG4gICAgICogQHJldHVybiB7U2VyaWFsUG9ydH0gU2VyaWFsUG9ydCBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gU2VyaWFsIHBvcnQgcHJvcGVydGllcyB3aXRoIGRlZmF1bHQgdmFsdWVzPC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBiYXVkUmF0ZTogOTYwMCxcclxuICAgICAqICAgZGF0YUJpdHM6IDgsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogOCwgNywgNiwgb3IgNS5cclxuICAgICAqICAgc3RvcEJpdHM6IDEsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogMSBvciAyLlxyXG4gICAgICogICBwYXJpdHk6ICdub25lJyAgICAgIC8vIE11c3QgYmUgb25lIG9mOiAnbm9uZScsICdldmVuJywgJ21hcmsnLCAnb2RkJywgJ3NwYWNlJy5cclxuICAgICAqICAgcnRzY3RzOiBmYWxzZSxcclxuICAgICAqICAgeG9uOiBmYWxzZSxcclxuICAgICAqICAgeG9mZjogZmFsc2UsXHJcbiAgICAgKiAgIHhhbnk6IGZhbHNlXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5vcGVuID0gZnVuY3Rpb24ocG9ydCwgb3B0cywgYnVmZmVyU2l6ZSA9IDY1NTM2KSB7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhwb3J0LCAncG9ydCcpO1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUoYnVmZmVyU2l6ZSwgJ2J1ZmZlclNpemUnKTtcclxuXHJcbiAgICAgICAgaWYgKHBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmlhbFBvcnQgPSBuZXcgU2VyaWFsUG9ydChwb3J0LCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdvcGVuJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VyaWFsUG9ydCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TRVJJQUxfUE9SVF9FUlJPUiwgZXJyLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBzZXJpYWxQb3J0LnBpcGUobmV3IFNlcmlhbFBvcnQucGFyc2Vycy5SZWFkbGluZSgpKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlciA9IG5ldyBDaXJjdWxhclN0cmluZ0J1ZmZlcihidWZmZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIHBhcnNlci5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLnB1c2goZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXRzIGZvciB0ZXh0IHRvIGFwcGVhciBpbiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGV4dCBwYXR0ZXJuIGNhbiBiZSBhbnkgb2YgdGhlIHN1cHBvcnRlZCBcclxuICAgICAqICBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnMob24gdGhlIHRvcCBvZiBwYWdlKS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBUZXh0IHBhdHRlcm4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUud2FpdEZvclRleHQgPSBhc3luYyBmdW5jdGlvbihwYXR0ZXJuLCB0aW1lb3V0ID0gNjAwMDApIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG5cclxuICAgICAgICBpZiAoc3RyaW5nQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSAobmV3IERhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFkb25lICYmIChEYXRlLm5vdygpIC0gbm93KSA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gc3RyaW5nQnVmZmVyLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMubWF0Y2hQYXR0ZXJuKHN0cmluZ0J1ZmZlcltpXSwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoKG5ldyBEYXRlKS5nZXRUaW1lKCkgLSBub3cgPj0gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXcml0ZSBkYXRhIHRvIHRoZSBwb3J0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0geyhTdHJpbmd8QXJyYXkpfSBkYXRhIC0gRGF0YSB0byBzZW5kLiBFaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHNlcmlhbC53cml0ZSgnSGVsbG9cXHJcXG4nKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50KGRhdGEsICdkYXRhJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0LndyaXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc2VyaWFsUG9ydC5kcmFpbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0QnVmZmVyXHJcbiAgICAgKiBAcmV0dXJuIHtDaXJjdWxhclN0cmluZ0J1ZmZlcn0gRGF0YSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHNlcmlhbFBvcnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIENpcmN1bGFyU3RyaW5nQnVmZmVyKG1heFNpemUpIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgQ2lyY3VsYXJTdHJpbmdCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xyXG5cclxuICAgIENpcmN1bGFyU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuc2l6ZSArIHN0cmluZy5sZW5ndGggPiB0aGlzLm1heFNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplIC09IHN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSArPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXSwibWFwcGluZ3MiOiI7OztBQWFBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FBQTtBQUFtQyxT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