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
@@ -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,31 +17,27 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
17
  * @name twilio
22
18
  * @description Provides methods for working with Twilio service.
23
19
  */
20
+
24
21
  module.exports = function () {
25
22
  const utils = require('./utils');
26
-
27
23
  const OxError = this.OxError = _OxygenError.default;
28
-
29
24
  const errHelper = this.errHelper = require('../errors/helper');
30
-
31
25
  const helpers = this.helpers = {};
32
-
33
26
  var _client;
34
-
35
27
  module.isInitialized = function () {
36
28
  return _client !== undefined;
37
29
  };
30
+
38
31
  /**
39
32
  * @summary Set Twilio authentication details.
40
33
  * @function init
41
34
  * @param {String} accountSid - Account SID.
42
35
  * @param {String} authToken - Authentication token.
43
36
  */
44
-
45
-
46
37
  module.init = function (accountSid, authToken) {
47
38
  _client = require('twilio')(accountSid, authToken);
48
39
  };
40
+
49
41
  /**
50
42
  * @summary Retrieves last SMS message.
51
43
  * @function getLastSms
@@ -55,24 +47,18 @@ module.exports = function () {
55
47
  * @param {String=} fromNumber - From number to filter message
56
48
  * @return {String} SMS text.
57
49
  */
58
-
59
-
60
50
  module.getLastSms = async function (removeOnRead, timeout, notOlderThan, fromNumber) {
61
51
  helpers.assertArgumentBool(removeOnRead, 'removeOnRead');
62
52
  helpers.assertArgumentNumberNonNegative(timeout, 'timeout');
63
-
64
53
  if (fromNumber) {
65
54
  helpers.assertArgumentString(fromNumber, 'fromNumber');
66
55
  }
67
-
68
56
  if (!notOlderThan) {
69
57
  notOlderThan = 4 * 60 * 1000;
70
58
  }
71
-
72
59
  var msg;
73
60
  var now = Date.now();
74
61
  var earliestMessageDate = new Date(now - notOlderThan);
75
-
76
62
  while (!msg && Date.now() - now < timeout) {
77
63
  await (() => {
78
64
  return new Promise((resolve, reject) => {
@@ -80,15 +66,14 @@ module.exports = function () {
80
66
  dateSentAfter: earliestMessageDate
81
67
  }, function (err, messages) {
82
68
  var _msg;
83
-
84
69
  if (messages && typeof messages[Symbol.iterator] === 'function') {
85
70
  for (_msg of messages) {
86
71
  if (_msg.direction == 'inbound') {
87
- if (fromNumber && _msg.from !== fromNumber) {// ignore
72
+ if (fromNumber && _msg.from !== fromNumber) {
73
+ // ignore
88
74
  } else {
89
- var _msgDate = Date.parse(_msg.dateCreated); // if message is newer than the previous one - save it
90
-
91
-
75
+ var _msgDate = Date.parse(_msg.dateCreated);
76
+ // if message is newer than the previous one - save it
92
77
  if (msg && Date.parse(msg.dateCreated) < _msgDate) {
93
78
  msg = _msg;
94
79
  } else if (!msg) {
@@ -98,18 +83,15 @@ module.exports = function () {
98
83
  }
99
84
  }
100
85
  }
101
-
102
86
  resolve();
103
87
  });
104
88
  });
105
89
  })();
106
90
  await _util.default.sleep(800);
107
91
  }
108
-
109
92
  if (!msg) {
110
93
  throw new OxError(errHelper.errorCode.TWILIO_ERROR, "Couldn't get the SMS within " + timeout + 'ms.');
111
94
  }
112
-
113
95
  if (removeOnRead) {
114
96
  await (() => {
115
97
  return new Promise((resolve, reject) => {
@@ -119,9 +101,9 @@ module.exports = function () {
119
101
  });
120
102
  })();
121
103
  }
122
-
123
104
  return msg.body;
124
105
  };
106
+
125
107
  /**
126
108
  * @summary Retrieves last SMS message sent from API.
127
109
  * @function getLastSentApiSms
@@ -130,20 +112,15 @@ module.exports = function () {
130
112
  * @param {Number=} notOlderThan - Retrieve message only if it arrived not before the given time (in ms). Default is 4 minutes.
131
113
  * @return {String} SMS text.
132
114
  */
133
-
134
-
135
115
  module.getLastSentApiSms = async function (removeOnRead, timeout, notOlderThan) {
136
116
  helpers.assertArgumentBool(removeOnRead, 'removeOnRead');
137
117
  helpers.assertArgumentNumberNonNegative(timeout, 'timeout');
138
-
139
118
  if (!notOlderThan) {
140
119
  notOlderThan = 4 * 60 * 1000;
141
120
  }
142
-
143
121
  var msg;
144
122
  var now = Date.now();
145
123
  var earliestMessageDate = new Date(now - notOlderThan);
146
-
147
124
  while (!msg && Date.now() - now < timeout) {
148
125
  await (() => {
149
126
  return new Promise((resolve, reject) => {
@@ -151,13 +128,11 @@ module.exports = function () {
151
128
  dateSentAfter: earliestMessageDate
152
129
  }, function (err, messages) {
153
130
  var _msg;
154
-
155
131
  if (messages && typeof messages[Symbol.iterator] === 'function') {
156
132
  for (_msg of messages) {
157
133
  if (_msg.direction == 'outbound-api') {
158
134
  var _msgDate = Date.parse(_msg.dateCreated); // if message is newer than the previous one - save it
159
135
 
160
-
161
136
  if (msg && Date.parse(msg.dateCreated) < _msgDate) {
162
137
  msg = _msg;
163
138
  } else if (!msg) {
@@ -166,18 +141,15 @@ module.exports = function () {
166
141
  }
167
142
  }
168
143
  }
169
-
170
144
  resolve();
171
145
  });
172
146
  });
173
147
  })();
174
148
  await _util.default.sleep(800);
175
149
  }
176
-
177
150
  if (!msg) {
178
151
  throw new OxError(errHelper.errorCode.TWILIO_ERROR, "Couldn't get the SMS within " + timeout + 'ms.');
179
152
  }
180
-
181
153
  if (removeOnRead) {
182
154
  await (() => {
183
155
  return new Promise((resolve, reject) => {
@@ -187,9 +159,9 @@ module.exports = function () {
187
159
  });
188
160
  })();
189
161
  }
190
-
191
162
  return msg.body;
192
163
  };
164
+
193
165
  /**
194
166
  * @summary Send an SMS.
195
167
  * @function sendSms
@@ -201,8 +173,6 @@ module.exports = function () {
201
173
  * twilio.init('Account Sid', 'Account Token');
202
174
  * twilio.sendSms('+1xxxxxxxxxx', '+972xxxxxxxxx', 'Hello World!');
203
175
  */
204
-
205
-
206
176
  module.sendSms = async function (from, to, message) {
207
177
  helpers.assertArgumentNonEmptyString(from, 'from');
208
178
  helpers.assertArgumentNonEmptyString(to, 'to');
@@ -223,38 +193,25 @@ module.exports = function () {
223
193
  });
224
194
  });
225
195
  })();
226
-
227
196
  if (response.message) {
228
197
  var msg = response.message;
229
-
230
198
  if (response.moreInfo) {
231
199
  msg += ' For more info: ' + response.moreInfo;
232
200
  } else if (response.code) {
233
201
  msg = 'Unable to connect to Twilio: ' + msg;
234
202
  }
235
-
236
203
  throw new OxError(errHelper.errorCode.TWILIO_ERROR, msg);
237
204
  }
238
-
239
205
  return response;
240
206
  };
241
-
242
207
  helpers.assertArgument = (val, name) => utils.assertArgument.call(this, val, name);
243
-
244
208
  helpers.assertArgumentNonEmptyString = (val, name) => utils.assertArgumentNonEmptyString.call(this, val, name);
245
-
246
209
  helpers.assertArgumentString = (val, name) => utils.assertArgumentString.call(this, val, name);
247
-
248
210
  helpers.assertArgumentNumber = (val, name) => utils.assertArgumentNumber.call(this, val, name);
249
-
250
211
  helpers.assertArgumentNumberNonNegative = (val, name) => utils.assertArgumentNumberNonNegative.call(this, val, name);
251
-
252
212
  helpers.assertArgumentBool = (val, name) => utils.assertArgumentBool.call(this, val, name);
253
-
254
213
  helpers.assertArgumentBoolOptional = (val, name) => utils.assertArgumentBoolOptional.call(this, val, name);
255
-
256
214
  helpers.assertArgumentTimeout = (val, name) => utils.assertArgumentTimeout.call(this, val, name);
257
-
258
215
  return module;
259
216
  };
260
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS10d2lsaW8uanMiXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsInV0aWxzIiwicmVxdWlyZSIsIk94RXJyb3IiLCJPeEVycm9yQ29udHNydWN0b3IiLCJlcnJIZWxwZXIiLCJoZWxwZXJzIiwiX2NsaWVudCIsImlzSW5pdGlhbGl6ZWQiLCJ1bmRlZmluZWQiLCJpbml0IiwiYWNjb3VudFNpZCIsImF1dGhUb2tlbiIsImdldExhc3RTbXMiLCJyZW1vdmVPblJlYWQiLCJ0aW1lb3V0Iiwibm90T2xkZXJUaGFuIiwiZnJvbU51bWJlciIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsIm1zZyIsIm5vdyIsIkRhdGUiLCJlYXJsaWVzdE1lc3NhZ2VEYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJtZXNzYWdlcyIsImxpc3QiLCJkYXRlU2VudEFmdGVyIiwiZXJyIiwiX21zZyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiZGlyZWN0aW9uIiwiZnJvbSIsIl9tc2dEYXRlIiwicGFyc2UiLCJkYXRlQ3JlYXRlZCIsImxpYlV0aWxzIiwic2xlZXAiLCJlcnJvckNvZGUiLCJUV0lMSU9fRVJST1IiLCJzaWQiLCJyZW1vdmUiLCJ0aGVuIiwiYm9keSIsImdldExhc3RTZW50QXBpU21zIiwic2VuZFNtcyIsInRvIiwibWVzc2FnZSIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJyZXNwb25zZSIsImNyZWF0ZSIsImNhdGNoIiwibW9yZUluZm8iLCJjb2RlIiwiYXNzZXJ0QXJndW1lbnQiLCJ2YWwiLCJuYW1lIiwiY2FsbCIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7QUFhQTs7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R0FBRCxFQUFNQyxJQUFOLEtBQWUzRCxLQUFLLENBQUMrRCxxQkFBTixDQUE0QkgsSUFBNUIsQ0FBaUMsSUFBakMsRUFBdUNGLEdBQXZDLEVBQTRDQyxJQUE1QyxDQUEvQzs7QUFFQSxTQUFPN0QsTUFBUDtBQUNILENBbk5EIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgdHdpbGlvXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggVHdpbGlvIHNlcnZpY2UuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvckNvbnRzcnVjdG9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XHJcbiAgICBjb25zdCBPeEVycm9yID0gdGhpcy5PeEVycm9yID0gT3hFcnJvckNvbnRzcnVjdG9yO1xyXG4gICAgY29uc3QgZXJySGVscGVyID0gdGhpcy5lcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbiAgICBjb25zdCBoZWxwZXJzID0gdGhpcy5oZWxwZXJzID0ge307XHJcblxyXG4gICAgdmFyIF9jbGllbnQ7XHJcblxyXG4gICAgbW9kdWxlLmlzSW5pdGlhbGl6ZWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gX2NsaWVudCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldCBUd2lsaW8gYXV0aGVudGljYXRpb24gZGV0YWlscy5cclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYWNjb3VudFNpZCAtIEFjY291bnQgU0lELlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGF1dGhUb2tlbiAtIEF1dGhlbnRpY2F0aW9uIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uKGFjY291bnRTaWQsIGF1dGhUb2tlbikge1xyXG4gICAgICAgIF9jbGllbnQgPSByZXF1aXJlKCd0d2lsaW8nKShhY2NvdW50U2lkLCBhdXRoVG9rZW4pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBsYXN0IFNNUyBtZXNzYWdlLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldExhc3RTbXNcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlT25SZWFkIC0gU3BlY2lmaWVzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGFmdGVyIHJlYWRpbmcgaXQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dCAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZSB0byBhcnJpdmUuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IG5vdE9sZGVyVGhhbiAtIFJldHJpZXZlIG1lc3NhZ2Ugb25seSBpZiBpdCBhcnJpdmVkIG5vdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUgKGluIG1zKS4gRGVmYXVsdCBpcyA0IG1pbnV0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZyb21OdW1iZXIgLSBGcm9tIG51bWJlciB0byBmaWx0ZXIgbWVzc2FnZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBTTVMgdGV4dC5cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmdldExhc3RTbXMgPSBhc3luYyBmdW5jdGlvbihyZW1vdmVPblJlYWQsIHRpbWVvdXQsIG5vdE9sZGVyVGhhbiwgZnJvbU51bWJlcikge1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sKHJlbW92ZU9uUmVhZCwgJ3JlbW92ZU9uUmVhZCcpO1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGlmIChmcm9tTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRTdHJpbmcoZnJvbU51bWJlciwgJ2Zyb21OdW1iZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghbm90T2xkZXJUaGFuKSB7XHJcbiAgICAgICAgICAgIG5vdE9sZGVyVGhhbiA9IDQqNjAqMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1zZztcclxuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB2YXIgZWFybGllc3RNZXNzYWdlRGF0ZSA9IG5ldyBEYXRlKG5vdyAtIG5vdE9sZGVyVGhhbik7XHJcbiAgICAgICAgd2hpbGUgKCFtc2cgJiYgKERhdGUubm93KCkgLSBub3cpIDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmxpc3QoeyBkYXRlU2VudEFmdGVyOiBlYXJsaWVzdE1lc3NhZ2VEYXRlIH0sIGZ1bmN0aW9uKGVyciwgbWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiB0eXBlb2YgbWVzc2FnZXNbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfbXNnIG9mIG1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tc2cuZGlyZWN0aW9uID09ICdpbmJvdW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbU51bWJlciAmJiBfbXNnLmZyb20gIT09IGZyb21OdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2dEYXRlID0gRGF0ZS5wYXJzZShfbXNnLmRhdGVDcmVhdGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1lc3NhZ2UgaXMgbmV3ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIC0gc2F2ZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyAmJiBEYXRlLnBhcnNlKG1zZy5kYXRlQ3JlYXRlZCkgPCBfbXNnRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtc2cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBfbXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg4MDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFtc2cpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5UV0lMSU9fRVJST1IsIFwiQ291bGRuJ3QgZ2V0IHRoZSBTTVMgd2l0aGluIFwiICsgdGltZW91dCArICdtcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZW1vdmVPblJlYWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NsaWVudC5tZXNzYWdlcyhtc2cuc2lkKS5yZW1vdmUoKS50aGVuKCgpID0+IHsgcmVzb2x2ZSgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1zZy5ib2R5O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBsYXN0IFNNUyBtZXNzYWdlIHNlbnQgZnJvbSBBUEkuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0TGFzdFNlbnRBcGlTbXNcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlT25SZWFkIC0gU3BlY2lmaWVzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGFmdGVyIHJlYWRpbmcgaXQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dCAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZSB0byBhcnJpdmUuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IG5vdE9sZGVyVGhhbiAtIFJldHJpZXZlIG1lc3NhZ2Ugb25seSBpZiBpdCBhcnJpdmVkIG5vdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUgKGluIG1zKS4gRGVmYXVsdCBpcyA0IG1pbnV0ZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFNNUyB0ZXh0LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0TGFzdFNlbnRBcGlTbXMgPSBhc3luYyBmdW5jdGlvbiAocmVtb3ZlT25SZWFkLCB0aW1lb3V0LCBub3RPbGRlclRoYW4pIHtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbChyZW1vdmVPblJlYWQsICdyZW1vdmVPblJlYWQnKTtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuXHJcbiAgICAgICAgaWYgKCFub3RPbGRlclRoYW4pIHtcclxuICAgICAgICAgICAgbm90T2xkZXJUaGFuID0gNCAqIDYwICogMTAwMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBtc2c7XHJcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgdmFyIGVhcmxpZXN0TWVzc2FnZURhdGUgPSBuZXcgRGF0ZShub3cgLSBub3RPbGRlclRoYW4pO1xyXG5cclxuICAgICAgICB3aGlsZSAoIW1zZyAmJiBEYXRlLm5vdygpIC0gbm93IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmxpc3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlU2VudEFmdGVyOiBlYXJsaWVzdE1lc3NhZ2VEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVyciwgbWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2c7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgdHlwZW9mIG1lc3NhZ2VzW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX21zZyBvZiBtZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbXNnLmRpcmVjdGlvbiA9PSAnb3V0Ym91bmQtYXBpJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX21zZ0RhdGUgPSBEYXRlLnBhcnNlKF9tc2cuZGF0ZUNyZWF0ZWQpOyAvLyBpZiBtZXNzYWdlIGlzIG5ld2VyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSAtIHNhdmUgaXRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cgJiYgRGF0ZS5wYXJzZShtc2cuZGF0ZUNyZWF0ZWQpIDwgX21zZ0RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1zZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gX21zZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDgwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW1zZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRXSUxJT19FUlJPUiwgXCJDb3VsZG4ndCBnZXQgdGhlIFNNUyB3aXRoaW4gXCIgKyB0aW1lb3V0ICsgJ21zLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZU9uUmVhZCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzKG1zZy5zaWQpLnJlbW92ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtc2cuYm9keTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZW5kIGFuIFNNUy5cclxuICAgICAqIEBmdW5jdGlvbiBzZW5kU21zXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZnJvbSAtIFBob25lIG51bWJlciB0byBzZW5kIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdG8gLSBQaG9uZSBudW1iZXIgdG8gc2VuZCB0by5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTWVzc2FnZSB0byBzZW5kLlxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBNZXNzYWdlIFNJRC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogdHdpbGlvLmluaXQoJ0FjY291bnQgU2lkJywgJ0FjY291bnQgVG9rZW4nKTtcclxuICAgICAqIHR3aWxpby5zZW5kU21zKCcrMXh4eHh4eHh4eHgnLCAnKzk3Mnh4eHh4eHh4eCcsICdIZWxsbyBXb3JsZCEnKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLnNlbmRTbXMgPSBhc3luYyBmdW5jdGlvbihmcm9tLCB0bywgbWVzc2FnZSkge1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhmcm9tLCAnZnJvbScpO1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyh0bywgJ3RvJyk7XHJcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKG1lc3NhZ2UsICdtZXNzYWdlJyk7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvOiB0b1xyXG4gICAgICAgICAgICAgICAgfSkudGhlbihtZXNzYWdlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IG1lc3NhZ2Uuc2lkO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBlcnI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHZhciBtc2cgPSByZXNwb25zZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UubW9yZUluZm8pIHtcclxuICAgICAgICAgICAgICAgIG1zZyArPSAnIEZvciBtb3JlIGluZm86ICcgKyByZXNwb25zZS5tb3JlSW5mbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBtc2cgPSAnVW5hYmxlIHRvIGNvbm5lY3QgdG8gVHdpbGlvOiAnICsgbXNnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVFdJTElPX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnQuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZy5jYWxsKHRoaXMsIHZhbCwgbmFtZSk7XHJcbiAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmcuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyLmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSAodmFsLCBuYW1lKSA9PiB1dGlscy5hc3NlcnRBcmd1bWVudEJvb2wuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsLmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0LmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXX0=
217
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfT3h5Z2VuRXJyb3IiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl91dGlsIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwibW9kdWxlIiwiZXhwb3J0cyIsInV0aWxzIiwiT3hFcnJvciIsIk94RXJyb3JDb250c3J1Y3RvciIsImVyckhlbHBlciIsImhlbHBlcnMiLCJfY2xpZW50IiwiaXNJbml0aWFsaXplZCIsInVuZGVmaW5lZCIsImluaXQiLCJhY2NvdW50U2lkIiwiYXV0aFRva2VuIiwiZ2V0TGFzdFNtcyIsInJlbW92ZU9uUmVhZCIsInRpbWVvdXQiLCJub3RPbGRlclRoYW4iLCJmcm9tTnVtYmVyIiwiYXNzZXJ0QXJndW1lbnRCb29sIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50U3RyaW5nIiwibXNnIiwibm93IiwiRGF0ZSIsImVhcmxpZXN0TWVzc2FnZURhdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm1lc3NhZ2VzIiwibGlzdCIsImRhdGVTZW50QWZ0ZXIiLCJlcnIiLCJfbXNnIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJkaXJlY3Rpb24iLCJmcm9tIiwiX21zZ0RhdGUiLCJwYXJzZSIsImRhdGVDcmVhdGVkIiwibGliVXRpbHMiLCJzbGVlcCIsImVycm9yQ29kZSIsIlRXSUxJT19FUlJPUiIsInNpZCIsInJlbW92ZSIsInRoZW4iLCJib2R5IiwiZ2V0TGFzdFNlbnRBcGlTbXMiLCJzZW5kU21zIiwidG8iLCJtZXNzYWdlIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsInJlc3BvbnNlIiwiY3JlYXRlIiwiY2F0Y2giLCJtb3JlSW5mbyIsImNvZGUiLCJhc3NlcnRBcmd1bWVudCIsInZhbCIsIm5hbWUiLCJjYWxsIiwiYXNzZXJ0QXJndW1lbnROdW1iZXIiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS10d2lsaW8uanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgdHdpbGlvXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggVHdpbGlvIHNlcnZpY2UuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvckNvbnRzcnVjdG9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XHJcbiAgICBjb25zdCBPeEVycm9yID0gdGhpcy5PeEVycm9yID0gT3hFcnJvckNvbnRzcnVjdG9yO1xyXG4gICAgY29uc3QgZXJySGVscGVyID0gdGhpcy5lcnJIZWxwZXIgPSByZXF1aXJlKCcuLi9lcnJvcnMvaGVscGVyJyk7XHJcbiAgICBjb25zdCBoZWxwZXJzID0gdGhpcy5oZWxwZXJzID0ge307XHJcblxyXG4gICAgdmFyIF9jbGllbnQ7XHJcblxyXG4gICAgbW9kdWxlLmlzSW5pdGlhbGl6ZWQgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gX2NsaWVudCAhPT0gdW5kZWZpbmVkO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldCBUd2lsaW8gYXV0aGVudGljYXRpb24gZGV0YWlscy5cclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gYWNjb3VudFNpZCAtIEFjY291bnQgU0lELlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGF1dGhUb2tlbiAtIEF1dGhlbnRpY2F0aW9uIHRva2VuLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuaW5pdCA9IGZ1bmN0aW9uKGFjY291bnRTaWQsIGF1dGhUb2tlbikge1xyXG4gICAgICAgIF9jbGllbnQgPSByZXF1aXJlKCd0d2lsaW8nKShhY2NvdW50U2lkLCBhdXRoVG9rZW4pO1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBsYXN0IFNNUyBtZXNzYWdlLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldExhc3RTbXNcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlT25SZWFkIC0gU3BlY2lmaWVzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGFmdGVyIHJlYWRpbmcgaXQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dCAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZSB0byBhcnJpdmUuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IG5vdE9sZGVyVGhhbiAtIFJldHJpZXZlIG1lc3NhZ2Ugb25seSBpZiBpdCBhcnJpdmVkIG5vdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUgKGluIG1zKS4gRGVmYXVsdCBpcyA0IG1pbnV0ZXMuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZyb21OdW1iZXIgLSBGcm9tIG51bWJlciB0byBmaWx0ZXIgbWVzc2FnZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBTTVMgdGV4dC5cclxuICAgICAqL1xyXG4gICAgbW9kdWxlLmdldExhc3RTbXMgPSBhc3luYyBmdW5jdGlvbihyZW1vdmVPblJlYWQsIHRpbWVvdXQsIG5vdE9sZGVyVGhhbiwgZnJvbU51bWJlcikge1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sKHJlbW92ZU9uUmVhZCwgJ3JlbW92ZU9uUmVhZCcpO1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGlmIChmcm9tTnVtYmVyKSB7XHJcbiAgICAgICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRTdHJpbmcoZnJvbU51bWJlciwgJ2Zyb21OdW1iZXInKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghbm90T2xkZXJUaGFuKSB7XHJcbiAgICAgICAgICAgIG5vdE9sZGVyVGhhbiA9IDQqNjAqMTAwMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIG1zZztcclxuICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB2YXIgZWFybGllc3RNZXNzYWdlRGF0ZSA9IG5ldyBEYXRlKG5vdyAtIG5vdE9sZGVyVGhhbik7XHJcbiAgICAgICAgd2hpbGUgKCFtc2cgJiYgKERhdGUubm93KCkgLSBub3cpIDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmxpc3QoeyBkYXRlU2VudEFmdGVyOiBlYXJsaWVzdE1lc3NhZ2VEYXRlIH0sIGZ1bmN0aW9uKGVyciwgbWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlcyAmJiB0eXBlb2YgbWVzc2FnZXNbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChfbXNnIG9mIG1lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tc2cuZGlyZWN0aW9uID09ICdpbmJvdW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbU51bWJlciAmJiBfbXNnLmZyb20gIT09IGZyb21OdW1iZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2dEYXRlID0gRGF0ZS5wYXJzZShfbXNnLmRhdGVDcmVhdGVkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG1lc3NhZ2UgaXMgbmV3ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIC0gc2F2ZSBpdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyAmJiBEYXRlLnBhcnNlKG1zZy5kYXRlQ3JlYXRlZCkgPCBfbXNnRGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtc2cpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBfbXNnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg4MDApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFtc2cpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5UV0lMSU9fRVJST1IsIFwiQ291bGRuJ3QgZ2V0IHRoZSBTTVMgd2l0aGluIFwiICsgdGltZW91dCArICdtcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZW1vdmVPblJlYWQpIHtcclxuICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgX2NsaWVudC5tZXNzYWdlcyhtc2cuc2lkKS5yZW1vdmUoKS50aGVuKCgpID0+IHsgcmVzb2x2ZSgpOyB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1zZy5ib2R5O1xyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBsYXN0IFNNUyBtZXNzYWdlIHNlbnQgZnJvbSBBUEkuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0TGFzdFNlbnRBcGlTbXNcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gcmVtb3ZlT25SZWFkIC0gU3BlY2lmaWVzIHdoZXRoZXIgdG8gZGVsZXRlIHRoZSBtZXNzYWdlIGFmdGVyIHJlYWRpbmcgaXQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dCAtIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZSB0byBhcnJpdmUuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IG5vdE9sZGVyVGhhbiAtIFJldHJpZXZlIG1lc3NhZ2Ugb25seSBpZiBpdCBhcnJpdmVkIG5vdCBiZWZvcmUgdGhlIGdpdmVuIHRpbWUgKGluIG1zKS4gRGVmYXVsdCBpcyA0IG1pbnV0ZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFNNUyB0ZXh0LlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUuZ2V0TGFzdFNlbnRBcGlTbXMgPSBhc3luYyBmdW5jdGlvbiAocmVtb3ZlT25SZWFkLCB0aW1lb3V0LCBub3RPbGRlclRoYW4pIHtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbChyZW1vdmVPblJlYWQsICdyZW1vdmVPblJlYWQnKTtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuXHJcbiAgICAgICAgaWYgKCFub3RPbGRlclRoYW4pIHtcclxuICAgICAgICAgICAgbm90T2xkZXJUaGFuID0gNCAqIDYwICogMTAwMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhciBtc2c7XHJcbiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7XHJcbiAgICAgICAgdmFyIGVhcmxpZXN0TWVzc2FnZURhdGUgPSBuZXcgRGF0ZShub3cgLSBub3RPbGRlclRoYW4pO1xyXG5cclxuICAgICAgICB3aGlsZSAoIW1zZyAmJiBEYXRlLm5vdygpIC0gbm93IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmxpc3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlU2VudEFmdGVyOiBlYXJsaWVzdE1lc3NhZ2VEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVyciwgbWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9tc2c7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXMgJiYgdHlwZW9mIG1lc3NhZ2VzW1N5bWJvbC5pdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoX21zZyBvZiBtZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfbXNnLmRpcmVjdGlvbiA9PSAnb3V0Ym91bmQtYXBpJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX21zZ0RhdGUgPSBEYXRlLnBhcnNlKF9tc2cuZGF0ZUNyZWF0ZWQpOyAvLyBpZiBtZXNzYWdlIGlzIG5ld2VyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSAtIHNhdmUgaXRcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cgJiYgRGF0ZS5wYXJzZShtc2cuZGF0ZUNyZWF0ZWQpIDwgX21zZ0RhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF9tc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1zZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gX21zZztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDgwMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIW1zZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRXSUxJT19FUlJPUiwgXCJDb3VsZG4ndCBnZXQgdGhlIFNNUyB3aXRoaW4gXCIgKyB0aW1lb3V0ICsgJ21zLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlbW92ZU9uUmVhZCkge1xyXG4gICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzKG1zZy5zaWQpLnJlbW92ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtc2cuYm9keTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZW5kIGFuIFNNUy5cclxuICAgICAqIEBmdW5jdGlvbiBzZW5kU21zXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZnJvbSAtIFBob25lIG51bWJlciB0byBzZW5kIGZyb20uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdG8gLSBQaG9uZSBudW1iZXIgdG8gc2VuZCB0by5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIC0gTWVzc2FnZSB0byBzZW5kLlxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBNZXNzYWdlIFNJRC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogdHdpbGlvLmluaXQoJ0FjY291bnQgU2lkJywgJ0FjY291bnQgVG9rZW4nKTtcclxuICAgICAqIHR3aWxpby5zZW5kU21zKCcrMXh4eHh4eHh4eHgnLCAnKzk3Mnh4eHh4eHh4eCcsICdIZWxsbyBXb3JsZCEnKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLnNlbmRTbXMgPSBhc3luYyBmdW5jdGlvbihmcm9tLCB0bywgbWVzc2FnZSkge1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhmcm9tLCAnZnJvbScpO1xyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyh0bywgJ3RvJyk7XHJcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKG1lc3NhZ2UsICdtZXNzYWdlJyk7XHJcblxyXG4gICAgICAgIHZhciByZXNwb25zZSA9IG51bGw7XHJcblxyXG4gICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBfY2xpZW50Lm1lc3NhZ2VzLmNyZWF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogbWVzc2FnZSxcclxuICAgICAgICAgICAgICAgICAgICBmcm9tOiBmcm9tLFxyXG4gICAgICAgICAgICAgICAgICAgIHRvOiB0b1xyXG4gICAgICAgICAgICAgICAgfSkudGhlbihtZXNzYWdlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IG1lc3NhZ2Uuc2lkO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBlcnI7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pKCk7XHJcblxyXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHZhciBtc2cgPSByZXNwb25zZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UubW9yZUluZm8pIHtcclxuICAgICAgICAgICAgICAgIG1zZyArPSAnIEZvciBtb3JlIGluZm86ICcgKyByZXNwb25zZS5tb3JlSW5mbztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICBtc2cgPSAnVW5hYmxlIHRvIGNvbm5lY3QgdG8gVHdpbGlvOiAnICsgbXNnO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVFdJTElPX0VSUk9SLCBtc2cpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfTtcclxuXHJcbiAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnQuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZy5jYWxsKHRoaXMsIHZhbCwgbmFtZSk7XHJcbiAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmcuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyLmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSAodmFsLCBuYW1lKSA9PiB1dGlscy5hc3NlcnRBcmd1bWVudEJvb2wuY2FsbCh0aGlzLCB2YWwsIG5hbWUpO1xyXG4gICAgaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9ICh2YWwsIG5hbWUpID0+IHV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsLmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0ID0gKHZhbCwgbmFtZSkgPT4gdXRpbHMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0LmNhbGwodGhpcywgdmFsLCBuYW1lKTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXSwibWFwcGluZ3MiOiI7OztBQWFBLElBQUFBLFlBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUYsc0JBQUEsQ0FBQUMsT0FB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
@@ -4,25 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
-
8
7
  require("source-map-support/register");
9
-
10
8
  var _fastXmlParser = _interopRequireDefault(require("fast-xml-parser"));
11
-
12
9
  var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
13
-
14
10
  var _utils = _interopRequireDefault(require("./utils"));
15
-
16
11
  var _util = _interopRequireDefault(require("../lib/util"));
17
-
18
12
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
19
-
20
13
  var _helper = _interopRequireDefault(require("../errors/helper"));
21
-
22
14
  var _paramReaderExcel = _interopRequireDefault(require("../lib/param-reader-excel"));
23
-
24
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
25
-
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
16
  /*
27
17
  * Copyright (C) 2015-present CloudBeat Limited
28
18
  *
@@ -36,36 +26,34 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
36
26
  * @name utils
37
27
  * @description Provides miscellaneous utility methods.
38
28
  */
39
- const MODULE_NAME = 'utils';
40
29
 
30
+ const MODULE_NAME = 'utils';
41
31
  class UtilsModule extends _OxygenModule.default {
42
32
  constructor(options, context, rs, logger, modules, services) {
43
33
  super(options, context, rs, logger, modules, services);
44
34
  this._alwaysInitialized = true;
45
35
  this._isInitialized = true;
46
36
  }
37
+
47
38
  /*
48
39
  * @summary Gets module name
49
40
  * @function name
50
41
  * @return {String} Constant value "utils".
51
42
  */
52
-
53
-
54
43
  get name() {
55
44
  return MODULE_NAME;
56
45
  }
46
+
57
47
  /**
58
48
  * @summary Pause test execution for the given amount of milliseconds.
59
49
  * @function pause
60
50
  * @param {Number} ms - Milliseconds to pause the execution for.
61
51
  */
62
-
63
-
64
52
  async pause(ms) {
65
53
  _utils.default.assertArgumentNumberNonNegative(ms, 'ms');
66
-
67
54
  await _util.default.sleep(ms);
68
55
  }
56
+
69
57
  /**
70
58
  * @summary Decrypt text
71
59
  * @function decrypt
@@ -87,11 +75,10 @@ class UtilsModule extends _OxygenModule.default {
87
75
  * const value = decrypt.getDecryptResult();
88
76
  * log.info(value); //will print https://www.wikipedia.org
89
77
  */
90
-
91
-
92
78
  decrypt(text) {
93
79
  return _util.default.decrypt(text);
94
80
  }
81
+
95
82
  /**
96
83
  * @summary Encrypt text
97
84
  * @function encrypt
@@ -113,8 +100,6 @@ class UtilsModule extends _OxygenModule.default {
113
100
  * const value = decrypt.getDecryptResult();
114
101
  * log.info(value); //will print https://www.wikipedia.org
115
102
  */
116
-
117
-
118
103
  encrypt(text) {
119
104
  return _util.default.encrypt(text);
120
105
  }
@@ -124,39 +109,31 @@ class UtilsModule extends _OxygenModule.default {
124
109
  * @param {String} filePath - Absolute path to file
125
110
  * @param {Object=} options - [Options](https://csv.js.org/parse/options/)
126
111
  */
127
-
128
-
129
112
  readCsv(filePath, options = {}) {
130
113
  const parse = require('csv-parse/lib/sync');
131
-
132
114
  var fs = require('fs');
133
-
134
115
  var path = require('path');
135
-
136
116
  var ext = path.extname(filePath);
137
-
138
117
  if (ext !== '.csv' && ext !== '.txt') {
139
118
  throw new _OxygenError.default(_helper.default.errorCode.CSV_ERROR, 'Unsupported file extension: ' + ext);
140
119
  }
141
-
142
120
  var data;
143
-
144
121
  try {
145
122
  data = fs.readFileSync(filePath, 'utf8');
146
123
  } catch (e) {
147
124
  throw new _OxygenError.default(_helper.default.errorCode.CSV_ERROR, 'Unable to read parameters file: ' + e);
148
- } // CSVs produced by OS X Excel have header terminated with 0d0d0a
149
-
125
+ }
150
126
 
151
- data = data.replace(/\r\r/g, '\r'); // strip BOM for UTF-8
127
+ // CSVs produced by OS X Excel have header terminated with 0d0d0a
128
+ data = data.replace(/\r\r/g, '\r');
152
129
 
153
- var bom = false; // catches 0xEFBBBF (UTF-8 BOM) because the buffer-to-string
130
+ // strip BOM for UTF-8
131
+ var bom = false;
132
+ // catches 0xEFBBBF (UTF-8 BOM) because the buffer-to-string
154
133
  // conversion translates it to 0xFEFF (UTF-16 BOM)
155
-
156
134
  if (data.charCodeAt(0) === 0xFEFF) {
157
135
  bom = true;
158
136
  }
159
-
160
137
  try {
161
138
  var table = parse(data, {
162
139
  bom: bom,
@@ -167,9 +144,9 @@ class UtilsModule extends _OxygenModule.default {
167
144
  } catch (e) {
168
145
  throw new _OxygenError.default(_helper.default.errorCode.CSV_ERROR, e.message);
169
146
  }
170
-
171
147
  return table;
172
148
  }
149
+
173
150
  /**
174
151
  * @summary Writes data into csv file
175
152
  * @function writeCsv
@@ -177,12 +154,9 @@ class UtilsModule extends _OxygenModule.default {
177
154
  * @param {Array} data - CSV data in format [{column_name_1: 'foo', column_name_2: 'bar'}]
178
155
  * @param {Object=} options - [Options](https://github.com/anton-bot/objects-to-csv#async-todiskfilename-options)
179
156
  */
180
-
181
-
182
157
  async writeCsv(filePath, data, options = {}) {
183
158
  try {
184
159
  const ObjectsToCsv = require('objects-to-csv');
185
-
186
160
  const csv = new ObjectsToCsv(data);
187
161
  await csv.toDisk(filePath, {
188
162
  allColumns: true,
@@ -192,18 +166,18 @@ class UtilsModule extends _OxygenModule.default {
192
166
  throw new _OxygenError.default(_helper.default.errorCode.CSV_ERROR, e.message);
193
167
  }
194
168
  }
169
+
195
170
  /**
196
171
  * @summary Reads data from Xlsx file
197
172
  * @function readXlsx
198
173
  * @param {String} filePath - Absolute path to file
199
174
  * @return {Array} - Array of xlsx data
200
175
  */
201
-
202
-
203
176
  async readXlsx(filePath) {
204
177
  const reader = new _paramReaderExcel.default();
205
178
  return await reader.read(filePath);
206
179
  }
180
+
207
181
  /**
208
182
  * @summary Uses the DNS protocol to resolve a host name
209
183
  * @function dnsResolve
@@ -211,33 +185,26 @@ class UtilsModule extends _OxygenModule.default {
211
185
  * @param {String=} rrType - Resource record type. Default: 'A'.
212
186
  * @return {String[] | Object} - Array or Object of resource records. The type and structure of individual results vary based on rrtype
213
187
  */
214
-
215
-
216
188
  async dnsResolve(hostname, rrType = 'A') {
217
189
  _utils.default.assertArgumentNonEmptyString(hostname, 'hostname');
218
-
219
190
  const rrTypes = ['A', 'AAAA', 'ANY', 'CNAME', 'MX', 'NAPTR', 'NS', 'PTR', 'SOA', 'SRV', 'TXT'];
220
-
221
191
  if (!rrTypes.includes(rrType)) {
222
192
  throw new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, `Invalid argument - 'rrType'. Available rrType values: ${rrTypes.join(', ')}`);
223
193
  }
224
-
225
194
  const dnsPromises = require('dns').promises;
226
-
227
195
  try {
228
196
  return await dnsPromises.resolve(hostname, rrType);
229
197
  } catch (e) {
230
198
  throw new _OxygenError.default(_helper.default.errorCode.DNS_ERROR, e.message);
231
199
  }
232
200
  }
201
+
233
202
  /**
234
203
  * @summary Parse XML data to JS object
235
204
  * @function xmlToJson
236
205
  * @param {string|Buffer} xmlDataStr - Like <root a="nice" b="very nice" ><a>wow</a></root>
237
206
  * @param {boolean|Object} options - [Options](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/docs/v4/2.XMLparseOptions.md)
238
207
  */
239
-
240
-
241
208
  xmlToJson(xmlDataStr, options = {}) {
242
209
  try {
243
210
  const parser = new _fastXmlParser.default.XMLParser(options);
@@ -247,27 +214,24 @@ class UtilsModule extends _OxygenModule.default {
247
214
  throw new _OxygenError.default(_helper.default.errorCode.XML_ERROR, e.message);
248
215
  }
249
216
  }
217
+
250
218
  /**
251
219
  * @summary Opens new transaction.
252
220
  * @description The transaction will persist untill a new one is opened. Transaction names must be unique.
253
221
  * @function transaction
254
222
  * @param {String} name - The transaction name.
255
223
  */
256
-
257
-
258
224
  async transaction(name) {
259
225
  if (!name) {
260
226
  return;
261
- } // just in case user passed a complex object by mistake
262
-
263
-
264
- name = name.toString(); // limit the name length (since we can't store values larger than 512B in the database)
227
+ }
228
+ // just in case user passed a complex object by mistake
229
+ name = name.toString();
265
230
 
231
+ // limit the name length (since we can't store values larger than 512B in the database)
266
232
  name = name.slice(0, 512);
267
233
  global._lastTransactionName = name;
268
234
  }
269
-
270
235
  }
271
-
272
236
  exports.default = UtilsModule;
273
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS11dGlscy5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlV0aWxzTW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX2Fsd2F5c0luaXRpYWxpemVkIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwicGF1c2UiLCJtcyIsInV0aWxzIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImxpYlV0aWxzIiwic2xlZXAiLCJkZWNyeXB0IiwidGV4dCIsImVuY3J5cHQiLCJyZWFkQ3N2IiwiZmlsZVBhdGgiLCJwYXJzZSIsInJlcXVpcmUiLCJmcyIsInBhdGgiLCJleHQiLCJleHRuYW1lIiwiT3hFcnJvciIsImVycm9ySGVscGVyIiwiZXJyb3JDb2RlIiwiQ1NWX0VSUk9SIiwiZGF0YSIsInJlYWRGaWxlU3luYyIsImUiLCJyZXBsYWNlIiwiYm9tIiwiY2hhckNvZGVBdCIsInRhYmxlIiwiY29sdW1ucyIsInRyaW0iLCJtZXNzYWdlIiwid3JpdGVDc3YiLCJPYmplY3RzVG9Dc3YiLCJjc3YiLCJ0b0Rpc2siLCJhbGxDb2x1bW5zIiwicmVhZFhsc3giLCJyZWFkZXIiLCJFeGNlbFJlYWRlciIsInJlYWQiLCJkbnNSZXNvbHZlIiwiaG9zdG5hbWUiLCJyclR5cGUiLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwicnJUeXBlcyIsImluY2x1ZGVzIiwiU0NSSVBUX0VSUk9SIiwiam9pbiIsImRuc1Byb21pc2VzIiwicHJvbWlzZXMiLCJyZXNvbHZlIiwiRE5TX0VSUk9SIiwieG1sVG9Kc29uIiwieG1sRGF0YVN0ciIsInBhcnNlciIsImZhc3RYbWxQYXJzZXIiLCJYTUxQYXJzZXIiLCJvdXRwdXQiLCJYTUxfRVJST1IiLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2Ui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QVMsQ0FBQ0MsVUFBRCxFQUFhOUQsT0FBTyxHQUFHLEVBQXZCLEVBQTJCO0FBQ2hDLFFBQUk7QUFDQSxZQUFNK0QsTUFBTSxHQUFHLElBQUlDLHVCQUFjQyxTQUFsQixDQUE0QmpFLE9BQTVCLENBQWY7QUFDQSxZQUFNa0UsTUFBTSxHQUFHSCxNQUFNLENBQUMzQyxLQUFQLENBQWEwQyxVQUFiLENBQWY7QUFDQSxhQUFPSSxNQUFQO0FBQ0gsS0FKRCxDQUlFLE9BQU9sQyxDQUFQLEVBQVU7QUFDUixZQUFNLElBQUlOLG9CQUFKLENBQVlDLGdCQUFZQyxTQUFaLENBQXNCdUMsU0FBbEMsRUFBNkNuQyxDQUFDLENBQUNPLE9BQS9DLENBQU47QUFDSDtBQUNKO0FBRUQ7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDcUIsUUFBWDZCLFdBQVcsQ0FBQzVELElBQUQsRUFBTztBQUNwQixRQUFJLENBQUNBLElBQUwsRUFBVztBQUNQO0FBQ0gsS0FIbUIsQ0FJcEI7OztBQUNBQSxJQUFBQSxJQUFJLEdBQUdBLElBQUksQ0FBQzZELFFBQUwsRUFBUCxDQUxvQixDQU9wQjs7QUFDQTdELElBQUFBLElBQUksR0FBR0EsSUFBSSxDQUFDOEQsS0FBTCxDQUFXLENBQVgsRUFBYyxHQUFkLENBQVA7QUFFQUMsSUFBQUEsTUFBTSxDQUFDQyxvQkFBUCxHQUE4QmhFLElBQTlCO0FBQ0g7O0FBMU1pRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEBuYW1lIHV0aWxzXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgbWV0aG9kcy5cclxuICovXHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICd1dGlscyc7XHJcbmltcG9ydCBmYXN0WG1sUGFyc2VyIGZyb20gJ2Zhc3QteG1sLXBhcnNlcic7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IEV4Y2VsUmVhZGVyIGZyb20gJy4uL2xpYi9wYXJhbS1yZWFkZXItZXhjZWwnO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHNNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcInV0aWxzXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBhdXNlIHRlc3QgZXhlY3V0aW9uIGZvciB0aGUgZ2l2ZW4gYW1vdW50IG9mIG1pbGxpc2Vjb25kcy5cclxuICAgICAqIEBmdW5jdGlvbiBwYXVzZVxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1zIC0gTWlsbGlzZWNvbmRzIHRvIHBhdXNlIHRoZSBleGVjdXRpb24gZm9yLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwYXVzZShtcykge1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUobXMsICdtcycpO1xyXG4gICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKG1zKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IERlY3J5cHQgdGV4dFxyXG4gICAgICogQGZ1bmN0aW9uIGRlY3J5cHRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gVGV4dFxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBEZWNyeXB0UmVzdWx0IE9iamVjdCB3aXRoIGdldERlY3J5cHRSZXN1bHQgbWV0aG9kXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIHRvIGVuY3J5cHQgcGxhaW50ZXh0IGludG8gY2lwaGVydGV4dCBcclxuICAgICAqIGNvbnN0IGVuY3J5cHQgPSB1dGlscy5lbmNyeXB0KCdodHRwczovL3d3dy53aWtpcGVkaWEub3JnJyk7XHJcbiAgICAgKiBsb2cuaW5mbyhlbmNyeXB0KTsgLy8gd2lsbCBwcmludCBiNzU3YmEyYzJmYzUwZmJiNTExZDU5NjgxNmNhMDZjNGZhNTZmNGU5OGNlMjIyZjMwYmM1OGQ1MjUxZWQ2MzVlXHJcbiAgICAgKiBcclxuICAgICAqIC8vIHRvIGRlY3J5cHQgY2lwaGVydGV4dCBhbmQgdXNlIGl0IGluIHNjcmlwdCAgXHJcbiAgICAgKiBjb25zdCBkZWNyeXB0ID0gdXRpbHMuZGVjcnlwdChlbmNyeXB0KTtcclxuICAgICAqIGxvZy5pbmZvKGRlY3J5cHQpOyAvLyB3aWxsIHByaW50IEVOQ1JZUFRFRFxyXG4gICAgICogXHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm9wZW4oZGVjcnlwdCk7IC8vIHdpbGwgb3BlbiBodHRwczovL3d3dy53aWtpcGVkaWEub3JnXHJcbiAgICAgKiBcclxuICAgICAqIC8vIHRvIGdldCBvcmlnaW5hbCBwbGFpbnRleHQgdXNlIGdldERlY3J5cHRSZXN1bHRcclxuICAgICAqIGNvbnN0IHZhbHVlID0gZGVjcnlwdC5nZXREZWNyeXB0UmVzdWx0KCk7XHJcbiAgICAgKiBsb2cuaW5mbyh2YWx1ZSk7IC8vd2lsbCBwcmludCBodHRwczovL3d3dy53aWtpcGVkaWEub3JnXHJcbiAgICAgKi9cclxuICAgIGRlY3J5cHQodGV4dCkge1xyXG4gICAgICAgIHJldHVybiBsaWJVdGlscy5kZWNyeXB0KHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRW5jcnlwdCB0ZXh0XHJcbiAgICAgKiBAZnVuY3Rpb24gZW5jcnlwdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgLSBUZXh0XHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IEVuY3J5cHRlZCB0ZXh0XHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIHRvIGVuY3J5cHQgcGxhaW50ZXh0IGludG8gY2lwaGVydGV4dCBcclxuICAgICAqIGNvbnN0IGVuY3J5cHQgPSB1dGlscy5lbmNyeXB0KCdodHRwczovL3d3dy53aWtpcGVkaWEub3JnJyk7XHJcbiAgICAgKiBsb2cuaW5mbyhlbmNyeXB0KTsgLy8gd2lsbCBwcmludCBiNzU3YmEyYzJmYzUwZmJiNTExZDU5NjgxNmNhMDZjNGZhNTZmNGU5OGNlMjIyZjMwYmM1OGQ1MjUxZWQ2MzVlXHJcbiAgICAgKiBcclxuICAgICAqIC8vIHRvIGRlY3J5cHQgY2lwaGVydGV4dCBhbmQgdXNlIGl0IGluIHNjcmlwdCAgXHJcbiAgICAgKiBjb25zdCBkZWNyeXB0ID0gdXRpbHMuZGVjcnlwdChlbmNyeXB0KTtcclxuICAgICAqIGxvZy5pbmZvKGRlY3J5cHQpOyAvLyB3aWxsIHByaW50IEVOQ1JZUFRFRFxyXG4gICAgICogXHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm9wZW4oZGVjcnlwdCk7IC8vIHdpbGwgb3BlbiBodHRwczovL3d3dy53aWtpcGVkaWEub3JnXHJcbiAgICAgKiBcclxuICAgICAqIC8vIHRvIGdldCBvcmlnaW5hbCBwbGFpbnRleHQgdXNlIGdldERlY3J5cHRSZXN1bHRcclxuICAgICAqIGNvbnN0IHZhbHVlID0gZGVjcnlwdC5nZXREZWNyeXB0UmVzdWx0KCk7XHJcbiAgICAgKiBsb2cuaW5mbyh2YWx1ZSk7IC8vd2lsbCBwcmludCBodHRwczovL3d3dy53aWtpcGVkaWEub3JnXHJcbiAgICAgKi9cclxuICAgIGVuY3J5cHQodGV4dCkge1xyXG4gICAgICAgIHJldHVybiBsaWJVdGlscy5lbmNyeXB0KHRleHQpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZWFkcyBkYXRhIGZyb20gY3N2IGZpbGVcclxuICAgICAqIEBmdW5jdGlvbiByZWFkQ3N2XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZmlsZVBhdGggLSBBYnNvbHV0ZSBwYXRoIHRvIGZpbGVcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyAtIFtPcHRpb25zXShodHRwczovL2Nzdi5qcy5vcmcvcGFyc2Uvb3B0aW9ucy8pXHJcbiAgICAgKi9cclxuICAgIHJlYWRDc3YoZmlsZVBhdGgsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IHBhcnNlID0gcmVxdWlyZSgnY3N2LXBhcnNlL2xpYi9zeW5jJyk7XHJcbiAgICAgICAgdmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcclxuICAgICAgICB2YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcclxuXHJcbiAgICAgICAgdmFyIGV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCk7XHJcbiAgICAgICAgaWYgKGV4dCAhPT0gJy5jc3YnICYmIGV4dCAhPT0gJy50eHQnKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5DU1ZfRVJST1IsICdVbnN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbjogJyArIGV4dCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2YXIgZGF0YTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkYXRhID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmOCcpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkNTVl9FUlJPUiwgJ1VuYWJsZSB0byByZWFkIHBhcmFtZXRlcnMgZmlsZTogJyArIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQ1NWcyBwcm9kdWNlZCBieSBPUyBYIEV4Y2VsIGhhdmUgaGVhZGVyIHRlcm1pbmF0ZWQgd2l0aCAwZDBkMGFcclxuICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKC9cXHJcXHIvZywgJ1xccicpO1xyXG5cclxuICAgICAgICAvLyBzdHJpcCBCT00gZm9yIFVURi04XHJcbiAgICAgICAgdmFyIGJvbSA9IGZhbHNlO1xyXG4gICAgICAgIC8vIGNhdGNoZXMgMHhFRkJCQkYgKFVURi04IEJPTSkgYmVjYXVzZSB0aGUgYnVmZmVyLXRvLXN0cmluZ1xyXG4gICAgICAgIC8vIGNvbnZlcnNpb24gdHJhbnNsYXRlcyBpdCB0byAweEZFRkYgKFVURi0xNiBCT00pXHJcbiAgICAgICAgaWYgKGRhdGEuY2hhckNvZGVBdCgwKSA9PT0gMHhGRUZGKSB7XHJcbiAgICAgICAgICAgIGJvbSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YXIgdGFibGUgPSBwYXJzZShkYXRhLCB7IGJvbTogYm9tLCBjb2x1bW5zOiB0cnVlLCB0cmltOiB0cnVlLCAuLi5vcHRpb25zIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkNTVl9FUlJPUiwgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0YWJsZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdyaXRlcyBkYXRhIGludG8gY3N2IGZpbGVcclxuICAgICAqIEBmdW5jdGlvbiB3cml0ZUNzdlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byBmaWxlXHJcbiAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIC0gQ1NWIGRhdGEgaW4gZm9ybWF0IFt7Y29sdW1uX25hbWVfMTogJ2ZvbycsIGNvbHVtbl9uYW1lXzI6ICdiYXInfV1cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyAtIFtPcHRpb25zXShodHRwczovL2dpdGh1Yi5jb20vYW50b24tYm90L29iamVjdHMtdG8tY3N2I2FzeW5jLXRvZGlza2ZpbGVuYW1lLW9wdGlvbnMpXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdyaXRlQ3N2KGZpbGVQYXRoLCBkYXRhLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBPYmplY3RzVG9Dc3YgPSByZXF1aXJlKCdvYmplY3RzLXRvLWNzdicpO1xyXG4gICAgICAgICAgICBjb25zdCBjc3YgPSBuZXcgT2JqZWN0c1RvQ3N2KGRhdGEpO1xyXG4gICAgICAgICAgICBhd2FpdCBjc3YudG9EaXNrKGZpbGVQYXRoLCB7IGFsbENvbHVtbnM6IHRydWUsIC4uLm9wdGlvbnMgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuQ1NWX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJlYWRzIGRhdGEgZnJvbSBYbHN4IGZpbGVcclxuICAgICAqIEBmdW5jdGlvbiByZWFkWGxzeFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byBmaWxlXHJcbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gLSBBcnJheSBvZiB4bHN4IGRhdGFcclxuICAgICAqL1xyXG4gICAgYXN5bmMgcmVhZFhsc3goZmlsZVBhdGgpIHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRXhjZWxSZWFkZXIoKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgcmVhZGVyLnJlYWQoZmlsZVBhdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgVXNlcyB0aGUgRE5TIHByb3RvY29sIHRvIHJlc29sdmUgYSBob3N0IG5hbWVcclxuICAgICAqIEBmdW5jdGlvbiBkbnNSZXNvbHZlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaG9zdG5hbWUgLSBIb3N0IG5hbWUgdG8gcmVzb2x2ZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gcnJUeXBlIC0gUmVzb3VyY2UgcmVjb3JkIHR5cGUuIERlZmF1bHQ6ICdBJy5cclxuICAgICAqIEByZXR1cm4ge1N0cmluZ1tdIHwgT2JqZWN0fSAtIEFycmF5IG9yIE9iamVjdCBvZiByZXNvdXJjZSByZWNvcmRzLiBUaGUgdHlwZSBhbmQgc3RydWN0dXJlIG9mIGluZGl2aWR1YWwgcmVzdWx0cyB2YXJ5IGJhc2VkIG9uIHJydHlwZVxyXG4gICAgICovXHJcbiAgICBhc3luYyBkbnNSZXNvbHZlKGhvc3RuYW1lLCByclR5cGUgPSAnQScpIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKGhvc3RuYW1lLCAnaG9zdG5hbWUnKTtcclxuICAgICAgICBjb25zdCByclR5cGVzID0gWydBJywgJ0FBQUEnLCAnQU5ZJywgJ0NOQU1FJywgJ01YJywgJ05BUFRSJywgJ05TJywgJ1BUUicsICdTT0EnLCAnU1JWJywgJ1RYVCddO1xyXG5cclxuICAgICAgICBpZiAoIXJyVHlwZXMuaW5jbHVkZXMocnJUeXBlKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCBgSW52YWxpZCBhcmd1bWVudCAtICdyclR5cGUnLiBBdmFpbGFibGUgcnJUeXBlIHZhbHVlczogJHtyclR5cGVzLmpvaW4oJywgJyl9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBkbnNQcm9taXNlcyA9IHJlcXVpcmUoJ2RucycpLnByb21pc2VzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBkbnNQcm9taXNlcy5yZXNvbHZlKGhvc3RuYW1lLCByclR5cGUpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkROU19FUlJPUiwgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQYXJzZSBYTUwgZGF0YSB0byBKUyBvYmplY3QgXHJcbiAgICAgKiBAZnVuY3Rpb24geG1sVG9Kc29uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ3xCdWZmZXJ9IHhtbERhdGFTdHIgLSBMaWtlIDxyb290IGE9XCJuaWNlXCIgYj1cInZlcnkgbmljZVwiID48YT53b3c8L2E+PC9yb290PlxyXG4gICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdH0gb3B0aW9ucyAtIFtPcHRpb25zXShodHRwczovL2dpdGh1Yi5jb20vTmF0dXJhbEludGVsbGlnZW5jZS9mYXN0LXhtbC1wYXJzZXIvYmxvYi9tYXN0ZXIvZG9jcy92NC8yLlhNTHBhcnNlT3B0aW9ucy5tZCkgXHJcbiAgICAgKi9cclxuICAgIHhtbFRvSnNvbih4bWxEYXRhU3RyLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgZmFzdFhtbFBhcnNlci5YTUxQYXJzZXIob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHBhcnNlci5wYXJzZSh4bWxEYXRhU3RyKTtcclxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5YTUxfRVJST1IsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdW50aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmUgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgaWYgKCFuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8ganVzdCBpbiBjYXNlIHVzZXIgcGFzc2VkIGEgY29tcGxleCBvYmplY3QgYnkgbWlzdGFrZVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIC8vIGxpbWl0IHRoZSBuYW1lIGxlbmd0aCAoc2luY2Ugd2UgY2FuJ3Qgc3RvcmUgdmFsdWVzIGxhcmdlciB0aGFuIDUxMkIgaW4gdGhlIGRhdGFiYXNlKVxyXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIDUxMik7XHJcblxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcbn0iXX0=
237
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZmFzdFhtbFBhcnNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX094eWdlbk1vZHVsZSIsIl91dGlscyIsIl91dGlsIiwiX094eWdlbkVycm9yIiwiX2hlbHBlciIsIl9wYXJhbVJlYWRlckV4Y2VsIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiTU9EVUxFX05BTUUiLCJVdGlsc01vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9pc0luaXRpYWxpemVkIiwibmFtZSIsInBhdXNlIiwibXMiLCJ1dGlscyIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJsaWJVdGlscyIsInNsZWVwIiwiZGVjcnlwdCIsInRleHQiLCJlbmNyeXB0IiwicmVhZENzdiIsImZpbGVQYXRoIiwicGFyc2UiLCJmcyIsInBhdGgiLCJleHQiLCJleHRuYW1lIiwiT3hFcnJvciIsImVycm9ySGVscGVyIiwiZXJyb3JDb2RlIiwiQ1NWX0VSUk9SIiwiZGF0YSIsInJlYWRGaWxlU3luYyIsInJlcGxhY2UiLCJib20iLCJjaGFyQ29kZUF0IiwidGFibGUiLCJjb2x1bW5zIiwidHJpbSIsIm1lc3NhZ2UiLCJ3cml0ZUNzdiIsIk9iamVjdHNUb0NzdiIsImNzdiIsInRvRGlzayIsImFsbENvbHVtbnMiLCJyZWFkWGxzeCIsInJlYWRlciIsIkV4Y2VsUmVhZGVyIiwicmVhZCIsImRuc1Jlc29sdmUiLCJob3N0bmFtZSIsInJyVHlwZSIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJyclR5cGVzIiwiaW5jbHVkZXMiLCJTQ1JJUFRfRVJST1IiLCJqb2luIiwiZG5zUHJvbWlzZXMiLCJwcm9taXNlcyIsInJlc29sdmUiLCJETlNfRVJST1IiLCJ4bWxUb0pzb24iLCJ4bWxEYXRhU3RyIiwicGFyc2VyIiwiZmFzdFhtbFBhcnNlciIsIlhNTFBhcnNlciIsIm91dHB1dCIsIlhNTF9FUlJPUiIsInRyYW5zYWN0aW9uIiwidG9TdHJpbmciLCJzbGljZSIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS11dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSB1dGlsc1xyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWlzY2VsbGFuZW91cyB1dGlsaXR5IG1ldGhvZHMuXHJcbiAqL1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAndXRpbHMnO1xyXG5pbXBvcnQgZmFzdFhtbFBhcnNlciBmcm9tICdmYXN0LXhtbC1wYXJzZXInO1xyXG5pbXBvcnQgT3h5Z2VuTW9kdWxlIGZyb20gJy4uL2NvcmUvT3h5Z2VuTW9kdWxlJztcclxuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBFeGNlbFJlYWRlciBmcm9tICcuLi9saWIvcGFyYW0tcmVhZGVyLWV4Y2VsJztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzTW9kdWxlIGV4dGVuZHMgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMuX2Fsd2F5c0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJ1dGlsc1wiLlxyXG4gICAgICovXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQYXVzZSB0ZXN0IGV4ZWN1dGlvbiBmb3IgdGhlIGdpdmVuIGFtb3VudCBvZiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gcGF1c2VcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBtcyAtIE1pbGxpc2Vjb25kcyB0byBwYXVzZSB0aGUgZXhlY3V0aW9uIGZvci5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcGF1c2UobXMpIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlKG1zLCAnbXMnKTtcclxuICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcChtcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBEZWNyeXB0IHRleHRcclxuICAgICAqIEBmdW5jdGlvbiBkZWNyeXB0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdGV4dCAtIFRleHRcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gRGVjcnlwdFJlc3VsdCBPYmplY3Qgd2l0aCBnZXREZWNyeXB0UmVzdWx0IG1ldGhvZFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiAvLyB0byBlbmNyeXB0IHBsYWludGV4dCBpbnRvIGNpcGhlcnRleHQgXHJcbiAgICAgKiBjb25zdCBlbmNyeXB0ID0gdXRpbHMuZW5jcnlwdCgnaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZycpO1xyXG4gICAgICogbG9nLmluZm8oZW5jcnlwdCk7IC8vIHdpbGwgcHJpbnQgYjc1N2JhMmMyZmM1MGZiYjUxMWQ1OTY4MTZjYTA2YzRmYTU2ZjRlOThjZTIyMmYzMGJjNThkNTI1MWVkNjM1ZVxyXG4gICAgICogXHJcbiAgICAgKiAvLyB0byBkZWNyeXB0IGNpcGhlcnRleHQgYW5kIHVzZSBpdCBpbiBzY3JpcHQgIFxyXG4gICAgICogY29uc3QgZGVjcnlwdCA9IHV0aWxzLmRlY3J5cHQoZW5jcnlwdCk7XHJcbiAgICAgKiBsb2cuaW5mbyhkZWNyeXB0KTsgLy8gd2lsbCBwcmludCBFTkNSWVBURURcclxuICAgICAqIFxyXG4gICAgICogd2ViLmluaXQoKTtcclxuICAgICAqIHdlYi5vcGVuKGRlY3J5cHQpOyAvLyB3aWxsIG9wZW4gaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZ1xyXG4gICAgICogXHJcbiAgICAgKiAvLyB0byBnZXQgb3JpZ2luYWwgcGxhaW50ZXh0IHVzZSBnZXREZWNyeXB0UmVzdWx0XHJcbiAgICAgKiBjb25zdCB2YWx1ZSA9IGRlY3J5cHQuZ2V0RGVjcnlwdFJlc3VsdCgpO1xyXG4gICAgICogbG9nLmluZm8odmFsdWUpOyAvL3dpbGwgcHJpbnQgaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZ1xyXG4gICAgICovXHJcbiAgICBkZWNyeXB0KHRleHQpIHtcclxuICAgICAgICByZXR1cm4gbGliVXRpbHMuZGVjcnlwdCh0ZXh0KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEVuY3J5cHQgdGV4dFxyXG4gICAgICogQGZ1bmN0aW9uIGVuY3J5cHRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IC0gVGV4dFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBFbmNyeXB0ZWQgdGV4dFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiAvLyB0byBlbmNyeXB0IHBsYWludGV4dCBpbnRvIGNpcGhlcnRleHQgXHJcbiAgICAgKiBjb25zdCBlbmNyeXB0ID0gdXRpbHMuZW5jcnlwdCgnaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZycpO1xyXG4gICAgICogbG9nLmluZm8oZW5jcnlwdCk7IC8vIHdpbGwgcHJpbnQgYjc1N2JhMmMyZmM1MGZiYjUxMWQ1OTY4MTZjYTA2YzRmYTU2ZjRlOThjZTIyMmYzMGJjNThkNTI1MWVkNjM1ZVxyXG4gICAgICogXHJcbiAgICAgKiAvLyB0byBkZWNyeXB0IGNpcGhlcnRleHQgYW5kIHVzZSBpdCBpbiBzY3JpcHQgIFxyXG4gICAgICogY29uc3QgZGVjcnlwdCA9IHV0aWxzLmRlY3J5cHQoZW5jcnlwdCk7XHJcbiAgICAgKiBsb2cuaW5mbyhkZWNyeXB0KTsgLy8gd2lsbCBwcmludCBFTkNSWVBURURcclxuICAgICAqIFxyXG4gICAgICogd2ViLmluaXQoKTtcclxuICAgICAqIHdlYi5vcGVuKGRlY3J5cHQpOyAvLyB3aWxsIG9wZW4gaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZ1xyXG4gICAgICogXHJcbiAgICAgKiAvLyB0byBnZXQgb3JpZ2luYWwgcGxhaW50ZXh0IHVzZSBnZXREZWNyeXB0UmVzdWx0XHJcbiAgICAgKiBjb25zdCB2YWx1ZSA9IGRlY3J5cHQuZ2V0RGVjcnlwdFJlc3VsdCgpO1xyXG4gICAgICogbG9nLmluZm8odmFsdWUpOyAvL3dpbGwgcHJpbnQgaHR0cHM6Ly93d3cud2lraXBlZGlhLm9yZ1xyXG4gICAgICovXHJcbiAgICBlbmNyeXB0KHRleHQpIHtcclxuICAgICAgICByZXR1cm4gbGliVXRpbHMuZW5jcnlwdCh0ZXh0KTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmVhZHMgZGF0YSBmcm9tIGNzdiBmaWxlXHJcbiAgICAgKiBAZnVuY3Rpb24gcmVhZENzdlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGZpbGVQYXRoIC0gQWJzb2x1dGUgcGF0aCB0byBmaWxlXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgLSBbT3B0aW9uc10oaHR0cHM6Ly9jc3YuanMub3JnL3BhcnNlL29wdGlvbnMvKVxyXG4gICAgICovXHJcbiAgICByZWFkQ3N2KGZpbGVQYXRoLCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBwYXJzZSA9IHJlcXVpcmUoJ2Nzdi1wYXJzZS9saWIvc3luYycpO1xyXG4gICAgICAgIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XHJcbiAgICAgICAgdmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XHJcblxyXG4gICAgICAgIHZhciBleHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xyXG4gICAgICAgIGlmIChleHQgIT09ICcuY3N2JyAmJiBleHQgIT09ICcudHh0Jykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuQ1NWX0VSUk9SLCAnVW5zdXBwb3J0ZWQgZmlsZSBleHRlbnNpb246ICcgKyBleHQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIGRhdGE7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGF0YSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5DU1ZfRVJST1IsICdVbmFibGUgdG8gcmVhZCBwYXJhbWV0ZXJzIGZpbGU6ICcgKyBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENTVnMgcHJvZHVjZWQgYnkgT1MgWCBFeGNlbCBoYXZlIGhlYWRlciB0ZXJtaW5hdGVkIHdpdGggMGQwZDBhXHJcbiAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgvXFxyXFxyL2csICdcXHInKTtcclxuXHJcbiAgICAgICAgLy8gc3RyaXAgQk9NIGZvciBVVEYtOFxyXG4gICAgICAgIHZhciBib20gPSBmYWxzZTtcclxuICAgICAgICAvLyBjYXRjaGVzIDB4RUZCQkJGIChVVEYtOCBCT00pIGJlY2F1c2UgdGhlIGJ1ZmZlci10by1zdHJpbmdcclxuICAgICAgICAvLyBjb252ZXJzaW9uIHRyYW5zbGF0ZXMgaXQgdG8gMHhGRUZGIChVVEYtMTYgQk9NKVxyXG4gICAgICAgIGlmIChkYXRhLmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xyXG4gICAgICAgICAgICBib20gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdmFyIHRhYmxlID0gcGFyc2UoZGF0YSwgeyBib206IGJvbSwgY29sdW1uczogdHJ1ZSwgdHJpbTogdHJ1ZSwgLi4ub3B0aW9ucyB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5DU1ZfRVJST1IsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGFibGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXcml0ZXMgZGF0YSBpbnRvIGNzdiBmaWxlXHJcbiAgICAgKiBAZnVuY3Rpb24gd3JpdGVDc3ZcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gZmlsZVxyXG4gICAgICogQHBhcmFtIHtBcnJheX0gZGF0YSAtIENTViBkYXRhIGluIGZvcm1hdCBbe2NvbHVtbl9uYW1lXzE6ICdmb28nLCBjb2x1bW5fbmFtZV8yOiAnYmFyJ31dXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgLSBbT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL2FudG9uLWJvdC9vYmplY3RzLXRvLWNzdiNhc3luYy10b2Rpc2tmaWxlbmFtZS1vcHRpb25zKVxyXG4gICAgICovXHJcbiAgICBhc3luYyB3cml0ZUNzdihmaWxlUGF0aCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgT2JqZWN0c1RvQ3N2ID0gcmVxdWlyZSgnb2JqZWN0cy10by1jc3YnKTtcclxuICAgICAgICAgICAgY29uc3QgY3N2ID0gbmV3IE9iamVjdHNUb0NzdihkYXRhKTtcclxuICAgICAgICAgICAgYXdhaXQgY3N2LnRvRGlzayhmaWxlUGF0aCwgeyBhbGxDb2x1bW5zOiB0cnVlLCAuLi5vcHRpb25zIH0pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLkNTVl9FUlJPUiwgZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZWFkcyBkYXRhIGZyb20gWGxzeCBmaWxlXHJcbiAgICAgKiBAZnVuY3Rpb24gcmVhZFhsc3hcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBmaWxlUGF0aCAtIEFic29sdXRlIHBhdGggdG8gZmlsZVxyXG4gICAgICogQHJldHVybiB7QXJyYXl9IC0gQXJyYXkgb2YgeGxzeCBkYXRhXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlYWRYbHN4KGZpbGVQYXRoKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEV4Y2VsUmVhZGVyKCk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlYWRlci5yZWFkKGZpbGVQYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFVzZXMgdGhlIEROUyBwcm90b2NvbCB0byByZXNvbHZlIGEgaG9zdCBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gZG5zUmVzb2x2ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhvc3RuYW1lIC0gSG9zdCBuYW1lIHRvIHJlc29sdmUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHJyVHlwZSAtIFJlc291cmNlIHJlY29yZCB0eXBlLiBEZWZhdWx0OiAnQScuXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmdbXSB8IE9iamVjdH0gLSBBcnJheSBvciBPYmplY3Qgb2YgcmVzb3VyY2UgcmVjb3Jkcy4gVGhlIHR5cGUgYW5kIHN0cnVjdHVyZSBvZiBpbmRpdmlkdWFsIHJlc3VsdHMgdmFyeSBiYXNlZCBvbiBycnR5cGVcclxuICAgICAqL1xyXG4gICAgYXN5bmMgZG5zUmVzb2x2ZShob3N0bmFtZSwgcnJUeXBlID0gJ0EnKSB7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhob3N0bmFtZSwgJ2hvc3RuYW1lJyk7XHJcbiAgICAgICAgY29uc3QgcnJUeXBlcyA9IFsnQScsICdBQUFBJywgJ0FOWScsICdDTkFNRScsICdNWCcsICdOQVBUUicsICdOUycsICdQVFInLCAnU09BJywgJ1NSVicsICdUWFQnXTtcclxuXHJcbiAgICAgICAgaWYgKCFyclR5cGVzLmluY2x1ZGVzKHJyVHlwZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgYEludmFsaWQgYXJndW1lbnQgLSAncnJUeXBlJy4gQXZhaWxhYmxlIHJyVHlwZSB2YWx1ZXM6ICR7cnJUeXBlcy5qb2luKCcsICcpfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZG5zUHJvbWlzZXMgPSByZXF1aXJlKCdkbnMnKS5wcm9taXNlcztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZG5zUHJvbWlzZXMucmVzb2x2ZShob3N0bmFtZSwgcnJUeXBlKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVycm9ySGVscGVyLmVycm9yQ29kZS5ETlNfRVJST1IsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGFyc2UgWE1MIGRhdGEgdG8gSlMgb2JqZWN0IFxyXG4gICAgICogQGZ1bmN0aW9uIHhtbFRvSnNvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd8QnVmZmVyfSB4bWxEYXRhU3RyIC0gTGlrZSA8cm9vdCBhPVwibmljZVwiIGI9XCJ2ZXJ5IG5pY2VcIiA+PGE+d293PC9hPjwvcm9vdD5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3R9IG9wdGlvbnMgLSBbT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL05hdHVyYWxJbnRlbGxpZ2VuY2UvZmFzdC14bWwtcGFyc2VyL2Jsb2IvbWFzdGVyL2RvY3MvdjQvMi5YTUxwYXJzZU9wdGlvbnMubWQpIFxyXG4gICAgICovXHJcbiAgICB4bWxUb0pzb24oeG1sRGF0YVN0ciwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcGFyc2VyID0gbmV3IGZhc3RYbWxQYXJzZXIuWE1MUGFyc2VyKG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBwYXJzZXIucGFyc2UoeG1sRGF0YVN0cik7XHJcbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuWE1MX0VSUk9SLCBlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHVudGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAvLyBsaW1pdCB0aGUgbmFtZSBsZW5ndGggKHNpbmNlIHdlIGNhbid0IHN0b3JlIHZhbHVlcyBsYXJnZXIgdGhhbiA1MTJCIGluIHRoZSBkYXRhYmFzZSlcclxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCA1MTIpO1xyXG5cclxuICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgfVxyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBZUEsSUFB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