oxygen-cli 1.22.0 → 1.99.0-alpha.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 (232) hide show
  1. package/CHANGELOG.md +0 -50
  2. package/build/core/OxygenCore.js +56 -145
  3. package/build/errors/OxygenError.js +5 -15
  4. package/build/errors/helper.js +45 -49
  5. package/build/index.js +14 -6
  6. package/build/lib/cli-util.js +19 -19
  7. package/build/lib/cli.js +4 -2
  8. package/build/lib/parallel-launcher.js +333 -0
  9. package/build/lib/param-manager.js +66 -47
  10. package/build/lib/util.js +38 -9
  11. package/build/ox_modules/index.js +1 -97
  12. package/build/ox_modules/module-assert.js +19 -9
  13. package/build/ox_modules/module-dns.js +220 -0
  14. package/build/ox_modules/module-http.js +39 -51
  15. package/build/ox_modules/module-shell.js +19 -75
  16. package/build/ox_modules/module-utils.js +1 -108
  17. package/build/ox_modules/utils.js +1 -357
  18. package/build/reporter/FileReporterBase.js +5 -5
  19. package/build/reporter/ReportAggregator.js +127 -4
  20. package/build/runners/WorkerProcess.js +15 -28
  21. package/build/runners/index.js +2 -6
  22. package/build/runners/oxygen/OxygenWorker.js +8 -8
  23. package/build/runners/oxygen/index.js +17 -18
  24. package/build/runners/oxygen/worker.js +10 -8
  25. package/package.json +12 -46
  26. package/build/lib/img-merge.js +0 -163
  27. package/build/ox_modules/module-db.js +0 -146
  28. package/build/ox_modules/module-email.js +0 -212
  29. package/build/ox_modules/module-eyes.js +0 -189
  30. package/build/ox_modules/module-mailinator.js +0 -207
  31. package/build/ox_modules/module-mob/commands/alertAccept.js +0 -35
  32. package/build/ox_modules/module-mob/commands/alertDismiss.js +0 -35
  33. package/build/ox_modules/module-mob/commands/assertAlert.js +0 -56
  34. package/build/ox_modules/module-mob/commands/assertText.js +0 -45
  35. package/build/ox_modules/module-mob/commands/assertTitle.js +0 -43
  36. package/build/ox_modules/module-mob/commands/assertValue.js +0 -66
  37. package/build/ox_modules/module-mob/commands/back.js +0 -27
  38. package/build/ox_modules/module-mob/commands/clear.js +0 -40
  39. package/build/ox_modules/module-mob/commands/click.js +0 -35
  40. package/build/ox_modules/module-mob/commands/clickHidden.js +0 -52
  41. package/build/ox_modules/module-mob/commands/clickLong.js +0 -34
  42. package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +0 -37
  43. package/build/ox_modules/module-mob/commands/closeApp.js +0 -27
  44. package/build/ox_modules/module-mob/commands/debug.js +0 -26
  45. package/build/ox_modules/module-mob/commands/dragAndDrop.js +0 -38
  46. package/build/ox_modules/module-mob/commands/enableNetwork.js +0 -75
  47. package/build/ox_modules/module-mob/commands/execute.js +0 -32
  48. package/build/ox_modules/module-mob/commands/findElement.js +0 -36
  49. package/build/ox_modules/module-mob/commands/findElements.js +0 -39
  50. package/build/ox_modules/module-mob/commands/getAlertText.js +0 -31
  51. package/build/ox_modules/module-mob/commands/getAppiumLogs.js +0 -26
  52. package/build/ox_modules/module-mob/commands/getBrowserLogs.js +0 -66
  53. package/build/ox_modules/module-mob/commands/getCurrentActivity.js +0 -26
  54. package/build/ox_modules/module-mob/commands/getCurrentPackage.js +0 -26
  55. package/build/ox_modules/module-mob/commands/getDeviceLogs.js +0 -57
  56. package/build/ox_modules/module-mob/commands/getDeviceTime.js +0 -27
  57. package/build/ox_modules/module-mob/commands/getLocation.js +0 -32
  58. package/build/ox_modules/module-mob/commands/getSource.js +0 -26
  59. package/build/ox_modules/module-mob/commands/getText.js +0 -36
  60. package/build/ox_modules/module-mob/commands/getTitle.js +0 -24
  61. package/build/ox_modules/module-mob/commands/getUrl.js +0 -28
  62. package/build/ox_modules/module-mob/commands/getValue.js +0 -50
  63. package/build/ox_modules/module-mob/commands/getWindowHandles.js +0 -27
  64. package/build/ox_modules/module-mob/commands/hideKeyboard.js +0 -33
  65. package/build/ox_modules/module-mob/commands/index.js +0 -594
  66. package/build/ox_modules/module-mob/commands/installApp.js +0 -28
  67. package/build/ox_modules/module-mob/commands/isAppInstalled.js +0 -28
  68. package/build/ox_modules/module-mob/commands/isCheckable.js +0 -31
  69. package/build/ox_modules/module-mob/commands/isChecked.js +0 -31
  70. package/build/ox_modules/module-mob/commands/isClickable.js +0 -31
  71. package/build/ox_modules/module-mob/commands/isExist.js +0 -36
  72. package/build/ox_modules/module-mob/commands/isSelected.js +0 -36
  73. package/build/ox_modules/module-mob/commands/isVisible.js +0 -36
  74. package/build/ox_modules/module-mob/commands/isWebViewContext.js +0 -27
  75. package/build/ox_modules/module-mob/commands/launchApp.js +0 -26
  76. package/build/ox_modules/module-mob/commands/longPressKeyCode.js +0 -30
  77. package/build/ox_modules/module-mob/commands/open.js +0 -43
  78. package/build/ox_modules/module-mob/commands/pause.js +0 -27
  79. package/build/ox_modules/module-mob/commands/removeApp.js +0 -28
  80. package/build/ox_modules/module-mob/commands/resetApp.js +0 -26
  81. package/build/ox_modules/module-mob/commands/scrollIntoElement.js +0 -86
  82. package/build/ox_modules/module-mob/commands/scrollIntoView.js +0 -40
  83. package/build/ox_modules/module-mob/commands/select.js +0 -54
  84. package/build/ox_modules/module-mob/commands/selectFrame.js +0 -53
  85. package/build/ox_modules/module-mob/commands/selectWindow.js +0 -149
  86. package/build/ox_modules/module-mob/commands/sendKeys.js +0 -84
  87. package/build/ox_modules/module-mob/commands/setContext.js +0 -28
  88. package/build/ox_modules/module-mob/commands/setNativeContext.js +0 -26
  89. package/build/ox_modules/module-mob/commands/setTimeout.js +0 -33
  90. package/build/ox_modules/module-mob/commands/setWebViewContext.js +0 -39
  91. package/build/ox_modules/module-mob/commands/shake.js +0 -27
  92. package/build/ox_modules/module-mob/commands/smsClickLink.js +0 -32
  93. package/build/ox_modules/module-mob/commands/smsGetText.js +0 -45
  94. package/build/ox_modules/module-mob/commands/swipe.js +0 -58
  95. package/build/ox_modules/module-mob/commands/swipeElement.js +0 -58
  96. package/build/ox_modules/module-mob/commands/swipeScreen.js +0 -56
  97. package/build/ox_modules/module-mob/commands/takeScreenshot.js +0 -27
  98. package/build/ox_modules/module-mob/commands/tap.js +0 -34
  99. package/build/ox_modules/module-mob/commands/type.js +0 -67
  100. package/build/ox_modules/module-mob/commands/unlockPattern.js +0 -92
  101. package/build/ox_modules/module-mob/commands/waitForExist.js +0 -29
  102. package/build/ox_modules/module-mob/commands/waitForInteractable.js +0 -42
  103. package/build/ox_modules/module-mob/commands/waitForVisible.js +0 -28
  104. package/build/ox_modules/module-mob.js +0 -699
  105. package/build/ox_modules/module-pdf.js +0 -328
  106. package/build/ox_modules/module-proxy.js +0 -324
  107. package/build/ox_modules/module-serial.js +0 -187
  108. package/build/ox_modules/module-soap.js +0 -260
  109. package/build/ox_modules/module-twilio.js +0 -192
  110. package/build/ox_modules/module-web/commands/alertAccept.js +0 -35
  111. package/build/ox_modules/module-web/commands/alertDismiss.js +0 -35
  112. package/build/ox_modules/module-web/commands/assertAlert.js +0 -55
  113. package/build/ox_modules/module-web/commands/assertExist.js +0 -28
  114. package/build/ox_modules/module-web/commands/assertSelectedLabel.js +0 -51
  115. package/build/ox_modules/module-web/commands/assertSelectedValue.js +0 -45
  116. package/build/ox_modules/module-web/commands/assertText.js +0 -45
  117. package/build/ox_modules/module-web/commands/assertTextNotPresent.js +0 -56
  118. package/build/ox_modules/module-web/commands/assertTextPresent.js +0 -52
  119. package/build/ox_modules/module-web/commands/assertTitle.js +0 -42
  120. package/build/ox_modules/module-web/commands/assertValue.js +0 -44
  121. package/build/ox_modules/module-web/commands/back.js +0 -27
  122. package/build/ox_modules/module-web/commands/clear.js +0 -41
  123. package/build/ox_modules/module-web/commands/click.js +0 -112
  124. package/build/ox_modules/module-web/commands/clickHidden.js +0 -79
  125. package/build/ox_modules/module-web/commands/closeWindow.js +0 -25
  126. package/build/ox_modules/module-web/commands/debug.js +0 -25
  127. package/build/ox_modules/module-web/commands/deleteCookies.js +0 -22
  128. package/build/ox_modules/module-web/commands/deselect.js +0 -34
  129. package/build/ox_modules/module-web/commands/doubleClick.js +0 -65
  130. package/build/ox_modules/module-web/commands/dragAndDrop.js +0 -36
  131. package/build/ox_modules/module-web/commands/execute.js +0 -36
  132. package/build/ox_modules/module-web/commands/fileBrowse.js +0 -72
  133. package/build/ox_modules/module-web/commands/findElement.js +0 -35
  134. package/build/ox_modules/module-web/commands/findElements.js +0 -38
  135. package/build/ox_modules/module-web/commands/fullscreenWindow.js +0 -24
  136. package/build/ox_modules/module-web/commands/getAlertText.js +0 -30
  137. package/build/ox_modules/module-web/commands/getAttribute.js +0 -38
  138. package/build/ox_modules/module-web/commands/getBrowserLogs.js +0 -34
  139. package/build/ox_modules/module-web/commands/getCookies.js +0 -23
  140. package/build/ox_modules/module-web/commands/getCssValue.js +0 -38
  141. package/build/ox_modules/module-web/commands/getElementCount.js +0 -29
  142. package/build/ox_modules/module-web/commands/getHTML.js +0 -30
  143. package/build/ox_modules/module-web/commands/getSource.js +0 -26
  144. package/build/ox_modules/module-web/commands/getText.js +0 -36
  145. package/build/ox_modules/module-web/commands/getTitle.js +0 -22
  146. package/build/ox_modules/module-web/commands/getUrl.js +0 -26
  147. package/build/ox_modules/module-web/commands/getValue.js +0 -43
  148. package/build/ox_modules/module-web/commands/getWindowHandles.js +0 -26
  149. package/build/ox_modules/module-web/commands/getWindowSize.js +0 -26
  150. package/build/ox_modules/module-web/commands/getXMLPageSource.js +0 -51
  151. package/build/ox_modules/module-web/commands/index.js +0 -634
  152. package/build/ox_modules/module-web/commands/isAlertPresent.js +0 -31
  153. package/build/ox_modules/module-web/commands/isChecked.js +0 -30
  154. package/build/ox_modules/module-web/commands/isExist.js +0 -36
  155. package/build/ox_modules/module-web/commands/isSelected.js +0 -35
  156. package/build/ox_modules/module-web/commands/isVisible.js +0 -36
  157. package/build/ox_modules/module-web/commands/makeVisible.js +0 -74
  158. package/build/ox_modules/module-web/commands/maximizeWindow.js +0 -24
  159. package/build/ox_modules/module-web/commands/minimizeWindow.js +0 -24
  160. package/build/ox_modules/module-web/commands/newWindow.js +0 -27
  161. package/build/ox_modules/module-web/commands/open.js +0 -42
  162. package/build/ox_modules/module-web/commands/pause.js +0 -26
  163. package/build/ox_modules/module-web/commands/point.js +0 -37
  164. package/build/ox_modules/module-web/commands/pointJS.js +0 -56
  165. package/build/ox_modules/module-web/commands/refresh.js +0 -26
  166. package/build/ox_modules/module-web/commands/rightClick.js +0 -61
  167. package/build/ox_modules/module-web/commands/rightClickActions.js +0 -57
  168. package/build/ox_modules/module-web/commands/scrollToElement.js +0 -33
  169. package/build/ox_modules/module-web/commands/select.js +0 -55
  170. package/build/ox_modules/module-web/commands/selectFrame.js +0 -52
  171. package/build/ox_modules/module-web/commands/selectWindow.js +0 -148
  172. package/build/ox_modules/module-web/commands/sendKeys.js +0 -56
  173. package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +0 -33
  174. package/build/ox_modules/module-web/commands/setTimeout.js +0 -33
  175. package/build/ox_modules/module-web/commands/setWindowSize.js +0 -29
  176. package/build/ox_modules/module-web/commands/takeScreenshot.js +0 -37
  177. package/build/ox_modules/module-web/commands/type.js +0 -52
  178. package/build/ox_modules/module-web/commands/waitForAngular.js +0 -83
  179. package/build/ox_modules/module-web/commands/waitForExist.js +0 -28
  180. package/build/ox_modules/module-web/commands/waitForInteractable.js +0 -31
  181. package/build/ox_modules/module-web/commands/waitForNotExist.js +0 -57
  182. package/build/ox_modules/module-web/commands/waitForNotText.js +0 -45
  183. package/build/ox_modules/module-web/commands/waitForNotValue.js +0 -45
  184. package/build/ox_modules/module-web/commands/waitForText.js +0 -45
  185. package/build/ox_modules/module-web/commands/waitForValue.js +0 -45
  186. package/build/ox_modules/module-web/commands/waitForVisible.js +0 -28
  187. package/build/ox_modules/module-web/commands/waitForWindow.js +0 -118
  188. package/build/ox_modules/module-web.js +0 -909
  189. package/build/ox_modules/module-win/commands/assertText.js +0 -41
  190. package/build/ox_modules/module-win/commands/assertTitle.js +0 -38
  191. package/build/ox_modules/module-win/commands/assertValue.js +0 -62
  192. package/build/ox_modules/module-win/commands/back.js +0 -21
  193. package/build/ox_modules/module-win/commands/clear.js +0 -34
  194. package/build/ox_modules/module-win/commands/click.js +0 -25
  195. package/build/ox_modules/module-win/commands/clickLong.js +0 -30
  196. package/build/ox_modules/module-win/commands/clickMultipleTimes.js +0 -33
  197. package/build/ox_modules/module-win/commands/findElement.js +0 -31
  198. package/build/ox_modules/module-win/commands/findElements.js +0 -31
  199. package/build/ox_modules/module-win/commands/getAppiumLogs.js +0 -22
  200. package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +0 -25
  201. package/build/ox_modules/module-win/commands/getLocation.js +0 -26
  202. package/build/ox_modules/module-win/commands/getSource.js +0 -22
  203. package/build/ox_modules/module-win/commands/getText.js +0 -32
  204. package/build/ox_modules/module-win/commands/getValue.js +0 -46
  205. package/build/ox_modules/module-win/commands/getWindowHandles.js +0 -25
  206. package/build/ox_modules/module-win/commands/index.js +0 -298
  207. package/build/ox_modules/module-win/commands/isCheckable.js +0 -26
  208. package/build/ox_modules/module-win/commands/isChecked.js +0 -26
  209. package/build/ox_modules/module-win/commands/isClickable.js +0 -26
  210. package/build/ox_modules/module-win/commands/isExist.js +0 -32
  211. package/build/ox_modules/module-win/commands/isSelected.js +0 -26
  212. package/build/ox_modules/module-win/commands/isVisible.js +0 -32
  213. package/build/ox_modules/module-win/commands/open.js +0 -24
  214. package/build/ox_modules/module-win/commands/pause.js +0 -23
  215. package/build/ox_modules/module-win/commands/rightClick.js +0 -30
  216. package/build/ox_modules/module-win/commands/selectWindow.js +0 -97
  217. package/build/ox_modules/module-win/commands/sendKeys.js +0 -50
  218. package/build/ox_modules/module-win/commands/setTimeout.js +0 -29
  219. package/build/ox_modules/module-win/commands/takeScreenshot.js +0 -26
  220. package/build/ox_modules/module-win/commands/tap.js +0 -29
  221. package/build/ox_modules/module-win/commands/type.js +0 -38
  222. package/build/ox_modules/module-win/commands/waitForExist.js +0 -25
  223. package/build/ox_modules/module-win/commands/waitForInteractable.js +0 -43
  224. package/build/ox_modules/module-win/commands/waitForVisible.js +0 -24
  225. package/build/ox_modules/module-win.js +0 -367
  226. package/build/ox_services/service-devtools/submodule-network.js +0 -338
  227. package/build/ox_services/service-devtools.js +0 -83
  228. package/build/runners/cucumber/CucumberEventListener.js +0 -181
  229. package/build/runners/cucumber/CucumberReporter.js +0 -277
  230. package/build/runners/cucumber/CucumberWorker.js +0 -337
  231. package/build/runners/cucumber/index.js +0 -159
  232. package/build/runners/cucumber/worker.js +0 -184
@@ -114,6 +114,10 @@ class OxygenRunner extends _events.EventEmitter {
114
114
  this._whenDisposed = (0, _when.defer)();
115
115
  }
116
116
 
117
+ getId() {
118
+ return this._id;
119
+ }
120
+
117
121
  async init(options, caps = {}, reporter) {
118
122
  if (!options.suites) {
119
123
  throw new Error('Initialization failed - no test suites are defined. You must define "suites" property in Oxygen options.');
@@ -131,8 +135,8 @@ class OxygenRunner extends _events.EventEmitter {
131
135
  if (typeof options.env === 'string' && typeof options.envs === 'object' && options.envs[options.env]) {
132
136
  optEnv = options.envs[options.env];
133
137
  } else if (typeof options.env === 'object' && Object.keys(options.env)) {
134
- optEnv = options.env;
135
- }
138
+ optEnv = options.env;
139
+ }
136
140
  }
137
141
 
138
142
  if (options.envVars && Object.keys(options.envVars)) {
@@ -448,6 +452,7 @@ class OxygenRunner extends _events.EventEmitter {
448
452
 
449
453
  suiteResult.endTime = _util.default.getTimeStamp();
450
454
  suiteResult.duration = suiteResult.endTime - suiteResult.startTime;
455
+ suiteResult._groupResult = this._options._groupResult;
451
456
 
452
457
  if (showSuiteIterationsMessages) {
453
458
  this._reporter.onIterationEnd(this._id, suiteResult, 'Suite');
@@ -666,16 +671,18 @@ class OxygenRunner extends _events.EventEmitter {
666
671
  }
667
672
 
668
673
  async _startWorkerProcess() {
669
- const workerPath = _path.default.join(__dirname, 'worker.js');
674
+ if (this._worker) {} else {
675
+ const workerPath = _path.default.join(__dirname, 'worker.js');
670
676
 
671
- this._worker = new _WorkerProcess.default(this._id, workerPath, this._debugMode, this._debugPort, 'Oxygen', this._npmGRootExecution);
672
- await this._worker.start();
677
+ this._worker = new _WorkerProcess.default(this._id, workerPath, this._debugMode, this._debugPort, 'Oxygen', this._npmGRootExecution);
678
+ await this._worker.start();
673
679
 
674
- this._hookWorkerEvents();
680
+ this._hookWorkerEvents();
675
681
 
676
- await this._worker.startDebugger();
682
+ await this._worker.startDebugger();
677
683
 
678
- this._hookWorkerDebuggerEvents();
684
+ this._hookWorkerDebuggerEvents();
685
+ }
679
686
  }
680
687
 
681
688
  _hookWorkerEvents() {
@@ -793,15 +800,7 @@ class OxygenRunner extends _events.EventEmitter {
793
800
  }
794
801
  }
795
802
 
796
- _resetGlobalVariables() {
797
- this._modCaps = {};
798
- this._worker = null;
799
- this._isRunning = false;
800
- this._isDisposing = false;
801
- this._isInitializing = false;
802
- this._testKilled = false;
803
- this._whenDisposed = (0, _when.defer)();
804
- }
803
+ _resetGlobalVariables() {}
805
804
 
806
805
  _processTestResults({
807
806
  resultStore,
@@ -852,4 +851,4 @@ class OxygenRunner extends _events.EventEmitter {
852
851
  }
853
852
 
854
853
  exports.default = OxygenRunner;
855
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZ2V0U3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZXMiLCJyZXR2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJzdWl0ZSIsImNhc2VzIiwiY2F6ZSIsImJyZWFrcG9pbnRzIiwiYnJlYWtwb2ludCIsInB1c2giLCJyZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyIsInJlbW92ZUJyZWFrcG9pbnQiLCJpZHgiLCJmaWxlIiwibGluZSIsInNwbGljZSIsIk94eWdlblJ1bm5lciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9pZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6aW5nIiwiX2lzRGlzcG9zaW5nIiwiX3dvcmtlciIsIl9kZWJ1Z01vZGUiLCJfd29ya2VyUHJvY0xhc3RFcnJvciIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIm5wbUdSb290RXhlY3V0aW9uIiwiX3N1aXRlIiwiX2VudlZhcnMiLCJfdmFycyIsIl9jYXBzIiwiX21vZENhcHMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJpbml0IiwiY2FwcyIsInJlcG9ydGVyIiwiRXJyb3IiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIl9yZXBvcnRlciIsIl9pc0luaXRpYWxpemVkIiwib3B0RW52IiwiZW52IiwiZW52cyIsIk9iamVjdCIsImtleXMiLCJlbnZWYXJzIiwiX2VudiIsIl9zdWl0ZXMiLCJkZWJ1Z1BvcnRJZGUiLCJfZGVidWdQb3J0IiwiZGVidWdQb3J0Iiwic2NyaXB0Q29udGVudExpbmVPZmZzZXQiLCJsb2NhbFRpbWUiLCJfc3RhcnRXb3JrZXJQcm9jZXNzIiwiX3dvcmtlcl9Jbml0T3h5Z2VuIiwiZGlzcG9zZSIsInN0YXR1cyIsImlzUnVubmluZyIsInN0b3AiLCJlIiwiY29uc29sZSIsIndhcm4iLCJfcmVzZXRHbG9iYWxWYXJpYWJsZXMiLCJydW4iLCJvblJ1bm5lclN0YXJ0IiwiZXJyb3IiLCJyZXN1bHQiLCJfcnVuVGVzdCIsImZhaWx1cmUiLCJvblJ1bm5lckVuZCIsImtpbGwiLCJkZWJ1Z0NvbnRpbnVlIiwiZGVidWdnZXIiLCJjb250aW51ZSIsInVwZGF0ZUJyZWFrcG9pbnRzIiwiZmlsZVBhdGgiLCJzZXRCcmVha3BvaW50c0FjdGl2ZSIsInByb21pc2VzIiwidHNCcmVha3BvaW50cyIsImdldEJyZWFrcG9pbnRzIiwic3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZUJwIiwiaW5jbHVkZXMiLCJhY3R1YWxDdXJyZW50QnAiLCJyZW1vdmVCcmVha3BvaW50QnlWYWx1ZSIsInVzZXJTZXRCcCIsInNldEJyZWFrcG9pbnQiLCJwcm9taXNlQWxsUHJvbWlzZSIsImFsbCIsInRoZW4iLCJ2YWx1ZSIsImRlYnVnIiwiYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyIsInJlcGxDbG9zZSIsIl9zZW5kIiwiZXZlbnQiLCJuYW1lIiwicmVwbFNlbmQiLCJjbWQiLCJjb250ZW50IiwicmVwbFN0YXJ0IiwiaW52b2tlIiwiY2xlYXJCcmVha3BvaW50IiwiVGVzdFJlc3VsdCIsInN0YXJ0VGltZSIsImdldFRpbWVTdGFtcCIsIlN0YXR1cyIsIlBBU1NFRCIsIl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rIiwic3VpdGVSZXN1bHQiLCJfcnVuU3VpdGUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJoYXNGYWlsZWRTdWl0ZXMiLCJzb21lIiwic3VpdGVJdGVyYXRpb25zIiwieCIsIkZBSUxFRCIsImVudmlyb25tZW50IiwiY2FwYWJpbGl0aWVzIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayIsInBhdGgiLCJpdGVyYXRpb25Db3VudCIsInNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInN1aXRlSXRlcmF0aW9uIiwib25JdGVyYXRpb25TdGFydCIsIlRlc3RTdWl0ZVJlc3VsdCIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsIml0ZXJhdGlvbk51bSIsIl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayIsIm9uU3VpdGVTdGFydCIsInVyaSIsImNhc2VJdGVyYXRpb24iLCJzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInJlUnVuQ291bnQiLCJjYXNlUmVzdWx0IiwiX3J1bkNhc2UiLCJyZVJ1bk9uRmFpbGVkIiwiX3dvcmtlcl9EaXNwb3NlTW9kdWxlcyIsIm9uSXRlcmF0aW9uRW5kIiwiX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayIsIm9uQ2FzZUVuZCIsImlkIiwiYXV0b0Rpc3Bvc2UiLCJfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayIsIm9uU3VpdGVFbmQiLCJyZVJ1biIsInBhcmFtcyIsInBhcmFtTWFuYWdlciIsInJlYWRQcmV2IiwiXyIsImV4dGVuZCIsImdldFZhbHVlcyIsInJlYWROZXh0IiwiaSIsIl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rIiwib25DYXNlU3RhcnQiLCJUZXN0Q2FzZVJlc3VsdCIsImxvY2F0aW9uIiwicmVzdWx0U3RvcmUiLCJjb250ZXh0IiwibW9kdWxlQ2FwcyIsIl93b3JrZXJfUnVuIiwiX3Byb2Nlc3NUZXN0UmVzdWx0cyIsInN0ZXBzIiwibG9ncyIsImhhciIsImZhaWxlZFN0ZXBzIiwiZmluZCIsImlzRW1wdHkiLCJtYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQiLCJfd2hlblRlc3RDYXNlRmluaXNoZWQiLCJyZWplY3QiLCJzY3JpcHROYW1lIiwic2NyaXB0UGF0aCIsInZhcnMiLCJ0ZXN0IiwiY2FzZSIsIml0ZXJhdGlvbiIsInBvRmlsZSIsInBvIiwiZGlzcG9zZU1vZHVsZXMiLCJpbnZva2VUZXN0SG9vayIsIm9uTG9nRW50cnkiLCJ3b3JrZXJQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIldvcmtlclByb2Nlc3MiLCJzdGFydCIsIl9ob29rV29ya2VyRXZlbnRzIiwic3RhcnREZWJ1Z2dlciIsIl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMiLCJfdGhpcyIsInN1YnNjcmliZSIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJvbiIsInBheWxvYWQiLCJleGl0RG9uZSIsImVtaXQiLCJleGl0Q29kZSIsInByb21pc2UiLCJPeHlnZW5FcnJvciIsImVycm9yQ29kZSIsIlNDUklQVF9FUlJPUiIsIm1zZyIsImxldmVsIiwiaW5mbyIsImVyciIsInRpbWUiLCJzcmMiLCJzdGFjayIsIm1ldGhvZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsIm9uU3RlcFN0YXJ0IiwibW9kdWxlIiwib25TdGVwRW5kIiwiX2VtaXRJdGVyYXRpb25FbmQiLCJ0cyIsInRjIiwic3VpdGVJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uTnVtIiwiY2FzZUl0ZXJhdGlvblJlc3VsdCIsIl9zdGF0dXMiLCJfZW1pdFRlc3RFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBaEJBLE1BQU1BLEdBQUcsR0FBRyxxQkFBTyxjQUFQLENBQVo7QUFDQSxNQUFNQyxjQUFjLEdBQUcsTUFBdkI7O0FBa0JBLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQUosQ0FBWUMsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQUQsRUFBVUYsRUFBVixDQUFqQyxDQUFyQjs7QUFFQSxNQUFNSSxvQkFBb0IsR0FBSUMsTUFBRCxJQUFZO0FBQ3JD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K0gsRUFBRSxDQUFDL0gsSUFGUDtBQUdGb0YsUUFBQUEsU0FBUyxFQUFFNkMsZ0JBSFQ7QUFJRnJHLFFBQUFBLGNBQWMsRUFBRW1HLEVBQUUsQ0FBQ25HO0FBSmpCLE9BSGlCO0FBU3ZCbEksTUFBQUEsS0FBSyxFQUFFO0FBQ0hzSixRQUFBQSxFQUFFLEVBQUU4RSxFQUFFLENBQUM5RSxFQUFILElBQVMsSUFEVjtBQUVIaEQsUUFBQUEsSUFBSSxFQUFFOEgsRUFBRSxDQUFDOUgsSUFGTjtBQUdIb0YsUUFBQUEsU0FBUyxFQUFFNEMsaUJBSFI7QUFJSHBHLFFBQUFBLGNBQWMsRUFBRWtHLEVBQUUsQ0FBQ2xHO0FBSmhCO0FBVGdCLEtBQTNCO0FBZ0JIOztBQUVEd0csRUFBQUEsWUFBWSxDQUFDbEssTUFBRCxFQUFTO0FBQ2pCLFNBQUt3SSxJQUFMLENBQVUsVUFBVixFQUFzQnhJLE1BQXRCO0FBQ0g7O0FBdnZCa0QiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yICovXHJcbi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IGxvZ2dlciBmcm9tICcuLi8uLi9saWIvbG9nZ2VyJztcclxuY29uc3QgbG9nID0gbG9nZ2VyKCdPeHlnZW5SdW5uZXInKTtcclxuY29uc3QgREVGQVVMVF9JU1NVRVIgPSAndXNlcic7XHJcblxyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgXyAgZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcblxyXG5pbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0UmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3Rlc3QtcmVzdWx0JztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi8uLi9tb2RlbC9zdGF0dXMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uLy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3h5Z2VuRXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IFBhcmFtZXRlck1hbmFnZXIgZnJvbSAnLi4vLi4vbGliL3BhcmFtLW1hbmFnZXIuanMnO1xyXG5pbXBvcnQgV29ya2VyUHJvY2VzcyBmcm9tICcuLi9Xb3JrZXJQcm9jZXNzJztcclxuXHJcbi8vIHNub296ZSBmdW5jdGlvbiAtIGFzeW5jIHdyYXBwZXIgYXJvdW5kIHNldFRpbWVvdXQgZnVuY3Rpb25cclxuY29uc3Qgc25vb3plID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG5jb25zdCBnZXRTdWl0ZXNCcmVha3BvaW50cyA9IChzdWl0ZXMpID0+IHtcclxuICAgIGNvbnN0IHJldHZhbCA9IFtdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwucHVzaChicmVha3BvaW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG59O1xyXG5cclxuY29uc3QgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMgPSAoc3VpdGVzLCByZW1vdmVCcmVha3BvaW50KSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3VpdGVzICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZXMpICYmXHJcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICAgIHN1aXRlcy5tYXAoKHN1aXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHN1aXRlICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhemUuYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLm1hcCgoYnJlYWtwb2ludCwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5maWxlID09PSByZW1vdmVCcmVha3BvaW50LmZpbGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmxpbmUgPT09IHJlbW92ZUJyZWFrcG9pbnQubGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlblJ1bm5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyBjbGFzcyB2YXJpYWJsZXNcclxuICAgICAgICB0aGlzLl9pZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX25wbUdSb290RXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5ucG1HUm9vdEV4ZWN1dGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVmaW5lIHZhcmlhYmxlcyB0byBpdGVyYXRlIHRocm91Z2ggdGVzdCBjYXNlcyBhbmQgdGVzdCBzdWl0ZSBpdGVyYXRpb25zXHJcbiAgICAgICAgdGhpcy5fc3VpdGU7XHJcbiAgICAgICAgdGhpcy5fZW52VmFycyA9IHt9OyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHBhc3NlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0XHJcbiAgICAgICAgdGhpcy5fdmFycyA9IHt9OyAgICAgLy8gdXNlci1kZWZpbmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgc2NyaXB0c1xyXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7fTsgLy8gZGVzaXJlZCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgcGFzc2VkIHRvIGVhY2ggbW9kdWxlXHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RLaWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IDM7XHJcbiAgICAgICAgLy8gcHJvbWlzZXNcclxuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICogUHVibGljIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICghb3B0aW9ucy5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9jd2QgPSB0aGlzLl9vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIG1lcmdlIGN1cnJlbnQgYW5kIHRlc3QgY29uZmlndXJhdGlvbiBiYXNlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgbGV0IG9wdEVudiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnYpIHtcclxuICAgICAgICAgICAgICAgIC8vICdlbnYnIG9wdGlvbiBtaWdodCBiZSBkZWZpbmVkIGVpdGhlciBhcyBhIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IG9yIGFzIGFuIG9iamVjdCB0aGF0IGxpc3RzIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGEgc3RyaW5nLCB0aGVuIHJlc29sdmUgdGhlIGFjdHVhbCB2YXJpYWJsZXMgZnJvbSAnZW52cycgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3B0aW9ucy5lbnZzID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnZzW29wdGlvbnMuZW52XTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAnZW52JyBpcyBhbiBvYmplY3QsIHVzZSB0aGUgdmFyaWFibGVzIGRlZmluZWQgaW4gaXRcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmVudiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnYpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudlZhcnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnZWYXJzKSkge1xyXG4gICAgICAgICAgICAgICAgb3B0RW52ID0geyAuLi5vcHRFbnYsIC4uLm9wdGlvbnMuZW52VmFycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgICAgdGhpcy5fZW52ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgLi4ub3B0RW52XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYXBzID0geyAuLi5jYXBzIH07IC8vIGFzc2lnbiBjYXBzIGZvciBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XHJcbiAgICAgICAgLy8gc2V0IHVwIGRlYnVnZ2luZyBvcHRpb25zXHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gZGVidWdnaW5nIChpbml0aWFsaXplRGVidWdnZXIpIHNob3VsZCBiZSByZW1vdmVkIGZyb20gT3h5Z2VuXHJcbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIG9wdGlvbnMuZGVidWdQb3J0SWRlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IG9wdGlvbnMuZGVidWdQb3J0IHx8IG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9ICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubG9jYWxUaW1lKSB8fCB0aGlzLl9sb2NhbFRpbWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRXb3JrZXJQcm9jZXNzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RvcChzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygncnVubmVyIGRpc3Bvc2UgZScsIGUpO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGR1cmluZyB0aGUgZGlzcG9zZVxyXG4gICAgICAgICAgICBsb2cud2FybignRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyOicsIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gJ0NBTkNFTEVEJykge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluaXRpYWxpemF0aW9uIGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQsIHdhaXQgZm9yICdpbml0aWFsaXplZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgdGVzdCBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciAndGVzdC1lbmRlZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyU3RhcnQodGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHMpO1xyXG5cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blRlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlcnJvciAmJiByZXN1bHQgJiYgcmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSByZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyRW5kKHRoaXMuX2lkLCByZXN1bHQsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMga2lsbChzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIua2lsbChzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0NvbnRpbnVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpIHtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHNCcmVha3BvaW50cyA9IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5nZXRCcmVha3BvaW50cyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZXNCcmVha3BvaW50cyA9IGdldFN1aXRlc0JyZWFrcG9pbnRzKHRoaXMuX3N1aXRlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGJyZWFrcG9pbnRzIGZyb20gc3VpdGVzL2Nhc2VzIHRyZWVcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHN1aXRlQnAgb2Ygc3VpdGVzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKHN1aXRlQnAubGluZSkgJiYgIGZpbGVQYXRoID09PSBzdWl0ZUJwLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXModGhpcy5fc3VpdGVzLCBzdWl0ZUJwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlbGV0ZWQgYnJlYWtwb2ludHNcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGFjdHVhbEN1cnJlbnRCcCBvZiB0c0JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmVha3BvaW50cy5pbmNsdWRlcyhhY3R1YWxDdXJyZW50QnApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fd29ya2VyLmRlYnVnZ2VyLnJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlKGZpbGVQYXRoLCBhY3R1YWxDdXJyZW50QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdXNlclNldEJwIG9mIGJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0c0JyZWFrcG9pbnRzLmluY2x1ZGVzKHVzZXJTZXRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludChmaWxlUGF0aCwgdXNlclNldEJwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlQWxsUHJvbWlzZSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoJ3VwZGF0ZUJyZWFrcG9pbnRzKCkgZG9uZS4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9taXNlQWxsUHJvbWlzZSA6IHByb21pc2VBbGxQcm9taXNlLCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIDogYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbENsb3NlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5fc2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAncmVwbCcsXHJcbiAgICAgICAgICAgIG5hbWU6ICdyZXBsX3N0b3AnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbFNlbmQoY21kKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfZXZhbCcsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNtZDogY21kXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZSgncmVwbFN0YXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QnJlYWtwb2ludChsaW5lKSB7XHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl9zdWl0ZSAmJiB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGMgPSB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXNbdGNpbmRleF07XHJcbiAgICAgICAgICAgIGxvZy5kZWJ1Zygnb3h5Z2VuLnNldEJyZWFrcG9pbnQ6ICcgKyAobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KHRjLm5hbWUsIGxpbmUgKyB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCk7XHJcbiAgICAgICAgfSovXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jbGVhckJyZWFrcG9pbnQobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0LCBudWxsKTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgYXN5bmMgX3J1blRlc3QoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICByZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5zdWl0ZXMgPSBbXTtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8vIGNhbGwgYmVmb3JlVGVzdCBob29rXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBzdWl0ZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGUgb2YgdGhpcy5fc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blN1aXRlKHN1aXRlKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICByZXN1bHQuZHVyYXRpb24gPSByZXN1bHQuZW5kVGltZSAtIHJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHJlc3VsdC5zdWl0ZXMuc29tZShzdWl0ZUl0ZXJhdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3VpdGVJdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoc3VpdGVJdGVyYXRpb25zKSAmJiBzdWl0ZUl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBoYXNGYWlsZWRTdWl0ZXMgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICByZXN1bHQuZW52aXJvbm1lbnQgPSB7IC4uLnRoaXMuX2VudiB9O1xyXG4gICAgICAgIC8vIGNvbWJpbmUgdGVzdCBkZWZpbmVkIGNhcHMgYW5kIHBlciBtb2R1bGUgY2FwYWJpbGl0aWVzLCB0aGF0IHdlcmUgcGFzc2VkIGJ5IHVzZXIgaW4gZWFjaCBtb2R1bGUncyBpbml0IGZ1bmN0aW9uXHJcbiAgICAgICAgcmVzdWx0LmNhcGFiaWxpdGllcyA9IHsgLi4udGhpcy5fY2FwcywgLi4udGhpcy5fbW9kQ2FwcyB9OyAgICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9jYXBzIG9iamVjdFxyXG4gICAgICAgIHJlc3VsdC5vcHRpb25zID0geyAuLi50aGlzLl9vcHRpb25zIH07ICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9vcHRpb25zIG9iamVjdFxyXG5cclxuICAgICAgICAvLyBpZiBlcnJvciBvY2N1cmVkLCBhZGQgaXQgdG8gdGhlIHN1bW1hcnlcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3J1blN1aXRlKHN1aXRlKSB7XHJcbiAgICAgICAgaWYgKCFzdWl0ZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ3N1aXRlIGlzIG51bGwgaW4gX3J1blN1aXRlKCkhISEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWdub3JlIHN1aXRlIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgcHJvcGVydGllc1xyXG4gICAgICAgIGlmICghc3VpdGUubmFtZSAmJiAhc3VpdGUucGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBhbHdheXMgc3BlY2lmeSBzdWl0ZS5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgIGlmICghc3VpdGUuaXRlcmF0aW9uQ291bnQpIHtcclxuICAgICAgICAgICAgc3VpdGUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN1aXRlLml0ZXJhdGlvbkNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2luZ2xlIHN1aXRlIG1pZ2h0IHByb2R1Y2UgbXVsdGlwbGUgcmVzdWx0cywgYmFzZWQgb24gYW1vdW50IG9mIGRlZmluZWQgaXRlcmF0aW9uc1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSXRlcmF0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHN1aXRlSXRlcmF0aW9uPTE7IHN1aXRlSXRlcmF0aW9uIDw9IHN1aXRlLml0ZXJhdGlvbkNvdW50OyBzdWl0ZUl0ZXJhdGlvbisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIHN1aXRlSXRlcmF0aW9uLCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IG5ldyBUZXN0U3VpdGVSZXN1bHQoKTtcclxuICAgICAgICAgICAgc3VpdGVJdGVyYXRpb25zLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5uYW1lID0gc3VpdGUubmFtZSB8fCBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHN1aXRlLnBhdGgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IHN1aXRlSXRlcmF0aW9uO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVTdGFydCh0aGlzLl9pZCwgc3VpdGUudXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNhemUgb2Ygc3VpdGUuY2FzZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXNlcyB3aXRoIG1pc3NpbmcgbWFuZGF0b3J5ICdwYXRoJyBwcm9wZXJ0eSBcclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUubmFtZSA9IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoY2F6ZS5wYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZUl0ZXJhdGlvbj0xOyBjYXNlSXRlcmF0aW9uIDw9IGNhemUuaXRlcmF0aW9uQ291bnQ7IGNhc2VJdGVyYXRpb24rKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2F6ZSAmJiBjYXplLml0ZXJhdGlvbkNvdW50ICYmIGNhemUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIGNhc2VJdGVyYXRpb24sICdDYXNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZVJ1bkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEICYmIHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCAmJiByZVJ1bkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlUnVuQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgb24gY2FuY2VsZWQgc3RhdHVzIG5vdCBjbG9zZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlcl9EaXNwb3NlTW9kdWxlcygncGFzc2VkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnJlUnVuQ291bnQgPSByZVJ1bkNvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgY2FzZVJlc3VsdCwgJ0Nhc2UnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgIT09ICdib29sZWFuJyB8fCB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKGNhc2VSZXN1bHQuc3RhdHVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5jYXNlcy5wdXNoKGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRlc3QgY2FzZSBpdGVyYXRpb24gaGFzIGZhaWxlZCwgdGhlbiBtYXJrIHRoZSBlbnRpcmUgdGVzdCBjYXNlIGFzIGZhaWxlZCwgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBpdGVyYXRpbmcgb3ZlciBpdCBhbmQgbW92ZSB0byB0aGUgbmV4dCB0ZXN0IGNhc2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZHVyYXRpb24gPSBzdWl0ZVJlc3VsdC5lbmRUaW1lIC0gc3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25FbmQodGhpcy5faWQsIHN1aXRlUmVzdWx0LCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vblN1aXRlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHJlUnVuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBnZXQgdGVzdCBzdWl0ZSdzIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIC8vIGdldCB0aGVtIGZpcnN0IGFuZCB0aGVuIG92ZXJyaWRlIHdpdGggdGVzdCBjYXNlIGxldmVsIHBhcmFtZXRlcnMgaWYgZGVmaW5lZFxyXG4gICAgICAgIGlmIChzdWl0ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5wYXJhbU1hbmFnZXIucmVhZFByZXYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIHN1aXRlLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZWFkIHRlc3QgY2FzZSdzIG5leHQgbGluZXMgb2YgcGFyYW1ldGVycyBpZiBwYXJhbWV0ZXIgbWFuYWdlciBpcyBkZWZpbmVkXHJcbiAgICAgICAgaWYgKGNhemUucGFyYW1NYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChyZVJ1bikge1xyXG4gICAgICAgICAgICAgICAgY2F6ZS5wYXJhbU1hbmFnZXIucmVhZFByZXYoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIGNhemUucGFyYW1NYW5hZ2VyLmdldFZhbHVlcygpKTtcclxuICAgICAgICAgICAgY2F6ZS5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFkZCBicmVha3BvaW50cyBiZWZvcmUgcnVubmluZyB0aGUgc2NyaXB0IGlmIGluIGRlYnVnIG1vZGVcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgY2F6ZS5icmVha3BvaW50cykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8IGNhemUuYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIC8vIGVkaXRvciBpbmRleCBzdGFydHMgZnJvbSAxLCBidXQgd2UgbmVlZCB6ZXJvIGJhc2VkIGluZGV4XHJcbiAgICAgICAgICAgICAgICBsZXQgbGluZSA9IGNhemUuYnJlYWtwb2ludHNbaV0ubGluZTtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxlID0gY2F6ZS5icmVha3BvaW50c1tpXS5maWxlO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGUsIGxpbmUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5lbWl0KCdpdGVyYXRpb246c3RhcnQnLCBjYXNlSXRlcmF0aW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rKGNhemUpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZVN0YXJ0KHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQgfHwgY2F6ZS5wYXRoLCBjYXplKTtcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5uYW1lID0gY2F6ZS5uYW1lO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXplLnBhdGg7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBjYXNlSXRlcmF0aW9uO1xyXG5cclxuICAgICAgICAvLyB0cnkgdG8gaW5pdGlhbGl6ZSBPeHlnZW4gYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAoISh0aGlzLl93b3JrZXIpICYmIHRoaXMuX3dvcmtlcl9Jbml0T3h5Z2VuKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXJfSW5pdE94eWdlbigpIHRocm93biBhbiBlcnJvcjonLCBlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSAwO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJ1biB0aGUgdGVzdCBpbiB0aGUgd29ya2VyIHByb2Nlc3MgYW5kIGhhbmRsZSBhbnkgcG9zc2libGUgZXJyb3JcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlcikge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgeyByZXN1bHRTdG9yZSwgY29udGV4dCwgbW9kdWxlQ2FwcywgZXJyb3IgfSA9IGF3YWl0IHRoaXMuX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1Rlc3RSZXN1bHRzKHsgcmVzdWx0U3RvcmUsIGNvbnRleHQsIGVycm9yLCBtb2R1bGVDYXBzIH0pO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IGNhc2VSZXN1bHQuZW5kVGltZSAtIGNhc2VSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RlcHMgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5zdGVwcyA/IHJlc3VsdFN0b3JlLnN0ZXBzIDogW107XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmxvZ3MgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5sb2dzID8gcmVzdWx0U3RvcmUubG9ncyA6IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5oYXIgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5oYXIgPyByZXN1bHRTdG9yZS5oYXIgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IGNhc2UgaXRlcmF0aW9uIHN0YXR1cyAtIG1hcmsgaXQgYXMgZmFpbGVkIGlmIGFueSBzdGVwIGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgIHZhciBmYWlsZWRTdGVwcyA9IF8uZmluZChjYXNlUmVzdWx0LnN0ZXBzLCB7c3RhdHVzOiBTdGF0dXMuRkFJTEVEfSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IF8uaXNFbXB0eShmYWlsZWRTdGVwcykgJiYgIWVycm9yID8gU3RhdHVzLlBBU1NFRCA6IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IG94dXRpbC5tYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQoY2FzZVJlc3VsdC5zdGVwcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9SdW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcykge1xyXG4gICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlciBpcyBudWxsIGJ1dCBub3Qgc3VwcG9zZSB0byEnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQucmVqZWN0KG5ldyBFcnJvcignX3dvcmtlciBpcyBudWxsJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RhcnQgcnVubmluZyB0aGUgdGVzdFxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl93b3JrZXIucnVuKHtcclxuICAgICAgICAgICAgc2NyaXB0TmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICBzY3JpcHRQYXRoOiBjYXplLnBhdGgsXHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgZW52OiB0aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICBjYXBzOiB0aGlzLl9jYXBzLFxyXG4gICAgICAgICAgICAgICAgdmFyczogdGhpcy5fdmFycyxcclxuICAgICAgICAgICAgICAgIHRlc3Q6IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNhemUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzdWl0ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwb0ZpbGU6IHRoaXMuX29wdGlvbnMucG8gfHwgbnVsbCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX0luaXRPeHlnZW4oKSB7XHJcbiAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW5pdCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2FwcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfRGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRpc3Bvc2VNb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVRlc3QnLCBbdGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHNdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVTdWl0ZUhvb2soc3VpdGUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVN1aXRlJywgW3N1aXRlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNhc2UnLCBbY2F6ZV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJUZXN0JywgW3RoaXMuX2lkLCByZXN1bHRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlclRlc3RcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgcmVzdWx0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyU3VpdGUnLCBbc3VpdGUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayhjYXplLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDYXNlJywgW2NhemUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zdGFydFdvcmtlclByb2Nlc3MoKSB7XHJcbiAgICAgICAgY29uc3Qgd29ya2VyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd3b3JrZXIuanMnKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgV29ya2VyUHJvY2Vzcyh0aGlzLl9pZCwgd29ya2VyUGF0aCwgdGhpcy5fZGVidWdNb2RlLCB0aGlzLl9kZWJ1Z1BvcnQsICdPeHlnZW4nLCB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0KCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckV2ZW50cygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydERlYnVnZ2VyKCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tXb3JrZXJFdmVudHMoKSB7XHJcbiAgICAgICAgLy8gcHJlc2VydmUgdGhpcyBvYmplY3RcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5zdWJzY3JpYmUoJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLl9oYW5kbGVBZnRlckNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdlcnJvcicsIChwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignV29ya2VyIHByb2Nlc3MgZXJyb3I6ICcsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXREb25lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdleGl0JywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IHBheWxvYWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhpdENvZGUgJiYgZXhpdENvZGUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgb3IgaXMgYmVpbmcgZGlzcG9zZWQgYW5kIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBkaWVkLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBlbmQgdGhlIHRlc3Qgb3IgZGlzcG9zYWwgd2l0aCBmYXRhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgLy8gKGNoaWxkIHByb2Nlc3Mgbm90IHN1cHBvc2UgdG8gZGllIHdpdGggY29kZSA+IDApXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzRGlzcG9zaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuRGlzcG9zZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5faXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpdENvZGUgPT0gMTM0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgT3h5Z2VuRXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ091dCBvZiBtZW1vcnkgZXJyb3IuIE1ha2Ugc3VyZSB0aGF0IHlvdSBkb25cXCd0IGhhdmUgYW55IG1lbW9yeSBsZWFrcyBpbiB0aGUgdGVzdCBzY3JpcHQuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihgV29ya2VyIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZTogJHtleGl0Q29kZX0uYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZSAmJiBwcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVzZXRHbG9iYWxWYXJpYWJsZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5vbignbWVzc2FnZScsIGFzeW5jIChtc2cpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLmxldmVsID09PSAnREVCVUcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdJTkZPJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdFUlJPUicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLm1zZywgbXNnLmVycik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ1dBUk4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbG9nJywgbXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXIgJiYgX3RoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xpbmUtdXBkYXRlJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbGluZS11cGRhdGUnLCBtc2cubGluZSwgbXNnLnN0YWNrLCBtc2cudGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3Jlc3VsdC11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnaW5pdC1kb25lJywgbXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnd29ya2VyRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd29ya2VyRXJyb3I6JywgbXNnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmtpbGwoJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdyZXBsJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgncmVwbCcsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIub24oJ2RlYnVnZ2VyOmJyZWFrJywgKGJyZWFrcG9pbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludCcsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWtFcnJvcicsIChicmVha0Vycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludEVycm9yJywgYnJlYWtFcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUJlZm9yZUNvbW1hbmQoZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uU3RlcFN0YXJ0KHRoaXMuX2lkLCBlKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVDb21tYW5kJywgW2VdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25TdGVwRW5kKHRoaXMuX2lkLCBlLnJlc3VsdCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNvbW1hbmQnLCBbZS5yZXN1bHRdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNldEdsb2JhbFZhcmlhYmxlcygpIHtcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NUZXN0UmVzdWx0cyh7IHJlc3VsdFN0b3JlLCBtb2R1bGVDYXBzLCBjb250ZXh0ID0ge30sIGVycm9yID0gbnVsbCB9KSB7XHJcbiAgICAgICAgLy8gaWYgdGVzdCB3YXMga2lsbGVkIGJlZm9yZSBhbnkgcmVzdWx0cyB3ZXJlIGdlbmVyYXRlZCwgdGhlbiBqdXN0IGZpbmFsaXplIHRoZSB0ZXN0IHdpdGhvdXQgcHJvY2Vzc2luZyByZXN1bHRzXHJcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLaWxsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0b3JlICd2YXJzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX3ZhcnMgPSBjb250ZXh0LnZhcnMgfHwgdGhpcy5fdmFycztcclxuICAgICAgICAvLyBzdG9yZSAnbW9kQ2FwcycgcGFydCBvZiB0aGUgY29udGV4dCBmb3IgYSBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0geyAuLi50aGlzLl9tb2RDYXBzLCAuLi5tb2R1bGVDYXBzIHx8IHt9IH07XHJcbiAgICAgICAgLy8gY2xlYW4gdXAgY29udGV4dCBmcm9tIGludGVybmFsIGVsZW1lbnRzLCBub3QgbmVlZCBpbiB0aGUgcmVwb3J0OlxyXG4gICAgICAgIC8vIHJlbW92ZSBjYXBzIGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LmNhcHMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmNhcHM7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGVudiBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC5lbnYpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmVudjtcclxuICAgICAgICAvLyByZW1vdmUgdGVzdCBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC50ZXN0KVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC50ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIF9lbWl0SXRlcmF0aW9uRW5kKHRzLCB0Yywgc3VpdGVJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25SZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2l0ZXJhdGlvbi1lbmQnLCB7XHJcbiAgICAgICAgICAgIHN0YXR1czogY2FzZUl0ZXJhdGlvblJlc3VsdC5fc3RhdHVzLFxyXG4gICAgICAgICAgICBmYWlsdXJlOiBjYXNlSXRlcmF0aW9uUmVzdWx0LmZhaWx1cmUgfHwgbnVsbCxcclxuICAgICAgICAgICAgY2FzZToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRjLmlkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0Yy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRjLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogdHMuaWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRzLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRzLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZW1pdFRlc3RFbmQocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVuZCcsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQYXJhbWV0ZXJNYW5hZ2VyIH07Il19
854
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZ2V0U3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZXMiLCJyZXR2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJzdWl0ZSIsImNhc2VzIiwiY2F6ZSIsImJyZWFrcG9pbnRzIiwiYnJlYWtwb2ludCIsInB1c2giLCJyZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyIsInJlbW92ZUJyZWFrcG9pbnQiLCJpZHgiLCJmaWxlIiwibGluZSIsInNwbGljZSIsIk94eWdlblJ1bm5lciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9pZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6aW5nIiwiX2lzRGlzcG9zaW5nIiwiX3dvcmtlciIsIl9kZWJ1Z01vZGUiLCJfd29ya2VyUHJvY0xhc3RFcnJvciIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIm5wbUdSb290RXhlY3V0aW9uIiwiX3N1aXRlIiwiX2VudlZhcnMiLCJfdmFycyIsIl9jYXBzIiwiX21vZENhcHMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJnZXRJZCIsImluaXQiLCJjYXBzIiwicmVwb3J0ZXIiLCJFcnJvciIsIl9jd2QiLCJjd2QiLCJwcm9jZXNzIiwiX3JlcG9ydGVyIiwiX2lzSW5pdGlhbGl6ZWQiLCJvcHRFbnYiLCJlbnYiLCJlbnZzIiwiT2JqZWN0Iiwia2V5cyIsImVudlZhcnMiLCJfZW52IiwiX3N1aXRlcyIsImRlYnVnUG9ydElkZSIsIl9kZWJ1Z1BvcnQiLCJkZWJ1Z1BvcnQiLCJzY3JpcHRDb250ZW50TGluZU9mZnNldCIsImxvY2FsVGltZSIsIl9zdGFydFdvcmtlclByb2Nlc3MiLCJfd29ya2VyX0luaXRPeHlnZW4iLCJkaXNwb3NlIiwic3RhdHVzIiwiaXNSdW5uaW5nIiwic3RvcCIsImUiLCJjb25zb2xlIiwid2FybiIsIl9yZXNldEdsb2JhbFZhcmlhYmxlcyIsInJ1biIsIm9uUnVubmVyU3RhcnQiLCJlcnJvciIsInJlc3VsdCIsIl9ydW5UZXN0IiwiZmFpbHVyZSIsIm9uUnVubmVyRW5kIiwia2lsbCIsImRlYnVnQ29udGludWUiLCJkZWJ1Z2dlciIsImNvbnRpbnVlIiwidXBkYXRlQnJlYWtwb2ludHMiLCJmaWxlUGF0aCIsInNldEJyZWFrcG9pbnRzQWN0aXZlIiwicHJvbWlzZXMiLCJ0c0JyZWFrcG9pbnRzIiwiZ2V0QnJlYWtwb2ludHMiLCJzdWl0ZXNCcmVha3BvaW50cyIsInN1aXRlQnAiLCJpbmNsdWRlcyIsImFjdHVhbEN1cnJlbnRCcCIsInJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlIiwidXNlclNldEJwIiwic2V0QnJlYWtwb2ludCIsInByb21pc2VBbGxQcm9taXNlIiwiYWxsIiwidGhlbiIsInZhbHVlIiwiZGVidWciLCJicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIiwicmVwbENsb3NlIiwiX3NlbmQiLCJldmVudCIsIm5hbWUiLCJyZXBsU2VuZCIsImNtZCIsImNvbnRlbnQiLCJyZXBsU3RhcnQiLCJpbnZva2UiLCJjbGVhckJyZWFrcG9pbnQiLCJUZXN0UmVzdWx0Iiwic3RhcnRUaW1lIiwiZ2V0VGltZVN0YW1wIiwiU3RhdHVzIiwiUEFTU0VEIiwiX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2siLCJzdWl0ZVJlc3VsdCIsIl9ydW5TdWl0ZSIsImVuZFRpbWUiLCJkdXJhdGlvbiIsImhhc0ZhaWxlZFN1aXRlcyIsInNvbWUiLCJzdWl0ZUl0ZXJhdGlvbnMiLCJ4IiwiRkFJTEVEIiwiZW52aXJvbm1lbnQiLCJjYXBhYmlsaXRpZXMiLCJlcnJvckhlbHBlciIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rIiwicGF0aCIsIml0ZXJhdGlvbkNvdW50Iiwic2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzIiwic3VpdGVJdGVyYXRpb24iLCJvbkl0ZXJhdGlvblN0YXJ0IiwiVGVzdFN1aXRlUmVzdWx0IiwiZ2V0RmlsZU5hbWVXaXRob3V0RXh0IiwiaXRlcmF0aW9uTnVtIiwiX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rIiwib25TdWl0ZVN0YXJ0IiwidXJpIiwiY2FzZUl0ZXJhdGlvbiIsInNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzIiwicmVSdW5Db3VudCIsImNhc2VSZXN1bHQiLCJfcnVuQ2FzZSIsInJlUnVuT25GYWlsZWQiLCJfd29ya2VyX0Rpc3Bvc2VNb2R1bGVzIiwib25JdGVyYXRpb25FbmQiLCJfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rIiwib25DYXNlRW5kIiwiaWQiLCJhdXRvRGlzcG9zZSIsIl9ncm91cFJlc3VsdCIsIl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rIiwib25TdWl0ZUVuZCIsInJlUnVuIiwicGFyYW1zIiwicGFyYW1NYW5hZ2VyIiwicmVhZFByZXYiLCJfIiwiZXh0ZW5kIiwiZ2V0VmFsdWVzIiwicmVhZE5leHQiLCJpIiwiX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2siLCJvbkNhc2VTdGFydCIsIlRlc3RDYXNlUmVzdWx0IiwibG9jYXRpb24iLCJyZXN1bHRTdG9yZSIsImNvbnRleHQiLCJtb2R1bGVDYXBzIiwiX3dvcmtlcl9SdW4iLCJfcHJvY2Vzc1Rlc3RSZXN1bHRzIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwiZmFpbGVkU3RlcHMiLCJmaW5kIiwiaXNFbXB0eSIsIm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZCIsIl93aGVuVGVzdENhc2VGaW5pc2hlZCIsInJlamVjdCIsInNjcmlwdE5hbWUiLCJzY3JpcHRQYXRoIiwidmFycyIsInRlc3QiLCJjYXNlIiwiaXRlcmF0aW9uIiwicG9GaWxlIiwicG8iLCJkaXNwb3NlTW9kdWxlcyIsImludm9rZVRlc3RIb29rIiwib25Mb2dFbnRyeSIsIndvcmtlclBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiV29ya2VyUHJvY2VzcyIsInN0YXJ0IiwiX2hvb2tXb3JrZXJFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2hvb2tXb3JrZXJEZWJ1Z2dlckV2ZW50cyIsIl90aGlzIiwic3Vic2NyaWJlIiwiX2hhbmRsZUJlZm9yZUNvbW1hbmQiLCJiaW5kIiwiX2hhbmRsZUFmdGVyQ29tbWFuZCIsIm9uIiwicGF5bG9hZCIsImV4aXREb25lIiwiZW1pdCIsImV4aXRDb2RlIiwicHJvbWlzZSIsIk94eWdlbkVycm9yIiwiZXJyb3JDb2RlIiwiU0NSSVBUX0VSUk9SIiwibXNnIiwibGV2ZWwiLCJpbmZvIiwiZXJyIiwidGltZSIsInNyYyIsInN0YWNrIiwibWV0aG9kIiwiYnJlYWtwb2ludERhdGEiLCJicmVha0Vycm9yIiwib25TdGVwU3RhcnQiLCJtb2R1bGUiLCJvblN0ZXBFbmQiLCJfZW1pdEl0ZXJhdGlvbkVuZCIsInRzIiwidGMiLCJzdWl0ZUl0ZXJhdGlvbk51bSIsImNhc2VJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uUmVzdWx0IiwiX3N0YXR1cyIsIl9lbWl0VGVzdEVuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUE7O0FBSUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFoQkEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLGNBQVAsQ0FBWjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxNQUF2Qjs7QUFrQkEsTUFBTUMsTUFBTSxHQUFHQyxFQUFFLElBQUksSUFBSUMsT0FBSixDQUFZQyxPQUFPLElBQUlDLFVBQVUsQ0FBQ0QsT0FBRCxFQUFVRixFQUFWLENBQWpDLENBQXJCOztBQUVBLE1BQU1JLG9CQUFv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QUNoSSxJQUZQO0FBR0ZxRixRQUFBQSxTQUFTLEVBQUU2QyxnQkFIVDtBQUlGdEcsUUFBQUEsY0FBYyxFQUFFb0csRUFBRSxDQUFDcEc7QUFKakIsT0FIaUI7QUFTdkJuSSxNQUFBQSxLQUFLLEVBQUU7QUFDSHVKLFFBQUFBLEVBQUUsRUFBRStFLEVBQUUsQ0FBQy9FLEVBQUgsSUFBUyxJQURWO0FBRUhoRCxRQUFBQSxJQUFJLEVBQUUrSCxFQUFFLENBQUMvSCxJQUZOO0FBR0hxRixRQUFBQSxTQUFTLEVBQUU0QyxpQkFIUjtBQUlIckcsUUFBQUEsY0FBYyxFQUFFbUcsRUFBRSxDQUFDbkc7QUFKaEI7QUFUZ0IsS0FBM0I7QUFnQkg7O0FBRUR5RyxFQUFBQSxZQUFZLENBQUNuSyxNQUFELEVBQVM7QUFDakIsU0FBS3lJLElBQUwsQ0FBVSxVQUFWLEVBQXNCekksTUFBdEI7QUFDSDs7QUFod0JrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ094eWdlblJ1bm5lcicpO1xyXG5jb25zdCBERUZBVUxUX0lTU1VFUiA9ICd1c2VyJztcclxuXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBfICBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuXHJcbmltcG9ydCBUZXN0U3VpdGVSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvc3VpdGUtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RDYXNlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL2Nhc2UtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvdGVzdC1yZXN1bHQnO1xyXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uLy4uL21vZGVsL3N0YXR1cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeHlnZW5FcnJvciBmcm9tICcuLi8uLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgUGFyYW1ldGVyTWFuYWdlciBmcm9tICcuLi8uLi9saWIvcGFyYW0tbWFuYWdlci5qcyc7XHJcbmltcG9ydCBXb3JrZXJQcm9jZXNzIGZyb20gJy4uL1dvcmtlclByb2Nlc3MnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbmNvbnN0IGdldFN1aXRlc0JyZWFrcG9pbnRzID0gKHN1aXRlcykgPT4ge1xyXG4gICAgY29uc3QgcmV0dmFsID0gW107XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAgIHN1aXRlcyAmJlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGVzKSAmJlxyXG4gICAgICAgIHN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgICBzdWl0ZXMubWFwKChzdWl0ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGUuY2FzZXMpICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubWFwKChjYXplKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbC5wdXNoKGJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXR2YWw7XHJcbn07XHJcblxyXG5jb25zdCByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyA9IChzdWl0ZXMsIHJlbW92ZUJyZWFrcG9pbnQpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmZpbGUgPT09IHJlbW92ZUJyZWFrcG9pbnQuZmlsZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQubGluZSA9PT0gcmVtb3ZlQnJlYWtwb2ludC5saW5lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3h5Z2VuUnVubmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIC8vIGNsYXNzIHZhcmlhYmxlc1xyXG4gICAgICAgIHRoaXMuX2lkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG9wdGlvbnMubnBtR1Jvb3RFeGVjdXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWZpbmUgdmFyaWFibGVzIHRvIGl0ZXJhdGUgdGhyb3VnaCB0ZXN0IGNhc2VzIGFuZCB0ZXN0IHN1aXRlIGl0ZXJhdGlvbnNcclxuICAgICAgICB0aGlzLl9zdWl0ZTtcclxuICAgICAgICB0aGlzLl9lbnZWYXJzID0ge307ICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3RcclxuICAgICAgICB0aGlzLl92YXJzID0ge307ICAgICAvLyB1c2VyLWRlZmluZWQgdmFyaWFibGVzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBzY3JpcHRzXHJcbiAgICAgICAgdGhpcy5fY2FwcyA9IHt9OyAvLyBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBwYXNzZWQgdG8gZWFjaCBtb2R1bGVcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gMztcclxuICAgICAgICAvLyBwcm9taXNlc1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQdWJsaWMgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIGdldElkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICghb3B0aW9ucy5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9jd2QgPSB0aGlzLl9vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIG1lcmdlIGN1cnJlbnQgYW5kIHRlc3QgY29uZmlndXJhdGlvbiBiYXNlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgbGV0IG9wdEVudiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnYpIHtcclxuICAgICAgICAgICAgICAgIC8vICdlbnYnIG9wdGlvbiBtaWdodCBiZSBkZWZpbmVkIGVpdGhlciBhcyBhIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IG9yIGFzIGFuIG9iamVjdCB0aGF0IGxpc3RzIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGEgc3RyaW5nLCB0aGVuIHJlc29sdmUgdGhlIGFjdHVhbCB2YXJpYWJsZXMgZnJvbSAnZW52cycgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3B0aW9ucy5lbnZzID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnZzW29wdGlvbnMuZW52XTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAnZW52JyBpcyBhbiBvYmplY3QsIHVzZSB0aGUgdmFyaWFibGVzIGRlZmluZWQgaW4gaXRcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmVudiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnYpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudlZhcnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnZWYXJzKSkge1xyXG4gICAgICAgICAgICAgICAgb3B0RW52ID0geyAuLi5vcHRFbnYsIC4uLm9wdGlvbnMuZW52VmFycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgICAgdGhpcy5fZW52ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgLi4ub3B0RW52XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYXBzID0geyAuLi5jYXBzIH07IC8vIGFzc2lnbiBjYXBzIGZvciBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XHJcbiAgICAgICAgLy8gc2V0IHVwIGRlYnVnZ2luZyBvcHRpb25zXHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gZGVidWdnaW5nIChpbml0aWFsaXplRGVidWdnZXIpIHNob3VsZCBiZSByZW1vdmVkIGZyb20gT3h5Z2VuXHJcbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIG9wdGlvbnMuZGVidWdQb3J0SWRlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IG9wdGlvbnMuZGVidWdQb3J0IHx8IG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9ICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubG9jYWxUaW1lKSB8fCB0aGlzLl9sb2NhbFRpbWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRXb3JrZXJQcm9jZXNzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RvcChzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygncnVubmVyIGRpc3Bvc2UgZScsIGUpO1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzIGR1cmluZyB0aGUgZGlzcG9zZVxyXG4gICAgICAgICAgICBsb2cud2FybignRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyOicsIGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gJ0NBTkNFTEVEJykge1xyXG4gICAgICAgICAgICB0aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6aW5nKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkluaXRpYWxpemF0aW9uIGhhc24ndCBiZWVuIGNvbXBsZXRlZCB5ZXQsIHdhaXQgZm9yICdpbml0aWFsaXplZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgdGVzdCBpcyBzdGlsbCBydW5uaW5nLCB3YWl0IGZvciAndGVzdC1lbmRlZCcgZXZlbnRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyU3RhcnQodGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHMpO1xyXG5cclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blRlc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFlcnJvciAmJiByZXN1bHQgJiYgcmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSByZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uUnVubmVyRW5kKHRoaXMuX2lkLCByZXN1bHQsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMga2lsbChzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmlzUnVubmluZykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIua2lsbChzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0NvbnRpbnVlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpIHtcclxuICAgICAgICB0cnkge1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgc25vb3plKDUwMCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51cGRhdGVCcmVha3BvaW50cyhicmVha3BvaW50cywgZmlsZVBhdGgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdHNCcmVha3BvaW50cyA9IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5nZXRCcmVha3BvaW50cyhmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZXNCcmVha3BvaW50cyA9IGdldFN1aXRlc0JyZWFrcG9pbnRzKHRoaXMuX3N1aXRlcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGJyZWFrcG9pbnRzIGZyb20gc3VpdGVzL2Nhc2VzIHRyZWVcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHN1aXRlQnAgb2Ygc3VpdGVzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKHN1aXRlQnAubGluZSkgJiYgIGZpbGVQYXRoID09PSBzdWl0ZUJwLmZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXModGhpcy5fc3VpdGVzLCBzdWl0ZUJwKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGRlbGV0ZWQgYnJlYWtwb2ludHNcclxuICAgICAgICAgICAgICAgIGZvciAodmFyIGFjdHVhbEN1cnJlbnRCcCBvZiB0c0JyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmVha3BvaW50cy5pbmNsdWRlcyhhY3R1YWxDdXJyZW50QnApKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fd29ya2VyLmRlYnVnZ2VyLnJlbW92ZUJyZWFrcG9pbnRCeVZhbHVlKGZpbGVQYXRoLCBhY3R1YWxDdXJyZW50QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdXNlclNldEJwIG9mIGJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0c0JyZWFrcG9pbnRzLmluY2x1ZGVzKHVzZXJTZXRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludChmaWxlUGF0aCwgdXNlclNldEJwKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlQWxsUHJvbWlzZSA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZSh0cnVlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsb2cuZGVidWcoJ3VwZGF0ZUJyZWFrcG9pbnRzKCkgZG9uZS4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBwcm9taXNlQWxsUHJvbWlzZSA6IHByb21pc2VBbGxQcm9taXNlLCBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIDogYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignRGVidWdnZXIgZXJyb3InLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbENsb3NlKCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5fc2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAncmVwbCcsXHJcbiAgICAgICAgICAgIG5hbWU6ICdyZXBsX3N0b3AnXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVwbFNlbmQoY21kKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfZXZhbCcsXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNtZDogY21kXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU3RhcnQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZSgncmVwbFN0YXJ0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QnJlYWtwb2ludChsaW5lKSB7XHJcbiAgICAgICAgLypcclxuICAgICAgICBpZiAodGhpcy5kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl9zdWl0ZSAmJiB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGMgPSB0aGlzLl9zdWl0ZS50ZXN0Y2FzZXNbdGNpbmRleF07XHJcbiAgICAgICAgICAgIGxvZy5kZWJ1Zygnb3h5Z2VuLnNldEJyZWFrcG9pbnQ6ICcgKyAobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KHRjLm5hbWUsIGxpbmUgKyB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCk7XHJcbiAgICAgICAgfSovXHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5jbGVhckJyZWFrcG9pbnQobGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0LCBudWxsKTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQcml2YXRlIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcblxyXG4gICAgYXN5bmMgX3J1blRlc3QoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICByZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5zdWl0ZXMgPSBbXTtcclxuICAgICAgICBsZXQgZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8vIGNhbGwgYmVmb3JlVGVzdCBob29rXHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBzdWl0ZXNcclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGUgb2YgdGhpcy5fc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1blN1aXRlKHN1aXRlKTtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICByZXN1bHQuZHVyYXRpb24gPSByZXN1bHQuZW5kVGltZSAtIHJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHJlc3VsdC5zdWl0ZXMuc29tZShzdWl0ZUl0ZXJhdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3VpdGVJdGVyYXRpb25zICYmIEFycmF5LmlzQXJyYXkoc3VpdGVJdGVyYXRpb25zKSAmJiBzdWl0ZUl0ZXJhdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlSXRlcmF0aW9ucy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBoYXNGYWlsZWRTdWl0ZXMgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICByZXN1bHQuZW52aXJvbm1lbnQgPSB7IC4uLnRoaXMuX2VudiB9O1xyXG4gICAgICAgIC8vIGNvbWJpbmUgdGVzdCBkZWZpbmVkIGNhcHMgYW5kIHBlciBtb2R1bGUgY2FwYWJpbGl0aWVzLCB0aGF0IHdlcmUgcGFzc2VkIGJ5IHVzZXIgaW4gZWFjaCBtb2R1bGUncyBpbml0IGZ1bmN0aW9uXHJcbiAgICAgICAgcmVzdWx0LmNhcGFiaWxpdGllcyA9IHsgLi4udGhpcy5fY2FwcywgLi4udGhpcy5fbW9kQ2FwcyB9OyAgICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9jYXBzIG9iamVjdFxyXG4gICAgICAgIHJlc3VsdC5vcHRpb25zID0geyAuLi50aGlzLl9vcHRpb25zIH07ICAvLyBhc3NpZ24gYSBjb3B5IG9mIF9vcHRpb25zIG9iamVjdFxyXG5cclxuICAgICAgICAvLyBpZiBlcnJvciBvY2N1cmVkLCBhZGQgaXQgdG8gdGhlIHN1bW1hcnlcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3J1blN1aXRlKHN1aXRlKSB7XHJcbiAgICAgICAgaWYgKCFzdWl0ZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ3N1aXRlIGlzIG51bGwgaW4gX3J1blN1aXRlKCkhISEnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWdub3JlIHN1aXRlIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgcHJvcGVydGllc1xyXG4gICAgICAgIGlmICghc3VpdGUubmFtZSAmJiAhc3VpdGUucGF0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSB0byBhbHdheXMgc3BlY2lmeSBzdWl0ZS5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgIGlmICghc3VpdGUuaXRlcmF0aW9uQ291bnQpIHtcclxuICAgICAgICAgICAgc3VpdGUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHN1aXRlLml0ZXJhdGlvbkNvdW50ID4gMSkge1xyXG4gICAgICAgICAgICBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc2luZ2xlIHN1aXRlIG1pZ2h0IHByb2R1Y2UgbXVsdGlwbGUgcmVzdWx0cywgYmFzZWQgb24gYW1vdW50IG9mIGRlZmluZWQgaXRlcmF0aW9uc1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSXRlcmF0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHN1aXRlSXRlcmF0aW9uPTE7IHN1aXRlSXRlcmF0aW9uIDw9IHN1aXRlLml0ZXJhdGlvbkNvdW50OyBzdWl0ZUl0ZXJhdGlvbisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIHN1aXRlSXRlcmF0aW9uLCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IG5ldyBUZXN0U3VpdGVSZXN1bHQoKTtcclxuICAgICAgICAgICAgc3VpdGVJdGVyYXRpb25zLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5uYW1lID0gc3VpdGUubmFtZSB8fCBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHN1aXRlLnBhdGgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IHN1aXRlSXRlcmF0aW9uO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVTdGFydCh0aGlzLl9pZCwgc3VpdGUudXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNhemUgb2Ygc3VpdGUuY2FzZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXNlcyB3aXRoIG1pc3NpbmcgbWFuZGF0b3J5ICdwYXRoJyBwcm9wZXJ0eSBcclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUubmFtZSA9IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoY2F6ZS5wYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZUl0ZXJhdGlvbj0xOyBjYXNlSXRlcmF0aW9uIDw9IGNhemUuaXRlcmF0aW9uQ291bnQ7IGNhc2VJdGVyYXRpb24rKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2F6ZSAmJiBjYXplLml0ZXJhdGlvbkNvdW50ICYmIGNhemUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIGNhc2VJdGVyYXRpb24sICdDYXNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZVJ1bkNvdW50ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEICYmIHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCAmJiByZVJ1bkNvdW50ID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlUnVuQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlsZWQgb24gY2FuY2VsZWQgc3RhdHVzIG5vdCBjbG9zZSBicm93c2VyIHdpbmRvd1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlcl9EaXNwb3NlTW9kdWxlcygncGFzc2VkJykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnJlUnVuQ291bnQgPSByZVJ1bkNvdW50O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgY2FzZVJlc3VsdCwgJ0Nhc2UnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uQ2FzZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkLCBjYXNlUmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgIT09ICdib29sZWFuJyB8fCB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKGNhc2VSZXN1bHQuc3RhdHVzKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5jYXNlcy5wdXNoKGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRlc3QgY2FzZSBpdGVyYXRpb24gaGFzIGZhaWxlZCwgdGhlbiBtYXJrIHRoZSBlbnRpcmUgdGVzdCBjYXNlIGFzIGZhaWxlZCwgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBpdGVyYXRpbmcgb3ZlciBpdCBhbmQgbW92ZSB0byB0aGUgbmV4dCB0ZXN0IGNhc2VcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuZHVyYXRpb24gPSBzdWl0ZVJlc3VsdC5lbmRUaW1lIC0gc3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5fZ3JvdXBSZXN1bHQgPSB0aGlzLl9vcHRpb25zLl9ncm91cFJlc3VsdDtcclxuXHJcbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uRW5kKHRoaXMuX2lkLCBzdWl0ZVJlc3VsdCwgJ1N1aXRlJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQWZ0ZXJTdWl0ZUhvb2soc3VpdGUsIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25TdWl0ZUVuZCh0aGlzLl9pZCwgc3VpdGUudXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzdWl0ZUl0ZXJhdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCByZVJ1biA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gZ2V0IHRlc3Qgc3VpdGUncyBwYXJhbWV0ZXJzIGlmIGRlZmluZWRcclxuICAgICAgICAvLyBnZXQgdGhlbSBmaXJzdCBhbmQgdGhlbiBvdmVycmlkZSB3aXRoIHRlc3QgY2FzZSBsZXZlbCBwYXJhbWV0ZXJzIGlmIGRlZmluZWRcclxuICAgICAgICBpZiAoc3VpdGUucGFyYW1NYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIGlmIChyZVJ1bikge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUucGFyYW1NYW5hZ2VyLnJlYWRQcmV2KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXy5leHRlbmQocGFyYW1zLCBzdWl0ZS5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgICAgICBzdWl0ZS5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVhZCB0ZXN0IGNhc2UncyBuZXh0IGxpbmVzIG9mIHBhcmFtZXRlcnMgaWYgcGFyYW1ldGVyIG1hbmFnZXIgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmIChjYXplLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICBpZiAocmVSdW4pIHtcclxuICAgICAgICAgICAgICAgIGNhemUucGFyYW1NYW5hZ2VyLnJlYWRQcmV2KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgXy5leHRlbmQocGFyYW1zLCBjYXplLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgIGNhemUucGFyYW1NYW5hZ2VyLnJlYWROZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBhZGQgYnJlYWtwb2ludHMgYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdCBpZiBpbiBkZWJ1ZyBtb2RlXHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIGNhemUuYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXplLmJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBlZGl0b3IgaW5kZXggc3RhcnRzIGZyb20gMSwgYnV0IHdlIG5lZWQgemVybyBiYXNlZCBpbmRleFxyXG4gICAgICAgICAgICAgICAgbGV0IGxpbmUgPSBjYXplLmJyZWFrcG9pbnRzW2ldLmxpbmU7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGNhemUuYnJlYWtwb2ludHNbaV0uZmlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludChmaWxlLCBsaW5lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvL3RoaXMuZW1pdCgnaXRlcmF0aW9uOnN0YXJ0JywgY2FzZUl0ZXJhdGlvbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKTtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkNhc2VTdGFydCh0aGlzLl9pZCwgc3VpdGUudXJpIHx8IHN1aXRlLmlkLCBjYXplLnVyaSB8fCBjYXplLmlkIHx8IGNhemUucGF0aCwgY2F6ZSk7XHJcbiAgICAgICAgY29uc3QgY2FzZVJlc3VsdCA9IG5ldyBUZXN0Q2FzZVJlc3VsdCgpO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubmFtZSA9IGNhemUubmFtZTtcclxuICAgICAgICBjYXNlUmVzdWx0LmxvY2F0aW9uID0gY2F6ZS5wYXRoO1xyXG4gICAgICAgIGNhc2VSZXN1bHQuaXRlcmF0aW9uTnVtID0gY2FzZUl0ZXJhdGlvbjtcclxuXHJcbiAgICAgICAgLy8gdHJ5IHRvIGluaXRpYWxpemUgT3h5Z2VuIGFuZCBoYW5kbGUgYW55IHBvc3NpYmxlIGVycm9yXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKCEodGhpcy5fd29ya2VyKSAmJiB0aGlzLl93b3JrZXJfSW5pdE94eWdlbigpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyX0luaXRPeHlnZW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmR1cmF0aW9uID0gMDtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkNhc2VFbmQodGhpcy5faWQsIHN1aXRlLnVyaSB8fCBzdWl0ZS5pZCwgY2F6ZS51cmkgfHwgY2F6ZS5pZCwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHJldHVybiBjYXNlUmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBydW4gdGhlIHRlc3QgaW4gdGhlIHdvcmtlciBwcm9jZXNzIGFuZCBoYW5kbGUgYW55IHBvc3NpYmxlIGVycm9yXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0U3RvcmUsIGNvbnRleHQsIG1vZHVsZUNhcHMsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl93b3JrZXJfUnVuKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcGFyYW1zKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NUZXN0UmVzdWx0cyh7IHJlc3VsdFN0b3JlLCBjb250ZXh0LCBlcnJvciwgbW9kdWxlQ2FwcyB9KTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSBjYXNlUmVzdWx0LmVuZFRpbWUgLSBjYXNlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0ZXBzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuc3RlcHMgPyByZXN1bHRTdG9yZS5zdGVwcyA6IFtdO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5sb2dzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUubG9ncyA/IHJlc3VsdFN0b3JlLmxvZ3MgOiBbXTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuaGFyID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuaGFyID8gcmVzdWx0U3RvcmUuaGFyIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGVzdCBjYXNlIGl0ZXJhdGlvbiBzdGF0dXMgLSBtYXJrIGl0IGFzIGZhaWxlZCBpZiBhbnkgc3RlcCBoYXMgZmFpbGVkXHJcbiAgICAgICAgICAgICAgICB2YXIgZmFpbGVkU3RlcHMgPSBfLmZpbmQoY2FzZVJlc3VsdC5zdGVwcywge3N0YXR1czogU3RhdHVzLkZBSUxFRH0pO1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBfLmlzRW1wdHkoZmFpbGVkU3RlcHMpICYmICFlcnJvciA/IFN0YXR1cy5QQVNTRUQgOiBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RlcHMgPSBveHV0aWwubWFrZVRyYW5zYWN0aW9uRmFpbGVkSWZTdGVwRmFpbGVkKGNhc2VSZXN1bHQuc3RlcHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXJfUnVuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9SdW4oc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCBwYXJhbXMpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3dvcmtlcikge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXIgaXMgbnVsbCBidXQgbm90IHN1cHBvc2UgdG8hJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkLnJlamVjdChuZXcgRXJyb3IoJ193b3JrZXIgaXMgbnVsbCcpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0YXJ0IHJ1bm5pbmcgdGhlIHRlc3RcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fd29ya2VyLnJ1bih7XHJcbiAgICAgICAgICAgIHNjcmlwdE5hbWU6IGNhemUubmFtZSxcclxuICAgICAgICAgICAgc2NyaXB0UGF0aDogY2F6ZS5wYXRoLFxyXG4gICAgICAgICAgICBjb250ZXh0OiB7XHJcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHBhcmFtcyxcclxuICAgICAgICAgICAgICAgIGVudjogdGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgY2FwczogdGhpcy5fY2FwcyxcclxuICAgICAgICAgICAgICAgIHZhcnM6IHRoaXMuX3ZhcnMsXHJcbiAgICAgICAgICAgICAgICB0ZXN0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjYXplLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogY2FzZUl0ZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgc3VpdGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogc3VpdGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBzdWl0ZUl0ZXJhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcG9GaWxlOiB0aGlzLl9vcHRpb25zLnBvIHx8IG51bGwsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9Jbml0T3h5Z2VuKCkge1xyXG4gICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmluaXQodGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHMpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kaXNwb3NlTW9kdWxlcykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuZGlzcG9zZU1vZHVsZXMoc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlVGVzdEhvb2soKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVUZXN0JywgW3RoaXMuX2lkLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9jYXBzXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZVRlc3RcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZVRlc3RcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rKHN1aXRlKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaykge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVTdWl0ZScsIFtzdWl0ZV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVTdWl0ZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlU3VpdGVcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2soY2F6ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVDYXNlJywgW2NhemVdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVDYXNlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVDYXNlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyVGVzdEhvb2socmVzdWx0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyVGVzdCcsIFt0aGlzLl9pZCwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlclRlc3RcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJTdWl0ZUhvb2soc3VpdGUsIHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlclN1aXRlJywgW3N1aXRlLCByZXN1bHRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlclN1aXRlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlclN1aXRlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2soY2F6ZSwgcmVzdWx0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyQ2FzZScsIFtjYXplLCByZXN1bHRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlckNhc2VcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfc3RhcnRXb3JrZXJQcm9jZXNzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgLy9pZ25vcmVcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCB3b3JrZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3dvcmtlci5qcycpO1xyXG4gICAgICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgV29ya2VyUHJvY2Vzcyh0aGlzLl9pZCwgd29ya2VyUGF0aCwgdGhpcy5fZGVidWdNb2RlLCB0aGlzLl9kZWJ1Z1BvcnQsICdPeHlnZW4nLCB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbik7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9ob29rV29ya2VyRXZlbnRzKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydERlYnVnZ2VyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX2hvb2tXb3JrZXJEZWJ1Z2dlckV2ZW50cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckV2ZW50cygpIHtcclxuICAgICAgICAvLyBwcmVzZXJ2ZSB0aGlzIG9iamVjdFxyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl93b3JrZXIuc3Vic2NyaWJlKCdjb21tYW5kOmJlZm9yZScsIHRoaXMuX2hhbmRsZUJlZm9yZUNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2Vycm9yJywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdXb3JrZXIgcHJvY2VzcyBlcnJvcjogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdERvbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2V4aXQnLCAocGF5bG9hZCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgeyBleGl0Q29kZSB9ID0gcGF5bG9hZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSAmJiBleGl0Q29kZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRlc3QgaXMgcnVubmluZyBvciBpcyBiZWluZyBkaXNwb3NlZCBhbmQgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGRpZWQsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGVuZCB0aGUgdGVzdCBvciBkaXNwb3NhbCB3aXRoIGZhdGFsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAvLyAoY2hpbGQgcHJvY2VzcyBub3Qgc3VwcG9zZSB0byBkaWUgd2l0aCBjb2RlID4gMClcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5faXNEaXNwb3NpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5EaXNwb3NlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3RoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAxMzQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnT3V0IG9mIG1lbW9yeSBlcnJvci4gTWFrZSBzdXJlIHRoYXQgeW91IGRvblxcJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzIGluIHRoZSB0ZXN0IHNjcmlwdC4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IE94eWdlbkVycm9yKGBXb3JrZXIgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlOiAke2V4aXRDb2RlfS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlICYmIHByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0lORk8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0VSUk9SJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cubXNnLCBtc2cuZXJyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmxldmVsID09PSAnV0FSTicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cubXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsb2cnLCBtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRlciAmJiBfdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnbGluZS11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsaW5lLXVwZGF0ZScsIG1zZy5saW5lLCBtc2cuc3RhY2ssIG1zZy50aW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAncmVzdWx0LXVwZGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubWV0aG9kID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdpbml0LWRvbmUnLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICd3b3JrZXJFcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3b3JrZXJFcnJvcjonLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMua2lsbCgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3JlcGwnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdyZXBsJywgbXNnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKSB7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWsnLCAoYnJlYWtwb2ludERhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha3BvaW50JywgYnJlYWtwb2ludERhdGEpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLm9uKCdkZWJ1Z2dlcjpicmVha0Vycm9yJywgKGJyZWFrRXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdicmVha3BvaW50RXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaGFuZGxlQmVmb3JlQ29tbWFuZChlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25TdGVwU3RhcnQodGhpcy5faWQsIGUpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1vZHVsZSAmJiBlLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNvbW1hbmQnLCBbZV0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaGFuZGxlQWZ0ZXJDb21tYW5kKGUpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vblN0ZXBFbmQodGhpcy5faWQsIGUucmVzdWx0KTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZSAmJiBlLm1vZHVsZSAmJiBlLm1vZHVsZSA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyQ29tbWFuZCcsIFtlLnJlc3VsdF0pKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJDb21tYW5kXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCkge1xyXG4gICAgICAgIC8vIHRoaXMuX21vZENhcHMgPSB7fTtcclxuICAgICAgICAvLyB0aGlzLl93b3JrZXIgPSBudWxsO1xyXG4gICAgICAgIC8vIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIC8vIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICAvLyB0aGlzLl90ZXN0S2lsbGVkID0gZmFsc2U7XHJcbiAgICAgICAgLy8gdGhpcy5fd2hlbkRpc3Bvc2VkID0gZGVmZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBfcHJvY2Vzc1Rlc3RSZXN1bHRzKHsgcmVzdWx0U3RvcmUsIG1vZHVsZUNhcHMsIGNvbnRleHQgPSB7fSwgZXJyb3IgPSBudWxsIH0pIHtcclxuICAgICAgICAvLyBpZiB0ZXN0IHdhcyBraWxsZWQgYmVmb3JlIGFueSByZXN1bHRzIHdlcmUgZ2VuZXJhdGVkLCB0aGVuIGp1c3QgZmluYWxpemUgdGhlIHRlc3Qgd2l0aG91dCBwcm9jZXNzaW5nIHJlc3VsdHNcclxuICAgICAgICBpZiAodGhpcy5fdGVzdEtpbGxlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RvcmUgJ3ZhcnMnIHBhcnQgb2YgdGhlIGNvbnRleHQgZm9yIGEgbGF0ZXIgdXNlXHJcbiAgICAgICAgdGhpcy5fdmFycyA9IGNvbnRleHQudmFycyB8fCB0aGlzLl92YXJzO1xyXG4gICAgICAgIC8vIHN0b3JlICdtb2RDYXBzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX21vZENhcHMgPSB7IC4uLnRoaXMuX21vZENhcHMsIC4uLm1vZHVsZUNhcHMgfHwge30gfTtcclxuICAgICAgICAvLyBjbGVhbiB1cCBjb250ZXh0IGZyb20gaW50ZXJuYWwgZWxlbWVudHMsIG5vdCBuZWVkIGluIHRoZSByZXBvcnQ6XHJcbiAgICAgICAgLy8gcmVtb3ZlIGNhcHMgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQuY2FwcylcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuY2FwcztcclxuICAgICAgICAvLyByZW1vdmUgZW52IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LmVudilcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZW52O1xyXG4gICAgICAgIC8vIHJlbW92ZSB0ZXN0IGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LnRlc3QpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LnRlc3Q7XHJcbiAgICB9XHJcblxyXG4gICAgX2VtaXRJdGVyYXRpb25FbmQodHMsIHRjLCBzdWl0ZUl0ZXJhdGlvbk51bSwgY2FzZUl0ZXJhdGlvbk51bSwgY2FzZUl0ZXJhdGlvblJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgnaXRlcmF0aW9uLWVuZCcsIHtcclxuICAgICAgICAgICAgc3RhdHVzOiBjYXNlSXRlcmF0aW9uUmVzdWx0Ll9zdGF0dXMsXHJcbiAgICAgICAgICAgIGZhaWx1cmU6IGNhc2VJdGVyYXRpb25SZXN1bHQuZmFpbHVyZSB8fCBudWxsLFxyXG4gICAgICAgICAgICBjYXNlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogdGMuaWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRjLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25OdW0sXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25Db3VudDogdGMuaXRlcmF0aW9uQ291bnRcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3VpdGU6IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0cy5pZCB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogdHMubmFtZSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25OdW0sXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25Db3VudDogdHMuaXRlcmF0aW9uQ291bnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9lbWl0VGVzdEVuZChyZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZW5kJywgcmVzdWx0KTtcclxuICAgIH1cclxuXHJcbn1cclxuXHJcbmV4cG9ydCB7IFBhcmFtZXRlck1hbmFnZXIgfTsiXX0=
@@ -12,6 +12,10 @@ const oxutil = require('../../lib/util');
12
12
 
13
13
  const errorHelper = require('../../errors/helper');
14
14
 
15
+ const {
16
+ parentPort
17
+ } = require('worker_threads');
18
+
15
19
  const reporter = {
16
20
  onSuiteStart: function (...args) {
17
21
  emitReporterEvent('onSuiteStart', args);
@@ -110,7 +114,7 @@ process.on('uncaughtException', async (err, origin) => {
110
114
  process.on('SIGINT', async function () {
111
115
  await dispose('CANCELED');
112
116
  });
113
- process.on('message', async function (msg) {
117
+ parentPort.on('message', async function (msg) {
114
118
  if (!msg.type) {
115
119
  return;
116
120
  }
@@ -147,12 +151,10 @@ async function dispose(status = null) {
147
151
  }
148
152
 
149
153
  function processSend(msg) {
150
- try {
151
- process.connected && process.send({
152
- time: oxutil.getTimeStamp(),
153
- ...msg
154
- });
155
- } catch (e) {}
154
+ parentPort.postMessage({
155
+ time: oxutil.getTimeStamp(),
156
+ ...msg
157
+ });
156
158
  }
157
159
 
158
160
  async function invoke(method, args) {
@@ -216,4 +218,4 @@ function emitReporterEvent(eventName, eventArgs) {
216
218
  args: eventArgs
217
219
  });
218
220
  }
219
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi93b3JrZXIuanMiXSwibmFtZXMiOlsib3h1dGlsIiwicmVxdWlyZSIsImVycm9ySGVscGVyIiwicmVwb3J0ZXIiLCJvblN1aXRlU3RhcnQiLCJhcmdzIiwiZW1pdFJlcG9ydGVyRXZlbnQiLCJvblN1aXRlRW5kIiwib25DYXNlU3RhcnQiLCJvbkNhc2VFbmQiLCJvblN0ZXBTdGFydCIsIm9uU3RlcEVuZCIsIm9uUnVubmVyRW5kIiwiZ2xvYmFsIiwiYnJvd3NlciIsImxvZ2dlciIsImluZm8iLCJtZXNzYWdlIiwic3JjIiwiREVGQVVMVF9MT0dHRVJfSVNTVUVSIiwidHMiLCJnZXRUaW1lU3RhbXAiLCJwcm9jZXNzU2VuZCIsInRpbWUiLCJldmVudCIsImxldmVsIiwiTEVWRUxTIiwiSU5GTyIsIm1zZyIsInN0cmluZ2lmeSIsImRlYnVnIiwiREVCVUciLCJlcnJvciIsImVyciIsIkVSUk9SIiwid2FybiIsIldBUk4iLCJfd29ya2VyIiwiT3h5Z2VuV29ya2VyIiwib2JqIiwiU3RyaW5nIiwiSlNPTiIsImhvb2tMb2dzIiwicHJvY2VzcyIsIm9uIiwib3JpZ2luIiwiSVNTVUVSUyIsIlVTRVIiLCJjb25zb2xlIiwibG9nIiwiZXJyTWVzc2FnZSIsImRpc3Bvc2UiLCJ0eXBlIiwibWV0aG9kIiwiY2FsbElkIiwiaW52b2tlRnVuYyIsImludm9rZVRlc3RIb29rIiwiaW52b2tlIiwicmV0dmFsIiwic3Vic2NyaWJlIiwic3RhdHVzIiwiZSIsImNvbm5lY3RlZCIsInNlbmQiLCJhcHBseSIsIkVycm9yIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsInVuZGVmaW5lZCIsImNhbGxUZXN0SG9vayIsImV2ZW50TmFtZSIsImVtaXRXb3JrZXJFdmVudCIsImV2ZW50QXJncyIsIm5hbWUiXSwibWFwcGluZ3MiOiI7Ozs7QUFhQTs7QUFDQTs7OztBQUNBLE1BQU1BLE1BQU0sR0FBR0MsT0FBTyxDQUFDLGdCQUFELENBQXRC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QUFJQSxPQUFPLENBQUNPLEVBQXZCLEVBQTJCO0FBQ3ZCUCxJQUFBQSxPQUFPLENBQUNPLEVBQVIsQ0FBV3lCLFNBQVgsRUFBc0IsQ0FBQyxHQUFHaEUsSUFBSixLQUFhaUUsZUFBZSxDQUFDRCxTQUFELEVBQVloRSxJQUFaLENBQWxEO0FBQ0g7QUFDSjs7QUFFRCxTQUFTaUUsZUFBVCxDQUF5QkQsU0FBekIsRUFBb0NFLFNBQXBDLEVBQStDO0FBQzNDakQsRUFBQUEsV0FBVyxDQUFDO0FBQ1JFLElBQUFBLEtBQUssRUFBRSxPQURDO0FBRVJnRCxJQUFBQSxJQUFJLEVBQUVILFNBRkU7QUFHUmhFLElBQUFBLElBQUksRUFBRWtFO0FBSEUsR0FBRCxDQUFYO0FBS0g7O0FBRUQsU0FBU2pFLGlCQUFULENBQTJCK0QsU0FBM0IsRUFBc0NFLFNBQXRDLEVBQWlEO0FBQzdDakQsRUFBQUEsV0FBVyxDQUFDO0FBQ1JFLElBQUFBLEtBQUssRUFBRSxVQURDO0FBRVI2QixJQUFBQSxNQUFNLEVBQUVnQixTQUZBO0FBR1JoRSxJQUFBQSxJQUFJLEVBQUVrRTtBQUhFLEdBQUQsQ0FBWDtBQUtIIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKlxyXG4gKiBCb2lsZXJwbGF0ZSBjb2RlIGZvciB1c2VyIHNjcmlwdHMuXHJcbiAqIFByb3ZpZGVzIGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IGZvciBleGVjdXRpbmcgSlMgdGVzdCBzY3JpcHRzLlxyXG4gKi9cclxuaW1wb3J0IHsgTEVWRUxTLCBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIElTU1VFUlMgfSBmcm9tICcuLi8uLi9saWIvbG9nZ2VyJztcclxuaW1wb3J0IE94eWdlbldvcmtlciBmcm9tICcuL094eWdlbldvcmtlcic7XHJcbmNvbnN0IG94dXRpbCA9IHJlcXVpcmUoJy4uLy4uL2xpYi91dGlsJyk7XHJcbmNvbnN0IGVycm9ySGVscGVyID0gcmVxdWlyZSgnLi4vLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5cclxuY29uc3QgcmVwb3J0ZXIgPSB7XHJcbiAgICBvblN1aXRlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdWl0ZVN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdWl0ZUVuZDogZnVuY3Rpb24oLi4uYXJncykge1xyXG4gICAgICAgIGVtaXRSZXBvcnRlckV2ZW50KCdvblN1aXRlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25DYXNlU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvbkNhc2VFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25DYXNlRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdGVwU3RhcnQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwU3RhcnQnLCBhcmdzKTtcclxuICAgIH0sXHJcbiAgICBvblN0ZXBFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdGVwRW5kJywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25SdW5uZXJFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25SdW5uZXJFbmQnLCBhcmdzKTtcclxuICAgIH1cclxufTtcclxuXHJcbi8vIG1vY2t1cCBnbG9iYmFsLmJyb3dzZXIgb2JqZWN0IGZvciBpbnRlcm5hbCBXRElPIGZ1bmN0aW9ucyB0byB3b3JrIHByb3Blcmx5XHJcbmdsb2JhbC5icm93c2VyID0ge307XHJcblxyXG5jb25zdCBsb2dnZXIgPSB7XHJcbiAgICBpbmZvOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIpIHtcclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuSU5GTywgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYyB9KTtcclxuICAgIH0sXHJcbiAgICBkZWJ1ZzogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLkRFQlVHLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfSxcclxuICAgIGVycm9yOiBmdW5jdGlvbihtZXNzYWdlLCBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVIsIGVyciA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIXNyYykge1xyXG4gICAgICAgICAgICBzcmMgPSBERUZBVUxUX0xPR0dFUl9JU1NVRVI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5FUlJPUiwgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYywgZXJyOiBlcnIgfSk7XHJcbiAgICB9LFxyXG4gICAgd2FybjogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLldBUk4sIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5sZXQgX3dvcmtlciA9IG5ldyBPeHlnZW5Xb3JrZXIocmVwb3J0ZXIsIGxvZ2dlcik7XHJcblxyXG5mdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7XHJcbiAgICByZXR1cm4gKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnIHx8IG9iaiBpbnN0YW5jZW9mIFN0cmluZyA/IG9iaiA6IEpTT04uc3RyaW5naWZ5KG9iaiwgbnVsbCwgMikpO1xyXG59XHJcblxyXG5veHV0aWwuaG9va0xvZ3MobG9nZ2VyKTtcclxuLy8gcmVkaXJlY3Qgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIGxvZ2dlclxyXG4vL3Byb2Nlc3Muc3Rkb3V0LndyaXRlID0gbG9nZ2VyLmRlYnVnO1xyXG4vL3Byb2Nlc3Muc3RkZXJyLndyaXRlID0gbG9nZ2VyLmVycm9yO1xyXG5cclxucHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgYXN5bmMoZXJyLCBvcmlnaW4pID0+IHtcclxuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSwgSVNTVUVSUy5VU0VSKTtcclxuICAgIGNvbnNvbGUubG9nKCd1bmhhbmRsZWRSZWplY3Rpb24nLCBlcnIpO1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAnd29ya2VyRXJyb3InLFxyXG4gICAgICAgIGVyck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxyXG4gICAgfSk7XHJcbn0pO1xyXG5cclxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBhc3luYyhlcnIsIG9yaWdpbikgPT4ge1xyXG4gICAgbG9nZ2VyLmVycm9yKGVyci5tZXNzYWdlLCBJU1NVRVJTLlVTRVIpO1xyXG4gICAgY29uc29sZS5sb2coJ3VuY2F1Z2h0RXhjZXB0aW9uJywgZXJyKTtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ3dvcmtlckVycm9yJyxcclxuICAgICAgICBlcnJNZXNzYWdlOiBlcnIubWVzc2FnZSxcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbnByb2Nlc3Mub24oJ1NJR0lOVCcsIGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgYXdhaXQgZGlzcG9zZSgnQ0FOQ0VMRUQnKTtcclxufSk7XHJcblxyXG5wcm9jZXNzLm9uKCdtZXNzYWdlJywgYXN5bmMgZnVuY3Rpb24gKG1zZykge1xyXG4gICAgaWYgKCFtc2cudHlwZSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICgobXNnLnR5cGUgPT09ICdpbnZva2UnIHx8IG1zZy50eXBlID09PSAnaW52b2tlOmhvb2snKSAmJiBtc2cubWV0aG9kKSB7XHJcbiAgICAgICAgY29uc3QgeyBjYWxsSWQsIG1ldGhvZCwgYXJncyB9ID0gbXNnO1xyXG4gICAgICAgIGNvbnN0IGludm9rZUZ1bmMgPSBtc2cudHlwZSA9PT0gJ2ludm9rZTpob29rJyA/IGludm9rZVRlc3RIb29rIDogaW52b2tlO1xyXG4gICAgICAgIGNvbnN0IHsgcmV0dmFsLCBlcnJvciB9ID0gYXdhaXQgaW52b2tlRnVuYyhtZXRob2QsIGFyZ3MpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdpbnZva2U6cmVzdWx0JyxcclxuICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IsXHJcbiAgICAgICAgICAgIHJldHZhbDogcmV0dmFsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChtc2cudHlwZSA9PT0gJ3N1YnNjcmliZScpIHtcclxuICAgICAgICBzdWJzY3JpYmUobXNnLmV2ZW50KTtcclxuICAgIH1cclxufSk7XHJcblxyXG5hc3luYyBmdW5jdGlvbiBkaXNwb3NlKHN0YXR1cz0gbnVsbCkge1xyXG4gICAgaWYgKF93b3JrZXIpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBfd29ya2VyLmRpc3Bvc2Uoc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzU2VuZChtc2cpIHtcclxuICAgIC8vIHdyYXAgcHJvY2Vzcy5zZW5kIHdpdGggdHJ5L2NhdGNoIGFzIHNvbWV0aW1lcyB3ZSBtaWdodCBjYWxsIHByb2Nlc3Muc2VuZCBcclxuICAgIC8vIHdoZW4gcGFyZW50IHByb2Nlc3MgaXMgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKHdoZW4gdXNlIGtpbGxzIHRoZSBtYWluIHByb2Nlc3MpXHJcbiAgICB0cnkge1xyXG4gICAgICAgIC8vIGFkZCB1dGMgdGltZXN0YW1wXHJcbiAgICAgICAgcHJvY2Vzcy5jb25uZWN0ZWQgJiYgcHJvY2Vzcy5zZW5kKHsgdGltZTogb3h1dGlsLmdldFRpbWVTdGFtcCgpLCAuLi5tc2cgfSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIC8vIGlnbm9yZVxyXG4gICAgfVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmdzKSB7XHJcbiAgICBsZXQgcmV0dmFsLCBlcnJvcjtcclxuICAgIGlmIChfd29ya2VyICYmIF93b3JrZXJbbWV0aG9kXSAmJiB0eXBlb2YgX3dvcmtlclttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmV0dmFsID0gYXdhaXQgX3dvcmtlclttZXRob2RdLmFwcGx5KF93b3JrZXIsIGFyZ3MgfHwgW10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGludm9rZTogJHttZXRob2R9OmAsIGUpO1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYE1ldGhvZCBcIiR7bWV0aG9kfVwiIGRvZXMgbm90IGV4aXN0YCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb252ZXJ0IEpTIGVycm9yIHRvIE94eWdlbiBGYWlsdXJlIG9iamVjdFxyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgZXJyb3IgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHJldHZhbCwgZXJyb3IgfTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gaW52b2tlVGVzdEhvb2sobWV0aG9kLCBhcmdzKSB7XHJcbiAgICBsZXQgcmV0dmFsID0gdW5kZWZpbmVkLCBlcnJvciA9IG51bGw7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHJldHZhbCA9IGF3YWl0IF93b3JrZXIuY2FsbFRlc3RIb29rKG1ldGhvZCwgYXJncyk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgIGVycm9yID0gZS5tZXNzYWdlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgcmV0dmFsLCBlcnJvciB9O1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzdWJzY3JpYmUoZXZlbnROYW1lKSB7XHJcbiAgICBpZiAoX3dvcmtlciAmJiBfd29ya2VyLm9uKSB7XHJcbiAgICAgICAgX3dvcmtlci5vbihldmVudE5hbWUsICguLi5hcmdzKSA9PiBlbWl0V29ya2VyRXZlbnQoZXZlbnROYW1lLCBhcmdzKSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVtaXRXb3JrZXJFdmVudChldmVudE5hbWUsIGV2ZW50QXJncykge1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAnZXZlbnQnLFxyXG4gICAgICAgIG5hbWU6IGV2ZW50TmFtZSxcclxuICAgICAgICBhcmdzOiBldmVudEFyZ3NcclxuICAgIH0pO1xyXG59XHJcblxyXG5mdW5jdGlvbiBlbWl0UmVwb3J0ZXJFdmVudChldmVudE5hbWUsIGV2ZW50QXJncykge1xyXG4gICAgcHJvY2Vzc1NlbmQoe1xyXG4gICAgICAgIGV2ZW50OiAncmVwb3J0ZXInLFxyXG4gICAgICAgIG1ldGhvZDogZXZlbnROYW1lLFxyXG4gICAgICAgIGFyZ3M6IGV2ZW50QXJnc1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbiJdfQ==
221
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi93b3JrZXIuanMiXSwibmFtZXMiOlsib3h1dGlsIiwicmVxdWlyZSIsImVycm9ySGVscGVyIiwicGFyZW50UG9ydCIsInJlcG9ydGVyIiwib25TdWl0ZVN0YXJ0IiwiYXJncyIsImVtaXRSZXBvcnRlckV2ZW50Iiwib25TdWl0ZUVuZCIsIm9uQ2FzZVN0YXJ0Iiwib25DYXNlRW5kIiwib25TdGVwU3RhcnQiLCJvblN0ZXBFbmQiLCJvblJ1bm5lckVuZCIsImdsb2JhbCIsImJyb3dzZXIiLCJsb2dnZXIiLCJpbmZvIiwibWVzc2FnZSIsInNyYyIsIkRFRkFVTFRfTE9HR0VSX0lTU1VFUiIsInRzIiwiZ2V0VGltZVN0YW1wIiwicHJvY2Vzc1NlbmQiLCJ0aW1lIiwiZXZlbnQiLCJsZXZlbCIsIkxFVkVMUyIsIklORk8iLCJtc2ciLCJzdHJpbmdpZnkiLCJkZWJ1ZyIsIkRFQlVHIiwiZXJyb3IiLCJlcnIiLCJFUlJPUiIsIndhcm4iLCJXQVJOIiwiX3dvcmtlciIsIk94eWdlbldvcmtlciIsIm9iaiIsIlN0cmluZyIsIkpTT04iLCJob29rTG9ncyIsInByb2Nlc3MiLCJvbiIsIm9yaWdpbiIsIklTU1VFUlMiLCJVU0VSIiwiY29uc29sZSIsImxvZyIsImVyck1lc3NhZ2UiLCJkaXNwb3NlIiwidHlwZSIsIm1ldGhvZCIsImNhbGxJZCIsImludm9rZUZ1bmMiLCJpbnZva2VUZXN0SG9vayIsImludm9rZSIsInJldHZhbCIsInN1YnNjcmliZSIsInN0YXR1cyIsImUiLCJwb3N0TWVzc2FnZSIsImFwcGx5IiwiRXJyb3IiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwidW5kZWZpbmVkIiwiY2FsbFRlc3RIb29rIiwiZXZlbnROYW1lIiwiZW1pdFdvcmtlckV2ZW50IiwiZXZlbnRBcmdzIiwibmFtZSJdLCJtYXBwaW5ncyI6Ijs7OztBQWFBOztBQUNBOzs7O0FBQ0EsTUFBTUEsTUFBTSxHQUFHQyxPQUFPLENBQUMsZ0JB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QU8sQ0FBQ08sRUFBdkIsRUFBMkI7QUFDdkJQLElBQUFBLE9BQU8sQ0FBQ08sRUFBUixDQUFXd0IsU0FBWCxFQUFzQixDQUFDLEdBQUcvRCxJQUFKLEtBQWFnRSxlQUFlLENBQUNELFNBQUQsRUFBWS9ELElBQVosQ0FBbEQ7QUFDSDtBQUNKOztBQUVELFNBQVNnRSxlQUFULENBQXlCRCxTQUF6QixFQUFvQ0UsU0FBcEMsRUFBK0M7QUFDM0NoRCxFQUFBQSxXQUFXLENBQUM7QUFDUkUsSUFBQUEsS0FBSyxFQUFFLE9BREM7QUFFUitDLElBQUFBLElBQUksRUFBRUgsU0FGRTtBQUdSL0QsSUFBQUEsSUFBSSxFQUFFaUU7QUFIRSxHQUFELENBQVg7QUFLSDs7QUFFRCxTQUFTaEUsaUJBQVQsQ0FBMkI4RCxTQUEzQixFQUFzQ0UsU0FBdEMsRUFBaUQ7QUFDN0NoRCxFQUFBQSxXQUFXLENBQUM7QUFDUkUsSUFBQUEsS0FBSyxFQUFFLFVBREM7QUFFUjZCLElBQUFBLE1BQU0sRUFBRWUsU0FGQTtBQUdSL0QsSUFBQUEsSUFBSSxFQUFFaUU7QUFIRSxHQUFELENBQVg7QUFLSCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogQm9pbGVycGxhdGUgY29kZSBmb3IgdXNlciBzY3JpcHRzLlxyXG4gKiBQcm92aWRlcyBldmVyeXRoaW5nIG5lY2Vzc2FyeSBmb3IgZXhlY3V0aW5nIEpTIHRlc3Qgc2NyaXB0cy5cclxuICovXHJcbmltcG9ydCB7IExFVkVMUywgREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBJU1NVRVJTIH0gZnJvbSAnLi4vLi4vbGliL2xvZ2dlcic7XHJcbmltcG9ydCBPeHlnZW5Xb3JrZXIgZnJvbSAnLi9PeHlnZW5Xb3JrZXInO1xyXG5jb25zdCBveHV0aWwgPSByZXF1aXJlKCcuLi8uLi9saWIvdXRpbCcpO1xyXG5jb25zdCBlcnJvckhlbHBlciA9IHJlcXVpcmUoJy4uLy4uL2Vycm9ycy9oZWxwZXInKTtcclxuXHJcbmNvbnN0IHsgcGFyZW50UG9ydCB9ID0gcmVxdWlyZSgnd29ya2VyX3RocmVhZHMnKTtcclxuXHJcbmNvbnN0IHJlcG9ydGVyID0ge1xyXG4gICAgb25TdWl0ZVN0YXJ0OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uU3VpdGVTdGFydCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uU3VpdGVFbmQ6IGZ1bmN0aW9uKC4uLmFyZ3MpIHtcclxuICAgICAgICBlbWl0UmVwb3J0ZXJFdmVudCgnb25TdWl0ZUVuZCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uQ2FzZVN0YXJ0OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uQ2FzZVN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25DYXNlRW5kOiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uQ2FzZUVuZCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uU3RlcFN0YXJ0OiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uU3RlcFN0YXJ0JywgYXJncyk7XHJcbiAgICB9LFxyXG4gICAgb25TdGVwRW5kOiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uU3RlcEVuZCcsIGFyZ3MpO1xyXG4gICAgfSxcclxuICAgIG9uUnVubmVyRW5kOiBmdW5jdGlvbiguLi5hcmdzKSB7XHJcbiAgICAgICAgZW1pdFJlcG9ydGVyRXZlbnQoJ29uUnVubmVyRW5kJywgYXJncyk7XHJcbiAgICB9XHJcbn07XHJcblxyXG4vLyBtb2NrdXAgZ2xvYmJhbC5icm93c2VyIG9iamVjdCBmb3IgaW50ZXJuYWwgV0RJTyBmdW5jdGlvbnMgdG8gd29yayBwcm9wZXJseVxyXG5nbG9iYWwuYnJvd3NlciA9IHt9O1xyXG5cclxuY29uc3QgbG9nZ2VyID0ge1xyXG4gICAgaW5mbzogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSKSB7XHJcbiAgICAgICAgY29uc3QgdHMgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcHJvY2Vzc1NlbmQoeyB0aW1lOiB0cywgZXZlbnQ6ICdsb2cnLCBsZXZlbDogTEVWRUxTLklORk8sIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMgfSk7XHJcbiAgICB9LFxyXG4gICAgZGVidWc6IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5ERUJVRywgbXNnOiBzdHJpbmdpZnkobWVzc2FnZSksIHNyYyB9KTtcclxuICAgIH0sXHJcbiAgICBlcnJvcjogZnVuY3Rpb24obWVzc2FnZSwgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSLCBlcnIgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFzcmMpIHtcclxuICAgICAgICAgICAgc3JjID0gREVGQVVMVF9MT0dHRVJfSVNTVUVSO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0cyA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7IHRpbWU6IHRzLCBldmVudDogJ2xvZycsIGxldmVsOiBMRVZFTFMuRVJST1IsIG1zZzogc3RyaW5naWZ5KG1lc3NhZ2UpLCBzcmMsIGVycjogZXJyIH0pO1xyXG4gICAgfSxcclxuICAgIHdhcm46IGZ1bmN0aW9uKG1lc3NhZ2UsIHNyYyA9IERFRkFVTFRfTE9HR0VSX0lTU1VFUikge1xyXG4gICAgICAgIGNvbnN0IHRzID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHByb2Nlc3NTZW5kKHsgdGltZTogdHMsIGV2ZW50OiAnbG9nJywgbGV2ZWw6IExFVkVMUy5XQVJOLCBtc2c6IHN0cmluZ2lmeShtZXNzYWdlKSwgc3JjIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxubGV0IF93b3JrZXIgPSBuZXcgT3h5Z2VuV29ya2VyKHJlcG9ydGVyLCBsb2dnZXIpO1xyXG5cclxuZnVuY3Rpb24gc3RyaW5naWZ5KG9iaikge1xyXG4gICAgcmV0dXJuICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyB8fCBvYmogaW5zdGFuY2VvZiBTdHJpbmcgPyBvYmogOiBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpKTtcclxufVxyXG5cclxub3h1dGlsLmhvb2tMb2dzKGxvZ2dlcik7XHJcbi8vIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBsb2dnZXJcclxuLy9wcm9jZXNzLnN0ZG91dC53cml0ZSA9IGxvZ2dlci5kZWJ1ZztcclxuLy9wcm9jZXNzLnN0ZGVyci53cml0ZSA9IGxvZ2dlci5lcnJvcjtcclxuXHJcbnByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsIGFzeW5jKGVyciwgb3JpZ2luKSA9PiB7XHJcbiAgICBsb2dnZXIuZXJyb3IoZXJyLm1lc3NhZ2UsIElTU1VFUlMuVVNFUik7XHJcbiAgICBjb25zb2xlLmxvZygndW5oYW5kbGVkUmVqZWN0aW9uJywgZXJyKTtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ3dvcmtlckVycm9yJyxcclxuICAgICAgICBlcnJNZXNzYWdlOiBlcnIubWVzc2FnZSxcclxuICAgIH0pO1xyXG59KTtcclxuXHJcbnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgYXN5bmMoZXJyLCBvcmlnaW4pID0+IHtcclxuICAgIGxvZ2dlci5lcnJvcihlcnIubWVzc2FnZSwgSVNTVUVSUy5VU0VSKTtcclxuICAgIGNvbnNvbGUubG9nKCd1bmNhdWdodEV4Y2VwdGlvbicsIGVycik7XHJcbiAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgZXZlbnQ6ICd3b3JrZXJFcnJvcicsXHJcbiAgICAgICAgZXJyTWVzc2FnZTogZXJyLm1lc3NhZ2UsXHJcbiAgICB9KTtcclxufSk7XHJcblxyXG5wcm9jZXNzLm9uKCdTSUdJTlQnLCBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IGRpc3Bvc2UoJ0NBTkNFTEVEJyk7XHJcbn0pO1xyXG5cclxucGFyZW50UG9ydC5vbignbWVzc2FnZScsIGFzeW5jIGZ1bmN0aW9uIChtc2cpIHtcclxuICAgIGlmICghbXNnLnR5cGUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoKG1zZy50eXBlID09PSAnaW52b2tlJyB8fCBtc2cudHlwZSA9PT0gJ2ludm9rZTpob29rJykgJiYgbXNnLm1ldGhvZCkge1xyXG4gICAgICAgIGNvbnN0IHsgY2FsbElkLCBtZXRob2QsIGFyZ3MgfSA9IG1zZztcclxuICAgICAgICBjb25zdCBpbnZva2VGdW5jID0gbXNnLnR5cGUgPT09ICdpbnZva2U6aG9vaycgPyBpbnZva2VUZXN0SG9vayA6IGludm9rZTtcclxuICAgICAgICBjb25zdCB7IHJldHZhbCwgZXJyb3IgfSA9IGF3YWl0IGludm9rZUZ1bmMobWV0aG9kLCBhcmdzKTtcclxuICAgICAgICBwcm9jZXNzU2VuZCh7XHJcbiAgICAgICAgICAgIGV2ZW50OiAnaW52b2tlOnJlc3VsdCcsXHJcbiAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICBjYWxsSWQ6IGNhbGxJZCxcclxuICAgICAgICAgICAgZXJyb3I6IGVycm9yLFxyXG4gICAgICAgICAgICByZXR2YWw6IHJldHZhbFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAobXNnLnR5cGUgPT09ICdzdWJzY3JpYmUnKSB7XHJcbiAgICAgICAgc3Vic2NyaWJlKG1zZy5ldmVudCk7XHJcbiAgICB9XHJcbn0pO1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZGlzcG9zZShzdGF0dXM9IG51bGwpIHtcclxuICAgIGlmIChfd29ya2VyKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgX3dvcmtlci5kaXNwb3NlKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcHJvY2Vzc1NlbmQobXNnKSB7XHJcblxyXG4gICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7IHRpbWU6IG94dXRpbC5nZXRUaW1lU3RhbXAoKSwgLi4ubXNnIH0pO1xyXG5cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJncykge1xyXG4gICAgbGV0IHJldHZhbCwgZXJyb3I7XHJcbiAgICBpZiAoX3dvcmtlciAmJiBfd29ya2VyW21ldGhvZF0gJiYgdHlwZW9mIF93b3JrZXJbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHZhbCA9IGF3YWl0IF93b3JrZXJbbWV0aG9kXS5hcHBseShfd29ya2VyLCBhcmdzIHx8IFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBpbnZva2U6ICR7bWV0aG9kfTpgLCBlKTtcclxuICAgICAgICAgICAgZXJyb3IgPSBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGVycm9yID0gbmV3IEVycm9yKGBNZXRob2QgXCIke21ldGhvZH1cIiBkb2VzIG5vdCBleGlzdGApO1xyXG4gICAgfVxyXG4gICAgLy8gY29udmVydCBKUyBlcnJvciB0byBPeHlnZW4gRmFpbHVyZSBvYmplY3RcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGVycm9yID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyByZXR2YWwsIGVycm9yIH07XHJcbn1cclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGludm9rZVRlc3RIb29rKG1ldGhvZCwgYXJncykge1xyXG4gICAgbGV0IHJldHZhbCA9IHVuZGVmaW5lZCwgZXJyb3IgPSBudWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICByZXR2YWwgPSBhd2FpdCBfd29ya2VyLmNhbGxUZXN0SG9vayhtZXRob2QsIGFyZ3MpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICBlcnJvciA9IGUubWVzc2FnZTtcclxuICAgIH1cclxuICAgIHJldHVybiB7IHJldHZhbCwgZXJyb3IgfTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlKGV2ZW50TmFtZSkge1xyXG4gICAgaWYgKF93b3JrZXIgJiYgX3dvcmtlci5vbikge1xyXG4gICAgICAgIF93b3JrZXIub24oZXZlbnROYW1lLCAoLi4uYXJncykgPT4gZW1pdFdvcmtlckV2ZW50KGV2ZW50TmFtZSwgYXJncykpO1xyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBlbWl0V29ya2VyRXZlbnQoZXZlbnROYW1lLCBldmVudEFyZ3MpIHtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ2V2ZW50JyxcclxuICAgICAgICBuYW1lOiBldmVudE5hbWUsXHJcbiAgICAgICAgYXJnczogZXZlbnRBcmdzXHJcbiAgICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZW1pdFJlcG9ydGVyRXZlbnQoZXZlbnROYW1lLCBldmVudEFyZ3MpIHtcclxuICAgIHByb2Nlc3NTZW5kKHtcclxuICAgICAgICBldmVudDogJ3JlcG9ydGVyJyxcclxuICAgICAgICBtZXRob2Q6IGV2ZW50TmFtZSxcclxuICAgICAgICBhcmdzOiBldmVudEFyZ3NcclxuICAgIH0pO1xyXG59XHJcblxyXG4iXX0=