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,5 +1,4 @@
1
1
  /* eslint-disable no-unused-vars */
2
-
3
2
  /*
4
3
  * Copyright (C) 2015-present CloudBeat Limited
5
4
  *
@@ -8,7 +7,9 @@
8
7
  * the Free Software Foundation, either version 3 of the License, or
9
8
  * (at your option) any later version.
10
9
  */
10
+
11
11
  'use strict';
12
+
12
13
  /**
13
14
  * @name web
14
15
  * @description Provides methods for browser automation.
@@ -41,52 +42,30 @@
41
42
  */
42
43
 
43
44
  /* eslint-disable quotes */
44
-
45
45
  Object.defineProperty(exports, "__esModule", {
46
46
  value: true
47
47
  });
48
48
  exports.default = void 0;
49
-
50
49
  require("source-map-support/register");
51
-
52
50
  var _chromeHar = require("chrome-har");
53
-
54
51
  var _url = _interopRequireDefault(require("url"));
55
-
56
52
  var wdio = _interopRequireWildcard(require("webdriverio"));
57
-
58
53
  var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
59
-
60
54
  var _when = require("when");
61
-
62
55
  var _utils = _interopRequireDefault(require("./utils"));
63
-
64
56
  var _helper = _interopRequireDefault(require("../errors/helper"));
65
-
66
57
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
67
-
68
58
  var _util = _interopRequireDefault(require("util"));
69
-
70
59
  var _saucelabs = _interopRequireDefault(require("saucelabs"));
71
-
72
60
  var _nodeRestClient = _interopRequireDefault(require("@lambdatest/node-rest-client"));
73
-
74
61
  var _testingbotApi = _interopRequireDefault(require("testingbot-api"));
75
-
76
62
  var _child_process = require("child_process");
77
-
78
63
  var _perfectoReporting = _interopRequireDefault(require("perfecto-reporting"));
79
-
80
64
  var _request = _interopRequireDefault(require("request"));
81
-
82
65
  var _imgMerge = _interopRequireDefault(require("../lib/img-merge"));
83
-
84
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
85
-
86
- function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
87
-
88
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
89
-
66
+ var _autoStart = require("../ox_modules/module-web/webdriver/auto-start");
67
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
68
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
90
69
  const MODULE_NAME = 'web';
91
70
  const DEFAULT_SELENIUM_URL = 'http://localhost:4444/wd/hub';
92
71
  const DEFAULT_BROWSER_NAME = 'chrome';
@@ -99,106 +78,108 @@ class WebModule extends _WebDriverModule.default {
99
78
  constructor(options, context, rs, logger, modules, services) {
100
79
  super(options, context, rs, logger, modules, services);
101
80
  this.transactions = {}; // transaction->har dictionary
102
-
103
81
  this.lastNavigationStartTime = null;
104
82
  this.helpers = {};
105
-
106
- this._loadHelperFunctions(); // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
107
-
108
-
83
+ this._loadHelperFunctions();
84
+ // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
109
85
  this.OxError = _OxygenError.default;
110
- this.errHelper = _helper.default; // holds element operation timeout value
111
-
86
+ this.errHelper = _helper.default;
87
+ // holds element operation timeout value
112
88
  this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
89
+ this.wdProc = null;
113
90
  }
114
-
115
91
  get name() {
116
92
  return MODULE_NAME;
117
93
  }
94
+
118
95
  /**
119
96
  * @function getDriver
120
97
  * @summary Returns the underlying WDIO driver.
121
98
  * @return {Object} WDIO driver.
122
99
  */
123
-
124
-
125
100
  getDriver() {
126
101
  return super.getDriver();
127
102
  }
103
+
128
104
  /**
129
105
  * @function getCapabilities
130
106
  * @summary Returns currently defined capabilities.
131
107
  * @return {Object} Current capabilities object.
132
108
  */
133
-
134
-
135
109
  getCapabilities() {
136
110
  return this.caps || super.getCapabilities();
137
111
  }
112
+
138
113
  /**
139
114
  * @function init
140
115
  * @summary Initializes new Selenium session.
141
116
  * @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
142
117
  * @param {String=} seleniumUrl - Remote server URL (default: http://localhost:4444/wd/hub).
143
118
  */
144
-
145
-
146
119
  async init(caps, seleniumUrl) {
147
120
  if (this.isInitialized) {
148
121
  return;
149
122
  }
150
123
 
151
- if (!seleniumUrl) {
152
- // if appiumUrl points to an external execution grid (such as BS)
153
- if (this.options.appiumUrl && !this.options.appiumUrl.startsWith('http://localhost')) {
154
- seleniumUrl = this.options.appiumUrl;
155
- } else {
156
- seleniumUrl = this.options.seleniumUrl || DEFAULT_SELENIUM_URL;
157
- }
158
- } // take capabilities either from init method argument or from context parameters passed in the constructor
124
+ // take capabilities either from init method argument or from context parameters passed in the constructor
159
125
  // merge capabilities from context and from init function argument, give preference to context-passed capabilities
160
-
161
-
162
126
  this.caps = {};
163
-
164
127
  if (this.ctx.caps) {
165
- this.caps = { ...this.ctx.caps
128
+ this.caps = {
129
+ ...this.ctx.caps
166
130
  };
167
131
  }
168
-
169
132
  if (caps) {
170
- this.caps = { ...this.caps,
133
+ this.caps = {
134
+ ...this.caps,
171
135
  ...caps
172
136
  };
173
- } // populate browserName caps from options. FIXME: why is this even needed?
174
-
137
+ }
138
+ if (!seleniumUrl && !this.options.autoStartWebDriver) {
139
+ // if appiumUrl points to an external execution grid (such as BS)
140
+ if (this.options.appiumUrl && !this.options.appiumUrl.startsWith('http://localhost')) {
141
+ seleniumUrl = this.options.appiumUrl;
142
+ } else {
143
+ seleniumUrl = this.options.seleniumUrl || DEFAULT_SELENIUM_URL;
144
+ }
145
+ }
146
+ // check if we should indetify and auto-start a relevant webdriver
147
+ else if (this.options.autoStartWebDriver) {
148
+ const {
149
+ remoteUrl,
150
+ proc
151
+ } = await (0, _autoStart.autoStartWebDriver)(this.caps);
152
+ seleniumUrl = remoteUrl;
153
+ this.wdProc = proc;
154
+ }
175
155
 
156
+ // populate browserName caps from options. FIXME: why is this even needed?
176
157
  let defaultBrowser = false;
177
-
178
158
  if (!this.caps.browserName) {
179
159
  this.caps.browserName = this.options.browserName || DEFAULT_BROWSER_NAME;
180
160
  defaultBrowser = true;
181
- } // FIXME: shall we throw an exception if browserName is not specified, neither in caps nor in options?!
182
-
183
-
161
+ }
162
+ // FIXME: shall we throw an exception if browserName is not specified, neither in caps nor in options?!
184
163
  if (!this.caps.browserName) {
185
164
  throw new _OxygenError.default(_helper.default.errorCode.INVALID_CAPABILITIES, 'Failed to initialize `web` module - browserName must be specified.');
186
- } // adjust browserName-s
187
-
165
+ }
188
166
 
167
+ // adjust browserName-s
189
168
  if (this.caps.browserName.toLowerCase() === 'ie') {
190
169
  // IE is specified as 'ie' through the command line and possibly suites
191
170
  // but selenium standalone server expects 'internet explorer'
192
171
  this.caps.browserName = 'internet explorer';
193
- } else if (this.caps['lambda:options']) {// lambdatest expects original case names
194
- } else if (this.caps['perfectoMobile:options']) {// perfectoMobile expects original case names
172
+ } else if (this.caps['lambda:options']) {
173
+ // lambdatest expects original case names
174
+ } else if (this.caps['perfectoMobile:options']) {
175
+ // perfectoMobile expects original case names
195
176
  } else if (this.caps.browserName !== 'MicrosoftEdge') {
196
177
  // selenium standalone server expects all browserNames to be lowercase
197
178
  // except "MicrosoftEdge"
198
179
  this.caps.browserName = this.caps.browserName.toLowerCase();
199
- } // adjust capabilities to enable collecting browser and performance stats in Chrome
200
-
180
+ }
201
181
 
182
+ // adjust capabilities to enable collecting browser and performance stats in Chrome
202
183
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
203
184
  this.caps['goog:loggingPrefs'] = {
204
185
  // for ChromeDriver >= 75
@@ -218,16 +199,16 @@ class WebModule extends _WebDriverModule.default {
218
199
  }
219
200
  };
220
201
  */
221
- } // populate WDIO options
222
-
202
+ }
223
203
 
204
+ // populate WDIO options
224
205
  const url = _url.default.parse(seleniumUrl || DEFAULT_SELENIUM_URL);
225
-
226
206
  const protocol = url.protocol.replace(/:$/, '');
227
207
  const host = url.hostname;
228
208
  const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
229
- const path = url.pathname; // auth is needed mostly for cloud providers such as LambdaTest
209
+ const path = url.pathname;
230
210
 
211
+ // auth is needed mostly for cloud providers such as LambdaTest
231
212
  if (url.auth) {
232
213
  const auth = url.auth.split(':');
233
214
  this.options.wdioOpts = {
@@ -235,24 +216,21 @@ class WebModule extends _WebDriverModule.default {
235
216
  key: auth[1]
236
217
  };
237
218
  }
238
-
239
- this.seleniumUrlBase = `${protocol}://${host}:${port}`; // check if selenium hub is based on Selenoid, then enable video recording
240
-
219
+ this.seleniumUrlBase = `${protocol}://${host}:${port}`;
220
+ // check if selenium hub is based on Selenoid, then enable video recording
241
221
  this.isRunningOnSelenoid = await this._isSelenoidHub(this.seleniumUrlBase);
242
-
243
222
  if (this.isRunningOnSelenoid) {
244
223
  if (!this.caps['selenoid:options']) {
245
224
  this.caps['selenoid:options'] = {};
246
225
  }
247
-
248
226
  if (this.caps['selenoid:options'].enableVideo === undefined) {
249
227
  this.caps['selenoid:options'].enableVideo = true;
250
228
  this.caps['selenoid:options'].videoFrameRate = 4;
251
229
  }
252
- } // generate Webdriver.io options
253
-
254
-
255
- const wdioOpts = { ...(this.options.wdioOpts || {}),
230
+ }
231
+ // generate Webdriver.io options
232
+ const wdioOpts = {
233
+ ...(this.options.wdioOpts || {}),
256
234
  protocol: protocol,
257
235
  hostname: host,
258
236
  port: port,
@@ -266,60 +244,25 @@ class WebModule extends _WebDriverModule.default {
266
244
  connectionRetryCount: 1
267
245
  };
268
246
  let initError = null;
269
-
270
247
  const _this = this;
271
-
272
248
  const provider = _utils.default.determineProvider(wdioOpts);
249
+ const name = _utils.default.enrichProviderWdioOptions(provider, wdioOpts);
273
250
 
274
- if (provider === _utils.default.provider.PERFECTO) {
275
- wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
276
- wdioOpts.port = 80;
277
- wdioOpts.protocol = 'http';
278
- wdioOpts.openDeviceTimeout = 15;
279
- }
280
-
281
- let name = 'name';
282
-
283
- if (wdioOpts.capabilities['perfectoMobile:options'] && wdioOpts.capabilities['perfectoMobile:options']['name']) {
284
- name = wdioOpts.capabilities['perfectoMobile:options']['name'];
285
- delete wdioOpts.capabilities['perfectoMobile:options'];
286
- }
287
-
288
- if (wdioOpts.capabilities['lambda:options'] && wdioOpts.capabilities['lambda:options']['name']) {
289
- name = wdioOpts.capabilities['lambda:options']['name'];
290
- delete wdioOpts.capabilities['lambda:options'];
291
- }
292
-
293
- if (wdioOpts.capabilities['testingBot:options'] && wdioOpts.capabilities['testingBot:options']['name']) {
294
- name = wdioOpts.capabilities['testingBot:options']['name'];
295
- delete wdioOpts.capabilities['testingBot:options'];
296
- }
297
-
298
- if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
299
- name = wdioOpts.capabilities['bstack:options']['name'];
300
- delete wdioOpts.capabilities['bstack:options'];
301
- } // set default browser for mobile web tests, if executed against remote devices of a cloud provider
302
-
303
-
251
+ // set default browser for mobile web tests, if executed against remote devices of a cloud provider
304
252
  if (defaultBrowser && provider) {
305
253
  this.caps.browserName = wdioOpts.capabilities.browserName = DEFAULT_MOBILE_BROWSER;
306
254
  }
307
-
308
255
  this.wdioOpts = wdioOpts;
309
-
310
256
  try {
311
257
  this.driver = await wdio.remote(wdioOpts);
312
258
  this.sessionId = this.driver.sessionId;
313
259
  this.driver.provider = provider;
314
-
315
260
  if (this.options.seleniumBrowserTimeout) {
316
261
  this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
317
262
  }
318
-
319
263
  if (this.options.seleniumTimeout) {
320
264
  this.driver.seleniumTimeout = this.options.seleniumTimeout;
321
265
  }
322
-
323
266
  if (provider === _utils.default.provider.PERFECTO) {
324
267
  const perfectoExecutionContext = await new _perfectoReporting.default.Perfecto.PerfectoExecutionContext({
325
268
  webdriver: {
@@ -333,9 +276,9 @@ class WebModule extends _WebDriverModule.default {
333
276
  }
334
277
  } catch (e) {
335
278
  throw _helper.default.getSeleniumInitError(e);
336
- } // reset browser logs if auto collect logs option is enabled
337
-
279
+ }
338
280
 
281
+ // reset browser logs if auto collect logs option is enabled
339
282
  if (this.options.collectBrowserLogs && this.caps.browserName === 'chrome') {
340
283
  try {
341
284
  // simply call this to clear the previous logs and start the test with the clean logs
@@ -344,15 +287,16 @@ class WebModule extends _WebDriverModule.default {
344
287
  this.logger.error('Cannot retrieve browser logs.', e);
345
288
  }
346
289
  }
347
-
348
290
  try {
349
- if ([_utils.default.provider.LAMBDATEST, _utils.default.provider.BROWSERSTACK, _utils.default.provider.PERFECTO].includes(this.driver.provider) //['MicrosoftEdge', 'msedge', 'Edge', 'Internet Explorer'].includes(this.driver.capabilities.browserName)
350
- ) {// do not maximize window if the test is executed against external cloud provider infrastructure
351
- // as most of cloud providers do not support this functionality
352
- } else {
291
+ if ([_utils.default.provider.LAMBDATEST, _utils.default.provider.BROWSERSTACK, _utils.default.provider.PERFECTO].includes(this.driver.provider)
292
+ //['MicrosoftEdge', 'msedge', 'Edge', 'Internet Explorer'].includes(this.driver.capabilities.browserName)
293
+ ) {
294
+ // do not maximize window if the test is executed against external cloud provider infrastructure
295
+ // as most of cloud providers do not support this functionality
296
+ } else {
353
297
  // maximize browser window
354
- await this.driver.maximizeWindow(); // set initial Timeout
355
-
298
+ await this.driver.maximizeWindow();
299
+ // set initial Timeout
356
300
  await this.driver.setTimeout({
357
301
  'implicit': this.waitForTimeout,
358
302
  'pageLoad': this.waitForTimeout
@@ -361,37 +305,30 @@ class WebModule extends _WebDriverModule.default {
361
305
  } catch (err) {
362
306
  throw new _OxygenError.default(_helper.default.errorCode.UNKNOWN_ERROR, err.message, _util.default.inspect(err));
363
307
  }
364
-
365
308
  await _utils.default.overwriteWdioCommands(this.driver);
366
309
  super.init(this.driver);
367
310
  }
311
+
368
312
  /**
369
313
  * @function dispose
370
314
  * @summary Ends the current session.
371
315
  * @param {String=} status - Test status, either `passed` or `failed`.
372
316
  */
373
-
374
-
375
317
  async dispose(status) {
376
318
  this.transactions = {};
377
319
  this._whenWebModuleDispose = (0, _when.defer)();
378
-
379
320
  if (!status) {
380
321
  status = 'passed';
381
-
382
322
  if (this.rs.steps && Array.isArray(this.rs.steps) && this.rs.steps.length > 0) {
383
323
  const failedFinded = this.rs.steps.find(item => item.status === 'failed');
384
-
385
324
  if (failedFinded) {
386
325
  status = 'failed';
387
326
  }
388
327
  }
389
328
  }
390
-
391
329
  if (this.driver && this.isInitialized) {
392
330
  try {
393
331
  status = status.toUpperCase();
394
-
395
332
  if (this.driver.provider === _utils.default.provider.SAUCELABS) {
396
333
  const username = this.wdioOpts.capabilities['sauce:options']['username'];
397
334
  const accessKey = this.wdioOpts.capabilities['sauce:options']['accessKey'];
@@ -418,7 +355,6 @@ class WebModule extends _WebDriverModule.default {
418
355
  await this._sendResultStatusToBrowserstack(status);
419
356
  await this.deleteSession();
420
357
  }
421
-
422
358
  if (this.driver.provider === null && ['PASSED', 'FAILED'].includes(status)) {
423
359
  await this.closeBrowserWindows(status);
424
360
  } else {
@@ -431,10 +367,12 @@ class WebModule extends _WebDriverModule.default {
431
367
  } else {
432
368
  this.disposeContinue();
433
369
  }
434
-
370
+ if (this.wdProc) {
371
+ this.wdProc.kill();
372
+ this.wdProc = null;
373
+ }
435
374
  return this._whenWebModuleDispose.promise;
436
375
  }
437
-
438
376
  async deleteSession() {
439
377
  try {
440
378
  // deleteSession only if no session timeout because it will take 5 min to execute otherwise
@@ -445,7 +383,6 @@ class WebModule extends _WebDriverModule.default {
445
383
  this.logger.error('deleteSession error', e);
446
384
  }
447
385
  }
448
-
449
386
  async closeBrowserWindows(status) {
450
387
  if (status && 'FAILED' === status.toUpperCase() && this.options && this.options.seleniumPid) {
451
388
  this.disposeContinue(status);
@@ -454,12 +391,12 @@ class WebModule extends _WebDriverModule.default {
454
391
  this.disposeContinue();
455
392
  }
456
393
  }
457
-
458
394
  disposeContinue(status) {
459
395
  this.driver = null;
460
396
  this.lastNavigationStartTime = null;
461
- super.dispose(); // cleanup chromedriver's only when running from within the IDE and test did not fail
397
+ super.dispose();
462
398
 
399
+ // cleanup chromedriver's only when running from within the IDE and test did not fail
463
400
  if (this.options && this.options.seleniumPid && (!status || 'FAILED' !== status.toUpperCase())) {
464
401
  try {
465
402
  if (process.platform === 'win32') {
@@ -468,10 +405,8 @@ class WebModule extends _WebDriverModule.default {
468
405
  });
469
406
  } else {
470
407
  let pgrepResult = (0, _child_process.execSync)("pgrep -d' ' chromedriver");
471
-
472
408
  if (pgrepResult && pgrepResult.toString) {
473
409
  pgrepResult = pgrepResult.toString();
474
-
475
410
  if (pgrepResult) {
476
411
  (0, _child_process.execSync)('kill -9 ' + pgrepResult, {
477
412
  stdio: ['ignore', 'ignore', 'ignore']
@@ -479,20 +414,20 @@ class WebModule extends _WebDriverModule.default {
479
414
  }
480
415
  }
481
416
  }
482
- } catch (e) {// ignore errors
417
+ } catch (e) {
418
+ // ignore errors
483
419
  }
484
- } // cleanup edgedriver's only when running from within the IDE and test did not fail
485
-
420
+ }
486
421
 
422
+ // cleanup edgedriver's only when running from within the IDE and test did not fail
487
423
  if (this.options && this.options.seleniumPid && (!status || 'FAILED' !== status.toUpperCase())) {
488
424
  try {
489
- if (process.platform === 'win32') {// ignore for now
425
+ if (process.platform === 'win32') {
426
+ // ignore for now
490
427
  } else {
491
428
  let pgrepResult = (0, _child_process.execSync)("pgrep -d' ' msedgedriver");
492
-
493
429
  if (pgrepResult && pgrepResult.toString) {
494
430
  pgrepResult = pgrepResult.toString();
495
-
496
431
  if (pgrepResult) {
497
432
  (0, _child_process.execSync)('kill -9 ' + pgrepResult, {
498
433
  stdio: ['ignore', 'ignore', 'ignore']
@@ -500,35 +435,29 @@ class WebModule extends _WebDriverModule.default {
500
435
  }
501
436
  }
502
437
  }
503
- } catch (e) {// ignore errors
438
+ } catch (e) {
439
+ // ignore errors
504
440
  }
505
441
  }
506
-
507
442
  this._whenWebModuleDispose.resolve(null);
508
443
  }
509
-
510
444
  _iterationStart() {
511
445
  // clear transaction name saved in previous iteration if any
512
446
  global._lastTransactionName = null;
513
447
  }
514
-
515
448
  async _iterationEnd(error) {
516
449
  if (error && error.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT) {
517
450
  this.seleniumSessionTimeout = true;
518
451
  return;
519
452
  }
520
-
521
453
  this.seleniumSessionTimeout = false;
522
-
523
454
  if (!this.isInitialized) {
524
455
  return;
525
- } // collect browser logs for this session
526
-
527
-
456
+ }
457
+ // collect browser logs for this session
528
458
  if (this.options.collectBrowserLogs === true && this.caps.browserName === 'chrome') {
529
459
  try {
530
460
  const logs = await this.getBrowserLogs();
531
-
532
461
  if (logs && Array.isArray(logs)) {
533
462
  for (var log of logs) {
534
463
  this.rs.logs.push(this._adjustBrowserLog(log));
@@ -538,31 +467,25 @@ class WebModule extends _WebDriverModule.default {
538
467
  // ignore errors
539
468
  this.logger.error('Cannot retrieve browser logs.', e);
540
469
  }
541
- } // TODO: should clear transactions to avoid duplicate names across iterations
470
+ }
471
+ // TODO: should clear transactions to avoid duplicate names across iterations
542
472
  // also should throw on duplicate names.
543
-
544
-
545
473
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
546
474
  // there might be no transactions set if test fails before web.transaction command
547
475
  if (global._lastTransactionName) {
548
476
  this.transactions[global._lastTransactionName] = await this._getHAR();
549
477
  }
550
478
  }
551
-
552
479
  this.rs.har = this.transactions;
553
480
  const hasFailed = error !== undefined && error !== null;
554
-
555
481
  this._addSelenoidVideoAsTestAttachment(hasFailed);
556
482
  }
557
-
558
483
  _isAction(name) {
559
484
  return ACTION_COMMANDS.includes(name);
560
485
  }
561
-
562
486
  _takeScreenshotSilent(name) {
563
487
  if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
564
488
  let error;
565
-
566
489
  try {
567
490
  if (this.driver && this.driver.takeScreenshot) {
568
491
  let retval;
@@ -571,22 +494,19 @@ class WebModule extends _WebDriverModule.default {
571
494
  try {
572
495
  const waitUntilRetVal = this.driver.waitUntil(async () => {
573
496
  try {
574
- let images = []; // collect all (screenshot and title) images
497
+ let images = [];
575
498
 
499
+ // collect all (screenshot and title) images
576
500
  const handles = await this.driver.getWindowHandles();
577
-
578
501
  if (Array.isArray(handles) && handles.length > 0) {
579
502
  for (const handle of handles) {
580
503
  await this.driver.switchToWindow(handle);
581
504
  const image = await this.driver.takeScreenshot();
582
505
  const title = await this.driver.getTitle();
583
-
584
506
  if (title) {
585
507
  try {
586
508
  const textToImage = require('../lib/text-to-image');
587
-
588
509
  let titleImage = await textToImage.generate(title);
589
-
590
510
  if (titleImage && typeof titleImage === 'string') {
591
511
  titleImage = titleImage.replace('data:image/png;base64,', '');
592
512
  images.push(titleImage);
@@ -594,22 +514,18 @@ class WebModule extends _WebDriverModule.default {
594
514
  } catch (e) {
595
515
  console.warn('Canvas operation failed.');
596
516
  } // Ignore canvas-related error
597
-
598
517
  }
599
-
600
518
  images.push(image);
601
519
  }
602
- } // merge all images into one
603
-
520
+ }
604
521
 
522
+ // merge all images into one
605
523
  const mergedImage = await (0, _imgMerge.default)(images, {
606
524
  direction: true
607
525
  });
608
-
609
526
  if (mergedImage && typeof mergedImage === 'string') {
610
527
  retval = mergedImage.replace('data:image/jpeg;base64,', '');
611
528
  }
612
-
613
529
  return true;
614
530
  } catch (e) {
615
531
  error = e;
@@ -618,7 +534,6 @@ class WebModule extends _WebDriverModule.default {
618
534
  }, {
619
535
  timeout: 30 * 1000
620
536
  });
621
-
622
537
  if (waitUntilRetVal && waitUntilRetVal.then) {
623
538
  waitUntilRetVal.then(() => {
624
539
  resolve();
@@ -633,30 +548,25 @@ class WebModule extends _WebDriverModule.default {
633
548
  }
634
549
  });
635
550
  });
636
-
637
551
  if (error) {
638
552
  this.logger.error('Cannot get screenshot (2)', error);
639
553
  }
640
-
641
554
  return retval;
642
555
  }
643
556
  } catch (e) {
644
557
  this.logger.error('Cannot get screenshot (3)', e);
645
-
646
558
  if (error) {
647
559
  this.logger.error('Cannot get screenshot inner error', error);
648
- } // ignore
649
-
560
+ }
561
+ // ignore
650
562
  }
651
563
  }
652
564
  }
653
-
654
565
  _adjustBrowserLog(log) {
655
566
  if (!log || typeof log !== 'object') {
656
567
  return null;
657
- } // TODO: convert log.timestamp from the browser time zone to the local one (so we can later correlate between steps and logs)
658
-
659
-
568
+ }
569
+ // TODO: convert log.timestamp from the browser time zone to the local one (so we can later correlate between steps and logs)
660
570
  return {
661
571
  time: log.timestamp,
662
572
  msg: log.message,
@@ -665,6 +575,7 @@ class WebModule extends _WebDriverModule.default {
665
575
  src: 'browser'
666
576
  };
667
577
  }
578
+
668
579
  /*
669
580
  * FIXME: There is a bug with IE. See the comment within function body.
670
581
  *
@@ -689,17 +600,16 @@ class WebModule extends _WebDriverModule.default {
689
600
  * 8. loadEventStart - The browser have finished loading all the resources like images, swf, etc.
690
601
  * 9. loadEventEnd - The load event callback, if any, finished executing.
691
602
  */
692
-
693
-
694
603
  _getStats(commandName) {
695
604
  if (this.options.fetchStats && this.isInitialized && this._isAction(commandName)) {
696
605
  var navigationStart;
697
606
  var domContentLoaded = 0;
698
607
  var load = 0;
699
- var samePage = false; // TODO: handle following situation:
608
+ var samePage = false;
609
+
610
+ // TODO: handle following situation:
700
611
  // if navigateStart equals to the one we got from previous attempt (we need to save it)
701
612
  // it means we are still on the same page and don't need to record load/domContentLoaded times
702
-
703
613
  try {
704
614
  this.driver.call(() => {
705
615
  return new Promise((resolve, reject) => {
@@ -715,7 +625,6 @@ class WebModule extends _WebDriverModule.default {
715
625
  };
716
626
  });
717
627
  lastError = false;
718
-
719
628
  if (timings.domContentLoadedEventStart > 0 && timings.loadEventStart > 0) {
720
629
  samePage = this.lastNavigationStartTime && this.lastNavigationStartTime == timings.navigationStart;
721
630
  navigationStart = this.lastNavigationStartTime = timings.navigationStart;
@@ -734,21 +643,18 @@ class WebModule extends _WebDriverModule.default {
734
643
  }, {
735
644
  timeout: 30 * 1000
736
645
  });
737
-
738
646
  if (waitUntilRetVal && waitUntilRetVal.then) {
739
647
  waitUntilRetVal.then(() => {
740
648
  if (lastError) {
741
649
  // print error from driver.execute or driver.waitUntil
742
650
  console.log(lastError);
743
651
  }
744
-
745
652
  resolve();
746
653
  }).catch(err => {
747
654
  if (lastError) {
748
655
  // print error from driver.execute or driver.waitUntil
749
656
  console.log(lastError);
750
657
  }
751
-
752
658
  reject(err);
753
659
  });
754
660
  } else {
@@ -757,44 +663,39 @@ class WebModule extends _WebDriverModule.default {
757
663
  });
758
664
  });
759
665
  } catch (e) {
760
- return {}; // couldn't get timings.
666
+ return {};
667
+ // couldn't get timings.
761
668
  }
762
-
763
669
  this.lastNavigationStartTime = navigationStart;
764
670
  return samePage ? {} : {
765
671
  DomContentLoadedEvent: domContentLoaded,
766
672
  LoadEvent: load
767
673
  };
768
674
  }
769
-
770
675
  return {};
771
676
  }
677
+
772
678
  /**
773
679
  * @summary Opens new transaction.
774
680
  * @description The transaction will persist till a new one is opened. Transaction names must be unique.
775
681
  * @function transaction
776
682
  * @param {String} name - The transaction name.
777
683
  */
778
-
779
-
780
684
  async transaction(name) {
781
685
  if (!name) {
782
686
  return;
783
- } // just in case user passed a complex object by mistake
784
-
785
-
786
- name = name.toString(); // limit the name length (since we can't store values larger than 512B in the database)
687
+ }
688
+ // just in case user passed a complex object by mistake
689
+ name = name.toString();
787
690
 
691
+ // limit the name length (since we can't store values larger than 512B in the database)
788
692
  name = name.slice(0, 512);
789
-
790
693
  if (global._lastTransactionName) {
791
694
  this.transactions[global._lastTransactionName] = null;
792
-
793
695
  if (this.options.recordHAR && this.isInitialized && this.caps.browserName === 'chrome') {
794
696
  this.transactions[global._lastTransactionName] = await this._getHAR();
795
697
  }
796
698
  }
797
-
798
699
  if (typeof this.transactions[name] !== 'undefined') {
799
700
  const counter = Object.keys(this.transactions).filter(item => item.startsWith(name)).length + 1;
800
701
  global._lastTransactionName = name + ' (#' + counter + ')';
@@ -802,7 +703,6 @@ class WebModule extends _WebDriverModule.default {
802
703
  global._lastTransactionName = name;
803
704
  }
804
705
  }
805
-
806
706
  _loadHelperFunctions() {
807
707
  this.helpers.getWdioLocator = _utils.default.getWdioLocator;
808
708
  this.helpers.matchPattern = _utils.default.matchPattern;
@@ -821,27 +721,22 @@ class WebModule extends _WebDriverModule.default {
821
721
  this.helpers.assertArgumentTimeout = _utils.default.assertArgumentTimeout;
822
722
  this.helpers.assertArgumentString = _utils.default.assertArgumentString;
823
723
  }
824
-
825
724
  async _getHAR() {
826
725
  try {
827
726
  const types = await this.driver.getLogTypes();
828
-
829
727
  if (types.includes('performance')) {
830
- const logs = await this.driver.getLogs('performance'); // in one instance, logs was not iterable for some reason - hence the following check:
728
+ const logs = await this.driver.getLogs('performance');
831
729
 
730
+ // in one instance, logs was not iterable for some reason - hence the following check:
832
731
  if (!logs || typeof logs[Symbol.iterator] !== 'function') {
833
732
  this.logger.error('getHAR: logs not iterable: ' + JSON.stringify(logs));
834
733
  return null;
835
734
  }
836
-
837
735
  const events = [];
838
-
839
736
  for (let log of logs) {
840
737
  const msgObj = JSON.parse(log.message); // returned as string
841
-
842
738
  events.push(msgObj.message);
843
739
  }
844
-
845
740
  const har = (0, _chromeHar.harFromMessages)(events);
846
741
  return JSON.stringify(har);
847
742
  } else {
@@ -852,13 +747,11 @@ class WebModule extends _WebDriverModule.default {
852
747
  return null;
853
748
  }
854
749
  }
855
-
856
750
  async checkWaitForAngular() {
857
751
  if (this.autoWaitForAngular) {
858
752
  await this.waitForAngular(this.autoWaitForAngularRootSelector, this.autoWaitForAngularSoftWait, this.autoWaitForAngularTimeout);
859
753
  }
860
754
  }
861
-
862
755
  async _sendResultStatusToLambdaTest(status) {
863
756
  return new Promise((resolve, reject) => {
864
757
  const lambdaCredentials = {
@@ -866,13 +759,10 @@ class WebModule extends _WebDriverModule.default {
866
759
  accessKey: this.wdioOpts.key
867
760
  };
868
761
  const sessionId = this.driver.sessionId;
869
-
870
762
  const lambdaAutomationClient = _nodeRestClient.default.AutomationClient(lambdaCredentials);
871
-
872
763
  const requestBody = {
873
764
  status_ind: status === 'PASSED' ? 'passed' : 'failed'
874
765
  };
875
-
876
766
  try {
877
767
  lambdaAutomationClient.updateSessionById(sessionId, requestBody, error => {
878
768
  resolve();
@@ -883,7 +773,6 @@ class WebModule extends _WebDriverModule.default {
883
773
  }
884
774
  });
885
775
  }
886
-
887
776
  async _sendResultStatusToTestingBot(status) {
888
777
  return new Promise((resolve, reject) => {
889
778
  const sessionId = this.driver.sessionId;
@@ -894,7 +783,6 @@ class WebModule extends _WebDriverModule.default {
894
783
  const testData = {
895
784
  "test[success]": status === 'PASSED' ? "1" : "0"
896
785
  };
897
-
898
786
  try {
899
787
  tb.updateTest(testData, sessionId, function (error, testDetails) {
900
788
  resolve();
@@ -905,7 +793,6 @@ class WebModule extends _WebDriverModule.default {
905
793
  }
906
794
  });
907
795
  }
908
-
909
796
  async _sendResultStatusToBrowserstack(status) {
910
797
  return new Promise((resolve, reject) => {
911
798
  const requestBody = {
@@ -923,7 +810,6 @@ class WebModule extends _WebDriverModule.default {
923
810
  'sendImmediately': false
924
811
  }
925
812
  };
926
-
927
813
  try {
928
814
  (0, _request.default)(options, (err, res, body) => {
929
815
  resolve();
@@ -934,7 +820,6 @@ class WebModule extends _WebDriverModule.default {
934
820
  }
935
821
  });
936
822
  }
937
-
938
823
  async _isSelenoidHub(seleniumUrl) {
939
824
  return new Promise((resolve, reject) => {
940
825
  const options = {
@@ -943,7 +828,6 @@ class WebModule extends _WebDriverModule.default {
943
828
  json: false,
944
829
  rejectUnauthorized: false
945
830
  };
946
-
947
831
  try {
948
832
  (0, _request.default)(options, (err, res, body) => {
949
833
  if (err) {
@@ -961,24 +845,20 @@ class WebModule extends _WebDriverModule.default {
961
845
  resolve();
962
846
  }
963
847
  });
964
- } // if the test is running inside Selenoid, then download the video if test has failed
965
-
848
+ }
966
849
 
850
+ // if the test is running inside Selenoid, then download the video if test has failed
967
851
  async _addSelenoidVideoAsTestAttachment(hasFailed = false) {
968
852
  if (!this.isRunningOnSelenoid) {
969
853
  return;
970
854
  }
971
-
972
855
  if (!this.options.recordVideo && !hasFailed) {
973
856
  return;
974
857
  }
975
-
976
858
  const videoFileUrl = `${this.seleniumUrlBase}/video/${this.sessionId}.mp4`;
977
859
  const fileName = `${this.sessionId}.mp4`;
978
860
  this.rs.attachments.push(_utils.default.newVideoAttachment(fileName, videoFileUrl));
979
861
  }
980
-
981
862
  }
982
-
983
863
  exports.default = WebModule;
984
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS13ZWIuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX1NFTEVOSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiREVGQVVMVF9NT0JJTEVfQlJPV1NFUiIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIldlYk1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwiaGVscGVycyIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0Iiwic2VsZW5pdW1VcmwiLCJpc0luaXRpYWxpemVkIiwiYXBwaXVtVXJsIiwic3RhcnRzV2l0aCIsImN0eCIsImRlZmF1bHRCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJlcnJvckNvZGUiLCJJTlZBTElEX0NBUEFCSUxJVElFUyIsInRvTG93ZXJDYXNlIiwicmVjb3JkSEFSIiwiYnJvd3NlciIsInBlcmZvcm1hbmNlIiwidXJsIiwiVVJMIiwicGFyc2UiLCJwcm90b2NvbCIsInJlcGxhY2UiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwYXRoIiwicGF0aG5hbWUiLCJhdXRoIiwic3BsaXQiLCJ3ZGlvT3B0cyIsInVzZXIiLCJrZXkiLCJzZWxlbml1bVVybEJhc2UiLCJpc1J1bm5pbmdPblNlbGVub2lkIiwiX2lzU2VsZW5vaWRIdWIiLCJlbmFibGVWaWRlbyIsInVuZGVmaW5lZCIsInZpZGVvRnJhbWVSYXRlIiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsImluaXRFcnJvciIsIl90aGlzIiwicHJvdmlkZXIiLCJtb2RVdGlscyIsImRldGVybWluZVByb3ZpZGVyIiwiUEVSRkVDVE8iLCJvcGVuRGV2aWNlVGltZW91dCIsImRyaXZlciIsIndkaW8iLCJyZW1vdGUiLCJzZXNzaW9uSWQiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwicGVyZmVjdG9FeGVjdXRpb25Db250ZXh0IiwicGVyZmVjdG9SZXBvcnRpbmciLCJQZXJmZWN0byIsIlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsIndlYmRyaXZlciIsImV4ZWN1dGVTY3JpcHQiLCJjb21tYW5kIiwicGFyYW1zIiwiZXhlY3V0ZSIsInJlcG9ydGluZ0NsaWVudCIsIlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50IiwidGVzdFN0YXJ0IiwiZSIsImdldFNlbGVuaXVtSW5pdEVycm9yIiwiY29sbGVjdEJyb3dzZXJMb2dzIiwiZ2V0QnJvd3NlckxvZ3MiLCJlcnJvciIsIkxBTUJEQVRFU1QiLCJCUk9XU0VSU1RBQ0siLCJpbmNsdWRlcyIsIm1heGltaXplV2luZG93Iiwic2V0VGltZW91dCIsImVyciIsIlVOS05PV05fRVJST1IiLCJtZXNzYWdlIiwidXRpbCIsImluc3BlY3QiLCJvdmVyd3JpdGVXZGlvQ29tbWFuZHMiLCJkaXNwb3NlIiwic3RhdHVzIiwiX3doZW5XZWJNb2R1bGVEaXNwb3NlIiwic3RlcHMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJmYWlsZWRGaW5kZWQiLCJmaW5kIiwiaXRlbSIsInRvVXBwZXJDYXNlIiwiU0FVQ0VMQUJTIiwidXNlcm5hbWUiLCJhY2Nlc3NLZXkiLCJwYXNzZWQiLCJpZCIsImJvZHkiLCJteUFjY291bnQiLCJTYXVjZUxhYnMiLCJ1cGRhdGVKb2IiLCJzdG9wSm9iIiwiX3NlbmRSZXN1bHRTdGF0dXNUb0xhbWJkYVRlc3QiLCJkZWxldGVTZXNzaW9uIiwiVEVTVElOR0JPVCIsIl9zZW5kUmVzdWx0U3RhdHVzVG9UZXN0aW5nQm90IiwidGVzdFN0b3AiLCJDb25zdGFudHMiLCJyZXN1bHRzIiwiZmFpbGVkIiwiX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayIsImNsb3NlQnJvd3NlcldpbmRvd3MiLCJkaXNwb3NlQ29udGludWUiLCJ3YXJuIiwicHJvbWlzZSIsInNlbGVuaXVtU2Vzc2lvblRpbWVvdXQiLCJzZWxlbml1bVBpZCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsInN0ZGlvIiwicGdyZXBSZXN1bHQiLCJ0b1N0cmluZyIsInJlc29sdmUiLCJfaXRlcmF0aW9uU3RhcnQiLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJTRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQiLCJsb2dzIiwibG9nIiwicHVzaCIsIl9hZGp1c3RCcm93c2VyTG9nIiwiX2dldEhBUiIsImhhciIsImhhc0ZhaWxlZCIsIl9hZGRTZWxlbm9pZFZpZGVvQXNUZXN0QXR0YWNobWVudCIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsInRha2VTY3JlZW5zaG90IiwicmV0dmFsIiwiY2FsbCIsIlByb21pc2UiLCJyZWplY3QiLCJ3YWl0VW50aWxSZXRWYWwiLCJ3YWl0VW50aWwiLCJpbWFnZXMiLCJoYW5kbGVzIiwiZ2V0V2luZG93SGFuZGxlcyIsImhhbmRsZSIsInN3aXRjaFRvV2luZG93IiwiaW1hZ2UiLCJ0aXRsZSIsImdldFRpdGxlIiwidGV4dFRvSW1hZ2UiLCJyZXF1aXJlIiwidGl0bGVJbWFnZSIsImdlbmVyYXRlIiwiY29uc29sZSIsIm1lcmdlZEltYWdlIiwiZGlyZWN0aW9uIiwidGltZW91dCIsInRoZW4iLCJjYXRjaCIsImV3IiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsImxldmVsIiwic3JjIiwiX2dldFN0YXRzIiwiY29tbWFuZE5hbWUiLCJmZXRjaFN0YXRzIiwibmF2aWdhdGlvblN0YXJ0IiwiZG9tQ29udGVudExvYWRlZCIsImxvYWQiLCJzYW1lUGFnZSIsImxhc3RFcnJvciIsInRpbWluZ3MiLCJ3aW5kb3ciLCJ0aW1pbmciLCJkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCIsImxvYWRFdmVudFN0YXJ0IiwiZXhlY3V0ZUVycm9yIiwiRG9tQ29udGVudExvYWRlZEV2ZW50IiwiTG9hZEV2ZW50IiwidHJhbnNhY3Rpb24iLCJzbGljZSIsImNvdW50ZXIiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0QXJndW1lbnRTdHJpbmciLCJ0eXBlcyIsImdldExvZ1R5cGVzIiwiZ2V0TG9ncyIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiSlNPTiIsInN0cmluZ2lmeSIsImV2ZW50cyIsIm1zZ09iaiIsImNoZWNrV2FpdEZvckFuZ3VsYXIiLCJhdXRvV2FpdEZvckFuZ3VsYXIiLCJ3YWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhclJvb3RTZWxlY3RvciIsImF1dG9XYWl0Rm9yQW5ndWxhclNvZnRXYWl0IiwiYXV0b1dhaXRGb3JBbmd1bGFyVGltZW91dCIsImxhbWJkYUNyZWRlbnRpYWxzIiwibGFtYmRhQXV0b21hdGlvbkNsaWVudCIsImxhbWJkYVJlc3RDbGllbnQiLCJBdXRvbWF0aW9uQ2xpZW50IiwicmVxdWVzdEJvZHkiLCJzdGF0dXNfaW5kIiwidXBkYXRlU2Vzc2lvbkJ5SWQiLCJ0YiIsIlRlc3RpbmdCb3QiLCJhcGlfa2V5IiwiYXBpX3NlY3JldCIsInRlc3REYXRhIiwidXBkYXRlVGVzdCIsInRlc3REZXRhaWxzIiwibWV0aG9kIiwianNvbiIsInJlamVjdFVuYXV0aG9yaXplZCIsInJlcyIsImluZGV4T2YiLCJyZWNvcmRWaWRlbyIsInZpZGVvRmlsZVVybCIsImZpbGVOYW1lIiwiYXR0YWNobWVudHMiLCJuZXdWaWRlb0F0dGFjaG1lbnQiXSwibWFwcGluZ3MiOiJBQUFBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7O0FBR0EsTUFBTUEsV0FBVyxHQUFHLEtBQXBCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsOEJBQTdCO0FBQ0EsTUFBTUMsb0JBQW9CLEdBQUcsUUFBN0I7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxTQUEvQjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQUMsTUFBRCxFQUFTLGFBQVQsQ0FBL0I7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FBQyxNQUFELEVBQVMsT0FBVCxDQUF4QjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHLEtBQUssSUFBbEMsQyxD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O0FBQ1IsYUFBS2pGLE1BQUwsQ0FBWXFGLEtBQVosQ0FBa0IsbURBQW1ESixDQUFDLENBQUN3RCxRQUFGLEVBQXJFO0FBQ0FDLFFBQUFBLE9BQU87QUFDVjtBQUNKLEtBMUJNLENBQVA7QUEyQkgsR0ExekJrRCxDQTR6Qm5EOzs7QUFDdUMsUUFBakNlLGlDQUFpQyxDQUFDRCxTQUFTLEdBQUcsS0FBYixFQUFvQjtBQUN2RCxRQUFJLENBQUMsS0FBSzNHLG1CQUFWLEVBQStCO0FBQzNCO0FBQ0g7O0FBQ0QsUUFBSSxDQUFDLEtBQUtoRCxPQUFMLENBQWFzUSxXQUFkLElBQTZCLENBQUMzRyxTQUFsQyxFQUE2QztBQUN6QztBQUNIOztBQUNELFVBQU00RyxZQUFZLEdBQUksR0FBRSxLQUFLeE4sZUFBZ0IsVUFBUyxLQUFLc0IsU0FBVSxNQUFyRTtBQUNBLFVBQU1tTSxRQUFRLEdBQUksR0FBRSxLQUFLbk0sU0FBVSxNQUFuQztBQUNBLFNBQUtuRSxFQUFMLENBQVF1USxXQUFSLENBQW9CbEgsSUFBcEIsQ0FBeUJ6RixlQUFTNE0sa0JBQVQsQ0FBNEJGLFFBQTVCLEVBQXNDRCxZQUF0QyxDQUF6QjtBQUNIOztBQXYwQmtEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSB3ZWJcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGJyb3dzZXIgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKk5vdGVzOioqICBcclxuICogICBcclxuICogQ29tbWFuZHMgd2hpY2ggb3BlcmF0ZSBvbiBlbGVtZW50cyBzdWNoIGFzIGNsaWNrLCBhc3NlcnQsIHdhaXRGb3IsIHR5cGUsIHNlbGVjdCwgYW5kIG90aGVycyB3aWxsIGF1dG9tYXRpY2FsbHkgd2FpdCBmb3IgYSBwZXJpb2Qgb2YgdGltZSBmb3IgdGhlIGVsZW1lbnQgdG8gYXBwZWFyIGluIERPTSBhbmQgYmVjb21lIHZpc2libGUuIEJ5IGRlZmF1bHQgdGhpcyBwZXJpb2QgZXF1YWxzIHRvIDYwIHNlY29uZHMsIGJ1dCBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgYHNldFRpbWVvdXRgY29tbWFuZC5cclxuICogICBcclxuICogKipTdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGEgc3RyaW5nIG1hdGNoaW5nIHBhdHRlcm4gaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBwYXR0ZXJucyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICAqIGByZWdleDpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYHJlZ2V4aTpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAgKiBgZXhhY3Q6U1RSSU5HYCAtIE1hdGNoIHRoZSBzdHJpbmcgdmVyYmF0aW0uXHJcbiAqICAqIGBnbG9iOlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgY2FzZS1pbnNlbnNpdGl2ZSBnbG9iIHBhdHRlcm4uIGA/YCB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyIGV4Y2VwdCBuZXcgbGluZSBcXChcXG5cXCkuIGAqYCB3aWxsIG1hdGNoIGFueSBzZXF1ZW5jZSBcXCgwIG9yIG1vcmVcXCkgb2YgY2hhcmFjdGVycyBleGNlcHQgbmV3IGxpbmUuIEVtcHR5ICAgICBQQVRURVJOIHdpbGwgbWF0Y2ggb25seSBvdGhlciBlbXB0eSBzdHJpbmdzLlxyXG4gKiAgKiBgUEFUVEVSTmAgLSBTYW1lIGFzIGdsb2IgbWF0Y2hpbmcuICBcclxuICpcclxuICogKipMb2NhdG9yczoqKiBcclxuICogXHJcbiAqICBDb21tYW5kcyB3aGljaCBleHBlY3QgYW4gZWxlbWVudCBsb2NhdG9yIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgbG9jYXRvciB0eXBlcyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElEIGF0dHJpYnV0ZS5cclxuICogICogYGNzcz1DU1NfU0VMRUNUT1JgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxyXG4gKiAgKiBgbGluaz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBtYXRjaGVzIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICAqIGBsaW5rLWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBsaW5rIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSB0ZXh0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICAqIGBuYW1lPU5BTUVgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBOQU1FIGF0dHJpYnV0ZS5cclxuICogICogYHRhZz1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdGFnIG5hbWUuXHJcbiAqICAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAgKiBgKFhQQVRIKVtdYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICovXHJcblxyXG4vKiBlc2xpbnQtZGlzYWJsZSBxdW90ZXMgKi9cclxuaW1wb3J0IHsgaGFyRnJvbU1lc3NhZ2VzIH0gZnJvbSAnY2hyb21lLWhhcic7XHJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcclxuaW1wb3J0ICogYXMgd2RpbyBmcm9tICd3ZWJkcml2ZXJpbyc7XHJcbmltcG9ydCBXZWJEcml2ZXJNb2R1bGUgZnJvbSAnLi4vY29yZS9XZWJEcml2ZXJNb2R1bGUnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCB1dGlsIGZyb20gJ3V0aWwnO1xyXG5pbXBvcnQgU2F1Y2VMYWJzIGZyb20gJ3NhdWNlbGFicyc7XHJcbmltcG9ydCBsYW1iZGFSZXN0Q2xpZW50IGZyb20gJ0BsYW1iZGF0ZXN0L25vZGUtcmVzdC1jbGllbnQnO1xyXG5pbXBvcnQgVGVzdGluZ0JvdCBmcm9tICd0ZXN0aW5nYm90LWFwaSc7XHJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XHJcbmltcG9ydCBwZXJmZWN0b1JlcG9ydGluZyBmcm9tICdwZXJmZWN0by1yZXBvcnRpbmcnO1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcclxuaW1wb3J0IG1lcmdlSW1hZ2VzIGZyb20gJy4uL2xpYi9pbWctbWVyZ2UnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICd3ZWInO1xyXG5jb25zdCBERUZBVUxUX1NFTEVOSVVNX1VSTCA9ICdodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViJztcclxuY29uc3QgREVGQVVMVF9CUk9XU0VSX05BTUUgPSAnY2hyb21lJztcclxuY29uc3QgREVGQVVMVF9NT0JJTEVfQlJPV1NFUiA9ICdkZWZhdWx0JztcclxuY29uc3QgTk9fU0NSRUVOU0hPVF9DT01NQU5EUyA9IFsnaW5pdCcsICdhc3NlcnRBbGVydCddO1xyXG5jb25zdCBBQ1RJT05fQ09NTUFORFMgPSBbJ29wZW4nLCAnY2xpY2snXTtcclxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVQgPSA2MCAqIDEwMDA7ICAgICAgICAgICAgLy8gZGVmYXVsdCA2MHMgd2FpdCB0aW1lb3V0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXZWJNb2R1bGUgZXh0ZW5kcyBXZWJEcml2ZXJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTsgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNhY3Rpb24tPmhhciBkaWN0aW9uYXJ5XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5fbG9hZEhlbHBlckZ1bmN0aW9ucygpO1xyXG4gICAgICAgIC8vIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoc29tZSBtb2R1bGUgY29tbWFuZHMgbWlnaHQgcmVmZXIgdG8gdGhpcy5PeEVycm9yIGFuZCB0aGlzLmVyckhlbHBlcilcclxuICAgICAgICB0aGlzLk94RXJyb3IgPSBPeEVycm9yO1xyXG4gICAgICAgIHRoaXMuZXJySGVscGVyID0gZXJySGVscGVyO1xyXG4gICAgICAgIC8vIGhvbGRzIGVsZW1lbnQgb3BlcmF0aW9uIHRpbWVvdXQgdmFsdWVcclxuICAgICAgICB0aGlzLndhaXRGb3JUaW1lb3V0ID0gREVGQVVMVF9XQUlUX1RJTUVPVVQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldERyaXZlclxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdW5kZXJseWluZyBXRElPIGRyaXZlci5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gV0RJTyBkcml2ZXIuXHJcbiAgICAgKi9cclxuICAgIGdldERyaXZlcigpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RHJpdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGN1cnJlbnRseSBkZWZpbmVkIGNhcGFiaWxpdGllcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQ3VycmVudCBjYXBhYmlsaXRpZXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwcyB8fCBzdXBlci5nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBuZXcgU2VsZW5pdW0gc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY2FwcyAtIERlc2lyZWQgY2FwYWJpbGl0aWVzLiBJZiBub3Qgc3BlY2lmaWVkIGNhcGFiaWxpdGllcyB3aWxsIGJlIHRha2VuIGZyb20gc3VpdGUgZGVmaW5pdGlvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gc2VsZW5pdW1VcmwgLSBSZW1vdGUgc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo0NDQ0L3dkL2h1YikuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoY2Fwcywgc2VsZW5pdW1VcmwpIHtcclxuICAgICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZW5pdW1VcmwpIHtcclxuICAgICAgICAgICAgLy8gaWYgYXBwaXVtVXJsIHBvaW50cyB0byBhbiBleHRlcm5hbCBleGVjdXRpb24gZ3JpZCAoc3VjaCBhcyBCUylcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hcHBpdW1VcmwgJiYgIXRoaXMub3B0aW9ucy5hcHBpdW1Vcmwuc3RhcnRzV2l0aCgnaHR0cDovL2xvY2FsaG9zdCcpKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5hcHBpdW1Vcmw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlbml1bVVybCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVVybCB8fCBERUZBVUxUX1NFTEVOSVVNX1VSTDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGFrZSBjYXBhYmlsaXRpZXMgZWl0aGVyIGZyb20gaW5pdCBtZXRob2QgYXJndW1lbnQgb3IgZnJvbSBjb250ZXh0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgYnJvd3Nlck5hbWUgY2FwcyBmcm9tIG9wdGlvbnMuIEZJWE1FOiB3aHkgaXMgdGhpcyBldmVuIG5lZWRlZD9cclxuICAgICAgICBsZXQgZGVmYXVsdEJyb3dzZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgfHwgREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgICAgIGRlZmF1bHRCcm93c2VyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRklYTUU6IHNoYWxsIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBicm93c2VyTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBuZWl0aGVyIGluIGNhcHMgbm9yIGluIG9wdGlvbnM/IVxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSU5WQUxJRF9DQVBBQklMSVRJRVMsXHJcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGluaXRpYWxpemUgYHdlYmAgbW9kdWxlIC0gYnJvd3Nlck5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgYnJvd3Nlck5hbWUtc1xyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2llJykge1xyXG4gICAgICAgICAgICAvLyBJRSBpcyBzcGVjaWZpZWQgYXMgJ2llJyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUgYW5kIHBvc3NpYmx5IHN1aXRlc1xyXG4gICAgICAgICAgICAvLyBidXQgc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyAnaW50ZXJuZXQgZXhwbG9yZXInXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9ICdpbnRlcm5ldCBleHBsb3Jlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ2xhbWJkYTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gbGFtYmRhdGVzdCBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIHBlcmZlY3RvTW9iaWxlIGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICE9PSAnTWljcm9zb2Z0RWRnZScpIHtcclxuICAgICAgICAgICAgLy8gc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyBhbGwgYnJvd3Nlck5hbWVzIHRvIGJlIGxvd2VyY2FzZVxyXG4gICAgICAgICAgICAvLyBleGNlcHQgXCJNaWNyb3NvZnRFZGdlXCJcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIC8vIHNwZWNpZnlpbmcgdGhpcyBsZWFkcyBDaHJvbWUgNzcrIHRvIHJlZnVzZSBsb2FkaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5sb2dnaW5nUHJlZnMgPSB7ICAgICAgICAgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPCA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmNocm9tZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBwZXJmTG9nZ2luZ1ByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV0d29yazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVQYWdlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgV0RJTyBvcHRpb25zXHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLnBhcnNlKHNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVuaXVtVXJsQmFzZSA9IGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgc2VsZW5pdW0gaHViIGlzIGJhc2VkIG9uIFNlbGVub2lkLCB0aGVuIGVuYWJsZSB2aWRlbyByZWNvcmRpbmdcclxuICAgICAgICB0aGlzLmlzUnVubmluZ09uU2VsZW5vaWQgPSBhd2FpdCB0aGlzLl9pc1NlbGVub2lkSHViKHRoaXMuc2VsZW5pdW1VcmxCYXNlKTtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmdPblNlbGVub2lkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYXBzWydzZWxlbm9pZDpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLnZpZGVvRnJhbWVSYXRlID0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSBXZWJkcml2ZXIuaW8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaW5pdEVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMucGF0aCA9ICcvbmV4cGVyaWVuY2UvcGVyZmVjdG9tb2JpbGUvd2QvaHViJztcclxuICAgICAgICAgICAgd2Rpb09wdHMucG9ydCA9IDgwO1xyXG4gICAgICAgICAgICB3ZGlvT3B0cy5wcm90b2NvbCA9ICdodHRwJztcclxuICAgICAgICAgICAgd2Rpb09wdHMub3BlbkRldmljZVRpbWVvdXQgPSAxNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBuYW1lID0gJ25hbWUnO1xyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddKSB7XHJcbiAgICAgICAgICAgIG5hbWUgPSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydwZXJmZWN0b01vYmlsZTpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2xhbWJkYTpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snbGFtYmRhOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydsYW1iZGE6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAod2Rpb09wdHMuY2FwYWJpbGl0aWVzWyd0ZXN0aW5nQm90Om9wdGlvbnMnXSAmJiB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3Rlc3RpbmdCb3Q6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ11bJ25hbWUnXTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllc1sndGVzdGluZ0JvdDpvcHRpb25zJ107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzZXQgZGVmYXVsdCBicm93c2VyIGZvciBtb2JpbGUgd2ViIHRlc3RzLCBpZiBleGVjdXRlZCBhZ2FpbnN0IHJlbW90ZSBkZXZpY2VzIG9mIGEgY2xvdWQgcHJvdmlkZXJcclxuICAgICAgICBpZiAoZGVmYXVsdEJyb3dzZXIgJiYgcHJvdmlkZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gd2Rpb09wdHMuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9NT0JJTEVfQlJPV1NFUjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIucHJvdmlkZXIgPSBwcm92aWRlcjtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1Ccm93c2VyVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuc2VsZW5pdW1UaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcGVyZmVjdG9FeGVjdXRpb25Db250ZXh0ID0gYXdhaXQgbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgd2ViZHJpdmVyOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTY3JpcHQ6IGFzeW5jIChjb21tYW5kLCBwYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGNvbW1hbmQsIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0aW5nQ2xpZW50ID0gbmV3IHBlcmZlY3RvUmVwb3J0aW5nLlBlcmZlY3RvLlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50KHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlcG9ydGluZ0NsaWVudC50ZXN0U3RhcnQobmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldFNlbGVuaXVtSW5pdEVycm9yKGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcmVzZXQgYnJvd3NlciBsb2dzIGlmIGF1dG8gY29sbGVjdCBsb2dzIG9wdGlvbiBpcyBlbmFibGVkXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MgJiYgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID09PSAnY2hyb21lJykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgLy8gc2ltcGx5IGNhbGwgdGhpcyB0byBjbGVhciB0aGUgcHJldmlvdXMgbG9ncyBhbmQgc3RhcnQgdGhlIHRlc3Qgd2l0aCB0aGUgY2xlYW4gbG9nc1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgW21vZFV0aWxzLnByb3ZpZGVyLkxBTUJEQVRFU1QsIG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSywgbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE9dLmluY2x1ZGVzKHRoaXMuZHJpdmVyLnByb3ZpZGVyKVxyXG4gICAgICAgICAgICAgICAgLy9bJ01pY3Jvc29mdEVkZ2UnLCAnbXNlZGdlJywgJ0VkZ2UnLCAnSW50ZXJuZXQgRXhwbG9yZXInXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgLy8gZG8gbm90IG1heGltaXplIHdpbmRvdyBpZiB0aGUgdGVzdCBpcyBleGVjdXRlZCBhZ2FpbnN0IGV4dGVybmFsIGNsb3VkIHByb3ZpZGVyIGluZnJhc3RydWN0dXJlXHJcbiAgICAgICAgICAgICAgICAvLyBhcyBtb3N0IG9mIGNsb3VkIHByb3ZpZGVycyBkbyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIG1heGltaXplIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5tYXhpbWl6ZVdpbmRvdygpO1xyXG4gICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgVGltZW91dFxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc2V0VGltZW91dCh7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0JzogdGhpcy53YWl0Rm9yVGltZW91dCxcclxuICAgICAgICAgICAgICAgICAgICAncGFnZUxvYWQnOiB0aGlzLndhaXRGb3JUaW1lb3V0XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlVOS05PV05fRVJST1IsIGVyci5tZXNzYWdlLCB1dGlsLmluc3BlY3QoZXJyKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBtb2RVdGlscy5vdmVyd3JpdGVXZGlvQ29tbWFuZHModGhpcy5kcml2ZXIpO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZSA9IGRlZmVyKCk7XHJcblxyXG4gICAgICAgIGlmICghc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9ICdwYXNzZWQnO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMucnMuc3RlcHMgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnJzLnN0ZXBzKSAmJiB0aGlzLnJzLnN0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZEZpbmRlZCA9IHRoaXMucnMuc3RlcHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWRGaW5kZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZmFpbGVkJztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5TQVVDRUxBQlMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ3VzZXJuYW1lJ107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXNzS2V5ID0gdGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3NhdWNlOm9wdGlvbnMnXVsnYWNjZXNzS2V5J107XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFzc2VkID0gc3RhdHVzID09PSAnUEFTU0VEJztcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gXCJ7XFxcInBhc3NlZFxcXCI6XCIrcGFzc2VkK1wifVwiO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBteUFjY291bnQgPSBuZXcgU2F1Y2VMYWJzKHsgdXNlcjogdXNlcm5hbWUsIGtleTogYWNjZXNzS2V5fSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbXlBY2NvdW50LnVwZGF0ZUpvYih1c2VybmFtZSwgaWQsIGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC5zdG9wSm9iKHVzZXJuYW1lLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNUKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuVEVTVElOR0JPVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5wYXNzZWQgOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLkJST1dTRVJTVEFDSykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBbJ1BBU1NFRCcsJ0ZBSUxFRCddLmluY2x1ZGVzKHN0YXR1cykpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsZWQgb3Igb3RoZXIgc3RhdHVzXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybignRXJyb3IgZGlzcG9zaW5nIGRyaXZlcjogJywgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBkZWxldGVTZXNzaW9uIG9ubHkgaWYgbm8gc2Vzc2lvbiB0aW1lb3V0IGJlY2F1c2UgaXQgd2lsbCB0YWtlIDUgbWluIHRvIGV4ZWN1dGUgb3RoZXJ3aXNlXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uICYmICF0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlc3Npb24gZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2xvc2VCcm93c2VyV2luZG93cyhzdGF0dXMpIHtcclxuICAgICAgICBpZiAoc3RhdHVzICYmICdGQUlMRUQnID09PSBzdGF0dXMudG9VcHBlckNhc2UoKSAmJiB0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKHN0YXR1cyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2VDb250aW51ZShzdGF0dXMpIHtcclxuICAgICAgICB0aGlzLmRyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG51bGw7XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG5cclxuICAgICAgICAvLyBjbGVhbnVwIGNocm9tZWRyaXZlcidzIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gd2l0aGluIHRoZSBJREUgYW5kIHRlc3QgZGlkIG5vdCBmYWlsXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQgJiYgKCFzdGF0dXMgfHwgJ0ZBSUxFRCcgIT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcclxuICAgICAgICAgICAgICAgICAgICBleGVjU3luYygndGFza2tpbGwgL0lNIGNocm9tZWRyaXZlci5leGUgL0YnLCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZ3JlcFJlc3VsdCA9IGV4ZWNTeW5jKFwicGdyZXAgLWQnICcgY2hyb21lZHJpdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCAmJiBwZ3JlcFJlc3VsdC50b1N0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZ3JlcFJlc3VsdCA9IHBncmVwUmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2tpbGwgLTkgJyArIHBncmVwUmVzdWx0LCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2xlYW51cCBlZGdlZHJpdmVyJ3Mgb25seSB3aGVuIHJ1bm5pbmcgZnJvbSB3aXRoaW4gdGhlIElERSBhbmQgdGVzdCBkaWQgbm90IGZhaWxcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCAmJiAoIXN0YXR1cyB8fCAnRkFJTEVEJyAhPT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkpKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBmb3Igbm93XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZ3JlcFJlc3VsdCA9IGV4ZWNTeW5jKFwicGdyZXAgLWQnICcgbXNlZGdlZHJpdmVyXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCAmJiBwZ3JlcFJlc3VsdC50b1N0cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwZ3JlcFJlc3VsdCA9IHBncmVwUmVzdWx0LnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZ3JlcFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ2tpbGwgLTkgJyArIHBncmVwUmVzdWx0LCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdpZ25vcmUnLCAnaWdub3JlJ10gfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fd2hlbldlYk1vZHVsZURpc3Bvc2UucmVzb2x2ZShudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXRlcmF0aW9uU3RhcnQoKSB7XHJcbiAgICAgICAgLy8gY2xlYXIgdHJhbnNhY3Rpb24gbmFtZSBzYXZlZCBpbiBwcmV2aW91cyBpdGVyYXRpb24gaWYgYW55XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaXRlcmF0aW9uRW5kKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLnR5cGUgPT09IGVycm9ySGVscGVyLmVycm9yQ29kZS5TRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29sbGVjdCBicm93c2VyIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzID09PSB0cnVlICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QnJvd3NlckxvZyhsb2cpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgYnJvd3NlciBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE86IHNob3VsZCBjbGVhciB0cmFuc2FjdGlvbnMgdG8gYXZvaWQgZHVwbGljYXRlIG5hbWVzIGFjcm9zcyBpdGVyYXRpb25zXHJcbiAgICAgICAgLy8gYWxzbyBzaG91bGQgdGhyb3cgb24gZHVwbGljYXRlIG5hbWVzLlxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgbm8gdHJhbnNhY3Rpb25zIHNldCBpZiB0ZXN0IGZhaWxzIGJlZm9yZSB3ZWIudHJhbnNhY3Rpb24gY29tbWFuZFxyXG4gICAgICAgICAgICBpZiAoZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucnMuaGFyID0gdGhpcy50cmFuc2FjdGlvbnM7XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkID0gZXJyb3IgIT09IHVuZGVmaW5lZCAmJiBlcnJvciAhPT0gbnVsbDtcclxuICAgICAgICB0aGlzLl9hZGRTZWxlbm9pZFZpZGVvQXNUZXN0QXR0YWNobWVudChoYXNGYWlsZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmV0VmFsID0gdGhpcy5kcml2ZXIud2FpdFVudGlsKGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltYWdlcyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbGxlY3QgYWxsIChzY3JlZW5zaG90IGFuZCB0aXRsZSkgaW1hZ2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0V2luZG93SGFuZGxlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaGFuZGxlcykgJiYgaGFuZGxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2YgaGFuZGxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zd2l0Y2hUb1dpbmRvdyhoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0VG9JbWFnZSA9IHJlcXVpcmUoJy4uL2xpYi90ZXh0LXRvLWltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlSW1hZ2UgPSBhd2FpdCB0ZXh0VG9JbWFnZS5nZW5lcmF0ZSh0aXRsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlSW1hZ2UgJiYgdHlwZW9mIHRpdGxlSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSB0aXRsZUltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKHRpdGxlSW1hZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDYW52YXMgb3BlcmF0aW9uIGZhaWxlZC4nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gSWdub3JlIGNhbnZhcy1yZWxhdGVkIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKGltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGltYWdlcyBpbnRvIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVyZ2VkSW1hZ2UgPSBhd2FpdCBtZXJnZUltYWdlcyhpbWFnZXMsIHsgZGlyZWN0aW9uOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lcmdlZEltYWdlICYmIHR5cGVvZiBtZXJnZWRJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXJnZWRJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCAoMSknLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCAoMiknLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IGdldCBzY3JlZW5zaG90ICgzKScsIGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCBpbm5lciBlcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9hZGp1c3RCcm93c2VyTG9nKGxvZykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgYnJvd3NlciB0aW1lIHpvbmUgdG8gdGhlIGxvY2FsIG9uZSAoc28gd2UgY2FuIGxhdGVyIGNvcnJlbGF0ZSBiZXR3ZWVuIHN0ZXBzIGFuZCBsb2dzKVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRpbWU6IGxvZy50aW1lc3RhbXAsXHJcbiAgICAgICAgICAgIG1zZzogbG9nLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIC8vIGNvbnZlcnQgU0VWRVJFIGxvZyBsZXZlbCB0byBFUlJPUlxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsID09PSAnU0VWRVJFJyA/ICdFUlJPUicgOiBsb2cubGV2ZWwsXHJcbiAgICAgICAgICAgIHNyYzogJ2Jyb3dzZXInXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogRklYTUU6IFRoZXJlIGlzIGEgYnVnIHdpdGggSUUuIFNlZSB0aGUgY29tbWVudCB3aXRoaW4gZnVuY3Rpb24gYm9keS5cclxuICAgICAqXHJcbiAgICAgKiAgZG9tQ29udGVudExvYWRlZCAoYWthIEZpcnN0IFZpc3VhbCBUaW1lKS0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKiAgbG9hZCAoYWthIEZ1bGwgTG9hZCBUaW1lKSAgICAgICAgICAgICAgIC0gUmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvYWRFdmVudFN0YXJ0IGFuZCBuYXZpZ2F0aW9uU3RhcnQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHByb2Nlc3NpbmcgbW9kZWw6XHJcbiAgICAgKlxyXG4gICAgICogIDEuIG5hdmlnYXRpb25TdGFydCAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXMgcmVxdWVzdGVkIHRoZSBkb2N1bWVudC5cclxuICAgICAqICAyLiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC0gTm90IHJlbGV2YW50IHRvIHVzLiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvbmF2aWdhdGlvbi10aW1pbmcvI3Byb2Nlc3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXHJcbiAgICAgKiAgMy4gZG9tTG9hZGluZyAgICAgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIHN0YXJ0cyBwYXJzaW5nIHRoZSBkb2N1bWVudC5cclxuICAgICAqICA0LiBkb21JbnRlcmFjdGl2ZSAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIGZpbmlzaGVkIHBhcnNpbmcgdGhlIGRvY3VtZW50IGFuZCB0aGUgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgcGFnZS5cclxuICAgICAqICA1LiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCAgIC0gVGhlIGRvY3VtZW50IGhhcyBiZWVuIGNvbXBsZXRlbHkgbG9hZGVkIGFuZCBwYXJzZWQgYW5kIGRlZmVycmVkIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC4gXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZXhlY3V0ZWQuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlc2hlZXRzWzFdLCBpbWFnZXMsIGFuZCBzdWJmcmFtZXMgbWlnaHQgb3IgbWlnaHQgbm90IGhhdmUgZmluaXNoZWQgbG9hZGluZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0gLSBTdHlsZXNoZWV0cyAvdXN1YWxseS8gZGVmZXIgdGhpcyBldmVudCEgLSBodHRwOi8vbW9saWx5LmRlL3dlYmxvZy9kb21jb250ZW50bG9hZGVkXHJcbiAgICAgKiAgNi4gZG9tQ29udGVudExvYWRlZEV2ZW50RW5kICAgICAtIFRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGNhbGxiYWNrLCBpZiBhbnksIGZpbmlzaGVkIGV4ZWN1dGluZy4gRS5nLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRE9NIGZ1bGx5IGxvYWRlZCBhbmQgcGFyc2VkXCIpO1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICogIDcuIGRvbUNvbXBsZXRlICAgICAgICAgICAgICAgICAgLSBUaGUgRE9NIHRyZWUgaXMgY29tcGxldGVseSBidWlsdC4gQXN5bmMgc2NyaXB0cywgaWYgYW55LCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogIDguIGxvYWRFdmVudFN0YXJ0ICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBoYXZlIGZpbmlzaGVkIGxvYWRpbmcgYWxsIHRoZSByZXNvdXJjZXMgbGlrZSBpbWFnZXMsIHN3ZiwgZXRjLlxyXG4gICAgICogIDkuIGxvYWRFdmVudEVuZCAgICAgICAgICAgICAgICAgLSBUaGUgbG9hZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuXHJcbiAgICAgKi9cclxuICAgIF9nZXRTdGF0cyhjb21tYW5kTmFtZSkge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmV0Y2hTdGF0cyAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5faXNBY3Rpb24oY29tbWFuZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHZhciBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkID0gMDtcclxuICAgICAgICAgICAgdmFyIGxvYWQgPSAwO1xyXG4gICAgICAgICAgICB2YXIgc2FtZVBhZ2UgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmb2xsb3dpbmcgc2l0dWF0aW9uOlxyXG4gICAgICAgICAgICAvLyBpZiBuYXZpZ2F0ZVN0YXJ0IGVxdWFscyB0byB0aGUgb25lIHdlIGdvdCBmcm9tIHByZXZpb3VzIGF0dGVtcHQgKHdlIG5lZWQgdG8gc2F2ZSBpdClcclxuICAgICAgICAgICAgLy8gaXQgbWVhbnMgd2UgYXJlIHN0aWxsIG9uIHRoZSBzYW1lIHBhZ2UgYW5kIGRvbid0IG5lZWQgdG8gcmVjb3JkIGxvYWQvZG9tQ29udGVudExvYWRlZCB0aW1lc1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3YWl0VW50aWxSZXRWYWwgPSB0aGlzLmRyaXZlci53YWl0VW50aWwoYXN5bmMoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZ2xvYmFsIHdpbmRvdyovXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWluZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5leGVjdXRlKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEV2ZW50U3RhcnQ6IHdpbmRvdy5wZXJmb3JtYW5jZS50aW1pbmcubG9hZEV2ZW50U3RhcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIHRpbWluZ3MubG9hZEV2ZW50U3RhcnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWVQYWdlID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSAmJiB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID09IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uU3RhcnQgPSB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gdGltaW5ncy5uYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA9IHRpbWluZ3MuZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkRXZlbnRTdGFydCA9IHRpbWluZ3MubG9hZEV2ZW50U3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkID0gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQgPSBsb2FkRXZlbnRTdGFydCAtIG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCA+IDAgJiYgbG9hZEV2ZW50U3RhcnQgPiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChleGVjdXRlRXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGVycm9yIGluc2lkZSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZXhlY3V0ZUVycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHRpbWVvdXQ6IDMwKjEwMDAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmludCBlcnJvciBmcm9tIGRyaXZlci5leGVjdXRlIG9yIGRyaXZlci53YWl0VW50aWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobGFzdEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XHJcbiAgICAgICAgICAgICAgICAvLyBjb3VsZG4ndCBnZXQgdGltaW5ncy5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IG5hdmlnYXRpb25TdGFydDtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBzYW1lUGFnZSA/IHt9IDogeyBEb21Db250ZW50TG9hZGVkRXZlbnQ6IGRvbUNvbnRlbnRMb2FkZWQsIExvYWRFdmVudDogbG9hZCB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG5cclxuICAgICAgICAvLyBsaW1pdCB0aGUgbmFtZSBsZW5ndGggKHNpbmNlIHdlIGNhbid0IHN0b3JlIHZhbHVlcyBsYXJnZXIgdGhhbiA1MTJCIGluIHRoZSBkYXRhYmFzZSlcclxuICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCA1MTIpO1xyXG5cclxuICAgICAgICBpZiAoZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zW2dsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZV0gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZWNvcmRIQVIgJiYgdGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25zW2dsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZV0gPSBhd2FpdCB0aGlzLl9nZXRIQVIoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zYWN0aW9uc1tuYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgY29uc3QgY291bnRlciA9IE9iamVjdC5rZXlzKHRoaXMudHJhbnNhY3Rpb25zKS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc3RhcnRzV2l0aChuYW1lKSkubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZSsnICgjJytjb3VudGVyKycpJztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWUgPSBuYW1lO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEhlbHBlckZ1bmN0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IgPSBtb2RVdGlscy5nZXRXZGlvTG9jYXRvcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMubWF0Y2hQYXR0ZXJuID0gbW9kVXRpbHMubWF0Y2hQYXR0ZXJuO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudHMgPSBtb2RVdGlscy5nZXRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuc2V0VGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMuc2V0VGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5yZXN0b3JlVGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXI7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2w7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50VGltZW91dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFN0cmluZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfZ2V0SEFSKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0TG9nVHlwZXMoKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcygncGVyZm9ybWFuY2UnKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbG9ncyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ3MoJ3BlcmZvcm1hbmNlJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gaW4gb25lIGluc3RhbmNlLCBsb2dzIHdhcyBub3QgaXRlcmFibGUgZm9yIHNvbWUgcmVhc29uIC0gaGVuY2UgdGhlIGZvbGxvd2luZyBjaGVjazpcclxuICAgICAgICAgICAgICAgIGlmICghbG9ncyB8fCB0eXBlb2YgbG9nc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2dldEhBUjogbG9ncyBub3QgaXRlcmFibGU6ICcgKyBKU09OLnN0cmluZ2lmeShsb2dzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1zZ09iaiA9IEpTT04ucGFyc2UobG9nLm1lc3NhZ2UpOyAgIC8vIHJldHVybmVkIGFzIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoKG1zZ09iai5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBoYXIgPSBoYXJGcm9tTWVzc2FnZXMoZXZlbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShoYXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gZmV0Y2ggSEFSOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoZWNrV2FpdEZvckFuZ3VsYXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFuZ3VsYXIodGhpcy5hdXRvV2FpdEZvckFuZ3VsYXJSb290U2VsZWN0b3IsIHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyU29mdFdhaXQsIHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyVGltZW91dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZW5kUmVzdWx0U3RhdHVzVG9MYW1iZGFUZXN0KHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGxhbWJkYUNyZWRlbnRpYWxzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFjY2Vzc0tleTogdGhpcy53ZGlvT3B0cy5rZXlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFBdXRvbWF0aW9uQ2xpZW50ID0gbGFtYmRhUmVzdENsaWVudC5BdXRvbWF0aW9uQ2xpZW50KFxyXG4gICAgICAgICAgICAgICAgbGFtYmRhQ3JlZGVudGlhbHNcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXNfaW5kOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGFtYmRhQXV0b21hdGlvbkNsaWVudC51cGRhdGVTZXNzaW9uQnlJZChzZXNzaW9uSWQsIHJlcXVlc3RCb2R5LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gTGFtYmRhVGVzdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvVGVzdGluZ0JvdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uSWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHRiID0gbmV3IFRlc3RpbmdCb3Qoe1xyXG4gICAgICAgICAgICAgICAgYXBpX2tleTogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgYXBpX3NlY3JldDogdGhpcy53ZGlvT3B0cy5rZXlcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHRlc3REYXRhID0geyBcInRlc3Rbc3VjY2Vzc11cIiA6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyBcIjFcIiA6IFwiMFwiIH07XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICB0Yi51cGRhdGVUZXN0KHRlc3REYXRhLCBzZXNzaW9uSWQsIGZ1bmN0aW9uKGVycm9yLCB0ZXN0RGV0YWlscykge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBUZXN0aW5nQm90OiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2soc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA9PT0gJ1BBU1NFRCcgPyAncGFzc2VkJyA6ICdmYWlsZWQnXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmAsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgICAgICdwYXNzJzogdGhpcy53ZGlvT3B0cy5rZXksXHJcbiAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qob3B0aW9ucywgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIEJyb3dzZXJzdGFjazogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaXNTZWxlbm9pZEh1YihzZWxlbml1bVVybCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IGAke3NlbGVuaXVtVXJsfWAsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAgICAganNvbjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qob3B0aW9ucywgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChib2R5ICYmIGJvZHkubGVuZ3RoICYmIGJvZHkuaW5kZXhPZignWW91IGFyZSB1c2luZyBTZWxlbm9pZCcpID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBCcm93c2Vyc3RhY2s6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgdGhlIHRlc3QgaXMgcnVubmluZyBpbnNpZGUgU2VsZW5vaWQsIHRoZW4gZG93bmxvYWQgdGhlIHZpZGVvIGlmIHRlc3QgaGFzIGZhaWxlZFxyXG4gICAgYXN5bmMgX2FkZFNlbGVub2lkVmlkZW9Bc1Rlc3RBdHRhY2htZW50KGhhc0ZhaWxlZCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZ09uU2VsZW5vaWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZWNvcmRWaWRlbyAmJiAhaGFzRmFpbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdmlkZW9GaWxlVXJsID0gYCR7dGhpcy5zZWxlbml1bVVybEJhc2V9L3ZpZGVvLyR7dGhpcy5zZXNzaW9uSWR9Lm1wNGA7XHJcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBgJHt0aGlzLnNlc3Npb25JZH0ubXA0YDtcclxuICAgICAgICB0aGlzLnJzLmF0dGFjaG1lbnRzLnB1c2gobW9kVXRpbHMubmV3VmlkZW9BdHRhY2htZW50KGZpbGVOYW1lLCB2aWRlb0ZpbGVVcmwpKTtcclxuICAgIH1cclxufVxyXG5cclxuIl19
864
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJ2YWx1ZSIsImRlZmF1bHQiLCJyZXF1aXJlIiwiX2Nocm9tZUhhciIsIl91cmwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0Iiwid2RpbyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX1dlYkRyaXZlck1vZHVsZSIsIl93aGVuIiwiX3V0aWxzIiwiX2hlbHBlciIsIl9PeHlnZW5FcnJvciIsIl91dGlsIiwiX3NhdWNlbGFicyIsIl9ub2RlUmVzdENsaWVudCIsIl90ZXN0aW5nYm90QXBpIiwiX2NoaWxkX3Byb2Nlc3MiLCJfcGVyZmVjdG9SZXBvcnRpbmciLCJfcmVxdWVzdCIsIl9pbWdNZXJnZSIsIl9hdXRvU3RhcnQiLCJlIiwidCIsIldlYWtNYXAiLCJyIiwibiIsIl9fZXNNb2R1bGUiLCJvIiwiaSIsImYiLCJfX3Byb3RvX18iLCJoYXMiLCJnZXQiLCJzZXQiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJNT0RVTEVfTkFNRSIsIkRFRkFVTFRfU0VMRU5JVU1fVVJMIiwiREVGQVVMVF9CUk9XU0VSX05BTUUiLCJERUZBVUxUX01PQklMRV9CUk9XU0VSIiwiTk9fU0NSRUVOU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiV2ViTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJoZWxwZXJzIiwiX2xvYWRIZWxwZXJGdW5jdGlvbnMiLCJPeEVycm9yIiwiZXJySGVscGVyIiwid2FpdEZvclRpbWVvdXQiLCJ3ZFByb2MiLCJuYW1lIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwiY2FwcyIsImluaXQiLCJzZWxlbml1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJjdHgiLCJhdXRvU3RhcnRXZWJEcml2ZXIiLCJhcHBpdW1VcmwiLCJzdGFydHNXaXRoIiwicmVtb3RlVXJsIiwicHJvYyIsImRlZmF1bHRCcm93c2VyIiwiYnJvd3Nlck5hbWUiLCJlcnJvckNvZGUiLCJJTlZBTElEX0NBUEFCSUxJVElFUyIsInRvTG93ZXJDYXNlIiwicmVjb3JkSEFSIiwiYnJvd3NlciIsInBlcmZvcm1hbmNlIiwidXJsIiwiVVJMIiwicGFyc2UiLCJwcm90b2NvbCIsInJlcGxhY2UiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwYXRoIiwicGF0aG5hbWUiLCJhdXRoIiwic3BsaXQiLCJ3ZGlvT3B0cyIsInVzZXIiLCJrZXkiLCJzZWxlbml1bVVybEJhc2UiLCJpc1J1bm5pbmdPblNlbGVub2lkIiwiX2lzU2VsZW5vaWRIdWIiLCJlbmFibGVWaWRlbyIsInVuZGVmaW5lZCIsInZpZGVvRnJhbWVSYXRlIiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsImluaXRFcnJvciIsIl90aGlzIiwicHJvdmlkZXIiLCJtb2RVdGlscyIsImRldGVybWluZVByb3ZpZGVyIiwiZW5yaWNoUHJvdmlkZXJXZGlvT3B0aW9ucyIsImRyaXZlciIsInJlbW90ZSIsInNlc3Npb25JZCIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJzZWxlbml1bVRpbWVvdXQiLCJQRVJGRUNUTyIsInBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsInBlcmZlY3RvUmVwb3J0aW5nIiwiUGVyZmVjdG8iLCJQZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJ3ZWJkcml2ZXIiLCJleGVjdXRlU2NyaXB0IiwiY29tbWFuZCIsInBhcmFtcyIsImV4ZWN1dGUiLCJyZXBvcnRpbmdDbGllbnQiLCJQZXJmZWN0b1JlcG9ydGluZ0NsaWVudCIsInRlc3RTdGFydCIsImdldFNlbGVuaXVtSW5pdEVycm9yIiwiY29sbGVjdEJyb3dzZXJMb2dzIiwiZ2V0QnJvd3NlckxvZ3MiLCJlcnJvciIsIkxBTUJEQVRFU1QiLCJCUk9XU0VSU1RBQ0siLCJpbmNsdWRlcyIsIm1heGltaXplV2luZG93Iiwic2V0VGltZW91dCIsImVyciIsIlVOS05PV05fRVJST1IiLCJtZXNzYWdlIiwidXRpbCIsImluc3BlY3QiLCJvdmVyd3JpdGVXZGlvQ29tbWFuZHMiLCJkaXNwb3NlIiwic3RhdHVzIiwiX3doZW5XZWJNb2R1bGVEaXNwb3NlIiwiZGVmZXIiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJTQVVDRUxBQlMiLCJ1c2VybmFtZSIsImFjY2Vzc0tleSIsInBhc3NlZCIsImlkIiwiYm9keSIsIm15QWNjb3VudCIsIlNhdWNlTGFicyIsInVwZGF0ZUpvYiIsInN0b3BKb2IiLCJfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdCIsImRlbGV0ZVNlc3Npb24iLCJURVNUSU5HQk9UIiwiX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3QiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJmYWlsZWQiLCJfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrIiwiY2xvc2VCcm93c2VyV2luZG93cyIsImRpc3Bvc2VDb250aW51ZSIsIndhcm4iLCJraWxsIiwicHJvbWlzZSIsInNlbGVuaXVtU2Vzc2lvblRpbWVvdXQiLCJzZWxlbml1bVBpZCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImV4ZWNTeW5jIiwic3RkaW8iLCJwZ3JlcFJlc3VsdCIsInRvU3RyaW5nIiwicmVzb2x2ZSIsIl9pdGVyYXRpb25TdGFydCIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiX2l0ZXJhdGlvbkVuZCIsInR5cGUiLCJlcnJvckhlbHBlciIsIlNFTEVOSVVNX1NFU1NJT05fVElNRU9VVCIsImxvZ3MiLCJsb2ciLCJwdXNoIiwiX2FkanVzdEJyb3dzZXJMb2ciLCJfZ2V0SEFSIiwiaGFyIiwiaGFzRmFpbGVkIiwiX2FkZFNlbGVub2lkVmlkZW9Bc1Rlc3RBdHRhY2htZW50IiwiX2lzQWN0aW9uIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJQcm9taXNlIiwicmVqZWN0Iiwid2FpdFVudGlsUmV0VmFsIiwid2FpdFVudGlsIiwiaW1hZ2VzIiwiaGFuZGxlcyIsImdldFdpbmRvd0hhbmRsZXMiLCJoYW5kbGUiLCJzd2l0Y2hUb1dpbmRvdyIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwidGl0bGVJbWFnZSIsImdlbmVyYXRlIiwiY29uc29sZSIsIm1lcmdlZEltYWdlIiwibWVyZ2VJbWFnZXMiLCJkaXJlY3Rpb24iLCJ0aW1lb3V0IiwidGhlbiIsImNhdGNoIiwiZXciLCJ0aW1lIiwidGltZXN0YW1wIiwibXNnIiwibGV2ZWwiLCJzcmMiLCJfZ2V0U3RhdHMiLCJjb21tYW5kTmFtZSIsImZldGNoU3RhdHMiLCJuYXZpZ2F0aW9uU3RhcnQiLCJkb21Db250ZW50TG9hZGVkIiwibG9hZCIsInNhbWVQYWdlIiwibGFzdEVycm9yIiwidGltaW5ncyIsIndpbmRvdyIsInRpbWluZyIsImRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IiwibG9hZEV2ZW50U3RhcnQiLCJleGVjdXRlRXJyb3IiLCJEb21Db250ZW50TG9hZGVkRXZlbnQiLCJMb2FkRXZlbnQiLCJ0cmFuc2FjdGlvbiIsInNsaWNlIiwiY291bnRlciIsImtleXMiLCJmaWx0ZXIiLCJnZXRXZGlvTG9jYXRvciIsIm1hdGNoUGF0dGVybiIsImdldEVsZW1lbnQiLCJnZXRFbGVtZW50cyIsImdldENoaWxkRWxlbWVudCIsImdldENoaWxkRWxlbWVudHMiLCJzZXRUaW1lb3V0SW1wbGljaXQiLCJyZXN0b3JlVGltZW91dEltcGxpY2l0IiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROdW1iZXIiLCJhc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlIiwiYXNzZXJ0QXJndW1lbnRCb29sIiwiYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWwiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJhc3NlcnRBcmd1bWVudFN0cmluZyIsInR5cGVzIiwiZ2V0TG9nVHlwZXMiLCJnZXRMb2dzIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJKU09OIiwic3RyaW5naWZ5IiwiZXZlbnRzIiwibXNnT2JqIiwiaGFyRnJvbU1lc3NhZ2VzIiwiY2hlY2tXYWl0Rm9yQW5ndWxhciIsImF1dG9XYWl0Rm9yQW5ndWxhciIsIndhaXRGb3JBbmd1bGFyIiwiYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yIiwiYXV0b1dhaXRGb3JBbmd1bGFyU29mdFdhaXQiLCJhdXRvV2FpdEZvckFuZ3VsYXJUaW1lb3V0IiwibGFtYmRhQ3JlZGVudGlhbHMiLCJsYW1iZGFBdXRvbWF0aW9uQ2xpZW50IiwibGFtYmRhUmVzdENsaWVudCIsIkF1dG9tYXRpb25DbGllbnQiLCJyZXF1ZXN0Qm9keSIsInN0YXR1c19pbmQiLCJ1cGRhdGVTZXNzaW9uQnlJZCIsInRiIiwiVGVzdGluZ0JvdCIsImFwaV9rZXkiLCJhcGlfc2VjcmV0IiwidGVzdERhdGEiLCJ1cGRhdGVUZXN0IiwidGVzdERldGFpbHMiLCJtZXRob2QiLCJqc29uIiwicmVqZWN0VW5hdXRob3JpemVkIiwicmVxdWVzdCIsInJlcyIsImluZGV4T2YiLCJyZWNvcmRWaWRlbyIsInZpZGVvRmlsZVVybCIsImZpbGVOYW1lIiwiYXR0YWNobWVudHMiLCJuZXdWaWRlb0F0dGFjaG1lbnQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb3hfbW9kdWxlcy9tb2R1bGUtd2ViLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgd2ViXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBicm93c2VyIGF1dG9tYXRpb24uXHJcbiAqIEBzYW1wbGUgKipOb3RlczoqKiAgXHJcbiAqICAgXHJcbiAqIENvbW1hbmRzIHdoaWNoIG9wZXJhdGUgb24gZWxlbWVudHMgc3VjaCBhcyBjbGljaywgYXNzZXJ0LCB3YWl0Rm9yLCB0eXBlLCBzZWxlY3QsIGFuZCBvdGhlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHdhaXQgZm9yIGEgcGVyaW9kIG9mIHRpbWUgZm9yIHRoZSBlbGVtZW50IHRvIGFwcGVhciBpbiBET00gYW5kIGJlY29tZSB2aXNpYmxlLiBCeSBkZWZhdWx0IHRoaXMgcGVyaW9kIGVxdWFscyB0byA2MCBzZWNvbmRzLCBidXQgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIGBzZXRUaW1lb3V0YGNvbW1hbmQuXHJcbiAqICAgXHJcbiAqICoqU3RyaW5nIG1hdGNoaW5nIHBhdHRlcm5zOioqIFxyXG4gKiBcclxuICogIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhIHN0cmluZyBtYXRjaGluZyBwYXR0ZXJuIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgcGF0dGVybnMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgcmVnZXg6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyByZWd1bGFyIGV4cHJlc3Npb24uXHJcbiAqICAqIGByZWdleGk6UEFUVEVSTmAgLSBNYXRjaCB1c2luZyBjYXNlLWluc2Vuc2l0aXZlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogICogYGV4YWN0OlNUUklOR2AgLSBNYXRjaCB0aGUgc3RyaW5nIHZlcmJhdGltLlxyXG4gKiAgKiBgZ2xvYjpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIGNhc2UtaW5zZW5zaXRpdmUgZ2xvYiBwYXR0ZXJuLiBgP2Agd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBleGNlcHQgbmV3IGxpbmUgXFwoXFxuXFwpLiBgKmAgd2lsbCBtYXRjaCBhbnkgc2VxdWVuY2UgXFwoMCBvciBtb3JlXFwpIG9mIGNoYXJhY3RlcnMgZXhjZXB0IG5ldyBsaW5lLiBFbXB0eSAgICAgUEFUVEVSTiB3aWxsIG1hdGNoIG9ubHkgb3RoZXIgZW1wdHkgc3RyaW5ncy5cclxuICogICogYFBBVFRFUk5gIC0gU2FtZSBhcyBnbG9iIG1hdGNoaW5nLiAgXHJcbiAqXHJcbiAqICoqTG9jYXRvcnM6KiogXHJcbiAqIFxyXG4gKiAgQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGFuIGVsZW1lbnQgbG9jYXRvciBpbiB0aGVpciBhcmd1bWVudHMsIHN1cHBvcnQgZm9sbG93aW5nIGxvY2F0b3IgdHlwZXMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAgKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBJRCBhdHRyaWJ1dGUuXHJcbiAqICAqIGBjc3M9Q1NTX1NFTEVDVE9SYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3Rvci5cclxuICogICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGxpbmsgZWxlbWVudCB3aG9zZSB2aXNpYmxlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbGluay1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgbGluayBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAgKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgTkFNRSBhdHRyaWJ1dGUuXHJcbiAqICAqIGB0YWc9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHRhZyBuYW1lLlxyXG4gKiAgKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogICogYChYUEFUSClbXWAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqL1xyXG5cclxuLyogZXNsaW50LWRpc2FibGUgcXVvdGVzICovXHJcbmltcG9ydCB7IGhhckZyb21NZXNzYWdlcyB9IGZyb20gJ2Nocm9tZS1oYXInO1xyXG5pbXBvcnQgVVJMIGZyb20gJ3VybCc7XHJcbmltcG9ydCAqIGFzIHdkaW8gZnJvbSAnd2ViZHJpdmVyaW8nO1xyXG5pbXBvcnQgV2ViRHJpdmVyTW9kdWxlIGZyb20gJy4uL2NvcmUvV2ViRHJpdmVyTW9kdWxlJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgdXRpbCBmcm9tICd1dGlsJztcclxuaW1wb3J0IFNhdWNlTGFicyBmcm9tICdzYXVjZWxhYnMnO1xyXG5pbXBvcnQgbGFtYmRhUmVzdENsaWVudCBmcm9tICdAbGFtYmRhdGVzdC9ub2RlLXJlc3QtY2xpZW50JztcclxuaW1wb3J0IFRlc3RpbmdCb3QgZnJvbSAndGVzdGluZ2JvdC1hcGknO1xyXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgcGVyZmVjdG9SZXBvcnRpbmcgZnJvbSAncGVyZmVjdG8tcmVwb3J0aW5nJztcclxuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCc7XHJcbmltcG9ydCBtZXJnZUltYWdlcyBmcm9tICcuLi9saWIvaW1nLW1lcmdlJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgeyBhdXRvU3RhcnRXZWJEcml2ZXIgfSBmcm9tICcuLi9veF9tb2R1bGVzL21vZHVsZS13ZWIvd2ViZHJpdmVyL2F1dG8tc3RhcnQnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnd2ViJztcclxuY29uc3QgREVGQVVMVF9TRUxFTklVTV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo0NDQ0L3dkL2h1Yic7XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9OQU1FID0gJ2Nocm9tZSc7XHJcbmNvbnN0IERFRkFVTFRfTU9CSUxFX0JST1dTRVIgPSAnZGVmYXVsdCc7XHJcbmNvbnN0IE5PX1NDUkVFTlNIT1RfQ09NTUFORFMgPSBbJ2luaXQnLCAnYXNzZXJ0QWxlcnQnXTtcclxuY29uc3QgQUNUSU9OX0NPTU1BTkRTID0gWydvcGVuJywgJ2NsaWNrJ107XHJcbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FT1VUID0gNjAgKiAxMDAwOyAgICAgICAgICAgIC8vIGRlZmF1bHQgNjBzIHdhaXQgdGltZW91dFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV2ViTW9kdWxlIGV4dGVuZHMgV2ViRHJpdmVyTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307ICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLT5oYXIgZGljdGlvbmFyeVxyXG4gICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgICAgIHRoaXMud2RQcm9jID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gTU9EVUxFX05BTUU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0RHJpdmVyXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIFdESU8gZHJpdmVyLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBXRElPIGRyaXZlci5cclxuICAgICAqL1xyXG4gICAgZ2V0RHJpdmVyKCkge1xyXG4gICAgICAgIHJldHVybiBzdXBlci5nZXREcml2ZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXRDYXBhYmlsaXRpZXNcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgY3VycmVudGx5IGRlZmluZWQgY2FwYWJpbGl0aWVzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGdldENhcGFiaWxpdGllcygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYXBzIHx8IHN1cGVyLmdldENhcGFiaWxpdGllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIG5ldyBTZWxlbml1bSBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjYXBzIC0gRGVzaXJlZCBjYXBhYmlsaXRpZXMuIElmIG5vdCBzcGVjaWZpZWQgY2FwYWJpbGl0aWVzIHdpbGwgYmUgdGFrZW4gZnJvbSBzdWl0ZSBkZWZpbml0aW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzZWxlbml1bVVybCAtIFJlbW90ZSBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjQ0NDQvd2QvaHViKS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdChjYXBzLCBzZWxlbml1bVVybCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gdGFrZSBjYXBhYmlsaXRpZXMgZWl0aGVyIGZyb20gaW5pdCBtZXRob2QgYXJndW1lbnQgb3IgZnJvbSBjb250ZXh0IHBhcmFtZXRlcnMgcGFzc2VkIGluIHRoZSBjb25zdHJ1Y3RvclxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlbml1bVVybCAmJiAhdGhpcy5vcHRpb25zLmF1dG9TdGFydFdlYkRyaXZlcikge1xyXG4gICAgICAgICAgICAvLyBpZiBhcHBpdW1VcmwgcG9pbnRzIHRvIGFuIGV4dGVybmFsIGV4ZWN1dGlvbiBncmlkIChzdWNoIGFzIEJTKVxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFwcGl1bVVybCAmJiAhdGhpcy5vcHRpb25zLmFwcGl1bVVybC5zdGFydHNXaXRoKCdodHRwOi8vbG9jYWxob3N0JykpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLmFwcGl1bVVybDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHNlbGVuaXVtVXJsID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNoZWNrIGlmIHdlIHNob3VsZCBpbmRldGlmeSBhbmQgYXV0by1zdGFydCBhIHJlbGV2YW50IHdlYmRyaXZlclxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hdXRvU3RhcnRXZWJEcml2ZXIpIHtcclxuICAgICAgICAgICAgY29uc3QgeyByZW1vdGVVcmwsIHByb2MgfSA9IGF3YWl0IGF1dG9TdGFydFdlYkRyaXZlcih0aGlzLmNhcHMpO1xyXG4gICAgICAgICAgICBzZWxlbml1bVVybCA9IHJlbW90ZVVybDtcclxuICAgICAgICAgICAgdGhpcy53ZFByb2MgPSBwcm9jO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgYnJvd3Nlck5hbWUgY2FwcyBmcm9tIG9wdGlvbnMuIEZJWE1FOiB3aHkgaXMgdGhpcyBldmVuIG5lZWRlZD9cclxuICAgICAgICBsZXQgZGVmYXVsdEJyb3dzZXIgPSBmYWxzZTtcclxuICAgICAgICBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPSB0aGlzLm9wdGlvbnMuYnJvd3Nlck5hbWUgfHwgREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgICAgIGRlZmF1bHRCcm93c2VyID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRklYTUU6IHNoYWxsIHdlIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBicm93c2VyTmFtZSBpcyBub3Qgc3BlY2lmaWVkLCBuZWl0aGVyIGluIGNhcHMgbm9yIGluIG9wdGlvbnM/IVxyXG4gICAgICAgIGlmICghdGhpcy5jYXBzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSU5WQUxJRF9DQVBBQklMSVRJRVMsXHJcbiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGluaXRpYWxpemUgYHdlYmAgbW9kdWxlIC0gYnJvd3Nlck5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgYnJvd3Nlck5hbWUtc1xyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2llJykge1xyXG4gICAgICAgICAgICAvLyBJRSBpcyBzcGVjaWZpZWQgYXMgJ2llJyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpbmUgYW5kIHBvc3NpYmx5IHN1aXRlc1xyXG4gICAgICAgICAgICAvLyBidXQgc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyAnaW50ZXJuZXQgZXhwbG9yZXInXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9ICdpbnRlcm5ldCBleHBsb3Jlcic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcHNbJ2xhbWJkYTpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgLy8gbGFtYmRhdGVzdCBleHBlY3RzIG9yaWdpbmFsIGNhc2UgbmFtZXNcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY2Fwc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIC8vIHBlcmZlY3RvTW9iaWxlIGV4cGVjdHMgb3JpZ2luYWwgY2FzZSBuYW1lc1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICE9PSAnTWljcm9zb2Z0RWRnZScpIHtcclxuICAgICAgICAgICAgLy8gc2VsZW5pdW0gc3RhbmRhbG9uZSBzZXJ2ZXIgZXhwZWN0cyBhbGwgYnJvd3Nlck5hbWVzIHRvIGJlIGxvd2VyY2FzZVxyXG4gICAgICAgICAgICAvLyBleGNlcHQgXCJNaWNyb3NvZnRFZGdlXCJcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gdGhpcy5jYXBzLmJyb3dzZXJOYW1lLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIC8vIHNwZWNpZnlpbmcgdGhpcyBsZWFkcyBDaHJvbWUgNzcrIHRvIHJlZnVzZSBsb2FkaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5sb2dnaW5nUHJlZnMgPSB7ICAgICAgICAgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPCA3NVxyXG4gICAgICAgICAgICAgICAgYnJvd3NlcjogJ0FMTCcsXHJcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZTogJ0FMTCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmNocm9tZU9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBwZXJmTG9nZ2luZ1ByZWZzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlTmV0d29yazogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICBlbmFibGVQYWdlOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAqL1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gcG9wdWxhdGUgV0RJTyBvcHRpb25zXHJcbiAgICAgICAgY29uc3QgdXJsID0gVVJMLnBhcnNlKHNlbGVuaXVtVXJsIHx8IERFRkFVTFRfU0VMRU5JVU1fVVJMKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVuaXVtVXJsQmFzZSA9IGAke3Byb3RvY29sfTovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgICAgLy8gY2hlY2sgaWYgc2VsZW5pdW0gaHViIGlzIGJhc2VkIG9uIFNlbGVub2lkLCB0aGVuIGVuYWJsZSB2aWRlbyByZWNvcmRpbmdcclxuICAgICAgICB0aGlzLmlzUnVubmluZ09uU2VsZW5vaWQgPSBhd2FpdCB0aGlzLl9pc1NlbGVub2lkSHViKHRoaXMuc2VsZW5pdW1VcmxCYXNlKTtcclxuICAgICAgICBpZiAodGhpcy5pc1J1bm5pbmdPblNlbGVub2lkKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5jYXBzWydzZWxlbm9pZDpvcHRpb25zJ10pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddID0ge307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLmVuYWJsZVZpZGVvID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2Fwc1snc2VsZW5vaWQ6b3B0aW9ucyddLnZpZGVvRnJhbWVSYXRlID0gNDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBnZW5lcmF0ZSBXZWJkcml2ZXIuaW8gb3B0aW9uc1xyXG4gICAgICAgIGNvbnN0IHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgaW5pdEVycm9yID0gbnVsbDtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1vZFV0aWxzLmVucmljaFByb3ZpZGVyV2Rpb09wdGlvbnMocHJvdmlkZXIsIHdkaW9PcHRzKTtcclxuXHJcbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgYnJvd3NlciBmb3IgbW9iaWxlIHdlYiB0ZXN0cywgaWYgZXhlY3V0ZWQgYWdhaW5zdCByZW1vdGUgZGV2aWNlcyBvZiBhIGNsb3VkIHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKGRlZmF1bHRCcm93c2VyICYmIHByb3ZpZGVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZSA9IERFRkFVTFRfTU9CSUxFX0JST1dTRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud2Rpb09wdHMgPSB3ZGlvT3B0cztcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlciA9IGF3YWl0IHdkaW8ucmVtb3RlKHdkaW9PcHRzKTtcclxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLnByb3ZpZGVyID0gcHJvdmlkZXI7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1Ccm93c2VyVGltZW91dDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLnNlbGVuaXVtVGltZW91dCA9IHRoaXMub3B0aW9ucy5zZWxlbml1bVRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCA9IGF3YWl0IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQoe1xyXG4gICAgICAgICAgICAgICAgICAgIHdlYmRyaXZlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU2NyaXB0OiBhc3luYyAoY29tbWFuZCwgcGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShjb21tYW5kLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGluZ0NsaWVudCA9IG5ldyBwZXJmZWN0b1JlcG9ydGluZy5QZXJmZWN0by5QZXJmZWN0b1JlcG9ydGluZ0NsaWVudChwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0YXJ0KG5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRocm93IGVyckhlbHBlci5nZXRTZWxlbml1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHJlc2V0IGJyb3dzZXIgbG9ncyBpZiBhdXRvIGNvbGxlY3QgbG9ncyBvcHRpb24gaXMgZW5hYmxlZFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzICYmIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9PT0gJ2Nocm9tZScpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIC8vIHNpbXBseSBjYWxsIHRoaXMgdG8gY2xlYXIgdGhlIHByZXZpb3VzIGxvZ3MgYW5kIHN0YXJ0IHRoZSB0ZXN0IHdpdGggdGhlIGNsZWFuIGxvZ3NcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0QnJvd3NlckxvZ3MoKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIFttb2RVdGlscy5wcm92aWRlci5MQU1CREFURVNULCBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0ssIG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPXS5pbmNsdWRlcyh0aGlzLmRyaXZlci5wcm92aWRlcilcclxuICAgICAgICAgICAgICAgIC8vWydNaWNyb3NvZnRFZGdlJywgJ21zZWRnZScsICdFZGdlJywgJ0ludGVybmV0IEV4cGxvcmVyJ10uaW5jbHVkZXModGhpcy5kcml2ZXIuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBtYXhpbWl6ZSB3aW5kb3cgaWYgdGhlIHRlc3QgaXMgZXhlY3V0ZWQgYWdhaW5zdCBleHRlcm5hbCBjbG91ZCBwcm92aWRlciBpbmZyYXN0cnVjdHVyZVxyXG4gICAgICAgICAgICAgICAgLy8gYXMgbW9zdCBvZiBjbG91ZCBwcm92aWRlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtYXhpbWl6ZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIubWF4aW1pemVXaW5kb3coKTtcclxuICAgICAgICAgICAgICAgIC8vIHNldCBpbml0aWFsIFRpbWVvdXRcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCc6IHRoaXMud2FpdEZvclRpbWVvdXQsXHJcbiAgICAgICAgICAgICAgICAgICAgJ3BhZ2VMb2FkJzogdGhpcy53YWl0Rm9yVGltZW91dFxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5VTktOT1dOX0VSUk9SLCBlcnIubWVzc2FnZSwgdXRpbC5pbnNwZWN0KGVycikpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgbW9kVXRpbHMub3ZlcndyaXRlV2Rpb0NvbW1hbmRzKHRoaXMuZHJpdmVyKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCh0aGlzLmRyaXZlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBzdGF0dXMgLSBUZXN0IHN0YXR1cywgZWl0aGVyIGBwYXNzZWRgIG9yIGBmYWlsZWRgLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cykge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fd2hlbldlYk1vZHVsZURpc3Bvc2UgPSBkZWZlcigpO1xyXG5cclxuICAgICAgICBpZiAoIXN0YXR1cykge1xyXG4gICAgICAgICAgICBzdGF0dXMgPSAncGFzc2VkJztcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJzLnN0ZXBzICYmIEFycmF5LmlzQXJyYXkodGhpcy5ycy5zdGVwcykgJiYgdGhpcy5ycy5zdGVwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmYWlsZWRGaW5kZWQgPSB0aGlzLnJzLnN0ZXBzLmZpbmQoKGl0ZW0pID0+IGl0ZW0uc3RhdHVzID09PSAnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkRmluZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2ZhaWxlZCc7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRyaXZlciAmJiB0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuU0FVQ0VMQUJTKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snc2F1Y2U6b3B0aW9ucyddWyd1c2VybmFtZSddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2Vzc0tleSA9IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydzYXVjZTpvcHRpb25zJ11bJ2FjY2Vzc0tleSddO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhc3NlZCA9IHN0YXR1cyA9PT0gJ1BBU1NFRCc7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmRyaXZlci5zZXNzaW9uSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IFwie1xcXCJwYXNzZWRcXFwiOlwiK3Bhc3NlZCtcIn1cIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXlBY2NvdW50ID0gbmV3IFNhdWNlTGFicyh7IHVzZXI6IHVzZXJuYW1lLCBrZXk6IGFjY2Vzc0tleX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG15QWNjb3VudC51cGRhdGVKb2IodXNlcm5hbWUsIGlkLCBib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBteUFjY291bnQuc3RvcEpvYih1c2VybmFtZSwgaWQpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRyaXZlci5wcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuTEFNQkRBVEVTVCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0xhbWJkYVRlc3Qoc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlRFU1RJTkdCT1QpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUmVzdWx0U3RhdHVzVG9UZXN0aW5nQm90KHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdG9wKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMucGFzc2VkIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMuZmFpbGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9zZW5kUmVzdWx0U3RhdHVzVG9Ccm93c2Vyc3RhY2soc3RhdHVzKTtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIucHJvdmlkZXIgPT09IG51bGwgJiYgWydQQVNTRUQnLCdGQUlMRUQnXS5pbmNsdWRlcyhzdGF0dXMpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jbG9zZUJyb3dzZXJXaW5kb3dzKHN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGVkIG9yIG90aGVyIHN0YXR1c1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcG9zZUNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0Vycm9yIGRpc3Bvc2luZyBkcml2ZXI6ICcsIGUpOyAgICAvLyBpZ25vcmUgYW55IGVycm9ycyBhdCBkaXNwb3NhbCBzdGFnZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwb3NlQ29udGludWUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLndkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLndkUHJvYy5raWxsKCk7XHJcbiAgICAgICAgICAgIHRoaXMud2RQcm9jID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl93aGVuV2ViTW9kdWxlRGlzcG9zZS5wcm9taXNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZVNlc3Npb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gZGVsZXRlU2Vzc2lvbiBvbmx5IGlmIG5vIHNlc3Npb24gdGltZW91dCBiZWNhdXNlIGl0IHdpbGwgdGFrZSA1IG1pbiB0byBleGVjdXRlIG90aGVyd2lzZVxyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbiAmJiAhdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdkZWxldGVTZXNzaW9uIGVycm9yJywgZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNsb3NlQnJvd3NlcldpbmRvd3Moc3RhdHVzKSB7XHJcbiAgICAgICAgaWYgKHN0YXR1cyAmJiAnRkFJTEVEJyA9PT0gc3RhdHVzLnRvVXBwZXJDYXNlKCkgJiYgdGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5zZWxlbml1bVBpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZShzdGF0dXMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2VDb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkaXNwb3NlQ29udGludWUoc3RhdHVzKSB7XHJcbiAgICAgICAgdGhpcy5kcml2ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgLy8gY2xlYW51cCBjaHJvbWVkcml2ZXIncyBvbmx5IHdoZW4gcnVubmluZyBmcm9tIHdpdGhpbiB0aGUgSURFIGFuZCB0ZXN0IGRpZCBub3QgZmFpbFxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnNlbGVuaXVtUGlkICYmICghc3RhdHVzIHx8ICdGQUlMRUQnICE9PSBzdGF0dXMudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXhlY1N5bmMoJ3Rhc2traWxsIC9JTSBjaHJvbWVkcml2ZXIuZXhlIC9GJywgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGdyZXBSZXN1bHQgPSBleGVjU3luYyhcInBncmVwIC1kJyAnIGNocm9tZWRyaXZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQgJiYgcGdyZXBSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGdyZXBSZXN1bHQgPSBwZ3JlcFJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdraWxsIC05ICcgKyBwZ3JlcFJlc3VsdCwgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNsZWFudXAgZWRnZWRyaXZlcidzIG9ubHkgd2hlbiBydW5uaW5nIGZyb20gd2l0aGluIHRoZSBJREUgYW5kIHRlc3QgZGlkIG5vdCBmYWlsXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc2VsZW5pdW1QaWQgJiYgKCFzdGF0dXMgfHwgJ0ZBSUxFRCcgIT09IHN0YXR1cy50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZm9yIG5vd1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGdyZXBSZXN1bHQgPSBleGVjU3luYyhcInBncmVwIC1kJyAnIG1zZWRnZWRyaXZlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQgJiYgcGdyZXBSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGdyZXBSZXN1bHQgPSBwZ3JlcFJlc3VsdC50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGdyZXBSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNTeW5jKCdraWxsIC05ICcgKyBwZ3JlcFJlc3VsdCwgeyBzdGRpbzogWydpZ25vcmUnLCAnaWdub3JlJywgJ2lnbm9yZSddIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3doZW5XZWJNb2R1bGVEaXNwb3NlLnJlc29sdmUobnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2l0ZXJhdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHRyYW5zYWN0aW9uIG5hbWUgc2F2ZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIGFueVxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2l0ZXJhdGlvbkVuZChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGNvbGxlY3QgYnJvd3NlciBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RCcm93c2VyTG9ncyA9PT0gdHJ1ZSAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEJyb3dzZXJMb2cobG9nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBzaG91bGQgY2xlYXIgdHJhbnNhY3Rpb25zIHRvIGF2b2lkIGR1cGxpY2F0ZSBuYW1lcyBhY3Jvc3MgaXRlcmF0aW9uc1xyXG4gICAgICAgIC8vIGFsc28gc2hvdWxkIHRocm93IG9uIGR1cGxpY2F0ZSBuYW1lcy5cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG5vIHRyYW5zYWN0aW9ucyBzZXQgaWYgdGVzdCBmYWlscyBiZWZvcmUgd2ViLnRyYW5zYWN0aW9uIGNvbW1hbmRcclxuICAgICAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbnNbZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lXSA9IGF3YWl0IHRoaXMuX2dldEhBUigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJzLmhhciA9IHRoaXMudHJhbnNhY3Rpb25zO1xyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZCA9IGVycm9yICE9PSB1bmRlZmluZWQgJiYgZXJyb3IgIT09IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYWRkU2VsZW5vaWRWaWRlb0FzVGVzdEF0dGFjaG1lbnQoaGFzRmFpbGVkKTtcclxuICAgIH1cclxuXHJcbiAgICBfaXNBY3Rpb24obmFtZSkge1xyXG4gICAgICAgIHJldHVybiBBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Rha2VTY3JlZW5zaG90U2lsZW50KG5hbWUpIHtcclxuICAgICAgICBpZiAoIU5PX1NDUkVFTlNIT1RfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHtcclxuICAgICAgICAgICAgbGV0IGVycm9yO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyICYmXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIudGFrZVNjcmVlbnNob3RcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuY2FsbCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFdpbmRvd0hhbmRsZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGhhbmRsZXMpICYmIGhhbmRsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlIG9mIGhhbmRsZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuc3dpdGNoVG9XaW5kb3coaGFuZGxlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBhd2FpdCB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFRpdGxlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCcuLi9saWIvdGV4dC10by1pbWFnZScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUltYWdlID0gYXdhaXQgdGV4dFRvSW1hZ2UuZ2VuZXJhdGUodGl0bGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aXRsZUltYWdlICYmIHR5cGVvZiB0aXRsZUltYWdlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUltYWdlID0gdGl0bGVJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL3BuZztiYXNlNjQsJywgJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCh0aXRsZUltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ2FudmFzIG9wZXJhdGlvbiBmYWlsZWQuJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIElnbm9yZSBjYW52YXMtcmVsYXRlZCBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGFsbCBpbWFnZXMgaW50byBvbmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lcmdlZEltYWdlID0gYXdhaXQgbWVyZ2VJbWFnZXMoaW1hZ2VzLCB7IGRpcmVjdGlvbjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWRJbWFnZSAmJiB0eXBlb2YgbWVyZ2VkSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gbWVyZ2VkSW1hZ2UucmVwbGFjZSgnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FpdFVudGlsUmV0VmFsICYmIHdhaXRVbnRpbFJldFZhbC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFJldFZhbC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChldykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgKDEpJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgKDIpJywgZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCAoMyknLCBlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfYWRqdXN0QnJvd3NlckxvZyhsb2cpIHtcclxuICAgICAgICBpZiAoIWxvZyB8fCB0eXBlb2YgbG9nICE9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogY29udmVydCBsb2cudGltZXN0YW1wIGZyb20gdGhlIGJyb3dzZXIgdGltZSB6b25lIHRvIHRoZSBsb2NhbCBvbmUgKHNvIHdlIGNhbiBsYXRlciBjb3JyZWxhdGUgYmV0d2VlbiBzdGVwcyBhbmQgbG9ncylcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICAvLyBjb252ZXJ0IFNFVkVSRSBsb2cgbGV2ZWwgdG8gRVJST1JcclxuICAgICAgICAgICAgbGV2ZWw6IGxvZy5sZXZlbCA9PT0gJ1NFVkVSRScgPyAnRVJST1InIDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6ICdicm93c2VyJ1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIEZJWE1FOiBUaGVyZSBpcyBhIGJ1ZyB3aXRoIElFLiBTZWUgdGhlIGNvbW1lbnQgd2l0aGluIGZ1bmN0aW9uIGJvZHkuXHJcbiAgICAgKlxyXG4gICAgICogIGRvbUNvbnRlbnRMb2FkZWQgKGFrYSBGaXJzdCBWaXN1YWwgVGltZSktIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICogIGxvYWQgKGFrYSBGdWxsIExvYWQgVGltZSkgICAgICAgICAgICAgICAtIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBsb2FkRXZlbnRTdGFydCBhbmQgbmF2aWdhdGlvblN0YXJ0LlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm9jZXNzaW5nIG1vZGVsOlxyXG4gICAgICpcclxuICAgICAqICAxLiBuYXZpZ2F0aW9uU3RhcnQgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGFzIHJlcXVlc3RlZCB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgMi4gLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAtIE5vdCByZWxldmFudCB0byB1cy4gU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL25hdmlnYXRpb24tdGltaW5nLyNwcm9jZXNzIGZvciBtb3JlIGluZm9ybWF0aW9uLlxyXG4gICAgICogIDMuIGRvbUxvYWRpbmcgICAgICAgICAgICAgICAgICAgLSBUaGUgYnJvd3NlciBzdGFydHMgcGFyc2luZyB0aGUgZG9jdW1lbnQuXHJcbiAgICAgKiAgNC4gZG9tSW50ZXJhY3RpdmUgICAgICAgICAgICAgICAtIFRoZSBicm93c2VyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBkb2N1bWVudCBhbmQgdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggdGhlIHBhZ2UuXHJcbiAgICAgKiAgNS4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgICAtIFRoZSBkb2N1bWVudCBoYXMgYmVlbiBjb21wbGV0ZWx5IGxvYWRlZCBhbmQgcGFyc2VkIGFuZCBkZWZlcnJlZCBzY3JpcHRzLCBpZiBhbnksIGhhdmUgZXhlY3V0ZWQuIFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3luYyBzY3JpcHRzLCBpZiBhbnksIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGV4ZWN1dGVkLlxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZXNoZWV0c1sxXSwgaW1hZ2VzLCBhbmQgc3ViZnJhbWVzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIGZpbmlzaGVkIGxvYWRpbmcuXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFdIC0gU3R5bGVzaGVldHMgL3VzdWFsbHkvIGRlZmVyIHRoaXMgZXZlbnQhIC0gaHR0cDovL21vbGlseS5kZS93ZWJsb2cvZG9tY29udGVudGxvYWRlZFxyXG4gICAgICogIDYuIGRvbUNvbnRlbnRMb2FkZWRFdmVudEVuZCAgICAgLSBUaGUgRE9NQ29udGVudExvYWRlZCBldmVudCBjYWxsYmFjaywgaWYgYW55LCBmaW5pc2hlZCBleGVjdXRpbmcuIEUuZy5cclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbihldmVudCkge1xyXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkRPTSBmdWxseSBsb2FkZWQgYW5kIHBhcnNlZFwiKTtcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAqICA3LiBkb21Db21wbGV0ZSAgICAgICAgICAgICAgICAgIC0gVGhlIERPTSB0cmVlIGlzIGNvbXBsZXRlbHkgYnVpbHQuIEFzeW5jIHNjcmlwdHMsIGlmIGFueSwgaGF2ZSBleGVjdXRlZC5cclxuICAgICAqICA4LiBsb2FkRXZlbnRTdGFydCAgICAgICAgICAgICAgIC0gVGhlIGJyb3dzZXIgaGF2ZSBmaW5pc2hlZCBsb2FkaW5nIGFsbCB0aGUgcmVzb3VyY2VzIGxpa2UgaW1hZ2VzLCBzd2YsIGV0Yy5cclxuICAgICAqICA5LiBsb2FkRXZlbnRFbmQgICAgICAgICAgICAgICAgIC0gVGhlIGxvYWQgZXZlbnQgY2FsbGJhY2ssIGlmIGFueSwgZmluaXNoZWQgZXhlY3V0aW5nLlxyXG4gICAgICovXHJcbiAgICBfZ2V0U3RhdHMoY29tbWFuZE5hbWUpIHtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZldGNoU3RhdHMgJiYgdGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuX2lzQWN0aW9uKGNvbW1hbmROYW1lKSkge1xyXG4gICAgICAgICAgICB2YXIgbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZCA9IDA7XHJcbiAgICAgICAgICAgIHZhciBsb2FkID0gMDtcclxuICAgICAgICAgICAgdmFyIHNhbWVQYWdlID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZm9sbG93aW5nIHNpdHVhdGlvbjpcclxuICAgICAgICAgICAgLy8gaWYgbmF2aWdhdGVTdGFydCBlcXVhbHMgdG8gdGhlIG9uZSB3ZSBnb3QgZnJvbSBwcmV2aW91cyBhdHRlbXB0ICh3ZSBuZWVkIHRvIHNhdmUgaXQpXHJcbiAgICAgICAgICAgIC8vIGl0IG1lYW5zIHdlIGFyZSBzdGlsbCBvbiB0aGUgc2FtZSBwYWdlIGFuZCBkb24ndCBuZWVkIHRvIHJlY29yZCBsb2FkL2RvbUNvbnRlbnRMb2FkZWQgdGltZXNcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmNhbGwoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FpdFVudGlsUmV0VmFsID0gdGhpcy5kcml2ZXIud2FpdFVudGlsKGFzeW5jKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmdsb2JhbCB3aW5kb3cqL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aW1pbmdzID0gYXdhaXQgdGhpcy5kcml2ZXIuZXhlY3V0ZShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25TdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydDogd2luZG93LnBlcmZvcm1hbmNlLnRpbWluZy5kb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRFdmVudFN0YXJ0OiB3aW5kb3cucGVyZm9ybWFuY2UudGltaW5nLmxvYWRFdmVudFN0YXJ0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVycm9yID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0ID4gMCAmJiB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lUGFnZSA9IHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgJiYgdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9PSB0aW1pbmdzLm5hdmlnYXRpb25TdGFydDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvblN0YXJ0ID0gdGhpcy5sYXN0TmF2aWdhdGlvblN0YXJ0VGltZSA9IHRpbWluZ3MubmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZEV2ZW50U3RhcnQgPSB0aW1pbmdzLmxvYWRFdmVudFN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tQ29udGVudExvYWRlZCA9IGRvbUNvbnRlbnRMb2FkZWRFdmVudFN0YXJ0IC0gbmF2aWdhdGlvblN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkID0gbG9hZEV2ZW50U3RhcnQgLSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQgPiAwICYmIGxvYWRFdmVudFN0YXJ0ID4gMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXhlY3V0ZUVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBlcnJvciBpbnNpZGUgZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFcnJvciA9IGV4ZWN1dGVFcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRVbnRpbFJldFZhbCAmJiB3YWl0VW50aWxSZXRWYWwudGhlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFVudGlsUmV0VmFsLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZXJyb3IgZnJvbSBkcml2ZXIuZXhlY3V0ZSBvciBkcml2ZXIud2FpdFVudGlsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxhc3RFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW50IGVycm9yIGZyb20gZHJpdmVyLmV4ZWN1dGUgb3IgZHJpdmVyLndhaXRVbnRpbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsYXN0RXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xyXG4gICAgICAgICAgICAgICAgLy8gY291bGRuJ3QgZ2V0IHRpbWluZ3MuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBuYXZpZ2F0aW9uU3RhcnQ7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gc2FtZVBhZ2UgPyB7fSA6IHsgRG9tQ29udGVudExvYWRlZEV2ZW50OiBkb21Db250ZW50TG9hZGVkLCBMb2FkRXZlbnQ6IGxvYWQgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7fTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXHJcbiAgICAgICAgbmFtZSA9IG5hbWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgLy8gbGltaXQgdGhlIG5hbWUgbGVuZ3RoIChzaW5jZSB3ZSBjYW4ndCBzdG9yZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gNTEyQiBpbiB0aGUgZGF0YWJhc2UpXHJcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgNTEyKTtcclxuXHJcbiAgICAgICAgaWYgKGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVjb3JkSEFSICYmIHRoaXMuaXNJbml0aWFsaXplZCAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uc1tnbG9iYWwuX2xhc3RUcmFuc2FjdGlvbk5hbWVdID0gYXdhaXQgdGhpcy5fZ2V0SEFSKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy50cmFuc2FjdGlvbnNbbmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvdW50ZXIgPSBPYmplY3Qua2V5cyh0aGlzLnRyYW5zYWN0aW9ucykuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnN0YXJ0c1dpdGgobmFtZSkpLmxlbmd0aCArIDE7XHJcbiAgICAgICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWUrJyAoIycrY291bnRlcisnKSc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gbW9kVXRpbHMuZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50U3RyaW5nID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRTdHJpbmc7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2dldEhBUigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldExvZ1R5cGVzKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZXMuaW5jbHVkZXMoJ3BlcmZvcm1hbmNlJykpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmRyaXZlci5nZXRMb2dzKCdwZXJmb3JtYW5jZScpO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGluIG9uZSBpbnN0YW5jZSwgbG9ncyB3YXMgbm90IGl0ZXJhYmxlIGZvciBzb21lIHJlYXNvbiAtIGhlbmNlIHRoZSBmb2xsb3dpbmcgY2hlY2s6XHJcbiAgICAgICAgICAgICAgICBpZiAoIWxvZ3MgfHwgdHlwZW9mIGxvZ3NbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdnZXRIQVI6IGxvZ3Mgbm90IGl0ZXJhYmxlOiAnICsgSlNPTi5zdHJpbmdpZnkobG9ncykpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50cyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dPYmogPSBKU09OLnBhcnNlKGxvZy5tZXNzYWdlKTsgICAvLyByZXR1cm5lZCBhcyBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICBldmVudHMucHVzaChtc2dPYmoubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgaGFyID0gaGFyRnJvbU1lc3NhZ2VzKGV2ZW50cyk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoaGFyKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIGZldGNoIEhBUjogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja1dhaXRGb3JBbmd1bGFyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JBbmd1bGFyKHRoaXMuYXV0b1dhaXRGb3JBbmd1bGFyUm9vdFNlbGVjdG9yLCB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclNvZnRXYWl0LCB0aGlzLmF1dG9XYWl0Rm9yQW5ndWxhclRpbWVvdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvTGFtYmRhVGVzdChzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBsYW1iZGFDcmVkZW50aWFscyA9IHtcclxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB0aGlzLndkaW9PcHRzLnVzZXIsXHJcbiAgICAgICAgICAgICAgICBhY2Nlc3NLZXk6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHRoaXMuZHJpdmVyLnNlc3Npb25JZDtcclxuICAgICAgICAgICAgY29uc3QgbGFtYmRhQXV0b21hdGlvbkNsaWVudCA9IGxhbWJkYVJlc3RDbGllbnQuQXV0b21hdGlvbkNsaWVudChcclxuICAgICAgICAgICAgICAgIGxhbWJkYUNyZWRlbnRpYWxzXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzX2luZDogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxhbWJkYUF1dG9tYXRpb25DbGllbnQudXBkYXRlU2Vzc2lvbkJ5SWQoc2Vzc2lvbklkLCByZXF1ZXN0Qm9keSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIExhbWJkYVRlc3Q6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb1Rlc3RpbmdCb3Qoc3RhdHVzKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5kcml2ZXIuc2Vzc2lvbklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YiA9IG5ldyBUZXN0aW5nQm90KHtcclxuICAgICAgICAgICAgICAgIGFwaV9rZXk6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgIGFwaV9zZWNyZXQ6IHRoaXMud2Rpb09wdHMua2V5XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RGF0YSA9IHsgXCJ0ZXN0W3N1Y2Nlc3NdXCIgOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gXCIxXCIgOiBcIjBcIiB9O1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgdGIudXBkYXRlVGVzdCh0ZXN0RGF0YSwgc2Vzc2lvbklkLCBmdW5jdGlvbihlcnJvciwgdGVzdERldGFpbHMpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gVGVzdGluZ0JvdDogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMua2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignVW5hYmxlIHRvIHNlbmQgcmVzdWx0IHN0YXR1cyB0byBCcm93c2Vyc3RhY2s6ICcgKyBlLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2lzU2VsZW5vaWRIdWIoc2VsZW5pdW1VcmwpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgdXJsOiBgJHtzZWxlbml1bVVybH1gLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnR0VUJyxcclxuICAgICAgICAgICAgICAgIGpzb246IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0KG9wdGlvbnMsIChlcnIsIHJlcywgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keSAmJiBib2R5Lmxlbmd0aCAmJiBib2R5LmluZGV4T2YoJ1lvdSBhcmUgdXNpbmcgU2VsZW5vaWQnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gQnJvd3NlcnN0YWNrOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGlmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgaW5zaWRlIFNlbGVub2lkLCB0aGVuIGRvd25sb2FkIHRoZSB2aWRlbyBpZiB0ZXN0IGhhcyBmYWlsZWRcclxuICAgIGFzeW5jIF9hZGRTZWxlbm9pZFZpZGVvQXNUZXN0QXR0YWNobWVudChoYXNGYWlsZWQgPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc1J1bm5pbmdPblNlbGVub2lkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMucmVjb3JkVmlkZW8gJiYgIWhhc0ZhaWxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZpZGVvRmlsZVVybCA9IGAke3RoaXMuc2VsZW5pdW1VcmxCYXNlfS92aWRlby8ke3RoaXMuc2Vzc2lvbklkfS5tcDRgO1xyXG4gICAgICAgIGNvbnN0IGZpbGVOYW1lID0gYCR7dGhpcy5zZXNzaW9uSWR9Lm1wNGA7XHJcbiAgICAgICAgdGhpcy5ycy5hdHRhY2htZW50cy5wdXNoKG1vZFV0aWxzLm5ld1ZpZGVvQXR0YWNobWVudChmaWxlTmFtZSwgdmlkZW9GaWxlVXJsKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQUFBLE1BQUEsQ0FBQUMsY0FBQSxDQUFBQyxPQUFBO0VBQUFDLEtBQUE7QUFBQTtBQUFBRCxPQUFBLENBQUFFLE9BQUE7QUFBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLElBQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLGdCQUFBLEdBQUFILHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTyxLQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxNQUFBLEdBQUFMLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFOLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBVSxZQUFBLEdBQUFQLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFB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