oxygen-cli 1.25.0-beta.2 → 1.25.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 (265) hide show
  1. package/.husky/pre-commit +4 -0
  2. package/CHANGELOG.md +65 -0
  3. package/build/core/OxygenCore.js +36 -257
  4. package/build/core/OxygenEvents.js +1 -11
  5. package/build/core/OxygenModule.js +1 -14
  6. package/build/core/OxygenService.js +1 -12
  7. package/build/core/OxygenSubModule.js +1 -10
  8. package/build/core/WebDriverModule.js +1 -30
  9. package/build/core/utils.js +1 -17
  10. package/build/errors/HookError.js +1 -7
  11. package/build/errors/ModuleError.js +1 -7
  12. package/build/errors/ModuleUnavailableError.js +1 -3
  13. package/build/errors/OxygenError.js +1 -33
  14. package/build/errors/ScriptNotFound.js +1 -7
  15. package/build/errors/helper.js +46 -77
  16. package/build/index.js +6 -18
  17. package/build/lib/cli-util.js +28 -90
  18. package/build/lib/cli.js +1 -23
  19. package/build/lib/debugger.js +1 -144
  20. package/build/lib/img-merge.js +1 -15
  21. package/build/lib/launcher.js +1 -28
  22. package/build/lib/moduleRequire.js +1 -4
  23. package/build/lib/param-manager.js +1 -28
  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/util.js +3 -58
  28. package/build/model/case-result.js +1 -2
  29. package/build/model/failure.js +1 -2
  30. package/build/model/status.js +1 -2
  31. package/build/model/step-result.js +1 -2
  32. package/build/model/suite-result.js +1 -2
  33. package/build/model/test-result.js +1 -2
  34. package/build/model/testcase.js +1 -2
  35. package/build/model/testsuite.js +1 -2
  36. package/build/ox_modules/index.js +13 -33
  37. package/build/ox_modules/module-assert.js +8 -24
  38. package/build/ox_modules/module-date.js +3 -8
  39. package/build/ox_modules/module-db.js +7 -28
  40. package/build/ox_modules/module-email.js +10 -36
  41. package/build/ox_modules/module-eyes.js +5 -46
  42. package/build/ox_modules/module-http.js +42 -104
  43. package/build/ox_modules/module-log.js +5 -22
  44. package/build/ox_modules/module-mailinator.js +10 -32
  45. package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
  46. package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
  47. package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
  48. package/build/ox_modules/module-mob/commands/assertText.js +1 -3
  49. package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
  50. package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
  51. package/build/ox_modules/module-mob/commands/back.js +1 -2
  52. package/build/ox_modules/module-mob/commands/clear.js +1 -4
  53. package/build/ox_modules/module-mob/commands/click.js +3 -4
  54. package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
  55. package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
  56. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
  57. package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
  58. package/build/ox_modules/module-mob/commands/debug.js +2 -2
  59. package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
  60. package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
  61. package/build/ox_modules/module-mob/commands/execute.js +1 -2
  62. package/build/ox_modules/module-mob/commands/findElement.js +1 -3
  63. package/build/ox_modules/module-mob/commands/findElements.js +1 -4
  64. package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
  65. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
  66. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
  67. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
  68. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
  69. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
  70. package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
  71. package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
  72. package/build/ox_modules/module-mob/commands/getSource.js +1 -2
  73. package/build/ox_modules/module-mob/commands/getText.js +1 -4
  74. package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
  75. package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
  76. package/build/ox_modules/module-mob/commands/getValue.js +5 -9
  77. package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
  78. package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
  79. package/build/ox_modules/module-mob/commands/index.js +19 -94
  80. package/build/ox_modules/module-mob/commands/installApp.js +1 -2
  81. package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
  82. package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
  83. package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
  84. package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
  85. package/build/ox_modules/module-mob/commands/isExist.js +1 -3
  86. package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
  87. package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
  88. package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
  89. package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
  90. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
  91. package/build/ox_modules/module-mob/commands/open.js +1 -3
  92. package/build/ox_modules/module-mob/commands/pause.js +1 -2
  93. package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
  94. package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
  95. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
  96. package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
  97. package/build/ox_modules/module-mob/commands/select.js +1 -4
  98. package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
  99. package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
  100. package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
  101. package/build/ox_modules/module-mob/commands/setContext.js +1 -2
  102. package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
  103. package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
  104. package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
  105. package/build/ox_modules/module-mob/commands/shake.js +1 -2
  106. package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
  107. package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
  108. package/build/ox_modules/module-mob/commands/swipe.js +1 -2
  109. package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
  110. package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
  111. package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
  112. package/build/ox_modules/module-mob/commands/tap.js +1 -2
  113. package/build/ox_modules/module-mob/commands/type.js +3 -7
  114. package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
  115. package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
  116. package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
  117. package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
  118. package/build/ox_modules/module-mob.js +72 -142
  119. package/build/ox_modules/module-pdf.js +23 -62
  120. package/build/ox_modules/module-proxy.js +8 -68
  121. package/build/ox_modules/module-serial.js +7 -32
  122. package/build/ox_modules/module-shell.js +8 -27
  123. package/build/ox_modules/module-soap.js +14 -47
  124. package/build/ox_modules/module-twilio.js +10 -53
  125. package/build/ox_modules/module-utils.js +16 -51
  126. package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
  127. package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
  128. package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
  129. package/build/ox_modules/module-web/commands/assertExist.js +1 -2
  130. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
  131. package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
  132. package/build/ox_modules/module-web/commands/assertText.js +1 -3
  133. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
  134. package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
  135. package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
  136. package/build/ox_modules/module-web/commands/assertValue.js +1 -3
  137. package/build/ox_modules/module-web/commands/back.js +1 -2
  138. package/build/ox_modules/module-web/commands/clear.js +1 -5
  139. package/build/ox_modules/module-web/commands/click.js +4 -13
  140. package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
  141. package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
  142. package/build/ox_modules/module-web/commands/debug.js +2 -2
  143. package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
  144. package/build/ox_modules/module-web/commands/deselect.js +1 -2
  145. package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
  146. package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
  147. package/build/ox_modules/module-web/commands/execute.js +1 -2
  148. package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
  149. package/build/ox_modules/module-web/commands/findElement.js +1 -3
  150. package/build/ox_modules/module-web/commands/findElements.js +1 -4
  151. package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
  152. package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
  153. package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
  154. package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
  155. package/build/ox_modules/module-web/commands/getCookies.js +1 -2
  156. package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
  157. package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
  158. package/build/ox_modules/module-web/commands/getHTML.js +1 -2
  159. package/build/ox_modules/module-web/commands/getSource.js +1 -2
  160. package/build/ox_modules/module-web/commands/getText.js +1 -4
  161. package/build/ox_modules/module-web/commands/getTitle.js +1 -2
  162. package/build/ox_modules/module-web/commands/getUrl.js +1 -2
  163. package/build/ox_modules/module-web/commands/getValue.js +1 -5
  164. package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
  165. package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
  166. package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
  167. package/build/ox_modules/module-web/commands/index.js +26 -99
  168. package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
  169. package/build/ox_modules/module-web/commands/isChecked.js +1 -2
  170. package/build/ox_modules/module-web/commands/isExist.js +1 -3
  171. package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
  172. package/build/ox_modules/module-web/commands/isSelected.js +1 -2
  173. package/build/ox_modules/module-web/commands/isVisible.js +1 -3
  174. package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
  175. package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
  176. package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
  177. package/build/ox_modules/module-web/commands/newWindow.js +1 -2
  178. package/build/ox_modules/module-web/commands/open.js +1 -4
  179. package/build/ox_modules/module-web/commands/pause.js +1 -2
  180. package/build/ox_modules/module-web/commands/point.js +1 -2
  181. package/build/ox_modules/module-web/commands/pointJS.js +2 -8
  182. package/build/ox_modules/module-web/commands/refresh.js +1 -2
  183. package/build/ox_modules/module-web/commands/rightClick.js +3 -8
  184. package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
  185. package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
  186. package/build/ox_modules/module-web/commands/select.js +1 -5
  187. package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
  188. package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
  189. package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
  190. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
  191. package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
  192. package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
  193. package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
  194. package/build/ox_modules/module-web/commands/type.js +1 -5
  195. package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
  196. package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
  197. package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
  198. package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
  199. package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
  200. package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
  201. package/build/ox_modules/module-web/commands/waitForText.js +3 -5
  202. package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
  203. package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
  204. package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
  205. package/build/ox_modules/module-web.js +86 -192
  206. package/build/ox_modules/module-win/commands/assertText.js +1 -3
  207. package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
  208. package/build/ox_modules/module-win/commands/assertValue.js +9 -15
  209. package/build/ox_modules/module-win/commands/back.js +1 -2
  210. package/build/ox_modules/module-win/commands/clear.js +1 -4
  211. package/build/ox_modules/module-win/commands/click.js +1 -2
  212. package/build/ox_modules/module-win/commands/clickLong.js +1 -2
  213. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
  214. package/build/ox_modules/module-win/commands/findElement.js +1 -3
  215. package/build/ox_modules/module-win/commands/findElements.js +1 -4
  216. package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
  217. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
  218. package/build/ox_modules/module-win/commands/getLocation.js +1 -2
  219. package/build/ox_modules/module-win/commands/getSource.js +1 -2
  220. package/build/ox_modules/module-win/commands/getText.js +1 -4
  221. package/build/ox_modules/module-win/commands/getValue.js +5 -9
  222. package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
  223. package/build/ox_modules/module-win/commands/index.js +5 -43
  224. package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
  225. package/build/ox_modules/module-win/commands/isChecked.js +1 -2
  226. package/build/ox_modules/module-win/commands/isClickable.js +1 -2
  227. package/build/ox_modules/module-win/commands/isExist.js +1 -3
  228. package/build/ox_modules/module-win/commands/isSelected.js +1 -2
  229. package/build/ox_modules/module-win/commands/isVisible.js +1 -3
  230. package/build/ox_modules/module-win/commands/open.js +1 -2
  231. package/build/ox_modules/module-win/commands/pause.js +1 -2
  232. package/build/ox_modules/module-win/commands/rightClick.js +1 -2
  233. package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
  234. package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
  235. package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
  236. package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
  237. package/build/ox_modules/module-win/commands/tap.js +1 -2
  238. package/build/ox_modules/module-win/commands/type.js +1 -4
  239. package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
  240. package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
  241. package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
  242. package/build/ox_modules/module-win.js +48 -87
  243. package/build/ox_modules/utils.js +22 -76
  244. package/build/ox_reporters/reporter-excel.js +1 -58
  245. package/build/ox_reporters/reporter-html.js +1 -28
  246. package/build/ox_reporters/reporter-json.js +1 -14
  247. package/build/ox_reporters/reporter-junit.js +1 -24
  248. package/build/ox_reporters/reporter-pdf.js +1 -19
  249. package/build/ox_reporters/reporter-xml.js +1 -17
  250. package/build/ox_services/service-devtools/submodule-network.js +3 -84
  251. package/build/ox_services/service-devtools.js +1 -23
  252. package/build/reporter/FileReporterBase.js +5 -44
  253. package/build/reporter/ReportAggregator.js +1 -65
  254. package/build/reporter/ReporterBase.js +1 -6
  255. package/build/runners/WorkerProcess.js +1 -99
  256. package/build/runners/cucumber/CucumberEventListener.js +4 -29
  257. package/build/runners/cucumber/CucumberReporter.js +1 -56
  258. package/build/runners/cucumber/CucumberWorker.js +1 -66
  259. package/build/runners/cucumber/index.js +1 -30
  260. package/build/runners/cucumber/worker.js +1 -18
  261. package/build/runners/index.js +1 -6
  262. package/build/runners/oxygen/OxygenWorker.js +20 -54
  263. package/build/runners/oxygen/index.js +17 -177
  264. package/build/runners/oxygen/worker.js +2 -25
  265. package/package.json +28 -29
@@ -6,7 +6,9 @@
6
6
  * the Free Software Foundation, either version 3 of the License, or
7
7
  * (at your option) any later version.
8
8
  */
9
+
9
10
  'use strict';
11
+
10
12
  /**
11
13
  * @name mob
12
14
  * @description Provides methods for mobile automation.
@@ -28,6 +30,8 @@
28
30
  * * `/XPATH` - Locates element using an XPath 1.0 expression.
29
31
  * * `id=ID` - Locates element by its ID.
30
32
  * * `~ACCESSIBILITY_ID` - Locates element by its Accessibility Id.
33
+ * * `-ios predicate string:PREDICATE_STRING` - Locates element using a [predicate query](https://github.com/facebookarchive/WebDriverAgent/wiki/Predicate-Queries-Construction-Rules).
34
+ * * `-ios class chain:CLASS_CHAIN` - Locates element using a [class chain expression](https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules).
31
35
  *
32
36
  * Hybrid![](../../.gitbook/assets/hybrid.png) and Web![](../../.gitbook/assets/web.png) application locators for![](../../.gitbook/assets/android.png) ![](../../.gitbook/assets/apple.png)
33
37
  *
@@ -47,38 +51,23 @@
47
51
  * * `PATTERN` - Verbatim matching.
48
52
  *
49
53
  */
50
-
51
54
  Object.defineProperty(exports, "__esModule", {
52
55
  value: true
53
56
  });
54
57
  exports.default = void 0;
55
-
56
58
  require("source-map-support/register");
57
-
58
59
  var _url = _interopRequireDefault(require("url"));
59
-
60
60
  var wdio = _interopRequireWildcard(require("webdriverio"));
61
-
62
61
  var _WebDriverModule = _interopRequireDefault(require("../core/WebDriverModule"));
63
-
64
62
  var _utils = _interopRequireDefault(require("./utils"));
65
-
66
63
  var _helper = _interopRequireDefault(require("../errors/helper"));
67
-
68
64
  var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
69
-
70
65
  var _perfectoReporting = _interopRequireDefault(require("perfecto-reporting"));
71
-
72
66
  var _request = _interopRequireDefault(require("request"));
73
-
74
67
  var _imgMerge = _interopRequireDefault(require("../lib/img-merge"));
75
-
76
68
  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); }
77
-
78
69
  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; }
79
-
80
70
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
81
-
82
71
  const MODULE_NAME = 'mob';
83
72
  const DEFAULT_APPIUM_URL = 'http://localhost:4723/wd/hub';
84
73
  const DEFAULT_BROWSER_NAME = 'default';
@@ -94,47 +83,41 @@ class MobileModule extends _WebDriverModule.default {
94
83
  this.networkRequests = null;
95
84
  this.helpers = {};
96
85
  this.appContext = 'NATIVE_APP';
97
-
98
- this._loadHelperFunctions(); // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
99
-
100
-
86
+ this._loadHelperFunctions();
87
+ // support backward compatibility (some module commands might refer to this.OxError and this.errHelper)
101
88
  this.OxError = _OxygenError.default;
102
- this.errHelper = _helper.default; // holds element operation timeout value
103
-
89
+ this.errHelper = _helper.default;
90
+ // holds element operation timeout value
104
91
  this.waitForTimeout = DEFAULT_WAIT_TIMEOUT;
105
92
  }
106
-
107
93
  get name() {
108
94
  return MODULE_NAME;
109
95
  }
96
+
110
97
  /**
111
98
  * @function getDriver
112
99
  * @summary Returns the underlying WDIO driver.
113
100
  * @return {Object} WDIO driver.
114
101
  */
115
-
116
-
117
102
  getDriver() {
118
103
  return super.getDriver();
119
104
  }
105
+
120
106
  /**
121
107
  * @function getCapabilities
122
108
  * @summary Returns currently defined capabilities.
123
109
  * @return {Object} Current capabilities object.
124
110
  */
125
-
126
-
127
111
  getCapabilities() {
128
112
  return this.caps || super.getCapabilities();
129
113
  }
114
+
130
115
  /**
131
116
  * @function init
132
117
  * @summary Initializes a new Appium session.
133
118
  * @param {String=} caps - Desired capabilities. If not specified capabilities will be taken from suite definition.
134
119
  * @param {String=} appiumUrl - Remote Appium server URL (default: http://localhost:4723/wd/hub).
135
120
  */
136
-
137
-
138
121
  async init(caps, appiumUrl) {
139
122
  // if reopenSession is true - reinitilize the module
140
123
  if (this.isInitialized) {
@@ -146,11 +129,10 @@ class MobileModule extends _WebDriverModule.default {
146
129
  } else {
147
130
  this.logger.debug('mob.init was called for already initialized module. reopenSession is false so the call is ignored.');
148
131
  }
149
-
150
132
  return;
151
- } // FIXME: this should be refactored
152
-
133
+ }
153
134
 
135
+ // FIXME: this should be refactored
154
136
  if (this.ctx.caps && this.ctx.caps['perfectoMobile:options']) {
155
137
  if (caps) {
156
138
  delete caps.platformName;
@@ -159,7 +141,6 @@ class MobileModule extends _WebDriverModule.default {
159
141
  delete caps.browserName;
160
142
  delete caps.automationName;
161
143
  delete caps.udid;
162
-
163
144
  if (caps.app) {
164
145
  caps.enableAppiumBehavior = true;
165
146
  } else {
@@ -171,60 +152,58 @@ class MobileModule extends _WebDriverModule.default {
171
152
  this.ctx.caps.enableAppiumBehavior = true;
172
153
  }
173
154
  }
174
-
175
155
  if (!appiumUrl) {
176
156
  appiumUrl = this.options.appiumUrl || DEFAULT_APPIUM_URL;
177
- } // merge capabilities from context and from init function argument, give preference to context-passed capabilities
178
-
157
+ }
179
158
 
159
+ // merge capabilities from context and from init function argument, give preference to context-passed capabilities
180
160
  this.caps = {};
181
-
182
161
  if (this.ctx.caps) {
183
- this.caps = { ...this.ctx.caps
162
+ this.caps = {
163
+ ...this.ctx.caps
184
164
  };
185
165
  }
186
-
187
166
  if (caps) {
188
- this.caps = { ...this.caps,
167
+ this.caps = {
168
+ ...this.caps,
189
169
  ...caps
190
170
  };
191
- } // make sure to clear the existing device logs, if collectDeviceLogs option is true (we want to include logs only relevant for this session)
192
-
171
+ }
193
172
 
173
+ // make sure to clear the existing device logs, if collectDeviceLogs option is true (we want to include logs only relevant for this session)
194
174
  if (this.options.collectDeviceLogs) {
195
175
  this.caps['appium:clearDeviceLogsOnStart'] = true;
196
- } // if both browserName and appPackage were specified - remove browserName
197
-
176
+ }
198
177
 
199
- if (this.caps.browserName && (this.caps.appPackage || this.caps.app)) {
178
+ // if both browserName and appPackage/app/bundleId were specified - assume we want to run the application and remove browserName
179
+ if (this.caps.browserName && (this.caps.appPackage || this.caps.app || this.caps.bundleId)) {
200
180
  delete this.caps.browserName;
201
- } // if no appPackage nor app capability, not browserName are defined, assume we want to run the test against default browser
202
- else if (!this.caps.browserName && !this.caps.appPackage && !this.caps.app) {
203
- this.caps.browserName = DEFAULT_BROWSER_NAME;
204
- } // webdriver expects lower case names
205
-
206
-
181
+ }
182
+ // if no appPackage/app/bundleId capability nor browserName are defined, assume we want to run the test against default browser
183
+ else if (!this.caps.browserName && !this.caps.appPackage && !this.caps.app && !this.caps.bundleId) {
184
+ this.caps.browserName = DEFAULT_BROWSER_NAME;
185
+ }
186
+ // webdriver expects lower case names
207
187
  if (this.caps.browserName && typeof this.caps.browserName === 'string') {
208
188
  this.caps.browserName = this.caps.browserName.toLowerCase();
209
- } // adjust capabilities to enable collecting browser and performance stats in Chrome
210
-
211
-
189
+ }
190
+ // adjust capabilities to enable collecting browser and performance stats in Chrome
212
191
  if (this.options.recordHAR && this.caps.browserName === 'chrome') {
213
192
  this.caps['goog:loggingPrefs'] = {
214
193
  // for ChromeDriver >= 75
215
194
  browser: 'ALL',
216
195
  performance: 'ALL'
217
196
  };
218
- } // populate WDIO options
219
-
197
+ }
220
198
 
199
+ // populate WDIO options
221
200
  const url = _url.default.parse(appiumUrl);
222
-
223
201
  const protocol = url.protocol.replace(/:$/, '');
224
202
  const host = url.hostname;
225
203
  const port = parseInt(url.port || (protocol === 'https' ? 443 : 80));
226
- const path = url.pathname; // auth is needed mostly for cloud providers such as LambdaTest
204
+ const path = url.pathname;
227
205
 
206
+ // auth is needed mostly for cloud providers such as LambdaTest
228
207
  if (url.auth) {
229
208
  const auth = url.auth.split(':');
230
209
  this.options.wdioOpts = {
@@ -232,8 +211,8 @@ class MobileModule extends _WebDriverModule.default {
232
211
  key: auth[1]
233
212
  };
234
213
  }
235
-
236
- var wdioOpts = { ...(this.options.wdioOpts || {}),
214
+ var wdioOpts = {
215
+ ...(this.options.wdioOpts || {}),
237
216
  protocol: protocol,
238
217
  hostname: host,
239
218
  port: port,
@@ -246,11 +225,8 @@ class MobileModule extends _WebDriverModule.default {
246
225
  connectionRetryTimeout: 310 * 1000,
247
226
  connectionRetryCount: 1
248
227
  };
249
-
250
228
  let provider = _utils.default.determineProvider(wdioOpts);
251
-
252
229
  let name = 'name';
253
-
254
230
  if (provider === _utils.default.provider.PERFECTO) {
255
231
  wdioOpts.capabilities.maxInstances = 1;
256
232
  wdioOpts.path = '/nexperience/perfectomobile/wd/hub';
@@ -264,26 +240,22 @@ class MobileModule extends _WebDriverModule.default {
264
240
  name = wdioOpts.capabilities['perfectoMobile:options']['name'];
265
241
  delete wdioOpts.capabilities['perfectoMobile:options'];
266
242
  }
267
-
268
243
  if (wdioOpts.capabilities['bstack:options'] && wdioOpts.capabilities['bstack:options']['name']) {
269
244
  name = wdioOpts.capabilities['bstack:options']['name'];
270
245
  delete wdioOpts.capabilities['bstack:options'];
271
246
  }
247
+ this.wdioOpts = wdioOpts;
272
248
 
273
- this.wdioOpts = wdioOpts; // init webdriver
274
-
249
+ // init webdriver
275
250
  try {
276
251
  this.driver = await wdio.remote(wdioOpts);
277
252
  this.driver.provider = provider;
278
-
279
253
  if (this.options.seleniumBrowserTimeout) {
280
254
  this.driver.seleniumBrowserTimeout = this.options.seleniumBrowserTimeout;
281
255
  }
282
-
283
256
  if (this.options.seleniumTimeout) {
284
257
  this.driver.seleniumTimeout = this.options.seleniumTimeout;
285
258
  }
286
-
287
259
  if (provider === _utils.default.provider.PERFECTO) {
288
260
  const perfectoExecutionContext = await new _perfectoReporting.default.Perfecto.PerfectoExecutionContext({
289
261
  webdriver: {
@@ -298,48 +270,42 @@ class MobileModule extends _WebDriverModule.default {
298
270
  } catch (e) {
299
271
  throw _helper.default.getAppiumInitError(e);
300
272
  }
273
+ this.appContext = await this.driver.getContext();
301
274
 
302
- this.appContext = await this.driver.getContext(); // if we are running on Android 7+ emulator, and thus/or using a WebView Browser Tester -
275
+ // if we are running on Android 7+ emulator, and thus/or using a WebView Browser Tester -
303
276
  // perform an actual appContext switch to WEB
304
277
  // so Appium will delegate commands to Chrome Driver instead of Appium Driver
305
-
306
278
  if (this.caps.browserName === 'chromium-webview') {
307
279
  await this.setWebViewContext();
308
280
  }
309
-
310
- if (provider === _utils.default.provider.BROWSERSTACK) {// ignore
281
+ if (provider === _utils.default.provider.BROWSERSTACK) {
282
+ // ignore
311
283
  // fails on browserstack
312
284
  } else {
313
285
  await this.driver.setTimeout({
314
286
  'implicit': this.waitForTimeout
315
287
  });
316
288
  }
317
-
318
289
  super.init(this.driver);
319
290
  }
291
+
320
292
  /**
321
293
  * @function dispose
322
294
  * @summary Ends the current session.
323
295
  * @param {String=} status - Test status, either `passed` or `failed`.
324
296
  */
325
-
326
-
327
297
  async dispose(status) {
328
298
  if (!status) {
329
299
  status = 'passed';
330
-
331
300
  if (this.rs.steps && Array.isArray(this.rs.steps) && this.rs.steps.length > 0) {
332
301
  const failedFinded = this.rs.steps.find(item => item.status === 'failed');
333
-
334
302
  if (failedFinded) {
335
303
  status = 'failed';
336
304
  }
337
305
  }
338
306
  }
339
-
340
307
  if (this.driver && this.isInitialized) {
341
308
  status = status.toUpperCase();
342
-
343
309
  if (this.driver.provider === _utils.default.provider.PERFECTO) {
344
310
  await this.reportingClient.testStop({
345
311
  status: status === 'PASSED' ? _perfectoReporting.default.Constants.results.passed : _perfectoReporting.default.Constants.results.failed
@@ -348,10 +314,10 @@ class MobileModule extends _WebDriverModule.default {
348
314
  await this._sendResultStatusToBrowserstack(status);
349
315
  await this.deleteSession();
350
316
  }
351
-
352
317
  try {
353
318
  if (!['CANCELED', 'FAILED'].includes(status)) {
354
- if (this.seleniumSessionTimeout) {// ignore
319
+ if (this.seleniumSessionTimeout) {
320
+ // ignore
355
321
  // deleteSession will take 5 min to call
356
322
  } else {
357
323
  await this.driver.deleteSession();
@@ -368,6 +334,7 @@ class MobileModule extends _WebDriverModule.default {
368
334
  return;
369
335
  }
370
336
  }
337
+
371
338
  /**
372
339
  * @summary Opens new transaction.
373
340
  * @description The transaction will persist till a new one is opened. Transaction names must be
@@ -376,24 +343,20 @@ class MobileModule extends _WebDriverModule.default {
376
343
  * @param {String} name - The transaction name.
377
344
  * @for android, ios, hybrid, web
378
345
  */
379
-
380
-
381
346
  transaction(name) {
382
347
  global._lastTransactionName = name;
383
348
  }
349
+
384
350
  /*
385
351
  * Private
386
352
  */
387
353
 
388
-
389
354
  _isAction(name) {
390
355
  return ACTION_COMMANDS.includes(name);
391
356
  }
392
-
393
357
  _takeScreenshotSilent(name) {
394
358
  if (!NO_SCREENSHOT_COMMANDS.includes(name)) {
395
359
  let error;
396
-
397
360
  try {
398
361
  if (this.driver && this.driver.takeScreenshot) {
399
362
  let retval;
@@ -402,37 +365,28 @@ class MobileModule extends _WebDriverModule.default {
402
365
  const waitUntilRetVal = this.driver.waitUntil(async () => {
403
366
  try {
404
367
  let images = [];
405
-
406
368
  const pushImageToImages = async (fetchTitle = true) => {
407
369
  const image = await this.driver.takeScreenshot();
408
-
409
370
  if (fetchTitle) {
410
371
  const title = await this.driver.getTitle();
411
-
412
372
  if (title) {
413
373
  const textToImage = require('text-to-image');
414
-
415
374
  let titleImage = await textToImage.generate(title, {
416
375
  debug: false,
417
376
  fontFamily: 'Arial'
418
377
  });
419
-
420
378
  if (titleImage && typeof titleImage === 'string') {
421
379
  titleImage = titleImage.replace('data:image/png;base64,', '');
422
380
  images.push(titleImage);
423
381
  }
424
382
  }
425
383
  }
426
-
427
384
  images.push(image);
428
385
  };
429
-
430
386
  const isWebViewContext = await this.isWebViewContext();
431
-
432
387
  if (isWebViewContext) {
433
388
  // collect all (screenshot and title) images
434
389
  const handles = await this.driver.getWindowHandles();
435
-
436
390
  if (handles && Array.isArray(handles) && handles.length > 0) {
437
391
  for (const handle of handles) {
438
392
  await this.driver.switchToWindow(handle);
@@ -441,17 +395,15 @@ class MobileModule extends _WebDriverModule.default {
441
395
  }
442
396
  } else {
443
397
  await pushImageToImages(false);
444
- } // merge all images into one
445
-
398
+ }
446
399
 
400
+ // merge all images into one
447
401
  const mergedImage = await (0, _imgMerge.default)(images, {
448
402
  direction: true
449
403
  });
450
-
451
404
  if (mergedImage && typeof mergedImage === 'string') {
452
405
  retval = mergedImage.replace('data:image/jpeg;base64,', '');
453
406
  }
454
-
455
407
  return true;
456
408
  } catch (e) {
457
409
  error = e;
@@ -460,7 +412,6 @@ class MobileModule extends _WebDriverModule.default {
460
412
  }, {
461
413
  timeout: 30 * 1000
462
414
  });
463
-
464
415
  if (waitUntilRetVal && waitUntilRetVal.then) {
465
416
  waitUntilRetVal.then(() => {
466
417
  resolve();
@@ -472,35 +423,32 @@ class MobileModule extends _WebDriverModule.default {
472
423
  }
473
424
  });
474
425
  });
475
-
476
426
  if (error) {
477
427
  this.logger.error('Cannot get screenshot', error);
478
428
  }
479
-
480
429
  return retval;
481
430
  }
482
431
  } catch (e) {
483
432
  this.logger.error('Cannot get screenshot', e);
484
-
485
433
  if (error) {
486
434
  this.logger.error('Cannot get screenshot inner error', error);
487
- } // ignore
488
-
435
+ }
436
+ // ignore
489
437
  }
490
438
  }
491
- } // _getLogs(name) {
439
+ }
440
+
441
+ // _getLogs(name) {
492
442
  // if (!NO_LOGS_COMMANDS.includes(name)) {
493
443
  // return this.getLogs();
494
444
  // }
495
445
  // }
496
446
 
497
-
498
447
  _adjustAppiumLog(log, src) {
499
448
  if (!log || typeof log !== 'object') {
500
449
  return null;
501
- } // TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
502
-
503
-
450
+ }
451
+ // TODO: convert log.timestamp from the device time zone to the local one (so we can later correlate between steps and logs)
504
452
  return {
505
453
  time: log.timestamp,
506
454
  msg: log.message,
@@ -508,30 +456,25 @@ class MobileModule extends _WebDriverModule.default {
508
456
  src: src
509
457
  };
510
458
  }
511
-
512
459
  _iterationStart() {
513
460
  // clear transaction name saved in previous iteration if any
514
461
  global._lastTransactionName = null;
515
462
  }
516
-
517
463
  async _iterationEnd(error) {
518
- if (error && error.type === _helper.default.errorCode.SELENIUM_SESSION_TIMEOUT) {
464
+ if (error && error.type === _helper.default.errorCode.APPIUM_SESSION_TIMEOUT) {
519
465
  this.seleniumSessionTimeout = true;
520
466
  return;
521
467
  } else {
522
468
  this.seleniumSessionTimeout = false;
523
- } // ignore the rest if mob module is not initialized
524
-
525
-
469
+ }
470
+ // ignore the rest if mob module is not initialized
526
471
  if (!this.isInitialized) {
527
472
  return;
528
- } // collect all the device logs for this session
529
-
530
-
473
+ }
474
+ // collect all the device logs for this session
531
475
  if (this.options.collectDeviceLogs) {
532
476
  try {
533
477
  const logs = await this.getDeviceLogs();
534
-
535
478
  if (logs && Array.isArray(logs)) {
536
479
  for (let log of logs) {
537
480
  this.rs.logs.push(this._adjustAppiumLog(log, 'device'));
@@ -541,13 +484,12 @@ class MobileModule extends _WebDriverModule.default {
541
484
  // ignore errors
542
485
  this.logger.error('Cannot retrieve device logs.', e);
543
486
  }
544
- } // collect all the browser logs for this session
545
-
487
+ }
546
488
 
489
+ // collect all the browser logs for this session
547
490
  if (this.options.collectBrowserLogs) {
548
491
  try {
549
492
  const logs = await this.getBrowserLogs();
550
-
551
493
  if (logs && Array.isArray(logs)) {
552
494
  for (let log of logs) {
553
495
  this.rs.logs.push(this._adjustAppiumLog(log, 'browser'));
@@ -557,13 +499,12 @@ class MobileModule extends _WebDriverModule.default {
557
499
  // ignore errors
558
500
  this.logger.error('Cannot retrieve browser logs.', e);
559
501
  }
560
- } // collect all Appium logs for this session
561
-
502
+ }
562
503
 
504
+ // collect all Appium logs for this session
563
505
  if (this.options.collectAppiumLogs) {
564
506
  try {
565
507
  const logs = this.getAppiumLogs();
566
-
567
508
  if (logs && Array.isArray(logs)) {
568
509
  for (var logEntry of logs) {
569
510
  this.rs.logs.push(this._adjustAppiumLog(logEntry, 'appium'));
@@ -575,38 +516,34 @@ class MobileModule extends _WebDriverModule.default {
575
516
  }
576
517
  }
577
518
  }
578
-
579
519
  _getWdioLocator(locator) {
580
520
  if (!locator) {
581
521
  throw new _OxygenError.default(_helper.default.errorCode.SCRIPT_ERROR, 'Invalid argument - locator not specified');
582
522
  }
583
-
584
523
  if (typeof locator !== 'string') {
585
524
  return locator;
586
525
  }
587
-
588
526
  if (locator.indexOf('/') === 0) {
589
527
  return locator; // leave xpath locator as is
590
528
  }
591
529
 
592
530
  const platform = this.caps && this.caps.platformName ? this.caps.platformName.toLowerCase() : null;
593
-
594
531
  if (this.appContext === 'NATIVE_APP' && platform === 'android') {
595
532
  if (locator.indexOf('id=') === 0) {
596
533
  // prepend package name if it's not specified
597
534
  // NOTE: getCurrentPackage() seems to crash possibly due to a wdio bug.
598
535
  // so we get package name from caps instead.
599
536
  locator = locator.substr('id='.length);
600
-
601
537
  if (locator.indexOf(':id/') === -1) {
602
538
  locator = this.caps.appPackage + ':id/' + locator;
603
539
  }
604
-
605
540
  return 'android=new UiSelector().resourceId("' + locator + '")';
606
- } else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0) // accessibility id
541
+ } else if (locator.indexOf('class=') === 0) return 'android=new UiSelector().className("' + locator.substr('class='.length) + '")';else if (locator.indexOf('text=') === 0) return 'android=new UiSelector().text("' + locator.substr('text='.length) + '")';else if (locator.indexOf('text-contains=') === 0) return 'android=new UiSelector().textContains("' + locator.substr('text-contains='.length) + '")';else if (locator.indexOf('desc=') === 0) return 'android=new UiSelector().description("' + locator.substr('desc='.length) + '")';else if (locator.indexOf('desc-contains=') === 0) return 'android=new UiSelector().descriptionContains("' + locator.substr('desc-contains='.length) + '")';else if (locator.indexOf('scrollable') === 0) return 'android=new UiSelector().scrollable(true)';else if (locator.indexOf('~') === 0)
542
+ // accessibility id
607
543
  return locator;
608
544
  } else if (this.appContext === 'NATIVE_APP' && platform === 'ios') {
609
- if (locator.indexOf('~') === 0) // accessibility id
545
+ if (locator.indexOf('~') === 0)
546
+ // accessibility id
610
547
  return locator;
611
548
  } else if (this.appContext !== 'NATIVE_APP') {
612
549
  // Hybrid or Web application
@@ -616,7 +553,6 @@ class MobileModule extends _WebDriverModule.default {
616
553
 
617
554
  return locator;
618
555
  }
619
-
620
556
  _loadHelperFunctions() {
621
557
  this.helpers.getWdioLocator = this._getWdioLocator;
622
558
  this.helpers.matchPattern = _utils.default.matchPattern;
@@ -637,7 +573,6 @@ class MobileModule extends _WebDriverModule.default {
637
573
  this.helpers.contextList = _utils.default.contextList;
638
574
  this.helpers.getLogTypes = _utils.default.getLogTypes;
639
575
  }
640
-
641
576
  async deleteSession() {
642
577
  try {
643
578
  if (this.driver && this.driver.deleteSession) {
@@ -647,14 +582,12 @@ class MobileModule extends _WebDriverModule.default {
647
582
  this.logger.error('deleteSession error', e);
648
583
  }
649
584
  }
650
-
651
585
  async _sendResultStatusToBrowserstack(status) {
652
586
  return new Promise((resolve, reject) => {
653
587
  const requestBody = {
654
588
  status: status === 'PASSED' ? 'passed' : 'failed'
655
589
  };
656
590
  let options;
657
-
658
591
  if (this.wdioOpts.capabilities.browserName) {
659
592
  options = {
660
593
  url: `https://api.browserstack.com/automate/sessions/${this.driver.sessionId}.json`,
@@ -682,7 +615,6 @@ class MobileModule extends _WebDriverModule.default {
682
615
  }
683
616
  };
684
617
  }
685
-
686
618
  try {
687
619
  (0, _request.default)(options, (err, res, body) => {
688
620
  resolve();
@@ -693,8 +625,6 @@ class MobileModule extends _WebDriverModule.default {
693
625
  }
694
626
  });
695
627
  }
696
-
697
628
  }
698
-
699
629
  exports.default = MobileModule;
700
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tb2IuanMiXSwibmFtZXMiOlsiTU9EVUxFX05BTUUiLCJERUZBVUxUX0FQUElVTV9VUkwiLCJERUZBVUxUX0JST1dTRVJfTkFNRSIsIk5PX1NDUkVFTlNIT1RfQ09NTUFORFMiLCJBQ1RJT05fQ09NTUFORFMiLCJERUZBVUxUX1dBSVRfVElNRU9VVCIsIk1vYmlsZU1vZHVsZSIsIldlYkRyaXZlck1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsInRyYW5zYWN0aW9ucyIsImxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lIiwibmV0d29ya1JlcXVlc3RzIiwiaGVscGVycyIsImFwcENvbnRleHQiLCJfbG9hZEhlbHBlckZ1bmN0aW9ucyIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJ3YWl0Rm9yVGltZW91dCIsIm5hbWUiLCJnZXREcml2ZXIiLCJnZXRDYXBhYmlsaXRpZXMiLCJjYXBzIiwiaW5pdCIsImFwcGl1bVVybCIsImlzSW5pdGlhbGl6ZWQiLCJyZW9wZW5TZXNzaW9uIiwiZGVidWciLCJkcml2ZXIiLCJyZWxvYWRTZXNzaW9uIiwiX2lzSW5pdGlhbGl6ZWQiLCJjdHgiLCJwbGF0Zm9ybU5hbWUiLCJwbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VOYW1lIiwiYnJvd3Nlck5hbWUiLCJhdXRvbWF0aW9uTmFtZSIsInVkaWQiLCJhcHAiLCJlbmFibGVBcHBpdW1CZWhhdmlvciIsInVzZUFwcGl1bUZvcldlYiIsImNvbGxlY3REZXZpY2VMb2dzIiwiYXBwUGFja2FnZSIsInRvTG93ZXJDYXNlIiwicmVjb3JkSEFSIiwiYnJvd3NlciIsInBlcmZvcm1hbmNlIiwidXJsIiwiVVJMIiwicGFyc2UiLCJwcm90b2NvbCIsInJlcGxhY2UiLCJob3N0IiwiaG9zdG5hbWUiLCJwb3J0IiwicGFyc2VJbnQiLCJwYXRoIiwicGF0aG5hbWUiLCJhdXRoIiwic3BsaXQiLCJ3ZGlvT3B0cyIsInVzZXIiLCJrZXkiLCJjYXBhYmlsaXRpZXMiLCJsb2dMZXZlbCIsInJ1bm5lciIsIndhaXRmb3JUaW1lb3V0IiwiY29ubmVjdGlvblJldHJ5VGltZW91dCIsImNvbm5lY3Rpb25SZXRyeUNvdW50IiwicHJvdmlkZXIiLCJtb2RVdGlscyIsImRldGVybWluZVByb3ZpZGVyIiwiUEVSRkVDVE8iLCJtYXhJbnN0YW5jZXMiLCJvcGVuRGV2aWNlVGltZW91dCIsIm1hbnVmYWN0dXJlciIsIm1vZGVsIiwid2RpbyIsInJlbW90ZSIsInNlbGVuaXVtQnJvd3NlclRpbWVvdXQiLCJzZWxlbml1bVRpbWVvdXQiLCJwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQiLCJwZXJmZWN0b1JlcG9ydGluZyIsIlBlcmZlY3RvIiwiUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0Iiwid2ViZHJpdmVyIiwiZXhlY3V0ZVNjcmlwdCIsImNvbW1hbmQiLCJwYXJhbXMiLCJleGVjdXRlIiwicmVwb3J0aW5nQ2xpZW50IiwiUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQiLCJ0ZXN0U3RhcnQiLCJlIiwiZ2V0QXBwaXVtSW5pdEVycm9yIiwiZ2V0Q29udGV4dCIsInNldFdlYlZpZXdDb250ZXh0IiwiQlJPV1NFUlNUQUNLIiwic2V0VGltZW91dCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdGVwcyIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsImZhaWxlZEZpbmRlZCIsImZpbmQiLCJpdGVtIiwidG9VcHBlckNhc2UiLCJ0ZXN0U3RvcCIsIkNvbnN0YW50cyIsInJlc3VsdHMiLCJwYXNzZWQiLCJmYWlsZWQiLCJfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrIiwiZGVsZXRlU2Vzc2lvbiIsImluY2x1ZGVzIiwic2VsZW5pdW1TZXNzaW9uVGltZW91dCIsIndhcm4iLCJ0cmFuc2FjdGlvbiIsImdsb2JhbCIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiX2lzQWN0aW9uIiwiX3Rha2VTY3JlZW5zaG90U2lsZW50IiwiZXJyb3IiLCJ0YWtlU2NyZWVuc2hvdCIsInJldHZhbCIsImNhbGwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIndhaXRVbnRpbFJldFZhbCIsIndhaXRVbnRpbCIsImltYWdlcyIsInB1c2hJbWFnZVRvSW1hZ2VzIiwiZmV0Y2hUaXRsZSIsImltYWdlIiwidGl0bGUiLCJnZXRUaXRsZSIsInRleHRUb0ltYWdlIiwicmVxdWlyZSIsInRpdGxlSW1hZ2UiLCJnZW5lcmF0ZSIsImZvbnRGYW1pbHkiLCJwdXNoIiwiaXNXZWJWaWV3Q29udGV4dCIsImhhbmRsZXMiLCJnZXRXaW5kb3dIYW5kbGVzIiwiaGFuZGxlIiwic3dpdGNoVG9XaW5kb3ciLCJtZXJnZWRJbWFnZSIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJfYWRqdXN0QXBwaXVtTG9nIiwibG9nIiwic3JjIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsIm1lc3NhZ2UiLCJsZXZlbCIsIl9pdGVyYXRpb25TdGFydCIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJTRUxFTklVTV9TRVNTSU9OX1RJTUVPVVQiLCJsb2dzIiwiZ2V0RGV2aWNlTG9ncyIsImNvbGxlY3RCcm93c2VyTG9ncyIsImdldEJyb3dzZXJMb2dzIiwiY29sbGVjdEFwcGl1bUxvZ3MiLCJnZXRBcHBpdW1Mb2dzIiwibG9nRW50cnkiLCJfZ2V0V2Rpb0xvY2F0b3IiLCJsb2NhdG9yIiwiU0NSSVBUX0VSUk9SIiwiaW5kZXhPZiIsInBsYXRmb3JtIiwic3Vic3RyIiwiZ2V0V2Rpb0xvY2F0b3IiLCJtYXRjaFBhdHRlcm4iLCJnZXRFbGVtZW50IiwiZ2V0RWxlbWVudHMiLCJnZXRDaGlsZEVsZW1lbnQiLCJnZXRDaGlsZEVsZW1lbnRzIiwic2V0VGltZW91dEltcGxpY2l0IiwicmVzdG9yZVRpbWVvdXRJbXBsaWNpdCIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsImFzc2VydEFyZ3VtZW50Qm9vbCIsImFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsIiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiYXNzZXJ0Q29udGV4dCIsImNvbnRleHRMaXN0IiwiZ2V0TG9nVHlwZXMiLCJyZXF1ZXN0Qm9keSIsInNlc3Npb25JZCIsIm1ldGhvZCIsImpzb24iLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJib2R5IiwicmVzIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFHQSxNQUFNQSxXQUFXLEdBQUcsS0FBcEI7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyw4QkFBM0I7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxTQUE3QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQUMsTUFBRCxFQUFTLGFBQVQsQ0FBL0I7QUFDQSxNQUFNQyxlQUFlLEdBQUcsQ0FBQyxNQUFELEVBQVEsS0FBUixFQUFjLE9BQWQsRUFBc0IsT0FBdEIsRUFBOEIsUUFBOUIsRUFBdUMsVUFBdkMsQ0FBeEI7QUFDQSxNQUFNQyxvQkFBb0IsR0FBRyxLQUFLLElBQWxDLEMsQ0FBbUQ7O0FBRXBDLE1BQU1DLFlBQU4s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Q0FBMkIsbUJBQTNCLENBREo7QUFFSixvQkFBUSxLQUFLSCxRQUFMLENBQWNHLFlBQWQsQ0FBMkIsa0JBQTNCLENBRko7QUFHSiwrQkFBbUI7QUFIZjtBQU5GLFNBQVY7QUFZSDs7QUFFRCxVQUFJO0FBQ0EsOEJBQVEzRCxPQUFSLEVBQWlCLENBQUN1SixHQUFELEVBQU1vRCxHQUFOLEVBQVdELElBQVgsS0FBb0I7QUFDakM3RSxVQUFBQSxPQUFPO0FBQ1YsU0FGRDtBQUdILE9BSkQsQ0FJRSxPQUFPcEMsQ0FBUCxFQUFVO0FBQ1IsYUFBS3RGLE1BQUwsQ0FBWXFILEtBQVosQ0FBa0IsbURBQW1EL0IsQ0FBQyxDQUFDbUgsUUFBRixFQUFyRTtBQUNBL0UsUUFBQUEsT0FBTztBQUNWO0FBQ0osS0EzQ00sQ0FBUDtBQTRDSDs7QUFybEJxRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuJ3VzZSBzdHJpY3QnO1xyXG4vKipcclxuICogQG5hbWUgbW9iXHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBtb2JpbGUgYXV0b21hdGlvbi5cclxuICogQHNhbXBsZSAqKkxvY2F0b3JzOioqICBcclxuICogXHJcbiAqIE5hdGl2ZSBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FuZHJvaWQucG5nKSAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYH5BQ0NFU1NJQklMSVRZX0lEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgQWNjZXNzaWJpbGl0eSBJZC5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgY2xhc3M9Q0xBU1NgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBjbGFzcy5cclxuICogKiBgdGV4dD1URVhUYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdmlzaWJsZSB0ZXh0LlxyXG4gKiAqIGB0ZXh0LWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBlbGVtZW50IHdob3NlIHZpc2libGUgdGV4dCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgZGVzYz1ERVNDUklQVElPTmAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGRlc2NyaXB0aW9uLlxyXG4gKiAqIGBkZXNjLWNvbnRhaW5zPURFU0NSSVBUSU9OYCAtIExvY2F0ZXMgZWxlbWVudCB3aG9zZSBkZXNjcmlwdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy5cclxuICogKiBgc2Nyb2xsYWJsZWAgLSBMb2NhdGVzIGVsZW1lbnRzIHRoYXQgYXJlIHNjcm9sbGFibGUuICBcclxuICogIFxyXG4gKiBOYXRpdmUgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hcHBsZS5wbmcpICBcclxuICogIFxyXG4gKiAqIGAvWFBBVEhgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGFuIFhQYXRoIDEuMCBleHByZXNzaW9uLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIElELlxyXG4gKiAqIGB+QUNDRVNTSUJJTElUWV9JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIEFjY2Vzc2liaWxpdHkgSWQuICBcclxuICogIFxyXG4gKiBIeWJyaWQhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2h5YnJpZC5wbmcpICBhbmQgV2ViIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy93ZWIucG5nKSAgYXBwbGljYXRpb24gbG9jYXRvcnMgZm9yIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9hbmRyb2lkLnBuZykgICFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvYXBwbGUucG5nKSAgXHJcbiAqICBcclxuICogKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogKiBgaWQ9SURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBpZC5cclxuICogKiBgbmFtZT1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgbmFtZSBhdHRyaWJ1dGUuXHJcbiAqICogYHRhZz1OQU1FYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgdGFnIG5hbWUuXHJcbiAqICogYGxpbms9VEVYVGAgLSBMb2NhdGVzIGFuY2hvciBlbGVtZW50IHdob3NlIHRleHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAqIGBsaW5rLWNvbnRhaW5zPVRFWFRgIC0gTG9jYXRlcyBhbmNob3IgZWxlbWVudCB3aG9zZSB0ZXh0IGNvbnRhaW5zIHRoZSBnaXZlbiBzdHJpbmcuXHJcbiAqICogYGNzcz1DU1NfU0VMRUNUT1JgIC0gTG9jYXRlcyBlbGVtZW50IHVzaW5nIGEgQ1NTIHNlbGVjdG9yLlxyXG4gKiBcclxuICogKipQYXR0ZXJuIGFyZ3VtZW50czoqKlxyXG4gKiBcclxuICogQ29tbWFuZHMgd2hpY2ggZXhwZWN0IGEgc3RyaW5nIG1hdGNoaW5nIHBhdHRlcm4gaW4gdGhlaXIgYXJndW1lbnRzLCBzdXBwb3J0IGZvbGxvd2luZyBwYXR0ZXJucyB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZTpcclxuICogXHJcbiAqICogYHJlZ2V4OlBBVFRFUk5gIC0gTWF0Y2ggdXNpbmcgcmVndWxhciBleHByZXNzaW9uLlxyXG4gKiAqIGBQQVRURVJOYCAtIFZlcmJhdGltIG1hdGNoaW5nLlxyXG4gKiBcclxuICovXHJcbmltcG9ydCBVUkwgZnJvbSAndXJsJztcclxuaW1wb3J0ICogYXMgd2RpbyBmcm9tICd3ZWJkcml2ZXJpbyc7XHJcbmltcG9ydCBXZWJEcml2ZXJNb2R1bGUgZnJvbSAnLi4vY29yZS9XZWJEcml2ZXJNb2R1bGUnO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBwZXJmZWN0b1JlcG9ydGluZyBmcm9tICdwZXJmZWN0by1yZXBvcnRpbmcnO1xyXG5pbXBvcnQgcmVxdWVzdCBmcm9tICdyZXF1ZXN0JztcclxuaW1wb3J0IG1lcmdlSW1hZ2VzIGZyb20gJy4uL2xpYi9pbWctbWVyZ2UnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdtb2InO1xyXG5jb25zdCBERUZBVUxUX0FQUElVTV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1Yic7XHJcbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9OQU1FID0gJ2RlZmF1bHQnO1xyXG5jb25zdCBOT19TQ1JFRU5TSE9UX0NPTU1BTkRTID0gWydpbml0JywgJ2Fzc2VydEFsZXJ0J107XHJcbmNvbnN0IEFDVElPTl9DT01NQU5EUyA9IFsnb3BlbicsJ3RhcCcsJ2NsaWNrJywnc3dpcGUnLCdzdWJtaXQnLCdzZXRWYWx1ZSddO1xyXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRU9VVCA9IDYwICogMTAwMDsgICAgICAgICAgICAvLyBkZWZhdWx0IDYwcyB3YWl0IHRpbWVvdXRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vYmlsZU1vZHVsZSBleHRlbmRzIFdlYkRyaXZlck1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHt9O1xyXG4gICAgICAgIHRoaXMubGFzdE5hdmlnYXRpb25TdGFydFRpbWUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubmV0d29ya1JlcXVlc3RzID0gbnVsbDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMgPSB7fTtcclxuICAgICAgICB0aGlzLmFwcENvbnRleHQgPSAnTkFUSVZFX0FQUCc7XHJcbiAgICAgICAgdGhpcy5fbG9hZEhlbHBlckZ1bmN0aW9ucygpO1xyXG4gICAgICAgIC8vIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAoc29tZSBtb2R1bGUgY29tbWFuZHMgbWlnaHQgcmVmZXIgdG8gdGhpcy5PeEVycm9yIGFuZCB0aGlzLmVyckhlbHBlcilcclxuICAgICAgICB0aGlzLk94RXJyb3IgPSBPeEVycm9yO1xyXG4gICAgICAgIHRoaXMuZXJySGVscGVyID0gZXJySGVscGVyO1xyXG4gICAgICAgIC8vIGhvbGRzIGVsZW1lbnQgb3BlcmF0aW9uIHRpbWVvdXQgdmFsdWVcclxuICAgICAgICB0aGlzLndhaXRGb3JUaW1lb3V0ID0gREVGQVVMVF9XQUlUX1RJTUVPVVQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldERyaXZlclxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgdW5kZXJseWluZyBXRElPIGRyaXZlci5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gV0RJTyBkcml2ZXIuXHJcbiAgICAgKi9cclxuICAgIGdldERyaXZlcigpIHtcclxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RHJpdmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0Q2FwYWJpbGl0aWVzXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGN1cnJlbnRseSBkZWZpbmVkIGNhcGFiaWxpdGllcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gQ3VycmVudCBjYXBhYmlsaXRpZXMgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRDYXBhYmlsaXRpZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwcyB8fCBzdXBlci5nZXRDYXBhYmlsaXRpZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBBcHBpdW0gc2Vzc2lvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY2FwcyAtIERlc2lyZWQgY2FwYWJpbGl0aWVzLiBJZiBub3Qgc3BlY2lmaWVkIGNhcGFiaWxpdGllcyB3aWxsIGJlIHRha2VuIGZyb20gc3VpdGUgZGVmaW5pdGlvbi5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gYXBwaXVtVXJsIC0gUmVtb3RlIEFwcGl1bSBzZXJ2ZXIgVVJMIChkZWZhdWx0OiBodHRwOi8vbG9jYWxob3N0OjQ3MjMvd2QvaHViKS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgaW5pdChjYXBzLCBhcHBpdW1VcmwpIHtcclxuICAgICAgICAvLyBpZiByZW9wZW5TZXNzaW9uIGlzIHRydWUgLSByZWluaXRpbGl6ZSB0aGUgbW9kdWxlXHJcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlb3BlblNlc3Npb24gIT09IGZhbHNlKSB7IC8vIHRydWUgb3IgZmFsc2UgaWYgZXhwbGlzaXRseSBzZXQuIHRydWUgb24gbnVsbCBvciB1bmRlZmluZWQuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygncmVvcGVuU2Vzc2lvbiBpcyB0cnVlIC0gcmVsb2FkaW5nIHRoZSBzZXNzaW9uLi4uJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5yZWxvYWRTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCdtb2IuaW5pdCB3YXMgY2FsbGVkIGZvciBhbHJlYWR5IGluaXRpYWxpemVkIG1vZHVsZS4gcmVvcGVuU2Vzc2lvbiBpcyBmYWxzZSBzbyB0aGUgY2FsbCBpcyBpZ25vcmVkLicpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZJWE1FOiB0aGlzIHNob3VsZCBiZSByZWZhY3RvcmVkXHJcbiAgICAgICAgaWYgKHRoaXMuY3R4LmNhcHMgJiYgdGhpcy5jdHguY2Fwc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddKSB7XHJcbiAgICAgICAgICAgIGlmIChjYXBzKSB7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5wbGF0Zm9ybU5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5wbGF0Zm9ybVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5kZXZpY2VOYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMuYnJvd3Nlck5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy5hdXRvbWF0aW9uTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLnVkaWQ7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNhcHMuYXBwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMudXNlQXBwaXVtRm9yV2ViID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNhcHMudXNlQXBwaXVtRm9yV2ViID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3R4LmNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWFwcGl1bVVybCkge1xyXG4gICAgICAgICAgICBhcHBpdW1VcmwgPSB0aGlzLm9wdGlvbnMuYXBwaXVtVXJsIHx8IERFRkFVTFRfQVBQSVVNX1VSTDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1lcmdlIGNhcGFiaWxpdGllcyBmcm9tIGNvbnRleHQgYW5kIGZyb20gaW5pdCBmdW5jdGlvbiBhcmd1bWVudCwgZ2l2ZSBwcmVmZXJlbmNlIHRvIGNvbnRleHQtcGFzc2VkIGNhcGFiaWxpdGllc1xyXG4gICAgICAgIHRoaXMuY2FwcyA9IHt9O1xyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2FwcyA9IHsgLi4udGhpcy5jdHguY2FwcyB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY2FwcywgLi4uY2FwcyB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGNsZWFyIHRoZSBleGlzdGluZyBkZXZpY2UgbG9ncywgaWYgY29sbGVjdERldmljZUxvZ3Mgb3B0aW9uIGlzIHRydWUgKHdlIHdhbnQgdG8gaW5jbHVkZSBsb2dzIG9ubHkgcmVsZXZhbnQgZm9yIHRoaXMgc2Vzc2lvbilcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snYXBwaXVtOmNsZWFyRGV2aWNlTG9nc09uU3RhcnQnXSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBpZiBib3RoIGJyb3dzZXJOYW1lIGFuZCBhcHBQYWNrYWdlIHdlcmUgc3BlY2lmaWVkIC0gcmVtb3ZlIGJyb3dzZXJOYW1lXHJcbiAgICAgICAgaWYgKHRoaXMuY2Fwcy5icm93c2VyTmFtZSAmJiAodGhpcy5jYXBzLmFwcFBhY2thZ2UgfHwgdGhpcy5jYXBzLmFwcCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgbm8gYXBwUGFja2FnZSBub3IgYXBwIGNhcGFiaWxpdHksIG5vdCBicm93c2VyTmFtZSBhcmUgZGVmaW5lZCwgYXNzdW1lIHdlIHdhbnQgdG8gcnVuIHRoZSB0ZXN0IGFnYWluc3QgZGVmYXVsdCBicm93c2VyXHJcbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuY2Fwcy5icm93c2VyTmFtZSAmJiAhdGhpcy5jYXBzLmFwcFBhY2thZ2UgJiYgIXRoaXMuY2Fwcy5hcHApIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlYmRyaXZlciBleHBlY3RzIGxvd2VyIGNhc2UgbmFtZXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmIHR5cGVvZiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2UoYXBwaXVtVXJsKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG5cclxuICAgICAgICAvLyBpbml0IHdlYmRyaXZlclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldEFwcGl1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gQW5kcm9pZCA3KyBlbXVsYXRvciwgYW5kIHRodXMvb3IgdXNpbmcgYSBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyIC1cclxuICAgICAgICAvLyBwZXJmb3JtIGFuIGFjdHVhbCBhcHBDb250ZXh0IHN3aXRjaCB0byBXRUJcclxuICAgICAgICAvLyBzbyBBcHBpdW0gd2lsbCBkZWxlZ2F0ZSBjb21tYW5kcyB0byBDaHJvbWUgRHJpdmVyIGluc3RlYWQgb2YgQXBwaXVtIERyaXZlclxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICAnY2hyb21pdW0td2VidmlldycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIC8vIGZhaWxzIG9uIGJyb3dzZXJzdGFja1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcclxuICAgICAgICAgICAgc3RhdHVzID0gJ3Bhc3NlZCc7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ycy5zdGVwcyAmJiBBcnJheS5pc0FycmF5KHRoaXMucnMuc3RlcHMpICYmIHRoaXMucnMuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkRmluZGVkID0gdGhpcy5ycy5zdGVwcy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZEZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMucGFzc2VkIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVsnQ0FOQ0VMRUQnLCAnRkFJTEVEJ10uaW5jbHVkZXMoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZVNlc3Npb24gd2lsbCB0YWtlIDUgbWluIHRvIGNhbGxcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdFcnJvciBkaXNwb3NpbmcgZHJpdmVyOiAnICsgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmVcclxuICAgICAqICAgICAgICAgICAgICB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKiBAZm9yIGFuZHJvaWQsIGlvcywgaHlicmlkLCB3ZWJcclxuICAgICAqL1xyXG4gICAgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGVcclxuICAgICAqL1xyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXNoSW1hZ2VUb0ltYWdlcyA9IGFzeW5jKGZldGNoVGl0bGUgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCd0ZXh0LXRvLWltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUltYWdlID0gYXdhaXQgdGV4dFRvSW1hZ2UuZ2VuZXJhdGUodGl0bGUsIHsgZGVidWc6IGZhbHNlLCBmb250RmFtaWx5OiAnQXJpYWwnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGVJbWFnZSAmJiB0eXBlb2YgdGl0bGVJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSB0aXRsZUltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCh0aXRsZUltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1dlYlZpZXdDb250ZXh0ID0gYXdhaXQgdGhpcy5pc1dlYlZpZXdDb250ZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1dlYlZpZXdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFdpbmRvd0hhbmRsZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShoYW5kbGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2YgaGFuZGxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zd2l0Y2hUb1dpbmRvdyhoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwdXNoSW1hZ2VUb0ltYWdlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHB1c2hJbWFnZVRvSW1hZ2VzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGltYWdlcyBpbnRvIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRJbWFnZSA9IGF3YWl0IG1lcmdlSW1hZ2VzKGltYWdlcywgeyBkaXJlY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWRJbWFnZSAmJiB0eXBlb2YgbWVyZ2VkSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXJnZWRJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBfZ2V0TG9ncyhuYW1lKSB7XHJcbiAgICAvLyAgICAgaWYgKCFOT19MT0dTX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgX2FkanVzdEFwcGl1bUxvZyhsb2csIHNyYykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgZGV2aWNlIHRpbWUgem9uZSB0byB0aGUgbG9jYWwgb25lIChzbyB3ZSBjYW4gbGF0ZXIgY29ycmVsYXRlIGJldHdlZW4gc3RlcHMgYW5kIGxvZ3MpICAgICAgICBcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6IHNyY1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgX2l0ZXJhdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHRyYW5zYWN0aW9uIG5hbWUgc2F2ZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIGFueVxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2l0ZXJhdGlvbkVuZChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuU0VMRU5JVU1fU0VTU0lPTl9USU1FT1VUKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZW5pdW1TZXNzaW9uVGltZW91dCA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWdub3JlIHRoZSByZXN0IGlmIG1vYiBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb2xsZWN0IGFsbCB0aGUgZGV2aWNlIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdERldmljZUxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldERldmljZUxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBsb2cgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nLCAnZGV2aWNlJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBkZXZpY2UgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgdGhlIGJyb3dzZXIgbG9ncyBmb3IgdGhpcyBzZXNzaW9uXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0QnJvd3NlckxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSBhd2FpdCB0aGlzLmdldEJyb3dzZXJMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZywgJ2Jyb3dzZXInKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIGJyb3dzZXIgbG9ncy4nLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgQXBwaXVtIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEFwcGl1bUxvZ3MpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxvZ3MgPSB0aGlzLmdldEFwcGl1bUxvZ3MoKTtcclxuICAgICAgICAgICAgICAgIGlmIChsb2dzICYmIEFycmF5LmlzQXJyYXkobG9ncykpIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsb2dFbnRyeSBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2dFbnRyeSwgJ2FwcGl1bScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgQXBwaXVtIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFdkaW9Mb2NhdG9yKGxvY2F0b3IpIHtcclxuICAgICAgICBpZiAoIWxvY2F0b3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TQ1JJUFRfRVJST1IsICdJbnZhbGlkIGFyZ3VtZW50IC0gbG9jYXRvciBub3Qgc3BlY2lmaWVkJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgbG9jYXRvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJy8nKSA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbG9jYXRvcjsgLy8gbGVhdmUgeHBhdGggbG9jYXRvciBhcyBpc1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwbGF0Zm9ybSA9IHRoaXMuY2FwcyAmJiB0aGlzLmNhcHMucGxhdGZvcm1OYW1lID8gdGhpcy5jYXBzLnBsYXRmb3JtTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYXBwQ29udGV4dCA9PT0gJ05BVElWRV9BUFAnICYmIHBsYXRmb3JtID09PSAnYW5kcm9pZCcpIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIHByZXBlbmQgcGFja2FnZSBuYW1lIGlmIGl0J3Mgbm90IHNwZWNpZmllZFxyXG4gICAgICAgICAgICAgICAgLy8gTk9URTogZ2V0Q3VycmVudFBhY2thZ2UoKSBzZWVtcyB0byBjcmFzaCBwb3NzaWJseSBkdWUgdG8gYSB3ZGlvIGJ1Zy4gXHJcbiAgICAgICAgICAgICAgICAvLyAgICAgICBzbyB3ZSBnZXQgcGFja2FnZSBuYW1lIGZyb20gY2FwcyBpbnN0ZWFkLlxyXG4gICAgICAgICAgICAgICAgbG9jYXRvciA9IGxvY2F0b3Iuc3Vic3RyKCdpZD0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCc6aWQvJykgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRvciA9IHRoaXMuY2Fwcy5hcHBQYWNrYWdlICsgJzppZC8nICsgbG9jYXRvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnJlc291cmNlSWQoXCInICsgbG9jYXRvciArICdcIiknO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY2xhc3M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5jbGFzc05hbWUoXCInICsgbG9jYXRvci5zdWJzdHIoJ2NsYXNzPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RleHQ9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS50ZXh0KFwiJyArIGxvY2F0b3Iuc3Vic3RyKCd0ZXh0PScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3RleHQtY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS50ZXh0Q29udGFpbnMoXCInICsgbG9jYXRvci5zdWJzdHIoJ3RleHQtY29udGFpbnM9Jy5sZW5ndGgpICsgJ1wiKSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignZGVzYz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLmRlc2NyaXB0aW9uKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdkZXNjPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Rlc2MtY29udGFpbnM9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbkNvbnRhaW5zKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdkZXNjLWNvbnRhaW5zPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ3Njcm9sbGFibGUnKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnYW5kcm9pZD1uZXcgVWlTZWxlY3RvcigpLnNjcm9sbGFibGUodHJ1ZSknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ34nKSA9PT0gMCkgICAgLy8gYWNjZXNzaWJpbGl0eSBpZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcENvbnRleHQgPT09ICdOQVRJVkVfQVBQJyAmJiBwbGF0Zm9ybSA9PT0gJ2lvcycpIHtcclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignficpID09PSAwKSAvLyBhY2Nlc3NpYmlsaXR5IGlkXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYXBwQ29udGV4dCAhPT0gJ05BVElWRV9BUFAnKSB7ICAgICAgICAgICAgLy8gSHlicmlkIG9yIFdlYiBhcHBsaWNhdGlvblxyXG4gICAgICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCdpZD0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnIycgKyBsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpOyAgICAgIC8vIGNvbnZlcnQgJ2lkPScgdG8gJyMnXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbmFtZT0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnW25hbWU9JyArIGxvY2F0b3Iuc3Vic3RyKCduYW1lPScubGVuZ3RoKSArICddJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICc9JyArIGxvY2F0b3Iuc3Vic3RyKCdsaW5rPScubGVuZ3RoKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdsaW5rLWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICcqPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignY3NzPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3Iuc3Vic3RyKCdjc3M9Jy5sZW5ndGgpOyAgICAgICAgICAgLy8gaW4gY2FzZSBvZiBjc3MsIGp1c3QgcmVtb3ZlIGNzcz0gcHJlZml4XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbG9jYXRvcjtcclxuICAgIH1cclxuXHJcbiAgICBfbG9hZEhlbHBlckZ1bmN0aW9ucygpIHtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0V2Rpb0xvY2F0b3IgPSB0aGlzLl9nZXRXZGlvTG9jYXRvcjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMubWF0Y2hQYXR0ZXJuID0gbW9kVXRpbHMubWF0Y2hQYXR0ZXJuO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0RWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudHMgPSBtb2RVdGlscy5nZXRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50ID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRDaGlsZEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0Q2hpbGRFbGVtZW50cztcclxuICAgICAgICB0aGlzLmhlbHBlcnMuc2V0VGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMuc2V0VGltZW91dEltcGxpY2l0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5yZXN0b3JlVGltZW91dEltcGxpY2l0ID0gbW9kVXRpbHMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmc7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXI7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2wgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudEJvb2w7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sT3B0aW9uYWw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50VGltZW91dDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0Q29udGV4dCA9IG1vZFV0aWxzLmFzc2VydENvbnRleHQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmNvbnRleHRMaXN0ID0gbW9kVXRpbHMuY29udGV4dExpc3Q7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldExvZ1R5cGVzID0gbW9kVXRpbHMuZ2V0TG9nVHlwZXM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlU2Vzc2lvbigpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbikge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kcml2ZXIuZGVsZXRlU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignZGVsZXRlU2Vzc2lvbiBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc2VuZFJlc3VsdFN0YXR1c1RvQnJvd3NlcnN0YWNrKHN0YXR1cykge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPT09ICdQQVNTRUQnID8gJ3Bhc3NlZCcgOiAnZmFpbGVkJ1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbGV0IG9wdGlvbnM7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy53ZGlvT3B0cy5jYXBhYmlsaXRpZXMuYnJvd3Nlck5hbWUpIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGkuYnJvd3NlcnN0YWNrLmNvbS9hdXRvbWF0ZS9zZXNzaW9ucy8ke3RoaXMuZHJpdmVyLnNlc3Npb25JZH0uanNvbmAsXHJcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgICAgICAgICBqc29uOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXHJcbiAgICAgICAgICAgICAgICAgICAgJ2F1dGgnOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJzogdGhpcy53ZGlvT3B0cy51c2VyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMua2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBgaHR0cHM6Ly9hcGktY2xvdWQuYnJvd3NlcnN0YWNrLmNvbS9hcHAtYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydicm93c2Vyc3RhY2sudXNlciddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFzcyc6IHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzWydicm93c2Vyc3RhY2sua2V5J10sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kSW1tZWRpYXRlbHknOiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgcmVxdWVzdChvcHRpb25zLCAoZXJyLCByZXMsIGJvZHkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBzZW5kIHJlc3VsdCBzdGF0dXMgdG8gQnJvd3NlcnN0YWNrOiAnICsgZS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
630
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIkRFRkFVTFRfQVBQSVVNX1VSTCIsIkRFRkFVTFRfQlJPV1NFUl9OQU1FIiwiTk9fU0NSRUVOU0hPVF9DT01NQU5EUyIsIkFDVElPTl9DT01NQU5EUyIsIkRFRkFVTFRfV0FJVF9USU1FT1VUIiwiTW9iaWxlTW9kdWxlIiwiV2ViRHJpdmVyTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwidHJhbnNhY3Rpb25zIiwibGFzdE5hdmlnYXRpb25TdGFydFRpbWUiLCJuZXR3b3JrUmVxdWVzdHMiLCJoZWxwZXJzIiwiYXBwQ29udGV4dCIsIl9sb2FkSGVscGVyRnVuY3Rpb25zIiwiT3hFcnJvciIsImVyckhlbHBlciIsIndhaXRGb3JUaW1lb3V0IiwibmFtZSIsImdldERyaXZlciIsImdldENhcGFiaWxpdGllcyIsImNhcHMiLCJpbml0IiwiYXBwaXVtVXJsIiwiaXNJbml0aWFsaXplZCIsInJlb3BlblNlc3Npb24iLCJkZWJ1ZyIsImRyaXZlciIsInJlbG9hZFNlc3Npb24iLCJfaXNJbml0aWFsaXplZCIsImN0eCIsInBsYXRmb3JtTmFtZSIsInBsYXRmb3JtVmVyc2lvbiIsImRldmljZU5hbWUiLCJicm93c2VyTmFtZSIsImF1dG9tYXRpb25OYW1lIiwidWRpZCIsImFwcCIsImVuYWJsZUFwcGl1bUJlaGF2aW9yIiwidXNlQXBwaXVtRm9yV2ViIiwiY29sbGVjdERldmljZUxvZ3MiLCJhcHBQYWNrYWdlIiwiYnVuZGxlSWQiLCJ0b0xvd2VyQ2FzZSIsInJlY29yZEhBUiIsImJyb3dzZXIiLCJwZXJmb3JtYW5jZSIsInVybCIsIlVSTCIsInBhcnNlIiwicHJvdG9jb2wiLCJyZXBsYWNlIiwiaG9zdCIsImhvc3RuYW1lIiwicG9ydCIsInBhcnNlSW50IiwicGF0aCIsInBhdGhuYW1lIiwiYXV0aCIsInNwbGl0Iiwid2Rpb09wdHMiLCJ1c2VyIiwia2V5IiwiY2FwYWJpbGl0aWVzIiwibG9nTGV2ZWwiLCJydW5uZXIiLCJ3YWl0Zm9yVGltZW91dCIsImNvbm5lY3Rpb25SZXRyeVRpbWVvdXQiLCJjb25uZWN0aW9uUmV0cnlDb3VudCIsInByb3ZpZGVyIiwibW9kVXRpbHMiLCJkZXRlcm1pbmVQcm92aWRlciIsIlBFUkZFQ1RPIiwibWF4SW5zdGFuY2VzIiwib3BlbkRldmljZVRpbWVvdXQiLCJtYW51ZmFjdHVyZXIiLCJtb2RlbCIsIndkaW8iLCJyZW1vdGUiLCJzZWxlbml1bUJyb3dzZXJUaW1lb3V0Iiwic2VsZW5pdW1UaW1lb3V0IiwicGVyZmVjdG9FeGVjdXRpb25Db250ZXh0IiwicGVyZmVjdG9SZXBvcnRpbmciLCJQZXJmZWN0byIsIlBlcmZlY3RvRXhlY3V0aW9uQ29udGV4dCIsIndlYmRyaXZlciIsImV4ZWN1dGVTY3JpcHQiLCJjb21tYW5kIiwicGFyYW1zIiwiZXhlY3V0ZSIsInJlcG9ydGluZ0NsaWVudCIsIlBlcmZlY3RvUmVwb3J0aW5nQ2xpZW50IiwidGVzdFN0YXJ0IiwiZSIsImdldEFwcGl1bUluaXRFcnJvciIsImdldENvbnRleHQiLCJzZXRXZWJWaWV3Q29udGV4dCIsIkJST1dTRVJTVEFDSyIsInNldFRpbWVvdXQiLCJkaXNwb3NlIiwic3RhdHVzIiwic3RlcHMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJmYWlsZWRGaW5kZWQiLCJmaW5kIiwiaXRlbSIsInRvVXBwZXJDYXNlIiwidGVzdFN0b3AiLCJDb25zdGFudHMiLCJyZXN1bHRzIiwicGFzc2VkIiwiZmFpbGVkIiwiX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayIsImRlbGV0ZVNlc3Npb24iLCJpbmNsdWRlcyIsInNlbGVuaXVtU2Vzc2lvblRpbWVvdXQiLCJ3YXJuIiwidHJhbnNhY3Rpb24iLCJnbG9iYWwiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsIl9pc0FjdGlvbiIsIl90YWtlU2NyZWVuc2hvdFNpbGVudCIsImVycm9yIiwidGFrZVNjcmVlbnNob3QiLCJyZXR2YWwiLCJjYWxsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJ3YWl0VW50aWxSZXRWYWwiLCJ3YWl0VW50aWwiLCJpbWFnZXMiLCJwdXNoSW1hZ2VUb0ltYWdlcyIsImZldGNoVGl0bGUiLCJpbWFnZSIsInRpdGxlIiwiZ2V0VGl0bGUiLCJ0ZXh0VG9JbWFnZSIsInJlcXVpcmUiLCJ0aXRsZUltYWdlIiwiZ2VuZXJhdGUiLCJmb250RmFtaWx5IiwicHVzaCIsImlzV2ViVmlld0NvbnRleHQiLCJoYW5kbGVzIiwiZ2V0V2luZG93SGFuZGxlcyIsImhhbmRsZSIsInN3aXRjaFRvV2luZG93IiwibWVyZ2VkSW1hZ2UiLCJtZXJnZUltYWdlcyIsImRpcmVjdGlvbiIsInRpbWVvdXQiLCJ0aGVuIiwiY2F0Y2giLCJlcnIiLCJfYWRqdXN0QXBwaXVtTG9nIiwibG9nIiwic3JjIiwidGltZSIsInRpbWVzdGFtcCIsIm1zZyIsIm1lc3NhZ2UiLCJsZXZlbCIsIl9pdGVyYXRpb25TdGFydCIsIl9pdGVyYXRpb25FbmQiLCJ0eXBlIiwiZXJyb3JIZWxwZXIiLCJlcnJvckNvZGUiLCJBUFBJVU1fU0VTU0lPTl9USU1FT1VUIiwibG9ncyIsImdldERldmljZUxvZ3MiLCJjb2xsZWN0QnJvd3NlckxvZ3MiLCJnZXRCcm93c2VyTG9ncyIsImNvbGxlY3RBcHBpdW1Mb2dzIiwiZ2V0QXBwaXVtTG9ncyIsImxvZ0VudHJ5IiwiX2dldFdkaW9Mb2NhdG9yIiwibG9jYXRvciIsIlNDUklQVF9FUlJPUiIsImluZGV4T2YiLCJwbGF0Zm9ybSIsInN1YnN0ciIsImdldFdkaW9Mb2NhdG9yIiwibWF0Y2hQYXR0ZXJuIiwiZ2V0RWxlbWVudCIsImdldEVsZW1lbnRzIiwiZ2V0Q2hpbGRFbGVtZW50IiwiZ2V0Q2hpbGRFbGVtZW50cyIsInNldFRpbWVvdXRJbXBsaWNpdCIsInJlc3RvcmVUaW1lb3V0SW1wbGljaXQiLCJhc3NlcnRBcmd1bWVudCIsImFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmciLCJhc3NlcnRBcmd1bWVudE51bWJlciIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJhc3NlcnRBcmd1bWVudEJvb2wiLCJhc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCIsImFzc2VydEFyZ3VtZW50VGltZW91dCIsImFzc2VydENvbnRleHQiLCJjb250ZXh0TGlzdCIsImdldExvZ1R5cGVzIiwicmVxdWVzdEJvZHkiLCJzZXNzaW9uSWQiLCJtZXRob2QiLCJqc29uIiwicmVqZWN0VW5hdXRob3JpemVkIiwiYm9keSIsInJlcXVlc3QiLCJyZXMiLCJ0b1N0cmluZyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1tb2IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSBtb2JcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIG1vYmlsZSBhdXRvbWF0aW9uLlxyXG4gKiBAc2FtcGxlICoqTG9jYXRvcnM6KiogIFxyXG4gKiBcclxuICogTmF0aXZlIGFwcGxpY2F0aW9uIGxvY2F0b3JzIGZvciFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvYW5kcm9pZC5wbmcpICBcclxuICogKiBgL1hQQVRIYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhbiBYUGF0aCAxLjAgZXhwcmVzc2lvbi5cclxuICogKiBgfkFDQ0VTU0lCSUxJVFlfSURgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyBBY2Nlc3NpYmlsaXR5IElkLlxyXG4gKiAqIGBpZD1JRGAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGlkLlxyXG4gKiAqIGBjbGFzcz1DTEFTU2AgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIGNsYXNzLlxyXG4gKiAqIGB0ZXh0PVRFWFRgIC0gTG9jYXRlcyBlbGVtZW50IGJ5IGl0cyB2aXNpYmxlIHRleHQuXHJcbiAqICogYHRleHQtY29udGFpbnM9VEVYVGAgLSBMb2NhdGVzIGVsZW1lbnQgd2hvc2UgdmlzaWJsZSB0ZXh0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxyXG4gKiAqIGBkZXNjPURFU0NSSVBUSU9OYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgZGVzY3JpcHRpb24uXHJcbiAqICogYGRlc2MtY29udGFpbnM9REVTQ1JJUFRJT05gIC0gTG9jYXRlcyBlbGVtZW50IHdob3NlIGRlc2NyaXB0aW9uIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3RyaW5nLlxyXG4gKiAqIGBzY3JvbGxhYmxlYCAtIExvY2F0ZXMgZWxlbWVudHMgdGhhdCBhcmUgc2Nyb2xsYWJsZS4gIFxyXG4gKiAgXHJcbiAqIE5hdGl2ZSBhcHBsaWNhdGlvbiBsb2NhdG9ycyBmb3IhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FwcGxlLnBuZykgIFxyXG4gKiAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYGlkPUlEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgSUQuXHJcbiAqICogYH5BQ0NFU1NJQklMSVRZX0lEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgQWNjZXNzaWJpbGl0eSBJZC4gIFxyXG4gKiAqIGAtaW9zIHByZWRpY2F0ZSBzdHJpbmc6UFJFRElDQVRFX1NUUklOR2AgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYSBbcHJlZGljYXRlIHF1ZXJ5XShodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2thcmNoaXZlL1dlYkRyaXZlckFnZW50L3dpa2kvUHJlZGljYXRlLVF1ZXJpZXMtQ29uc3RydWN0aW9uLVJ1bGVzKS4gIFxyXG4gKiAqIGAtaW9zIGNsYXNzIGNoYWluOkNMQVNTX0NIQUlOYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIFtjbGFzcyBjaGFpbiBleHByZXNzaW9uXShodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2thcmNoaXZlL1dlYkRyaXZlckFnZW50L3dpa2kvQ2xhc3MtQ2hhaW4tUXVlcmllcy1Db25zdHJ1Y3Rpb24tUnVsZXMpLiAgXHJcbiAqICBcclxuICogSHlicmlkIVtdKC4uLy4uLy5naXRib29rL2Fzc2V0cy9oeWJyaWQucG5nKSAgYW5kIFdlYiFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvd2ViLnBuZykgIGFwcGxpY2F0aW9uIGxvY2F0b3JzIGZvciFbXSguLi8uLi8uZ2l0Ym9vay9hc3NldHMvYW5kcm9pZC5wbmcpICAhW10oLi4vLi4vLmdpdGJvb2svYXNzZXRzL2FwcGxlLnBuZykgIFxyXG4gKiAgXHJcbiAqICogYC9YUEFUSGAgLSBMb2NhdGVzIGVsZW1lbnQgdXNpbmcgYW4gWFBhdGggMS4wIGV4cHJlc3Npb24uXHJcbiAqICogYGlkPUlEYCAtIExvY2F0ZXMgZWxlbWVudCBieSBpdHMgaWQuXHJcbiAqICogYG5hbWU9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIG5hbWUgYXR0cmlidXRlLlxyXG4gKiAqIGB0YWc9TkFNRWAgLSBMb2NhdGVzIGVsZW1lbnQgYnkgaXRzIHRhZyBuYW1lLlxyXG4gKiAqIGBsaW5rPVRFWFRgIC0gTG9jYXRlcyBhbmNob3IgZWxlbWVudCB3aG9zZSB0ZXh0IG1hdGNoZXMgdGhlIGdpdmVuIHN0cmluZy5cclxuICogKiBgbGluay1jb250YWlucz1URVhUYCAtIExvY2F0ZXMgYW5jaG9yIGVsZW1lbnQgd2hvc2UgdGV4dCBjb250YWlucyB0aGUgZ2l2ZW4gc3RyaW5nLlxyXG4gKiAqIGBjc3M9Q1NTX1NFTEVDVE9SYCAtIExvY2F0ZXMgZWxlbWVudCB1c2luZyBhIENTUyBzZWxlY3Rvci5cclxuICogXHJcbiAqICoqUGF0dGVybiBhcmd1bWVudHM6KipcclxuICogXHJcbiAqIENvbW1hbmRzIHdoaWNoIGV4cGVjdCBhIHN0cmluZyBtYXRjaGluZyBwYXR0ZXJuIGluIHRoZWlyIGFyZ3VtZW50cywgc3VwcG9ydCBmb2xsb3dpbmcgcGF0dGVybnMgdW5sZXNzIHNwZWNpZmllZCBvdGhlcndpc2U6XHJcbiAqIFxyXG4gKiAqIGByZWdleDpQQVRURVJOYCAtIE1hdGNoIHVzaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbi5cclxuICogKiBgUEFUVEVSTmAgLSBWZXJiYXRpbSBtYXRjaGluZy5cclxuICogXHJcbiAqL1xyXG5pbXBvcnQgVVJMIGZyb20gJ3VybCc7XHJcbmltcG9ydCAqIGFzIHdkaW8gZnJvbSAnd2ViZHJpdmVyaW8nO1xyXG5pbXBvcnQgV2ViRHJpdmVyTW9kdWxlIGZyb20gJy4uL2NvcmUvV2ViRHJpdmVyTW9kdWxlJztcclxuaW1wb3J0IG1vZFV0aWxzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgcGVyZmVjdG9SZXBvcnRpbmcgZnJvbSAncGVyZmVjdG8tcmVwb3J0aW5nJztcclxuaW1wb3J0IHJlcXVlc3QgZnJvbSAncmVxdWVzdCc7XHJcbmltcG9ydCBtZXJnZUltYWdlcyBmcm9tICcuLi9saWIvaW1nLW1lcmdlJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAnbW9iJztcclxuY29uc3QgREVGQVVMVF9BUFBJVU1fVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6NDcyMy93ZC9odWInO1xyXG5jb25zdCBERUZBVUxUX0JST1dTRVJfTkFNRSA9ICdkZWZhdWx0JztcclxuY29uc3QgTk9fU0NSRUVOU0hPVF9DT01NQU5EUyA9IFsnaW5pdCcsICdhc3NlcnRBbGVydCddO1xyXG5jb25zdCBBQ1RJT05fQ09NTUFORFMgPSBbJ29wZW4nLCd0YXAnLCdjbGljaycsJ3N3aXBlJywnc3VibWl0Jywnc2V0VmFsdWUnXTtcclxuY29uc3QgREVGQVVMVF9XQUlUX1RJTUVPVVQgPSA2MCAqIDEwMDA7ICAgICAgICAgICAgLy8gZGVmYXVsdCA2MHMgd2FpdCB0aW1lb3V0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2JpbGVNb2R1bGUgZXh0ZW5kcyBXZWJEcml2ZXJNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB7fTtcclxuICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICB0aGlzLm5ldHdvcmtSZXF1ZXN0cyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzID0ge307XHJcbiAgICAgICAgdGhpcy5hcHBDb250ZXh0ID0gJ05BVElWRV9BUFAnO1xyXG4gICAgICAgIHRoaXMuX2xvYWRIZWxwZXJGdW5jdGlvbnMoKTtcclxuICAgICAgICAvLyBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKHNvbWUgbW9kdWxlIGNvbW1hbmRzIG1pZ2h0IHJlZmVyIHRvIHRoaXMuT3hFcnJvciBhbmQgdGhpcy5lcnJIZWxwZXIpXHJcbiAgICAgICAgdGhpcy5PeEVycm9yID0gT3hFcnJvcjtcclxuICAgICAgICB0aGlzLmVyckhlbHBlciA9IGVyckhlbHBlcjtcclxuICAgICAgICAvLyBob2xkcyBlbGVtZW50IG9wZXJhdGlvbiB0aW1lb3V0IHZhbHVlXHJcbiAgICAgICAgdGhpcy53YWl0Rm9yVGltZW91dCA9IERFRkFVTFRfV0FJVF9USU1FT1VUO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBnZXREcml2ZXJcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHVuZGVybHlpbmcgV0RJTyBkcml2ZXIuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFdESU8gZHJpdmVyLlxyXG4gICAgICovXHJcbiAgICBnZXREcml2ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cGVyLmdldERyaXZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGdldENhcGFiaWxpdGllc1xyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBjdXJyZW50bHkgZGVmaW5lZCBjYXBhYmlsaXRpZXMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IEN1cnJlbnQgY2FwYWJpbGl0aWVzIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0Q2FwYWJpbGl0aWVzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcHMgfHwgc3VwZXIuZ2V0Q2FwYWJpbGl0aWVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gaW5pdFxyXG4gICAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgQXBwaXVtIHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGNhcHMgLSBEZXNpcmVkIGNhcGFiaWxpdGllcy4gSWYgbm90IHNwZWNpZmllZCBjYXBhYmlsaXRpZXMgd2lsbCBiZSB0YWtlbiBmcm9tIHN1aXRlIGRlZmluaXRpb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGFwcGl1bVVybCAtIFJlbW90ZSBBcHBpdW0gc2VydmVyIFVSTCAoZGVmYXVsdDogaHR0cDovL2xvY2FsaG9zdDo0NzIzL3dkL2h1YikuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQoY2FwcywgYXBwaXVtVXJsKSB7XHJcbiAgICAgICAgLy8gaWYgcmVvcGVuU2Vzc2lvbiBpcyB0cnVlIC0gcmVpbml0aWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5yZW9wZW5TZXNzaW9uICE9PSBmYWxzZSkgeyAvLyB0cnVlIG9yIGZhbHNlIGlmIGV4cGxpc2l0bHkgc2V0LiB0cnVlIG9uIG51bGwgb3IgdW5kZWZpbmVkLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZGVidWcoJ3Jlb3BlblNlc3Npb24gaXMgdHJ1ZSAtIHJlbG9hZGluZyB0aGUgc2Vzc2lvbi4uLicpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIucmVsb2FkU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygnbW9iLmluaXQgd2FzIGNhbGxlZCBmb3IgYWxyZWFkeSBpbml0aWFsaXplZCBtb2R1bGUuIHJlb3BlblNlc3Npb24gaXMgZmFsc2Ugc28gdGhlIGNhbGwgaXMgaWdub3JlZC4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBGSVhNRTogdGhpcyBzaG91bGQgYmUgcmVmYWN0b3JlZFxyXG4gICAgICAgIGlmICh0aGlzLmN0eC5jYXBzICYmIHRoaXMuY3R4LmNhcHNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXSkge1xyXG4gICAgICAgICAgICBpZiAoY2Fwcykge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMucGxhdGZvcm1OYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMucGxhdGZvcm1WZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMuZGV2aWNlTmFtZTtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBjYXBzLmJyb3dzZXJOYW1lO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGNhcHMuYXV0b21hdGlvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgY2Fwcy51ZGlkO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChjYXBzLmFwcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcHMuZW5hYmxlQXBwaXVtQmVoYXZpb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXBzLnVzZUFwcGl1bUZvcldlYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2Fwcy5lbmFibGVBcHBpdW1CZWhhdmlvciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5jYXBzLnVzZUFwcGl1bUZvcldlYiA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmN0eC5jYXBzLmVuYWJsZUFwcGl1bUJlaGF2aW9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFhcHBpdW1VcmwpIHtcclxuICAgICAgICAgICAgYXBwaXVtVXJsID0gdGhpcy5vcHRpb25zLmFwcGl1bVVybCB8fCBERUZBVUxUX0FQUElVTV9VUkw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBtZXJnZSBjYXBhYmlsaXRpZXMgZnJvbSBjb250ZXh0IGFuZCBmcm9tIGluaXQgZnVuY3Rpb24gYXJndW1lbnQsIGdpdmUgcHJlZmVyZW5jZSB0byBjb250ZXh0LXBhc3NlZCBjYXBhYmlsaXRpZXNcclxuICAgICAgICB0aGlzLmNhcHMgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5jdHguY2Fwcykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHMgPSB7IC4uLnRoaXMuY3R4LmNhcHMgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNhcHMpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzID0geyAuLi50aGlzLmNhcHMsIC4uLmNhcHMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBjbGVhciB0aGUgZXhpc3RpbmcgZGV2aWNlIGxvZ3MsIGlmIGNvbGxlY3REZXZpY2VMb2dzIG9wdGlvbiBpcyB0cnVlICh3ZSB3YW50IHRvIGluY2x1ZGUgbG9ncyBvbmx5IHJlbGV2YW50IGZvciB0aGlzIHNlc3Npb24pXHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb2xsZWN0RGV2aWNlTG9ncykge1xyXG4gICAgICAgICAgICB0aGlzLmNhcHNbJ2FwcGl1bTpjbGVhckRldmljZUxvZ3NPblN0YXJ0J10gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgYm90aCBicm93c2VyTmFtZSBhbmQgYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgd2VyZSBzcGVjaWZpZWQgLSBhc3N1bWUgd2Ugd2FudCB0byBydW4gdGhlIGFwcGxpY2F0aW9uIGFuZCByZW1vdmUgYnJvd3Nlck5hbWVcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmICh0aGlzLmNhcHMuYXBwUGFja2FnZSB8fCB0aGlzLmNhcHMuYXBwIHx8IHRoaXMuY2Fwcy5idW5kbGVJZCkpIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2Fwcy5icm93c2VyTmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgbm8gYXBwUGFja2FnZS9hcHAvYnVuZGxlSWQgY2FwYWJpbGl0eSBub3IgYnJvd3Nlck5hbWUgYXJlIGRlZmluZWQsIGFzc3VtZSB3ZSB3YW50IHRvIHJ1biB0aGUgdGVzdCBhZ2FpbnN0IGRlZmF1bHQgYnJvd3NlclxyXG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNhcHMuYnJvd3Nlck5hbWUgJiYgIXRoaXMuY2Fwcy5hcHBQYWNrYWdlICYmICF0aGlzLmNhcHMuYXBwICYmICF0aGlzLmNhcHMuYnVuZGxlSWQpIHtcclxuICAgICAgICAgICAgdGhpcy5jYXBzLmJyb3dzZXJOYW1lID0gREVGQVVMVF9CUk9XU0VSX05BTUU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHdlYmRyaXZlciBleHBlY3RzIGxvd2VyIGNhc2UgbmFtZXNcclxuICAgICAgICBpZiAodGhpcy5jYXBzLmJyb3dzZXJOYW1lICYmIHR5cGVvZiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwcy5icm93c2VyTmFtZSA9IHRoaXMuY2Fwcy5icm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBhZGp1c3QgY2FwYWJpbGl0aWVzIHRvIGVuYWJsZSBjb2xsZWN0aW5nIGJyb3dzZXIgYW5kIHBlcmZvcm1hbmNlIHN0YXRzIGluIENocm9tZSBcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlY29yZEhBUiAmJiB0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICdjaHJvbWUnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2Fwc1snZ29vZzpsb2dnaW5nUHJlZnMnXSA9IHsgICAgIC8vIGZvciBDaHJvbWVEcml2ZXIgPj0gNzVcclxuICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdBTEwnLFxyXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2U6ICdBTEwnXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwb3B1bGF0ZSBXRElPIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB1cmwgPSBVUkwucGFyc2UoYXBwaXVtVXJsKTtcclxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHVybC5wcm90b2NvbC5yZXBsYWNlKC86JC8sICcnKTtcclxuICAgICAgICBjb25zdCBob3N0ID0gdXJsLmhvc3RuYW1lO1xyXG4gICAgICAgIGNvbnN0IHBvcnQgPSBwYXJzZUludCh1cmwucG9ydCB8fCAocHJvdG9jb2wgPT09ICdodHRwcycgPyA0NDMgOiA4MCkpO1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWU7XHJcblxyXG4gICAgICAgIC8vIGF1dGggaXMgbmVlZGVkIG1vc3RseSBmb3IgY2xvdWQgcHJvdmlkZXJzIHN1Y2ggYXMgTGFtYmRhVGVzdFxyXG4gICAgICAgIGlmICh1cmwuYXV0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBhdXRoID0gdXJsLmF1dGguc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAgICAgdXNlcjogYXV0aFswXSxcclxuICAgICAgICAgICAgICAgIGtleTogYXV0aFsxXVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdmFyIHdkaW9PcHRzID0ge1xyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMud2Rpb09wdHMgfHwge30sXHJcbiAgICAgICAgICAgIHByb3RvY29sOiBwcm90b2NvbCxcclxuICAgICAgICAgICAgaG9zdG5hbWU6IGhvc3QsXHJcbiAgICAgICAgICAgIHBvcnQ6IHBvcnQsXHJcbiAgICAgICAgICAgIHBhdGg6IHBhdGgsXHJcbiAgICAgICAgICAgIGNhcGFiaWxpdGllczogdGhpcy5jYXBzLFxyXG4gICAgICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXHJcbiAgICAgICAgICAgIHJ1bm5lcjogJ3JlcGwnLFxyXG4gICAgICAgICAgICB3YWl0Zm9yVGltZW91dDogNTAwMCwgLy8gaW5jcmVhc2UgdGhlIGRlZmF1bHQgMzAwMFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uUmV0cnlUaW1lb3V0OiAzMTAqMTAwMCxcclxuICAgICAgICAgICAgY29ubmVjdGlvblJldHJ5Q291bnQ6IDFcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBsZXQgcHJvdmlkZXIgPSBtb2RVdGlscy5kZXRlcm1pbmVQcm92aWRlcih3ZGlvT3B0cyk7XHJcbiAgICAgICAgbGV0IG5hbWUgPSAnbmFtZSc7XHJcblxyXG4gICAgICAgIGlmIChwcm92aWRlciA9PT0gbW9kVXRpbHMucHJvdmlkZXIuUEVSRkVDVE8pIHtcclxuICAgICAgICAgICAgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1heEluc3RhbmNlcyA9IDE7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBhdGggPSAnL25leHBlcmllbmNlL3BlcmZlY3RvbW9iaWxlL3dkL2h1Yic7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLnBvcnQgPSA4MDtcclxuICAgICAgICAgICAgd2Rpb09wdHMucHJvdG9jb2wgPSAnaHR0cCc7XHJcbiAgICAgICAgICAgIHdkaW9PcHRzLm9wZW5EZXZpY2VUaW1lb3V0ID0gMTU7XHJcblxyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzLm1hbnVmYWN0dXJlcjtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5tb2RlbDtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5icm93c2VyTmFtZTtcclxuICAgICAgICAgICAgZGVsZXRlIHdkaW9PcHRzLmNhcGFiaWxpdGllcy5ob3N0O1xyXG5cclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1sncGVyZmVjdG9Nb2JpbGU6b3B0aW9ucyddWyduYW1lJ107XHJcbiAgICAgICAgICAgIGRlbGV0ZSB3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ3BlcmZlY3RvTW9iaWxlOm9wdGlvbnMnXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh3ZGlvT3B0cy5jYXBhYmlsaXRpZXNbJ2JzdGFjazpvcHRpb25zJ10gJiYgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddWyduYW1lJ10pIHtcclxuICAgICAgICAgICAgbmFtZSA9IHdkaW9PcHRzLmNhcGFiaWxpdGllc1snYnN0YWNrOm9wdGlvbnMnXVsnbmFtZSddO1xyXG4gICAgICAgICAgICBkZWxldGUgd2Rpb09wdHMuY2FwYWJpbGl0aWVzWydic3RhY2s6b3B0aW9ucyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy53ZGlvT3B0cyA9IHdkaW9PcHRzO1xyXG5cclxuICAgICAgICAvLyBpbml0IHdlYmRyaXZlclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyID0gYXdhaXQgd2Rpby5yZW1vdGUod2Rpb09wdHMpO1xyXG4gICAgICAgICAgICB0aGlzLmRyaXZlci5wcm92aWRlciA9IHByb3ZpZGVyO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZWxlbml1bUJyb3dzZXJUaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bUJyb3dzZXJUaW1lb3V0ID0gdGhpcy5vcHRpb25zLnNlbGVuaXVtQnJvd3NlclRpbWVvdXQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5zZWxlbml1bVRpbWVvdXQgPSB0aGlzLm9wdGlvbnMuc2VsZW5pdW1UaW1lb3V0O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocHJvdmlkZXIgPT09IG1vZFV0aWxzLnByb3ZpZGVyLlBFUkZFQ1RPKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwZXJmZWN0b0V4ZWN1dGlvbkNvbnRleHQgPSBhd2FpdCBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KHtcclxuICAgICAgICAgICAgICAgICAgICB3ZWJkcml2ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVNjcmlwdDogYXN5bmMgKGNvbW1hbmQsIHBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZHJpdmVyLmV4ZWN1dGUoY29tbWFuZCwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRpbmdDbGllbnQgPSBuZXcgcGVyZmVjdG9SZXBvcnRpbmcuUGVyZmVjdG8uUGVyZmVjdG9SZXBvcnRpbmdDbGllbnQocGVyZmVjdG9FeGVjdXRpb25Db250ZXh0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVwb3J0aW5nQ2xpZW50LnRlc3RTdGFydChuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJySGVscGVyLmdldEFwcGl1bUluaXRFcnJvcihlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXBwQ29udGV4dCA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldENvbnRleHQoKTtcclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIHJ1bm5pbmcgb24gQW5kcm9pZCA3KyBlbXVsYXRvciwgYW5kIHRodXMvb3IgdXNpbmcgYSBXZWJWaWV3IEJyb3dzZXIgVGVzdGVyIC1cclxuICAgICAgICAvLyBwZXJmb3JtIGFuIGFjdHVhbCBhcHBDb250ZXh0IHN3aXRjaCB0byBXRUJcclxuICAgICAgICAvLyBzbyBBcHBpdW0gd2lsbCBkZWxlZ2F0ZSBjb21tYW5kcyB0byBDaHJvbWUgRHJpdmVyIGluc3RlYWQgb2YgQXBwaXVtIERyaXZlclxyXG4gICAgICAgIGlmICh0aGlzLmNhcHMuYnJvd3Nlck5hbWUgPT09ICAnY2hyb21pdW0td2VidmlldycpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRXZWJWaWV3Q29udGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIC8vIGZhaWxzIG9uIGJyb3dzZXJzdGFja1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLnNldFRpbWVvdXQoeyAnaW1wbGljaXQnOiB0aGlzLndhaXRGb3JUaW1lb3V0IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5pbml0KHRoaXMuZHJpdmVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBFbmRzIHRoZSBjdXJyZW50IHNlc3Npb24uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IHN0YXR1cyAtIFRlc3Qgc3RhdHVzLCBlaXRoZXIgYHBhc3NlZGAgb3IgYGZhaWxlZGAuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcclxuICAgICAgICAgICAgc3RhdHVzID0gJ3Bhc3NlZCc7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5ycy5zdGVwcyAmJiBBcnJheS5pc0FycmF5KHRoaXMucnMuc3RlcHMpICYmIHRoaXMucnMuc3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkRmluZGVkID0gdGhpcy5ycy5zdGVwcy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGZhaWxlZEZpbmRlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdmYWlsZWQnO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5kcml2ZXIgJiYgdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHN0YXR1cyA9IHN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5QRVJGRUNUTykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXBvcnRpbmdDbGllbnQudGVzdFN0b3Aoe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZmVjdG9SZXBvcnRpbmcuQ29uc3RhbnRzLnJlc3VsdHMucGFzc2VkIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJmZWN0b1JlcG9ydGluZy5Db25zdGFudHMucmVzdWx0cy5mYWlsZWRcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJpdmVyLnByb3ZpZGVyID09PSBtb2RVdGlscy5wcm92aWRlci5CUk9XU0VSU1RBQ0spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIVsnQ0FOQ0VMRUQnLCAnRkFJTEVEJ10uaW5jbHVkZXMoc3RhdHVzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZVNlc3Npb24gd2lsbCB0YWtlIDUgbWluIHRvIGNhbGxcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5kZWxldGVTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKCdFcnJvciBkaXNwb3NpbmcgZHJpdmVyOiAnICsgZSk7ICAgIC8vIGlnbm9yZSBhbnkgZXJyb3JzIGF0IGRpc3Bvc2FsIHN0YWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uU3RhcnRUaW1lID0gbnVsbDtcclxuICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBuZXcgdHJhbnNhY3Rpb24uXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGhlIHRyYW5zYWN0aW9uIHdpbGwgcGVyc2lzdCB0aWxsIGEgbmV3IG9uZSBpcyBvcGVuZWQuIFRyYW5zYWN0aW9uIG5hbWVzIG11c3QgYmVcclxuICAgICAqICAgICAgICAgICAgICB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKiBAZm9yIGFuZHJvaWQsIGlvcywgaHlicmlkLCB3ZWJcclxuICAgICAqL1xyXG4gICAgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgLypcclxuICAgICAqIFByaXZhdGVcclxuICAgICAqL1xyXG5cclxuICAgIF9pc0FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBfdGFrZVNjcmVlbnNob3RTaWxlbnQobmFtZSkge1xyXG4gICAgICAgIGlmICghTk9fU0NSRUVOU0hPVF9DT01NQU5EUy5pbmNsdWRlcyhuYW1lKSkge1xyXG4gICAgICAgICAgICBsZXQgZXJyb3I7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci50YWtlU2NyZWVuc2hvdFxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHZhbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5jYWxsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhaXRVbnRpbFJldFZhbCA9IHRoaXMuZHJpdmVyLndhaXRVbnRpbChhc3luYygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdXNoSW1hZ2VUb0ltYWdlcyA9IGFzeW5jKGZldGNoVGl0bGUgPSB0cnVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IGF3YWl0IHRoaXMuZHJpdmVyLnRha2VTY3JlZW5zaG90KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmV0Y2hUaXRsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gYXdhaXQgdGhpcy5kcml2ZXIuZ2V0VGl0bGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dFRvSW1hZ2UgPSByZXF1aXJlKCd0ZXh0LXRvLWltYWdlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aXRsZUltYWdlID0gYXdhaXQgdGV4dFRvSW1hZ2UuZ2VuZXJhdGUodGl0bGUsIHsgZGVidWc6IGZhbHNlLCBmb250RmFtaWx5OiAnQXJpYWwnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGVJbWFnZSAmJiB0eXBlb2YgdGl0bGVJbWFnZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSW1hZ2UgPSB0aXRsZUltYWdlLnJlcGxhY2UoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnLCAnJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCh0aXRsZUltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMucHVzaChpbWFnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1dlYlZpZXdDb250ZXh0ID0gYXdhaXQgdGhpcy5pc1dlYlZpZXdDb250ZXh0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1dlYlZpZXdDb250ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IGFsbCAoc2NyZWVuc2hvdCBhbmQgdGl0bGUpIGltYWdlc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlcyA9IGF3YWl0IHRoaXMuZHJpdmVyLmdldFdpbmRvd0hhbmRsZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShoYW5kbGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGUgb2YgaGFuZGxlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmRyaXZlci5zd2l0Y2hUb1dpbmRvdyhoYW5kbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwdXNoSW1hZ2VUb0ltYWdlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHB1c2hJbWFnZVRvSW1hZ2VzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVyZ2UgYWxsIGltYWdlcyBpbnRvIG9uZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRJbWFnZSA9IGF3YWl0IG1lcmdlSW1hZ2VzKGltYWdlcywgeyBkaXJlY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXJnZWRJbWFnZSAmJiB0eXBlb2YgbWVyZ2VkSW1hZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXJnZWRJbWFnZS5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0aW1lb3V0OiAzMCoxMDAwIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWl0VW50aWxSZXRWYWwgJiYgd2FpdFVudGlsUmV0VmFsLnRoZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0VW50aWxSZXRWYWwudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCBnZXQgc2NyZWVuc2hvdCcsIGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QnLCBlKTtcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgZ2V0IHNjcmVlbnNob3QgaW5uZXIgZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBfZ2V0TG9ncyhuYW1lKSB7XHJcbiAgICAvLyAgICAgaWYgKCFOT19MT0dTX0NPTU1BTkRTLmluY2x1ZGVzKG5hbWUpKSB7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmdldExvZ3MoKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgX2FkanVzdEFwcGl1bUxvZyhsb2csIHNyYykge1xyXG4gICAgICAgIGlmICghbG9nIHx8IHR5cGVvZiBsb2cgIT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGxvZy50aW1lc3RhbXAgZnJvbSB0aGUgZGV2aWNlIHRpbWUgem9uZSB0byB0aGUgbG9jYWwgb25lIChzbyB3ZSBjYW4gbGF0ZXIgY29ycmVsYXRlIGJldHdlZW4gc3RlcHMgYW5kIGxvZ3MpICAgICAgICBcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aW1lOiBsb2cudGltZXN0YW1wLFxyXG4gICAgICAgICAgICBtc2c6IGxvZy5tZXNzYWdlLFxyXG4gICAgICAgICAgICBsZXZlbDogbG9nLmxldmVsLFxyXG4gICAgICAgICAgICBzcmM6IHNyY1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgX2l0ZXJhdGlvblN0YXJ0KCkge1xyXG4gICAgICAgIC8vIGNsZWFyIHRyYW5zYWN0aW9uIG5hbWUgc2F2ZWQgaW4gcHJldmlvdXMgaXRlcmF0aW9uIGlmIGFueVxyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2l0ZXJhdGlvbkVuZChlcnJvcikge1xyXG4gICAgICAgIGlmIChlcnJvciAmJiBlcnJvci50eXBlID09PSBlcnJvckhlbHBlci5lcnJvckNvZGUuQVBQSVVNX1NFU1NJT05fVElNRU9VVCkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVuaXVtU2Vzc2lvblRpbWVvdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlbml1bVNlc3Npb25UaW1lb3V0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgcmVzdCBpZiBtb2IgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZFxyXG4gICAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29sbGVjdCBhbGwgdGhlIGRldmljZSBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3REZXZpY2VMb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXREZXZpY2VMb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbG9nIG9mIGxvZ3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ycy5sb2dzLnB1c2godGhpcy5fYWRqdXN0QXBwaXVtTG9nKGxvZywgJ2RldmljZScpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdDYW5ub3QgcmV0cmlldmUgZGV2aWNlIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIHRoZSBicm93c2VyIGxvZ3MgZm9yIHRoaXMgc2Vzc2lvblxyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29sbGVjdEJyb3dzZXJMb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gYXdhaXQgdGhpcy5nZXRCcm93c2VyTG9ncygpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxvZyBvZiBsb2dzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnMubG9ncy5wdXNoKHRoaXMuX2FkanVzdEFwcGl1bUxvZyhsb2csICdicm93c2VyJykpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ0Nhbm5vdCByZXRyaWV2ZSBicm93c2VyIGxvZ3MuJywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbGxlY3QgYWxsIEFwcGl1bSBsb2dzIGZvciB0aGlzIHNlc3Npb25cclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbGxlY3RBcHBpdW1Mb2dzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsb2dzID0gdGhpcy5nZXRBcHBpdW1Mb2dzKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobG9ncyAmJiBBcnJheS5pc0FycmF5KGxvZ3MpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbG9nRW50cnkgb2YgbG9ncykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJzLmxvZ3MucHVzaCh0aGlzLl9hZGp1c3RBcHBpdW1Mb2cobG9nRW50cnksICdhcHBpdW0nKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcignQ2Fubm90IHJldHJpZXZlIEFwcGl1bSBsb2dzLicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9nZXRXZGlvTG9jYXRvcihsb2NhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFsb2NhdG9yKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnSW52YWxpZCBhcmd1bWVudCAtIGxvY2F0b3Igbm90IHNwZWNpZmllZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodHlwZW9mIGxvY2F0b3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobG9jYXRvci5pbmRleE9mKCcvJykgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7IC8vIGxlYXZlIHhwYXRoIGxvY2F0b3IgYXMgaXNcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGxhdGZvcm0gPSB0aGlzLmNhcHMgJiYgdGhpcy5jYXBzLnBsYXRmb3JtTmFtZSA/IHRoaXMuY2Fwcy5wbGF0Zm9ybU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmFwcENvbnRleHQgPT09ICdOQVRJVkVfQVBQJyAmJiBwbGF0Zm9ybSA9PT0gJ2FuZHJvaWQnKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ2lkPScpID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBwcmVwZW5kIHBhY2thZ2UgbmFtZSBpZiBpdCdzIG5vdCBzcGVjaWZpZWRcclxuICAgICAgICAgICAgICAgIC8vIE5PVEU6IGdldEN1cnJlbnRQYWNrYWdlKCkgc2VlbXMgdG8gY3Jhc2ggcG9zc2libHkgZHVlIHRvIGEgd2RpbyBidWcuIFxyXG4gICAgICAgICAgICAgICAgLy8gICAgICAgc28gd2UgZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIGNhcHMgaW5zdGVhZC5cclxuICAgICAgICAgICAgICAgIGxvY2F0b3IgPSBsb2NhdG9yLnN1YnN0cignaWQ9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignOmlkLycpID09PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0b3IgPSB0aGlzLmNhcHMuYXBwUGFja2FnZSArICc6aWQvJyArIGxvY2F0b3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5yZXNvdXJjZUlkKFwiJyArIGxvY2F0b3IgKyAnXCIpJztcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2NsYXNzPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuY2xhc3NOYW1lKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCdjbGFzcz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd0ZXh0PScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkudGV4dChcIicgKyBsb2NhdG9yLnN1YnN0cigndGV4dD0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd0ZXh0LWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkudGV4dENvbnRhaW5zKFwiJyArIGxvY2F0b3Iuc3Vic3RyKCd0ZXh0LWNvbnRhaW5zPScubGVuZ3RoKSArICdcIiknO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Rlc2M9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5kZXNjcmlwdGlvbihcIicgKyBsb2NhdG9yLnN1YnN0cignZGVzYz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdkZXNjLWNvbnRhaW5zPScpID09PSAwKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICdhbmRyb2lkPW5ldyBVaVNlbGVjdG9yKCkuZGVzY3JpcHRpb25Db250YWlucyhcIicgKyBsb2NhdG9yLnN1YnN0cignZGVzYy1jb250YWlucz0nLmxlbmd0aCkgKyAnXCIpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCdzY3JvbGxhYmxlJykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2FuZHJvaWQ9bmV3IFVpU2VsZWN0b3IoKS5zY3JvbGxhYmxlKHRydWUpJztcclxuICAgICAgICAgICAgZWxzZSBpZiAobG9jYXRvci5pbmRleE9mKCd+JykgPT09IDApICAgIC8vIGFjY2Vzc2liaWxpdHkgaWRcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5hcHBDb250ZXh0ID09PSAnTkFUSVZFX0FQUCcgJiYgcGxhdGZvcm0gPT09ICdpb3MnKSB7XHJcbiAgICAgICAgICAgIGlmIChsb2NhdG9yLmluZGV4T2YoJ34nKSA9PT0gMCkgLy8gYWNjZXNzaWJpbGl0eSBpZFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFwcENvbnRleHQgIT09ICdOQVRJVkVfQVBQJykgeyAgICAgICAgICAgIC8vIEh5YnJpZCBvciBXZWIgYXBwbGljYXRpb25cclxuICAgICAgICAgICAgaWYgKGxvY2F0b3IuaW5kZXhPZignaWQ9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJyMnICsgbG9jYXRvci5zdWJzdHIoJ2lkPScubGVuZ3RoKTsgICAgICAvLyBjb252ZXJ0ICdpZD0nIHRvICcjJ1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ25hbWU9JykgPT09IDApXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1tuYW1lPScgKyBsb2NhdG9yLnN1YnN0cignbmFtZT0nLmxlbmd0aCkgKyAnXSc7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluaz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnPScgKyBsb2NhdG9yLnN1YnN0cignbGluaz0nLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvY2F0b3IuaW5kZXhPZignbGluay1jb250YWlucz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiAnKj0nICsgbG9jYXRvci5zdWJzdHIoJ2xpbms9Jy5sZW5ndGgpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChsb2NhdG9yLmluZGV4T2YoJ2Nzcz0nKSA9PT0gMClcclxuICAgICAgICAgICAgICAgIHJldHVybiBsb2NhdG9yLnN1YnN0cignY3NzPScubGVuZ3RoKTsgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgY3NzLCBqdXN0IHJlbW92ZSBjc3M9IHByZWZpeFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGxvY2F0b3I7XHJcbiAgICB9XHJcblxyXG4gICAgX2xvYWRIZWxwZXJGdW5jdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldFdkaW9Mb2NhdG9yID0gdGhpcy5fZ2V0V2Rpb0xvY2F0b3I7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLm1hdGNoUGF0dGVybiA9IG1vZFV0aWxzLm1hdGNoUGF0dGVybjtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0RWxlbWVudCA9IG1vZFV0aWxzLmdldEVsZW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldEVsZW1lbnRzID0gbW9kVXRpbHMuZ2V0RWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmdldENoaWxkRWxlbWVudCA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuZ2V0Q2hpbGRFbGVtZW50cyA9IG1vZFV0aWxzLmdldENoaWxkRWxlbWVudHM7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLnNldFRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnNldFRpbWVvdXRJbXBsaWNpdDtcclxuICAgICAgICB0aGlzLmhlbHBlcnMucmVzdG9yZVRpbWVvdXRJbXBsaWNpdCA9IG1vZFV0aWxzLnJlc3RvcmVUaW1lb3V0SW1wbGljaXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50ID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydEFyZ3VtZW50Tm9uRW1wdHlTdHJpbmcgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlciA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudE51bWJlck5vbk5lZ2F0aXZlID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZTtcclxuICAgICAgICB0aGlzLmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRCb29sID0gbW9kVXRpbHMuYXNzZXJ0QXJndW1lbnRCb29sO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudEJvb2xPcHRpb25hbCA9IG1vZFV0aWxzLmFzc2VydEFyZ3VtZW50Qm9vbE9wdGlvbmFsO1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQgPSBtb2RVdGlscy5hc3NlcnRBcmd1bWVudFRpbWVvdXQ7XHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmFzc2VydENvbnRleHQgPSBtb2RVdGlscy5hc3NlcnRDb250ZXh0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5jb250ZXh0TGlzdCA9IG1vZFV0aWxzLmNvbnRleHRMaXN0O1xyXG4gICAgICAgIHRoaXMuaGVscGVycy5nZXRMb2dUeXBlcyA9IG1vZFV0aWxzLmdldExvZ1R5cGVzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZVNlc3Npb24oKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZHJpdmVyICYmIHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24pIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZHJpdmVyLmRlbGV0ZVNlc3Npb24oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoJ2RlbGV0ZVNlc3Npb24gZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NlbmRSZXN1bHRTdGF0dXNUb0Jyb3dzZXJzdGFjayhzdGF0dXMpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzID09PSAnUEFTU0VEJyA/ICdwYXNzZWQnIDogJ2ZhaWxlZCdcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGxldCBvcHRpb25zO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMud2Rpb09wdHMuY2FwYWJpbGl0aWVzLmJyb3dzZXJOYW1lKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLmJyb3dzZXJzdGFjay5jb20vYXV0b21hdGUvc2Vzc2lvbnMvJHt0aGlzLmRyaXZlci5zZXNzaW9uSWR9Lmpzb25gLFxyXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BVVCcsXHJcbiAgICAgICAgICAgICAgICAgICAganNvbjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxyXG4gICAgICAgICAgICAgICAgICAgICdhdXRoJzoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAndXNlcic6IHRoaXMud2Rpb09wdHMudXNlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnOiB0aGlzLndkaW9PcHRzLmtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmRJbW1lZGlhdGVseSc6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25zID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHVybDogYGh0dHBzOi8vYXBpLWNsb3VkLmJyb3dzZXJzdGFjay5jb20vYXBwLWF1dG9tYXRlL3Nlc3Npb25zLyR7dGhpcy5kcml2ZXIuc2Vzc2lvbklkfS5qc29uYCxcclxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICAgICAgICAgIGpzb246IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcclxuICAgICAgICAgICAgICAgICAgICAnYXV0aCc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXInOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnJvd3NlcnN0YWNrLnVzZXInXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3MnOiB0aGlzLndkaW9PcHRzLmNhcGFiaWxpdGllc1snYnJvd3NlcnN0YWNrLmtleSddLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAnc2VuZEltbWVkaWF0ZWx5JzogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHJlcXVlc3Qob3B0aW9ucywgKGVyciwgcmVzLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKCdVbmFibGUgdG8gc2VuZCByZXN1bHQgc3RhdHVzIHRvIEJyb3dzZXJzdGFjazogJyArIGUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsWUFBWTs7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUF6Q0E7RUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBDQTtBQUNBO0FB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