testcafe 1.20.2-alpha.1 → 2.0.0-rc.3

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 (231) hide show
  1. package/lib/api/request-hooks/assert-type.js +2 -2
  2. package/lib/api/request-hooks/hook.js +2 -2
  3. package/lib/api/request-hooks/request-logger.js +2 -2
  4. package/lib/api/skip-js-errors/index.js +62 -0
  5. package/lib/api/structure/base-unit.js +2 -2
  6. package/lib/api/structure/fixture.js +13 -13
  7. package/lib/api/structure/test.js +18 -17
  8. package/lib/api/structure/testing-unit.js +26 -16
  9. package/lib/api/test-controller/assertion.js +5 -5
  10. package/lib/api/test-controller/execution-context.js +2 -2
  11. package/lib/api/test-controller/index.js +33 -30
  12. package/lib/api/test-controller/proxy.js +2 -2
  13. package/lib/api/test-page-url.js +4 -4
  14. package/lib/api/test-run-tracker.js +2 -2
  15. package/lib/api/wrap-test-function.js +3 -3
  16. package/lib/assertions/executor.js +4 -4
  17. package/lib/assertions/get-fn.js +3 -3
  18. package/lib/browser/connection/gateway.js +18 -18
  19. package/lib/browser/connection/get-hints.js +8 -8
  20. package/lib/browser/connection/index.js +11 -11
  21. package/lib/browser/connection/remotes-queue.js +4 -4
  22. package/lib/browser/provider/built-in/dedicated/base.js +6 -6
  23. package/lib/browser/provider/built-in/dedicated/chrome/cdp-client/index.js +10 -10
  24. package/lib/browser/provider/built-in/dedicated/chrome/config.js +17 -17
  25. package/lib/browser/provider/built-in/dedicated/chrome/create-temp-profile.js +4 -4
  26. package/lib/browser/provider/built-in/dedicated/chrome/index.js +6 -6
  27. package/lib/browser/provider/built-in/dedicated/chrome/local-chrome.js +6 -6
  28. package/lib/browser/provider/built-in/dedicated/chrome/runtime-info.js +4 -4
  29. package/lib/browser/provider/built-in/dedicated/edge/runtime-info.js +2 -2
  30. package/lib/browser/provider/built-in/dedicated/firefox/config.js +8 -8
  31. package/lib/browser/provider/built-in/dedicated/firefox/create-temp-profile.js +3 -3
  32. package/lib/browser/provider/built-in/dedicated/firefox/index.js +5 -5
  33. package/lib/browser/provider/built-in/dedicated/firefox/local-firefox.js +2 -2
  34. package/lib/browser/provider/built-in/dedicated/firefox/marionette-client/index.js +7 -7
  35. package/lib/browser/provider/built-in/dedicated/firefox/runtime-info.js +3 -3
  36. package/lib/browser/provider/built-in/path.js +2 -2
  37. package/lib/browser/provider/built-in/remote.js +3 -3
  38. package/lib/browser/provider/index.js +5 -5
  39. package/lib/browser/provider/plugin-host.js +5 -6
  40. package/lib/browser/provider/pool.js +4 -4
  41. package/lib/browser/provider/utils/argument-parsing.js +3 -3
  42. package/lib/browser/provider/utils/browser-starter.js +2 -2
  43. package/lib/cli/argument-parser/index.js +52 -41
  44. package/lib/cli/argument-parser/parse-utils.js +2 -2
  45. package/lib/cli/authentication-helper.js +3 -3
  46. package/lib/cli/cli.js +8 -8
  47. package/lib/cli/correct-browsers-and-sources.js +2 -2
  48. package/lib/cli/index.js +2 -2
  49. package/lib/cli/log.js +3 -3
  50. package/lib/cli/remotes-wizard.js +3 -3
  51. package/lib/client/automation/index.js +120 -34
  52. package/lib/client/automation/index.min.js +1 -1
  53. package/lib/client/browser/idle-page/index.js +321 -317
  54. package/lib/client/browser/service-worker.js +244 -290
  55. package/lib/client/core/deps/hammerhead.js +12 -4
  56. package/lib/client/core/index.js +145 -55
  57. package/lib/client/core/index.min.js +1 -1
  58. package/lib/client/core/utils/dom.js +33 -28
  59. package/lib/client/core/utils/position.js +18 -14
  60. package/lib/client/core/utils/style.js +8 -4
  61. package/lib/client/driver/command-executors/client-functions/selector-executor/filter.js +5 -5
  62. package/lib/client/driver/command-executors/client-functions/selector-executor/utils.js +3 -3
  63. package/lib/client/driver/deps/hammerhead.js +12 -4
  64. package/lib/client/driver/deps/testcafe-core.js +12 -4
  65. package/lib/client/driver/deps/testcafe-ui.js +12 -4
  66. package/lib/client/driver/index.js +654 -630
  67. package/lib/client/driver/index.min.js +1 -1
  68. package/lib/client/driver/status.js +2 -2
  69. package/lib/client/ui/index.js +10 -8
  70. package/lib/client/ui/index.min.js +1 -1
  71. package/lib/client-functions/builder-symbol.js +1 -2
  72. package/lib/client-functions/client-function-builder.js +12 -12
  73. package/lib/client-functions/replicator.js +2 -2
  74. package/lib/client-functions/selector-api-execution-mode.js +2 -2
  75. package/lib/client-functions/selectors/add-api.js +48 -48
  76. package/lib/client-functions/selectors/selector-builder.js +17 -17
  77. package/lib/compiler/compile-client-function.js +6 -6
  78. package/lib/compiler/index.js +9 -9
  79. package/lib/compiler/test-file/api-based.js +8 -8
  80. package/lib/compiler/test-file/base.js +6 -6
  81. package/lib/compiler/test-file/exportble-lib-path.js +2 -2
  82. package/lib/compiler/test-file/formats/coffeescript/compiler.js +2 -2
  83. package/lib/compiler/test-file/formats/coffeescript/get-test-list.js +2 -2
  84. package/lib/compiler/test-file/formats/es-next/compiler.js +4 -4
  85. package/lib/compiler/test-file/formats/es-next/get-test-list.js +4 -4
  86. package/lib/compiler/test-file/formats/raw.js +2 -2
  87. package/lib/compiler/test-file/formats/typescript/compiler.js +11 -11
  88. package/lib/compiler/test-file/formats/typescript/get-test-list.js +3 -3
  89. package/lib/compiler/test-file/test-file-parser-base.js +3 -3
  90. package/lib/configuration/configuration-base.js +15 -15
  91. package/lib/configuration/interfaces.js +1 -1
  92. package/lib/configuration/skip-js-errors-option-names.js +11 -0
  93. package/lib/configuration/testcafe-configuration.js +21 -16
  94. package/lib/configuration/types.js +1 -1
  95. package/lib/configuration/typescript-configuration.js +4 -4
  96. package/lib/custom-client-scripts/assert-type.js +2 -2
  97. package/lib/custom-client-scripts/client-script.js +6 -6
  98. package/lib/custom-client-scripts/get-code.js +2 -2
  99. package/lib/custom-client-scripts/routing.js +3 -3
  100. package/lib/custom-client-scripts/utils.js +3 -3
  101. package/lib/dashboard/connector.js +4 -4
  102. package/lib/dashboard/get-default-project-link.js +2 -2
  103. package/lib/dashboard/index.js +26 -26
  104. package/lib/errors/create-stack-filter.js +2 -2
  105. package/lib/errors/error-list.js +2 -2
  106. package/lib/errors/get-callsite.js +2 -2
  107. package/lib/errors/is-internal-stack-frame.js +5 -5
  108. package/lib/errors/process-test-fn-error.js +2 -2
  109. package/lib/errors/runtime/index.js +10 -10
  110. package/lib/errors/runtime/templates.js +5 -2
  111. package/lib/errors/runtime/type-assertions.js +6 -6
  112. package/lib/errors/stack-cleaning-hook.js +2 -2
  113. package/lib/errors/test-run/formattable-adapter.js +7 -7
  114. package/lib/errors/test-run/index.js +25 -5
  115. package/lib/errors/test-run/render-error-template/index.js +6 -6
  116. package/lib/errors/test-run/render-error-template/utils.js +2 -2
  117. package/lib/errors/test-run/templates.js +40 -31
  118. package/lib/errors/test-run/utils.js +7 -7
  119. package/lib/errors/types.js +5 -1
  120. package/lib/index.js +1 -1
  121. package/lib/live/file-watcher/index.js +2 -2
  122. package/lib/live/keyboard-observer.js +3 -3
  123. package/lib/live/test-run-controller.js +3 -3
  124. package/lib/live/test-run.js +3 -2
  125. package/lib/live/test-runner.js +2 -2
  126. package/lib/load-assets.js +2 -2
  127. package/lib/notifications/add-rendered-warning.js +4 -4
  128. package/lib/notifications/debug-logger.js +6 -6
  129. package/lib/notifications/deprecated.js +2 -2
  130. package/lib/notifications/information-message.js +4 -3
  131. package/lib/proxyless/resource-injector.js +4 -4
  132. package/lib/reporter/command/command-formatter.js +4 -4
  133. package/lib/reporter/index.js +10 -10
  134. package/lib/reporter/plugin-host.js +7 -7
  135. package/lib/role/index.js +8 -8
  136. package/lib/role/role.js +2 -2
  137. package/lib/runner/bootstrapper.js +20 -20
  138. package/lib/runner/browser-job.js +3 -3
  139. package/lib/runner/browser-set.js +12 -12
  140. package/lib/runner/fixture-hook-controller.js +5 -5
  141. package/lib/runner/index.js +43 -33
  142. package/lib/runner/task/index.js +10 -6
  143. package/lib/runner/test-run-hook-controller.js +5 -5
  144. package/lib/runner/tested-app.js +7 -7
  145. package/lib/screenshots/capturer.js +17 -17
  146. package/lib/screenshots/crop.js +8 -8
  147. package/lib/screenshots/index.js +6 -10
  148. package/lib/screenshots/utils.js +4 -4
  149. package/lib/services/compiler/host.js +8 -8
  150. package/lib/services/compiler/service.js +13 -13
  151. package/lib/services/compiler/test-run-proxy.js +8 -8
  152. package/lib/services/serialization/replicator/transforms/callsite-record-transform.js +2 -2
  153. package/lib/services/serialization/replicator/transforms/command-base-trasform/command-constructors.js +2 -1
  154. package/lib/services/serialization/replicator/transforms/command-base-trasform/index.js +3 -3
  155. package/lib/services/serialization/replicator/transforms/raw-command-callsite-record-transform.js +2 -2
  156. package/lib/services/serialization/test-structure.js +4 -4
  157. package/lib/services/utils/ipc/interfaces.js +1 -3
  158. package/lib/services/utils/ipc/io.js +3 -3
  159. package/lib/services/utils/ipc/message.js +2 -2
  160. package/lib/services/utils/ipc/proxy.js +4 -4
  161. package/lib/services/utils/ipc/transport.js +2 -2
  162. package/lib/shared/errors/index.js +9 -2
  163. package/lib/shared/errors/selector-error-ctor-callback.js +7 -3
  164. package/lib/test-run/bookmark.js +1 -1
  165. package/lib/test-run/browser-manipulation-queue.js +3 -3
  166. package/lib/test-run/commands/actions.js +66 -46
  167. package/lib/test-run/commands/assertion.js +3 -3
  168. package/lib/test-run/commands/base.js +2 -2
  169. package/lib/test-run/commands/browser-manipulation.js +8 -8
  170. package/lib/test-run/commands/observation.js +4 -4
  171. package/lib/test-run/commands/options.js +27 -12
  172. package/lib/test-run/commands/type.js +2 -1
  173. package/lib/test-run/commands/utils.js +3 -2
  174. package/lib/test-run/commands/validations/argument.js +19 -10
  175. package/lib/test-run/commands/validations/factories.js +10 -2
  176. package/lib/test-run/commands/validations/initializers.js +4 -4
  177. package/lib/test-run/debug-log.js +4 -4
  178. package/lib/test-run/execute-js-expression/index.js +4 -4
  179. package/lib/test-run/index.js +48 -41
  180. package/lib/test-run/request/create-request-options.js +9 -9
  181. package/lib/test-run/request/process-response-data.js +2 -2
  182. package/lib/test-run/request/send.js +5 -5
  183. package/lib/testcafe.js +8 -4
  184. package/lib/utils/check-file-path.js +2 -2
  185. package/lib/utils/check-url.js +2 -2
  186. package/lib/utils/correct-file-path.js +4 -4
  187. package/lib/utils/delegated-api.js +1 -1
  188. package/lib/utils/detect-ffmpeg.js +3 -3
  189. package/lib/utils/diff/colors.js +2 -2
  190. package/lib/utils/diff/index.js +11 -7
  191. package/lib/utils/diff/util.js +5 -5
  192. package/lib/utils/diff.js +4 -4
  193. package/lib/utils/escape-user-agent.js +2 -2
  194. package/lib/utils/execute-fn-with-timeout.js +2 -2
  195. package/lib/utils/get-browser.js +2 -2
  196. package/lib/utils/get-filter-fn.js +4 -4
  197. package/lib/utils/get-options/base.js +2 -2
  198. package/lib/utils/get-options/compiler.js +2 -2
  199. package/lib/utils/get-options/dashboard.js +2 -2
  200. package/lib/utils/get-options/get-assertion-timeout.js +1 -1
  201. package/lib/utils/get-options/index.js +4 -2
  202. package/lib/utils/get-options/meta.js +2 -2
  203. package/lib/utils/get-options/quarantine.js +8 -6
  204. package/lib/utils/get-options/screenshot.js +2 -2
  205. package/lib/utils/get-options/skip-js-errors.js +35 -0
  206. package/lib/utils/get-options/ssl.js +6 -6
  207. package/lib/utils/get-options/video.js +2 -2
  208. package/lib/utils/is-password-input.js +1 -1
  209. package/lib/utils/log-entry.js +2 -2
  210. package/lib/utils/make-reg-exp.js +19 -6
  211. package/lib/utils/moment-loader.js +2 -2
  212. package/lib/utils/parse-file-list.js +7 -7
  213. package/lib/utils/path-pattern.js +4 -4
  214. package/lib/utils/prepare-reporters.js +2 -2
  215. package/lib/utils/prerender-callsite.js +6 -6
  216. package/lib/utils/process.js +7 -7
  217. package/lib/utils/promisified-functions.js +14 -14
  218. package/lib/utils/raw-command-callsite-record.js +2 -2
  219. package/lib/utils/resolve-path-relatively-cwd.js +2 -2
  220. package/lib/utils/string.js +3 -3
  221. package/lib/utils/temp-directory/cleanup-process/index.js +6 -6
  222. package/lib/utils/temp-directory/cleanup-process/worker.js +4 -4
  223. package/lib/utils/temp-directory/index.js +6 -6
  224. package/lib/utils/temp-directory/lockfile.js +2 -2
  225. package/lib/video-recorder/process.js +6 -6
  226. package/lib/video-recorder/recorder.js +9 -9
  227. package/lib/video-recorder/test-run-video-recorder.js +2 -2
  228. package/package.json +8 -7
  229. package/ts-defs/index.d.ts +46 -7
  230. package/ts-defs/selectors.d.ts +39 -0
  231. package/ts-defs/testcafe-scripts.d.ts +39 -0
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -14,7 +18,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
14
18
  var __importStar = (this && this.__importStar) || function (mod) {
15
19
  if (mod && mod.__esModule) return mod;
16
20
  var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
22
  __setModuleDefault(result, mod);
19
23
  return result;
20
24
  };
@@ -70,6 +74,7 @@ const executor_1 = __importDefault(require("../assertions/executor"));
70
74
  const async_filter_1 = __importDefault(require("../utils/async-filter"));
71
75
  const execute_fn_with_timeout_1 = __importDefault(require("../utils/execute-fn-with-timeout"));
72
76
  const url_1 = require("url");
77
+ const skip_js_errors_1 = require("../api/skip-js-errors");
73
78
  const lazyRequire = require('import-lazy')(require);
74
79
  const ClientFunctionBuilder = lazyRequire('../client-functions/client-function-builder');
75
80
  const TestRunBookmark = lazyRequire('./bookmark');
@@ -78,8 +83,8 @@ const browserManipulationCommands = lazyRequire('./commands/browser-manipulation
78
83
  const serviceCommands = lazyRequire('./commands/service');
79
84
  const observationCommands = lazyRequire('./commands/observation');
80
85
  const { executeJsExpression, executeAsyncJsExpression } = lazyRequire('./execute-js-expression');
81
- const TEST_RUN_TEMPLATE = read_file_relative_1.readSync('../client/test-run/index.js.mustache');
82
- const IFRAME_TEST_RUN_TEMPLATE = read_file_relative_1.readSync('../client/test-run/iframe.js.mustache');
86
+ const TEST_RUN_TEMPLATE = (0, read_file_relative_1.readSync)('../client/test-run/index.js.mustache');
87
+ const IFRAME_TEST_RUN_TEMPLATE = (0, read_file_relative_1.readSync)('../client/test-run/iframe.js.mustache');
83
88
  const TEST_DONE_CONFIRMATION_RESPONSE = 'test-done-confirmation';
84
89
  const MAX_RESPONSE_DELAY = 3000;
85
90
  const CHILD_WINDOW_READY_TIMEOUT = 30 * 1000;
@@ -101,7 +106,7 @@ class TestRun extends async_event_emitter_1.default {
101
106
  this.test = test;
102
107
  this.browserConnection = browserConnection;
103
108
  this.unstable = false;
104
- this.browser = get_browser_1.default(browserConnection);
109
+ this.browser = (0, get_browser_1.default)(browserConnection);
105
110
  this.phase = phase_2.default.initial;
106
111
  this.driverTaskQueue = [];
107
112
  this.testDoneCommandQueued = false;
@@ -142,7 +147,7 @@ class TestRun extends async_event_emitter_1.default {
142
147
  this.observedCallsites = new observed_callsites_storage_1.default();
143
148
  this.compilerService = compilerService;
144
149
  this.asyncJsExpressionCallsites = new Map();
145
- this.replicator = replicator_1.createReplicator([new replicator_1.SelectorNodeTransform()]);
150
+ this.replicator = (0, replicator_1.createReplicator)([new replicator_1.SelectorNodeTransform()]);
146
151
  this.disconnected = false;
147
152
  this.errScreenshotPath = null;
148
153
  this.startRunExecutionTime = startRunExecutionTime;
@@ -193,12 +198,12 @@ class TestRun extends async_event_emitter_1.default {
193
198
  : this.testExecutionTimeout || null;
194
199
  }
195
200
  _addClientScriptContentWarningsIfNecessary() {
196
- const { empty, duplicatedContent } = utils_1.findProblematicScripts(this.test.clientScripts);
201
+ const { empty, duplicatedContent } = (0, utils_1.findProblematicScripts)(this.test.clientScripts);
197
202
  if (empty.length)
198
203
  this.warningLog.addWarning(warning_message_1.default.clientScriptsWithEmptyContent);
199
204
  if (duplicatedContent.length) {
200
- const suffix = string_1.getPluralSuffix(duplicatedContent);
201
- const duplicatedContentClientScriptsStr = string_1.getConcatenatedValuesString(duplicatedContent, '\n');
205
+ const suffix = (0, string_1.getPluralSuffix)(duplicatedContent);
206
+ const duplicatedContentClientScriptsStr = (0, string_1.getConcatenatedValuesString)(duplicatedContent, '\n');
202
207
  this.warningLog.addWarning(warning_message_1.default.clientScriptsWithDuplicatedContent, suffix, duplicatedContentClientScriptsStr);
203
208
  }
204
209
  }
@@ -207,7 +212,7 @@ class TestRun extends async_event_emitter_1.default {
207
212
  this.injectable.scripts.push(...INJECTABLES.SCRIPTS);
208
213
  this.injectable.userScripts.push(...this.test.clientScripts.map(script => {
209
214
  return {
210
- url: get_url_1.default(script),
215
+ url: (0, get_url_1.default)(script),
211
216
  page: script.page,
212
217
  };
213
218
  }));
@@ -231,7 +236,7 @@ class TestRun extends async_event_emitter_1.default {
231
236
  removeRequestHook(hook) {
232
237
  if (!this.test.requestHooks.includes(hook))
233
238
  return;
234
- lodash_1.pull(this.test.requestHooks, hook);
239
+ (0, lodash_1.pull)(this.test.requestHooks, hook);
235
240
  this._disposeRequestHook(hook);
236
241
  }
237
242
  _initRequestHook(hook) {
@@ -255,9 +260,8 @@ class TestRun extends async_event_emitter_1.default {
255
260
  });
256
261
  }
257
262
  _onRequestHookMethodError(event, hookClassName) {
258
- var _a;
259
263
  let err = event.error;
260
- const isRequestHookNotImplementedMethodError = ((_a = err) === null || _a === void 0 ? void 0 : _a.code) === types_1.TEST_RUN_ERRORS.requestHookNotImplementedError;
264
+ const isRequestHookNotImplementedMethodError = (err === null || err === void 0 ? void 0 : err.code) === types_1.TEST_RUN_ERRORS.requestHookNotImplementedError;
261
265
  if (!isRequestHookNotImplementedMethodError)
262
266
  err = new test_run_1.RequestHookUnhandledError(err, hookClassName, event.methodName);
263
267
  this.addError(err);
@@ -301,10 +305,17 @@ class TestRun extends async_event_emitter_1.default {
301
305
  else
302
306
  this.test.requestHooks.forEach(hook => this._initRequestHook(hook));
303
307
  }
308
+ _prepareSkipJsErrorsOption() {
309
+ const options = this.test.skipJsErrorsOptions !== void 0
310
+ ? this.test.skipJsErrorsOptions
311
+ : this.opts.skipJsErrors || false;
312
+ return (0, skip_js_errors_1.prepareSkipJsErrorsOptions)(options);
313
+ }
304
314
  // Hammerhead payload
305
315
  async getPayloadScript() {
306
316
  this.fileDownloadingHandled = false;
307
317
  this.resolveWaitForFileDownloadingPromise = null;
318
+ const skipJsErrors = this._prepareSkipJsErrorsOption();
308
319
  return mustache_1.default.render(TEST_RUN_TEMPLATE, {
309
320
  testRunId: JSON.stringify(this.session.id),
310
321
  browserId: JSON.stringify(this.browserConnection.id),
@@ -320,7 +331,7 @@ class TestRun extends async_event_emitter_1.default {
320
331
  selectorTimeout: this.opts.selectorTimeout,
321
332
  pageLoadTimeout: this.pageLoadTimeout,
322
333
  childWindowReadyTimeout: CHILD_WINDOW_READY_TIMEOUT,
323
- skipJsErrors: this.opts.skipJsErrors,
334
+ skipJsErrors: JSON.stringify(skipJsErrors),
324
335
  retryTestPages: this.opts.retryTestPages,
325
336
  speed: this.speed,
326
337
  dialogHandler: JSON.stringify(this.activeDialogHandler),
@@ -363,7 +374,7 @@ class TestRun extends async_event_emitter_1.default {
363
374
  async _executeTestFn(phase, fn, timeout) {
364
375
  this.phase = phase;
365
376
  try {
366
- await execute_fn_with_timeout_1.default(fn, timeout, this);
377
+ await (0, execute_fn_with_timeout_1.default)(fn, timeout, this);
367
378
  }
368
379
  catch (err) {
369
380
  await this._makeScreenshotOnFail();
@@ -442,7 +453,7 @@ class TestRun extends async_event_emitter_1.default {
442
453
  }
443
454
  _ensureErrorId(err) {
444
455
  // @ts-ignore
445
- err.id = err.id || nanoid_1.nanoid(7);
456
+ err.id = err.id || (0, nanoid_1.nanoid)(7);
446
457
  }
447
458
  _createErrorAdapter(err) {
448
459
  this._ensureErrorId(err);
@@ -461,11 +472,11 @@ class TestRun extends async_event_emitter_1.default {
461
472
  });
462
473
  }
463
474
  normalizeRequestHookErrors() {
464
- const requestHookErrors = lodash_1.remove(this.errs, e => e.code === types_1.TEST_RUN_ERRORS.requestHookNotImplementedError ||
475
+ const requestHookErrors = (0, lodash_1.remove)(this.errs, e => e.code === types_1.TEST_RUN_ERRORS.requestHookNotImplementedError ||
465
476
  e.code === types_1.TEST_RUN_ERRORS.requestHookUnhandledError);
466
477
  if (!requestHookErrors.length)
467
478
  return;
468
- const uniqRequestHookErrors = lodash_1.chain(requestHookErrors)
479
+ const uniqRequestHookErrors = (0, lodash_1.chain)(requestHookErrors)
469
480
  .uniqBy(e => {
470
481
  const err = e;
471
482
  return err.hookClassName + err.methodName;
@@ -486,7 +497,7 @@ class TestRun extends async_event_emitter_1.default {
486
497
  });
487
498
  }
488
499
  get driverTaskQueueLength() {
489
- return this.addingDriverTasksCount ? promisify_event_1.default(this, ALL_DRIVER_TASKS_ADDED_TO_QUEUE_EVENT) : Promise.resolve(this.driverTaskQueue.length);
500
+ return this.addingDriverTasksCount ? (0, promisify_event_1.default)(this, ALL_DRIVER_TASKS_ADDED_TO_QUEUE_EVENT) : Promise.resolve(this.driverTaskQueue.length);
490
501
  }
491
502
  async _enqueueBrowserConsoleMessagesCommand(command, callsite) {
492
503
  await this._enqueueCommand(command, callsite);
@@ -513,7 +524,7 @@ class TestRun extends async_event_emitter_1.default {
513
524
  this.debugging = await this._internalExecuteCommand(new serviceCommands.SetBreakpointCommand(!!error, !!this.compilerService), callsite);
514
525
  }
515
526
  _removeAllNonServiceTasks() {
516
- this.driverTaskQueue = this.driverTaskQueue.filter(driverTask => utils_2.isServiceCommand(driverTask.command));
527
+ this.driverTaskQueue = this.driverTaskQueue.filter(driverTask => (0, utils_2.isServiceCommand)(driverTask.command));
517
528
  this.browserManipulationQueue.removeAllNonServiceManipulations();
518
529
  }
519
530
  _handleDebugState(driverStatus) {
@@ -567,7 +578,7 @@ class TestRun extends async_event_emitter_1.default {
567
578
  this._resolveCurrentDriverTask(driverStatus.result);
568
579
  }
569
580
  _handlePageErrorStatus(pageError) {
570
- if (this.currentDriverTask && utils_2.isCommandRejectableByPageError(this.currentDriverTask.command)) {
581
+ if (this.currentDriverTask && (0, utils_2.isCommandRejectableByPageError)(this.currentDriverTask.command)) {
571
582
  this._rejectCurrentDriverTask(pageError);
572
583
  this.pendingPageError = null;
573
584
  return true;
@@ -651,7 +662,7 @@ class TestRun extends async_event_emitter_1.default {
651
662
  async _executeAssertion(command, callsite) {
652
663
  if (command.actual === Symbol.for(marker_1.RE_EXECUTABLE_PROMISE_MARKER_DESCRIPTION))
653
664
  this._redirectReExecutablePromiseExecutionToCompilerService(command);
654
- const assertionTimeout = get_assertion_timeout_1.default(command, this.opts);
665
+ const assertionTimeout = (0, get_assertion_timeout_1.default)(command, this.opts);
655
666
  const executor = new executor_1.default(command, assertionTimeout, callsite);
656
667
  executor.once('start-assertion-retries', (timeout) => this._internalExecuteCommand(new serviceCommands.ShowAssertionRetriesStatusCommand(timeout)));
657
668
  executor.once('end-assertion-retries', (success) => this._internalExecuteCommand(new serviceCommands.HideAssertionRetriesStatusCommand(success)));
@@ -697,14 +708,14 @@ class TestRun extends async_event_emitter_1.default {
697
708
  if (!result)
698
709
  return;
699
710
  const node = this.replicator.decode(result);
700
- command.options.confidential = is_password_input_1.default(node);
711
+ command.options.confidential = (0, is_password_input_1.default)(node);
701
712
  }
702
713
  else if (command.type === type_1.default.pressKey) {
703
714
  const result = await this._internalExecuteCommand(new serviceCommands.GetActiveElementCommand());
704
715
  if (!result)
705
716
  return;
706
717
  const node = this.replicator.decode(result);
707
- command.options.confidential = is_password_input_1.default(node);
718
+ command.options.confidential = (0, is_password_input_1.default)(node);
708
719
  }
709
720
  else if (command instanceof observation_1.ExecuteClientFunctionCommandBase && !!this.compilerService && !this._clientEnvironmentPrepared) {
710
721
  this._clientEnvironmentPrepared = true;
@@ -712,7 +723,7 @@ class TestRun extends async_event_emitter_1.default {
712
723
  }
713
724
  }
714
725
  async _setBreakpointIfNecessary(command, callsite) {
715
- if (!this.disableDebugBreakpoints && this.debugging && utils_2.canSetDebuggerBreakpointBeforeCommand(command))
726
+ if (!this.disableDebugBreakpoints && this.debugging && (0, utils_2.canSetDebuggerBreakpointBeforeCommand)(command))
716
727
  await this._enqueueSetBreakpointCommand(callsite);
717
728
  }
718
729
  async executeCommand(command, callsite) {
@@ -739,7 +750,7 @@ class TestRun extends async_event_emitter_1.default {
739
750
  }
740
751
  catch (err) {
741
752
  if (this.phase === phase_2.default.pendingFinalization && err instanceof test_run_1.ExternalAssertionLibraryError)
742
- add_rendered_warning_1.default(this.warningLog, { message: warning_message_1.default.unawaitedMethodWithAssertion, actionId: command.actionId }, callsite);
753
+ (0, add_rendered_warning_1.default)(this.warningLog, { message: warning_message_1.default.unawaitedMethodWithAssertion, actionId: command.actionId }, callsite);
743
754
  else
744
755
  error = err;
745
756
  }
@@ -750,7 +761,7 @@ class TestRun extends async_event_emitter_1.default {
750
761
  // since error is already was processed in role initializer
751
762
  if (!(error instanceof error_list_1.default)) {
752
763
  await this._makeScreenshotOnFail(command.actionId);
753
- errorAdapter = this._createErrorAdapter(process_test_fn_error_1.default(error));
764
+ errorAdapter = this._createErrorAdapter((0, process_test_fn_error_1.default)(error));
754
765
  }
755
766
  else
756
767
  errorAdapter = error.adapter;
@@ -767,26 +778,26 @@ class TestRun extends async_event_emitter_1.default {
767
778
  }
768
779
  async _internalExecuteCommand(command, callsite) {
769
780
  this.debugLog.command(command);
770
- if (this.pendingPageError && utils_2.isCommandRejectableByPageError(command))
781
+ if (this.pendingPageError && (0, utils_2.isCommandRejectableByPageError)(command))
771
782
  return this._rejectCommandWithPageError(callsite);
772
- if (utils_2.isExecutableOnClientCommand(command))
783
+ if ((0, utils_2.isExecutableOnClientCommand)(command))
773
784
  this.addingDriverTasksCount++;
774
785
  this._adjustConfigurationWithCommand(command);
775
786
  await this._setBreakpointIfNecessary(command, callsite);
776
- if (utils_2.isScreenshotCommand(command)) {
787
+ if ((0, utils_2.isScreenshotCommand)(command)) {
777
788
  if (this.opts.disableScreenshots) {
778
789
  this.warningLog.addWarning({ message: warning_message_1.default.screenshotsDisabled, actionId: command.actionId });
779
790
  return null;
780
791
  }
781
792
  await this._adjustScreenshotCommand(command);
782
793
  }
783
- if (utils_2.isBrowserManipulationCommand(command)) {
794
+ if ((0, utils_2.isBrowserManipulationCommand)(command)) {
784
795
  this.browserManipulationQueue.push(command);
785
- if (utils_2.isResizeWindowCommand(command) && this.opts.videoPath)
796
+ if ((0, utils_2.isResizeWindowCommand)(command) && this.opts.videoPath)
786
797
  this.warningLog.addWarning({ message: warning_message_1.default.videoBrowserResizing, actionId: command.actionId }, this.test.name);
787
798
  }
788
799
  if (command.type === type_1.default.wait)
789
- return delay_1.default(command.timeout);
800
+ return (0, delay_1.default)(command.timeout);
790
801
  if (command.type === type_1.default.setPageLoadTimeout)
791
802
  return null;
792
803
  if (command.type === type_1.default.debug) {
@@ -837,9 +848,8 @@ class TestRun extends async_event_emitter_1.default {
837
848
  return new actionCommands.CloseChildWindowOnFileDownloading();
838
849
  }
839
850
  async _makeScreenshotOnFail(failedActionId) {
840
- var _a;
841
851
  const { screenshots } = this.opts;
842
- if (!this.errScreenshotPath && ((_a = screenshots) === null || _a === void 0 ? void 0 : _a.takeOnFails))
852
+ if (!this.errScreenshotPath && (screenshots === null || screenshots === void 0 ? void 0 : screenshots.takeOnFails))
843
853
  this.errScreenshotPath = await this._internalExecuteCommand(new browserManipulationCommands.TakeScreenshotOnFailCommand({ failedActionId }));
844
854
  }
845
855
  _decorateWithFlag(fn, flagName, value) {
@@ -849,9 +859,6 @@ class TestRun extends async_event_emitter_1.default {
849
859
  try {
850
860
  return await fn();
851
861
  }
852
- catch (err) {
853
- throw err;
854
- }
855
862
  finally {
856
863
  // @ts-ignore
857
864
  this[flagName] = !value;
@@ -917,7 +924,7 @@ class TestRun extends async_event_emitter_1.default {
917
924
  if (role.phase === phase_1.default.uninitialized)
918
925
  await role.initialize(this);
919
926
  else if (role.phase === phase_1.default.pendingInitialization)
920
- await promisify_event_1.default(role, 'initialized');
927
+ await (0, promisify_event_1.default)(role, 'initialized');
921
928
  if (role.initErr)
922
929
  throw role.initErr;
923
930
  this.phase = prevPhase;
@@ -944,7 +951,7 @@ class TestRun extends async_event_emitter_1.default {
944
951
  }
945
952
  async _switchToWindowByPredicate(command) {
946
953
  const currentWindows = await this._internalExecuteCommand(new actions_1.GetCurrentWindowsCommand({}, this));
947
- const windows = await async_filter_1.default(currentWindows, async (wnd) => {
954
+ const windows = await (0, async_filter_1.default)(currentWindows, async (wnd) => {
948
955
  try {
949
956
  const predicateData = {
950
957
  url: new url_1.URL(wnd.url),
@@ -1056,4 +1063,4 @@ class TestRun extends async_event_emitter_1.default {
1056
1063
  }
1057
1064
  exports.default = TestRun;
1058
1065
  module.exports = exports.default;
1059
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUNBSWdCO0FBRWhCLG1DQUFnQztBQUNoQywyREFBc0Q7QUFDdEQsc0VBQTZDO0FBQzdDLHdEQUFnQztBQUNoQyx1RkFBNkQ7QUFDN0QsNERBQTBDO0FBQzFDLGlHQUFvRjtBQUNwRixzRUFBcUQ7QUFDckQsK0NBQWlEO0FBRWpELGtEQVU2QjtBQUU3Qix3RUFBZ0Q7QUFDaEQsMkRBQTJDO0FBQzNDLDJEQUFtQztBQUNuQyxtRkFBeUQ7QUFDekQsb0VBQTRDO0FBQzVDLCtFQUFxRDtBQUNyRCwwREFBdUM7QUFDdkMsMEVBQXlEO0FBQ3pELDBGQUFnRTtBQUNoRSwrRUFBc0Q7QUFDdEQsdUZBQStEO0FBRS9ELDZEQVU2QjtBQUU3QixtRUFBcUQ7QUFDckQsMERBQXdFO0FBQ3hFLCtFQUF3RTtBQUN4RSw0Q0FBK0U7QUFFL0UsNENBUTBCO0FBRTFCLGdEQVM0QjtBQUU1QiwyQ0FBa0U7QUFDbEUsNEZBQWlFO0FBQ2pFLCtGQUE0RTtBQUM1RSwrREFBeUY7QUFLekYsOEVBQXFEO0FBRXJELDhGQUFvRTtBQUNwRSw4RkFBb0U7QUFNcEUsZ0RBQW9FO0FBS3BFLHVHQUE2RTtBQU03RSxvREFBbUM7QUFFbkMsd0RBSWdDO0FBRWhDLG1IQUFrSjtBQUNsSiwyRkFBaUU7QUFDakUsaUdBQXVFO0FBQ3ZFLHVFQUE4QztBQUM5QyxzRUFBdUQ7QUFDdkQseUVBQWdEO0FBR2hELCtGQUFvRTtBQUNwRSw2QkFBMEI7QUFHMUIsTUFBTSxXQUFXLEdBQW1CLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwRSxNQUFNLHFCQUFxQixHQUFTLFdBQVcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0FBQy9GLE1BQU0sZUFBZSxHQUFlLFdBQVcsQ0FB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QUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksS0FBSyxHQUFJLElBQUksQ0FBQztRQUVsQixJQUFJO1lBQ0EsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLDBCQUEwQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDbEc7UUFDRCxPQUFPLEdBQUcsRUFBRTtZQUNSLEtBQUssR0FBRyxHQUFHLENBQUM7U0FDZjtRQUVELE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLEtBQUssQ0FBQyxDQUFDLHlCQUFlLENBQUMsbUJBQW1CLENBQUMsQ0FBRSxHQUFrQjtRQUNuRSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pCLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUM3QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO2dCQUNwQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDakI7O2dCQUVHLElBQUksQ0FBQyxvQ0FBb0MsR0FBRyxPQUFPLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFwMENELDBCQW8wQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIHB1bGwsXG4gICAgcmVtb3ZlLFxuICAgIGNoYWluLFxufSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBuYW5vaWQgfSBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgcmVhZFN5bmMgYXMgcmVhZCB9IGZyb20gJ3JlYWQtZmlsZS1yZWxhdGl2ZSc7XG5pbXBvcnQgcHJvbWlzaWZ5RXZlbnQgZnJvbSAncHJvbWlzaWZ5LWV2ZW50JztcbmltcG9ydCBNdXN0YWNoZSBmcm9tICdtdXN0YWNoZSc7XG5pbXBvcnQgQXN5bmNFdmVudEVtaXR0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgVGVzdFJ1bkRlYnVnTG9nIGZyb20gJy4vZGVidWctbG9nJztcbmltcG9ydCBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIgZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuL2Zvcm1hdHRhYmxlLWFkYXB0ZXInO1xuaW1wb3J0IFRlc3RDYWZlRXJyb3JMaXN0IGZyb20gJy4uL2Vycm9ycy9lcnJvci1saXN0JztcbmltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcblxuaW1wb3J0IHtcbiAgICBSZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yLFxuICAgIFBhZ2VMb2FkRXJyb3IsXG4gICAgUm9sZVN3aXRjaEluUm9sZUluaXRpYWxpemVyRXJyb3IsXG4gICAgU3dpdGNoVG9XaW5kb3dQcmVkaWNhdGVFcnJvcixcbiAgICBXaW5kb3dOb3RGb3VuZEVycm9yLFxuICAgIFJlcXVlc3RIb29rQmFzZUVycm9yLFxuICAgIFRlc3RUaW1lb3V0RXJyb3IsXG4gICAgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IsXG4gICAgUnVuVGltZW91dEVycm9yLFxufSBmcm9tICcuLi9lcnJvcnMvdGVzdC1ydW4vJztcblxuaW1wb3J0IENMSUVOVF9NRVNTQUdFUyBmcm9tICcuL2NsaWVudC1tZXNzYWdlcyc7XG5pbXBvcnQgQ09NTUFORF9UWVBFIGZyb20gJy4vY29tbWFuZHMvdHlwZSc7XG5pbXBvcnQgZGVsYXkgZnJvbSAnLi4vdXRpbHMvZGVsYXknO1xuaW1wb3J0IGlzUGFzc3dvcmRJbnB1dCBmcm9tICcuLi91dGlscy9pcy1wYXNzd29yZC1pbnB1dCc7XG5pbXBvcnQgdGVzdFJ1bk1hcmtlciBmcm9tICcuL21hcmtlci1zeW1ib2wnO1xuaW1wb3J0IHRlc3RSdW5UcmFja2VyIGZyb20gJy4uL2FwaS90ZXN0LXJ1bi10cmFja2VyJztcbmltcG9ydCBST0xFX1BIQVNFIGZyb20gJy4uL3JvbGUvcGhhc2UnO1xuaW1wb3J0IFJlcG9ydGVyUGx1Z2luSG9zdCBmcm9tICcuLi9yZXBvcnRlci9wbHVnaW4taG9zdCc7XG5pbXBvcnQgQnJvd3NlckNvbnNvbGVNZXNzYWdlcyBmcm9tICcuL2Jyb3dzZXItY29uc29sZS1tZXNzYWdlcyc7XG5pbXBvcnQgV2FybmluZ0xvZyBmcm9tICcuLi9ub3RpZmljYXRpb25zL3dhcm5pbmctbG9nJztcbmltcG9ydCBXQVJOSU5HX01FU1NBR0UgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuXG5pbXBvcnQge1xuICAgIFN0YXRlU25hcHNob3QsXG4gICAgU1BFQ0lBTF9FUlJPUl9QQUdFLFxuICAgIFJlcXVlc3RGaWx0ZXJSdWxlLFxuICAgIEluamVjdGFibGVSZXNvdXJjZXMsXG4gICAgUmVxdWVzdEV2ZW50LFxuICAgIENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQsXG4gICAgUmVzcG9uc2VFdmVudCxcbiAgICBSZXF1ZXN0SG9va01ldGhvZEVycm9yLFxuICAgIFN0b3JhZ2VzU25hcHNob3QsXG59IGZyb20gJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnO1xuXG5pbXBvcnQgKiBhcyBJTkpFQ1RBQkxFUyBmcm9tICcuLi9hc3NldHMvaW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgZmluZFByb2JsZW1hdGljU2NyaXB0cyB9IGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy91dGlscyc7XG5pbXBvcnQgZ2V0Q3VzdG9tQ2xpZW50U2NyaXB0VXJsIGZyb20gJy4uL2N1c3RvbS1jbGllbnQtc2NyaXB0cy9nZXQtdXJsJztcbmltcG9ydCB7IGdldFBsdXJhbFN1ZmZpeCwgZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcblxuaW1wb3J0IHtcbiAgICBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IsXG4gICAgaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZCxcbiAgICBpc1NjcmVlbnNob3RDb21tYW5kLFxuICAgIGlzU2VydmljZUNvbW1hbmQsXG4gICAgY2FuU2V0RGVidWdnZXJCcmVha3BvaW50QmVmb3JlQ29tbWFuZCxcbiAgICBpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQsXG4gICAgaXNSZXNpemVXaW5kb3dDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCxcbiAgICBFeGVjdXRlRXhwcmVzc2lvbkNvbW1hbmQsXG4gICAgR2V0Q3VycmVudFdpbmRvd3NDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kLFxuICAgIFN3aXRjaFRvV2luZG93Q29tbWFuZCxcbiAgICBHZXRDb29raWVzQ29tbWFuZCxcbiAgICBTZXRDb29raWVzQ29tbWFuZCxcbiAgICBEZWxldGVDb29raWVzQ29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcy9hY3Rpb25zJztcblxuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMsIFRFU1RfUlVOX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgcHJvY2Vzc1Rlc3RGbkVycm9yIGZyb20gJy4uL2Vycm9ycy9wcm9jZXNzLXRlc3QtZm4tZXJyb3InO1xuaW1wb3J0IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMgZnJvbSAnLi4vYXBpL3JlcXVlc3QtaG9va3MvaG9vay1tZXRob2QtbmFtZXMnO1xuaW1wb3J0IHsgY3JlYXRlUmVwbGljYXRvciwgU2VsZWN0b3JOb2RlVHJhbnNmb3JtIH0gZnJvbSAnLi4vY2xpZW50LWZ1bmN0aW9ucy9yZXBsaWNhdG9yJztcbmltcG9ydCBUZXN0IGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvdGVzdCc7XG5pbXBvcnQgQ2FwdHVyZXIgZnJvbSAnLi4vc2NyZWVuc2hvdHMvY2FwdHVyZXInO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJy4uL2NvbmZpZ3VyYXRpb24vaW50ZXJmYWNlcyc7XG5pbXBvcnQgQ29tcGlsZXJTZXJ2aWNlIGZyb20gJy4uL3NlcnZpY2VzL2NvbXBpbGVyL2hvc3QnO1xuaW1wb3J0IFNlc3Npb25Db250cm9sbGVyIGZyb20gJy4vc2Vzc2lvbi1jb250cm9sbGVyJztcbmltcG9ydCBUZXN0Q29udHJvbGxlciBmcm9tICcuLi9hcGkvdGVzdC1jb250cm9sbGVyJztcbmltcG9ydCBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWUgZnJvbSAnLi9icm93c2VyLW1hbmlwdWxhdGlvbi1xdWV1ZSc7XG5pbXBvcnQgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlIGZyb20gJy4vb2JzZXJ2ZWQtY2FsbHNpdGVzLXN0b3JhZ2UnO1xuaW1wb3J0IENsaWVudFNjcmlwdCBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvY2xpZW50LXNjcmlwdCc7XG5pbXBvcnQgQnJvd3NlckNvbm5lY3Rpb24gZnJvbSAnLi4vYnJvd3Nlci9jb25uZWN0aW9uJztcbmltcG9ydCB7IFF1YXJhbnRpbmUgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9xdWFyYW50aW5lJztcbmltcG9ydCBSZXF1ZXN0SG9vayBmcm9tICcuLi9hcGkvcmVxdWVzdC1ob29rcy9ob29rJztcbmltcG9ydCBEcml2ZXJTdGF0dXMgZnJvbSAnLi4vY2xpZW50L2RyaXZlci9zdGF0dXMnO1xuaW1wb3J0IHsgQ29tbWFuZEJhc2UsIEFjdGlvbkNvbW1hbmRCYXNlIH0gZnJvbSAnLi9jb21tYW5kcy9iYXNlLmpzJztcbmltcG9ydCBSb2xlIGZyb20gJy4uL3JvbGUvcm9sZSc7XG5pbXBvcnQgeyBUZXN0UnVuRXJyb3JCYXNlIH0gZnJvbSAnLi4vc2hhcmVkL2Vycm9ycyc7XG5pbXBvcnQgeyBDYWxsc2l0ZVJlY29yZCB9IGZyb20gJ2NhbGxzaXRlLXJlY29yZCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgZ2V0QXNzZXJ0aW9uVGltZW91dCBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucy9nZXQtYXNzZXJ0aW9uLXRpbWVvdXQnO1xuaW1wb3J0IHsgQXNzZXJ0aW9uQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvYXNzZXJ0aW9uJztcbmltcG9ydCB7IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2Jyb3dzZXItbWFuaXB1bGF0aW9uJztcbi8vQHRzLWlnbm9yZVxuaW1wb3J0IHsgVGVzdFJ1biBhcyBMZWdhY3lUZXN0UnVuIH0gZnJvbSAndGVzdGNhZmUtbGVnYWN5LWFwaSc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ludGVyZmFjZXMnO1xuaW1wb3J0IFRlc3RSdW5QaGFzZSBmcm9tICcuL3BoYXNlJztcblxuaW1wb3J0IHtcbiAgICBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kLFxuICAgIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmRCYXNlLFxuICAgIEV4ZWN1dGVTZWxlY3RvckNvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvb2JzZXJ2YXRpb24nO1xuXG5pbXBvcnQgeyBSRV9FWEVDVVRBQkxFX1BST01JU0VfTUFSS0VSX0RFU0NSSVBUSU9OIH0gZnJvbSAnLi4vc2VydmljZXMvc2VyaWFsaXphdGlvbi9yZXBsaWNhdG9yL3RyYW5zZm9ybXMvcmUtZXhlY3V0YWJsZS1wcm9taXNlLXRyYW5zZm9ybS9tYXJrZXInO1xuaW1wb3J0IFJlRXhlY3V0YWJsZVByb21pc2UgZnJvbSAnLi4vdXRpbHMvcmUtZXhlY3V0YWJsZS1wcm9taXNlJztcbmltcG9ydCBhZGRSZW5kZXJlZFdhcm5pbmcgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy9hZGQtcmVuZGVyZWQtd2FybmluZyc7XG5pbXBvcnQgZ2V0QnJvd3NlciBmcm9tICcuLi91dGlscy9nZXQtYnJvd3Nlcic7XG5pbXBvcnQgQXNzZXJ0aW9uRXhlY3V0b3IgZnJvbSAnLi4vYXNzZXJ0aW9ucy9leGVjdXRvcic7XG5pbXBvcnQgYXN5bmNGaWx0ZXIgZnJvbSAnLi4vdXRpbHMvYXN5bmMtZmlsdGVyJztcbmltcG9ydCBGaXh0dXJlIGZyb20gJy4uL2FwaS9zdHJ1Y3R1cmUvZml4dHVyZSc7XG5pbXBvcnQgTWVzc2FnZUJ1cyBmcm9tICcuLi91dGlscy9tZXNzYWdlLWJ1cyc7XG5pbXBvcnQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQgZnJvbSAnLi4vdXRpbHMvZXhlY3V0ZS1mbi13aXRoLXRpbWVvdXQnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvb2tpZU9wdGlvbnMgfSBmcm9tICcuL2NvbW1hbmRzL29wdGlvbnMnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3QgQ2xpZW50RnVuY3Rpb25CdWlsZGVyICAgICAgID0gbGF6eVJlcXVpcmUoJy4uL2NsaWVudC1mdW5jdGlvbnMvY2xpZW50LWZ1bmN0aW9uLWJ1aWxkZXInKTtcbmNvbnN0IFRlc3RSdW5Cb29rbWFyayAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2Jvb2ttYXJrJyk7XG5jb25zdCBhY3Rpb25Db21tYW5kcyAgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9jb21tYW5kcy9hY3Rpb25zJyk7XG5jb25zdCBicm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZHMgPSBsYXp5UmVxdWlyZSgnLi9jb21tYW5kcy9icm93c2VyLW1hbmlwdWxhdGlvbicpO1xuY29uc3Qgc2VydmljZUNvbW1hbmRzICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvc2VydmljZScpO1xuY29uc3Qgb2JzZXJ2YXRpb25Db21tYW5kcyAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvb2JzZXJ2YXRpb24nKTtcblxuY29uc3QgeyBleGVjdXRlSnNFeHByZXNzaW9uLCBleGVjdXRlQXN5bmNKc0V4cHJlc3Npb24gfSA9IGxhenlSZXF1aXJlKCcuL2V4ZWN1dGUtanMtZXhwcmVzc2lvbicpO1xuXG5jb25zdCBURVNUX1JVTl9URU1QTEFURSAgICAgICAgICAgICAgID0gcmVhZCgnLi4vY2xpZW50L3Rlc3QtcnVuL2luZGV4LmpzLm11c3RhY2hlJykgYXMgc3RyaW5nO1xuY29uc3QgSUZSQU1FX1RFU1RfUlVOX1RFTVBMQVRFICAgICAgICA9IHJlYWQoJy4uL2NsaWVudC90ZXN0LXJ1bi9pZnJhbWUuanMubXVzdGFjaGUnKSBhcyBzdHJpbmc7XG5jb25zdCBURVNUX0RPTkVfQ09ORklSTUFUSU9OX1JFU1BPTlNFID0gJ3Rlc3QtZG9uZS1jb25maXJtYXRpb24nO1xuY29uc3QgTUFYX1JFU1BPTlNFX0RFTEFZICAgICAgICAgICAgICA9IDMwMDA7XG5jb25zdCBDSElMRF9XSU5ET1dfUkVBRFlfVElNRU9VVCAgICAgID0gMzAgKiAxMDAwO1xuXG5jb25zdCBBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5UID0gJ2FsbC1kcml2ZXItdGFza3MtYWRkZWQtdG8tcXVldWUnO1xuXG5jb25zdCBDT01QSUxFUl9TRVJWSUNFX0VWRU5UUyA9IFtcbiAgICAnc2V0TW9jaycsXG4gICAgJ3NldENvbmZpZ3VyZVJlc3BvbnNlRXZlbnRPcHRpb25zJyxcbiAgICAnc2V0SGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50JyxcbiAgICAncmVtb3ZlSGVhZGVyT25Db25maWd1cmVSZXNwb25zZUV2ZW50Jyxcbl07XG5cblxuaW50ZXJmYWNlIFRlc3RSdW5Jbml0IHtcbiAgICB0ZXN0OiBUZXN0O1xuICAgIGJyb3dzZXJDb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICBzY3JlZW5zaG90Q2FwdHVyZXI6IENhcHR1cmVyO1xuICAgIGdsb2JhbFdhcm5pbmdMb2c6IFdhcm5pbmdMb2c7XG4gICAgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT47XG4gICAgY29tcGlsZXJTZXJ2aWNlPzogQ29tcGlsZXJTZXJ2aWNlO1xuICAgIG1lc3NhZ2VCdXM/OiBNZXNzYWdlQnVzO1xuICAgIHN0YXJ0UnVuRXhlY3V0aW9uVGltZT86IERhdGU7XG59XG5cbmludGVyZmFjZSBEcml2ZXJUYXNrIHtcbiAgICBjb21tYW5kOiBDb21tYW5kQmFzZTtcbiAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICByZWplY3Q6IEZ1bmN0aW9uO1xuICAgIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZDtcbn1cblxuaW50ZXJmYWNlIERyaXZlck1lc3NhZ2Uge1xuICAgIHN0YXR1czogRHJpdmVyU3RhdHVzO1xufVxuXG5pbnRlcmZhY2UgUmVxdWVzdFRpbWVvdXQge1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gICAgYWpheD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEV4ZWN1dGlvblRpbWVvdXQge1xuICAgIHRpbWVvdXQ6IG51bWJlcjtcbiAgICByZWplY3RXaXRoOiBUZXN0VGltZW91dEVycm9yIHwgUnVuVGltZW91dEVycm9yO1xufVxuXG5pbnRlcmZhY2UgUGVuZGluZ1JlcXVlc3Qge1xuICAgIHJlc3BvbnNlVGltZW91dDogTm9kZUpTLlRpbWVvdXQ7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbn1cblxuaW50ZXJmYWNlIEJyb3dzZXJNYW5pcHVsYXRpb25SZXN1bHQge1xuICAgIHJlc3VsdDogdW5rbm93bjtcbiAgICBlcnJvcjogRXJyb3I7XG59XG5cbmludGVyZmFjZSBPcGVuZWRXaW5kb3dJbmZvcm1hdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICB0aXRsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0UnVuIGV4dGVuZHMgQXN5bmNFdmVudEVtaXR0ZXIge1xuICAgIHByaXZhdGUgW3Rlc3RSdW5NYXJrZXJdOiBib29sZWFuO1xuICAgIHB1YmxpYyByZWFkb25seSB3YXJuaW5nTG9nOiBXYXJuaW5nTG9nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT47XG4gICAgcHVibGljIHJlYWRvbmx5IHRlc3Q6IFRlc3Q7XG4gICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXJDb25uZWN0aW9uOiBCcm93c2VyQ29ubmVjdGlvbjtcbiAgICBwdWJsaWMgdW5zdGFibGU6IGJvb2xlYW47XG4gICAgcHVibGljIHBoYXNlOiBUZXN0UnVuUGhhc2U7XG4gICAgcHJpdmF0ZSBkcml2ZXJUYXNrUXVldWU6IERyaXZlclRhc2tbXTtcbiAgICBwcml2YXRlIHRlc3REb25lQ29tbWFuZFF1ZXVlZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgYWN0aXZlRGlhbG9nSGFuZGxlcjogRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIGFjdGl2ZUlmcmFtZVNlbGVjdG9yOiBFeGVjdXRlU2VsZWN0b3JDb21tYW5kIHwgbnVsbDtcbiAgICBwdWJsaWMgc3BlZWQ6IG51bWJlcjtcbiAgICBwdWJsaWMgcGFnZUxvYWRUaW1lb3V0OiBudW1iZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0ZXN0RXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBydW5FeGVjdXRpb25UaW1lb3V0OiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbDtcbiAgICBwcml2YXRlIGRpc2FibGVQYWdlUmVsb2FkczogYm9vbGVhbjtcbiAgICBwcml2YXRlIGRpc2FibGVQYWdlQ2FjaGluZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIGRpc2FibGVNdWx0aXBsZVdpbmRvd3M6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZXF1ZXN0VGltZW91dDogUmVxdWVzdFRpbWVvdXQ7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlc3Npb246IFNlc3Npb25Db250cm9sbGVyO1xuICAgIHB1YmxpYyBjb25zb2xlTWVzc2FnZXM6IEJyb3dzZXJDb25zb2xlTWVzc2FnZXM7XG4gICAgcHJpdmF0ZSBwZW5kaW5nUmVxdWVzdDogUGVuZGluZ1JlcXVlc3QgfCBudWxsO1xuICAgIHByaXZhdGUgcGVuZGluZ1BhZ2VFcnJvcjogUGFnZUxvYWRFcnJvciB8IEVycm9yIHwgbnVsbDtcbiAgICBwdWJsaWMgY29udHJvbGxlcjogVGVzdENvbnRyb2xsZXIgfCBudWxsO1xuICAgIHB1YmxpYyBjdHg6IG9iamVjdDtcbiAgICBwdWJsaWMgZml4dHVyZUN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwdWJsaWMgdGVzdFJ1bkN0eDogb2JqZWN0IHwgbnVsbDtcbiAgICBwcml2YXRlIGN1cnJlbnRSb2xlSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1c2VkUm9sZVN0YXRlczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICBwdWJsaWMgZXJyczogVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyW107XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzSWQ6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSBsYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U6IENvbW1hbmRCYXNlIHwgbnVsbCB8IHN0cmluZztcbiAgICBwcml2YXRlIGZpbGVEb3dubG9hZGluZ0hhbmRsZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlOiBGdW5jdGlvbiB8IG51bGw7XG4gICAgcHJpdmF0ZSBhZGRpbmdEcml2ZXJUYXNrc0NvdW50OiBudW1iZXI7XG4gICAgcHVibGljIGRlYnVnZ2luZzogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnT25GYWlsOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlzYWJsZURlYnVnQnJlYWtwb2ludHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdDogUmVwb3J0ZXJQbHVnaW5Ib3N0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlOiBCcm93c2VyTWFuaXB1bGF0aW9uUXVldWU7XG4gICAgcHJpdmF0ZSBkZWJ1Z0xvZzogVGVzdFJ1bkRlYnVnTG9nO1xuICAgIHB1YmxpYyBxdWFyYW50aW5lOiBRdWFyYW50aW5lIHwgbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYnVnTG9nZ2VyOiBhbnk7XG4gICAgcHVibGljIG9ic2VydmVkQ2FsbHNpdGVzOiBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2U7XG4gICAgcHVibGljIHJlYWRvbmx5IGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlcGxpY2F0b3I6IGFueTtcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIGVyclNjcmVlbnNob3RQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXM6IE1hcDxzdHJpbmcsIENhbGxzaXRlUmVjb3JkPjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgYnJvd3NlcjogQnJvd3NlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9tZXNzYWdlQnVzPzogTWVzc2FnZUJ1cztcbiAgICBwcml2YXRlIF9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkID0gZmFsc2U7XG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXJ0UnVuRXhlY3V0aW9uVGltZT86IERhdGU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKHsgdGVzdCwgYnJvd3NlckNvbm5lY3Rpb24sIHNjcmVlbnNob3RDYXB0dXJlciwgZ2xvYmFsV2FybmluZ0xvZywgb3B0cywgY29tcGlsZXJTZXJ2aWNlLCBtZXNzYWdlQnVzLCBzdGFydFJ1bkV4ZWN1dGlvblRpbWUgfTogVGVzdFJ1bkluaXQpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzW3Rlc3RSdW5NYXJrZXJdICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUJ1cyAgICAgICA9IG1lc3NhZ2VCdXM7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZyAgICAgICAgPSBuZXcgV2FybmluZ0xvZyhnbG9iYWxXYXJuaW5nTG9nLCBXYXJuaW5nTG9nLmNyZWF0ZUFkZFdhcm5pbmdDYWxsYmFjayhtZXNzYWdlQnVzLCB0aGlzKSk7XG4gICAgICAgIHRoaXMub3B0cyAgICAgICAgICAgICAgPSBvcHRzO1xuICAgICAgICB0aGlzLnRlc3QgICAgICAgICAgICAgID0gdGVzdDtcbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbiA9IGJyb3dzZXJDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLnVuc3RhYmxlICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYnJvd3NlciAgICAgICAgICAgPSBnZXRCcm93c2VyKGJyb3dzZXJDb25uZWN0aW9uKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluaXRpYWw7XG5cbiAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY3RpdmVJZnJhbWVTZWxlY3RvciA9IG51bGw7XG4gICAgICAgIHRoaXMuc3BlZWQgICAgICAgICAgICAgICAgPSB0aGlzLm9wdHMuc3BlZWQgYXMgbnVtYmVyO1xuICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCAgICAgID0gdGhpcy5fZ2V0UGFnZUxvYWRUaW1lb3V0KHRlc3QsIG9wdHMpO1xuICAgICAgICB0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0ID0gdGhpcy5fZ2V0VGVzdEV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZVJlbG9hZHMgICA9IHRlc3QuZGlzYWJsZVBhZ2VSZWxvYWRzIHx8IG9wdHMuZGlzYWJsZVBhZ2VSZWxvYWRzIGFzIGJvb2xlYW4gJiYgdGVzdC5kaXNhYmxlUGFnZVJlbG9hZHMgIT09IGZhbHNlO1xuICAgICAgICB0aGlzLmRpc2FibGVQYWdlQ2FjaGluZyAgID0gdGVzdC5kaXNhYmxlUGFnZUNhY2hpbmcgfHwgb3B0cy5kaXNhYmxlUGFnZUNhY2hpbmcgYXMgYm9vbGVhbjtcblxuICAgICAgICB0aGlzLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MgPSBvcHRzLmRpc2FibGVNdWx0aXBsZVdpbmRvd3MgYXMgYm9vbGVhbjtcblxuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gdGhpcy5fZ2V0UmVxdWVzdFRpbWVvdXQodGVzdCwgb3B0cyk7XG5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gU2Vzc2lvbkNvbnRyb2xsZXIuZ2V0U2Vzc2lvbih0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnNvbGVNZXNzYWdlcyA9IG5ldyBCcm93c2VyQ29uc29sZU1lc3NhZ2VzKCk7XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICB0aGlzLmNvbnRyb2xsZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmN0eCAgICAgICAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLmZpeHR1cmVDdHggPSBudWxsO1xuICAgICAgICB0aGlzLnRlc3RSdW5DdHggPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCAgPSBudWxsO1xuICAgICAgICB0aGlzLnVzZWRSb2xlU3RhdGVzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICAgICAgICB0aGlzLmVycnMgPSBbXTtcblxuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZCAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gbnVsbDtcblxuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50ID0gMDtcblxuICAgICAgICB0aGlzLmRlYnVnZ2luZyAgICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnTW9kZSBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmRlYnVnT25GYWlsICAgICAgICAgICAgID0gdGhpcy5vcHRzLmRlYnVnT25GYWlsIGFzIGJvb2xlYW47XG4gICAgICAgIHRoaXMuZGlzYWJsZURlYnVnQnJlYWtwb2ludHMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZWJ1Z1JlcG9ydGVyUGx1Z2luSG9zdCA9IG5ldyBSZXBvcnRlclBsdWdpbkhvc3QoeyBub0NvbG9yczogZmFsc2UgfSk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUgPSBuZXcgQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlKGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIHRoaXMud2FybmluZ0xvZyk7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z0xvZyA9IG5ldyBUZXN0UnVuRGVidWdMb2codGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQpO1xuXG4gICAgICAgIHRoaXMucXVhcmFudGluZSAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuZGVidWdMb2dnZXIgPSB0aGlzLm9wdHMuZGVidWdMb2dnZXI7XG5cbiAgICAgICAgdGhpcy5vYnNlcnZlZENhbGxzaXRlcyAgICAgICAgICA9IG5ldyBPYnNlcnZlZENhbGxzaXRlc1N0b3JhZ2UoKTtcbiAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2UgICAgICAgICAgICA9IGNvbXBpbGVyU2VydmljZTtcbiAgICAgICAgdGhpcy5hc3luY0pzRXhwcmVzc2lvbkNhbGxzaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBDYWxsc2l0ZVJlY29yZD4oKTtcblxuICAgICAgICB0aGlzLnJlcGxpY2F0b3IgPSBjcmVhdGVSZXBsaWNhdG9yKFsgbmV3IFNlbGVjdG9yTm9kZVRyYW5zZm9ybSgpIF0pO1xuXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJTY3JlZW5zaG90UGF0aCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zdGFydFJ1bkV4ZWN1dGlvblRpbWUgPSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU7XG4gICAgICAgIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dCAgID0gdGhpcy5fZ2V0UnVuRXhlY3V0aW9uVGltZW91dChvcHRzKTtcblxuICAgICAgICB0aGlzLl9hZGRJbmplY3RhYmxlcygpO1xuICAgICAgICB0aGlzLl9pbml0UmVxdWVzdEhvb2tzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UGFnZUxvYWRUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IG51bWJlciB7XG4gICAgICAgIGlmICh0ZXN0LnRpbWVvdXRzPy5wYWdlTG9hZFRpbWVvdXQgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybiB0ZXN0LnRpbWVvdXRzLnBhZ2VMb2FkVGltZW91dDtcblxuICAgICAgICByZXR1cm4gb3B0cy5wYWdlTG9hZFRpbWVvdXQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJlcXVlc3RUaW1lb3V0ICh0ZXN0OiBUZXN0LCBvcHRzOiBEaWN0aW9uYXJ5PE9wdGlvblZhbHVlPik6IFJlcXVlc3RUaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRlc3QudGltZW91dHM/LnBhZ2VSZXF1ZXN0VGltZW91dCB8fCBvcHRzLnBhZ2VSZXF1ZXN0VGltZW91dCBhcyBudW1iZXIsXG4gICAgICAgICAgICBhamF4OiB0ZXN0LnRpbWVvdXRzPy5hamF4UmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5hamF4UmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEV4ZWN1dGlvblRpbWVvdXQgKHRpbWVvdXQ6IG51bWJlciwgZXJyb3I6IFRlc3RUaW1lb3V0RXJyb3IgfCBSdW5UaW1lb3V0RXJyb3IpOiBFeGVjdXRpb25UaW1lb3V0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgICByZWplY3RXaXRoOiBlcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRUZXN0RXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHRlc3RFeGVjdXRpb25UaW1lb3V0ID0gb3B0cy50ZXN0RXhlY3V0aW9uVGltZW91dCBhcyBudW1iZXIgfHwgMDtcblxuICAgICAgICBpZiAoIXRlc3RFeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQodGVzdEV4ZWN1dGlvblRpbWVvdXQsIG5ldyBUZXN0VGltZW91dEVycm9yKHRlc3RFeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0UnVuRXhlY3V0aW9uVGltZW91dCAob3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBFeGVjdXRpb25UaW1lb3V0IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHJ1bkV4ZWN1dGlvblRpbWVvdXQgPSBvcHRzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCFydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQocnVuRXhlY3V0aW9uVGltZW91dCwgbmV3IFJ1blRpbWVvdXRFcnJvcihydW5FeGVjdXRpb25UaW1lb3V0KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZXN0UnVuRXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lIHx8ICF0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjdXJyZW50VGltZW91dCA9IE1hdGgubWF4KHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IC0gKERhdGUubm93KCkgLSB0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZS5nZXRUaW1lKCkpLCAwKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RXhlY3V0aW9uVGltZW91dChjdXJyZW50VGltZW91dCwgdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0LnJlamVjdFdpdGgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZXhlY3V0aW9uVGltZW91dCAoKTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dCAmJiAoIXRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dC50aW1lb3V0IDwgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dC50aW1lb3V0KVxuICAgICAgICAgICAgPyB0aGlzLnJlc3RSdW5FeGVjdXRpb25UaW1lb3V0XG4gICAgICAgICAgICA6IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRDbGllbnRTY3JpcHRDb250ZW50V2FybmluZ3NJZk5lY2Vzc2FyeSAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgZW1wdHksIGR1cGxpY2F0ZWRDb250ZW50IH0gPSBmaW5kUHJvYmxlbWF0aWNTY3JpcHRzKHRoaXMudGVzdC5jbGllbnRTY3JpcHRzIGFzIENsaWVudFNjcmlwdFtdKTtcblxuICAgICAgICBpZiAoZW1wdHkubGVuZ3RoKVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoV0FSTklOR19NRVNTQUdFLmNsaWVudFNjcmlwdHNXaXRoRW1wdHlDb250ZW50KTtcblxuICAgICAgICBpZiAoZHVwbGljYXRlZENvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRQbHVyYWxTdWZmaXgoZHVwbGljYXRlZENvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZHVwbGljYXRlZENvbnRlbnRDbGllbnRTY3JpcHRzU3RyID0gZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKGR1cGxpY2F0ZWRDb250ZW50LCAnXFxuJyk7XG5cbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5jbGllbnRTY3JpcHRzV2l0aER1cGxpY2F0ZWRDb250ZW50LCBzdWZmaXgsIGR1cGxpY2F0ZWRDb250ZW50Q2xpZW50U2NyaXB0c1N0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGRJbmplY3RhYmxlcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2FkZENsaWVudFNjcmlwdENvbnRlbnRXYXJuaW5nc0lmTmVjZXNzYXJ5KCk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS5zY3JpcHRzLnB1c2goLi4uSU5KRUNUQUJMRVMuU0NSSVBUUyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS51c2VyU2NyaXB0cy5wdXNoKC4uLnRoaXMudGVzdC5jbGllbnRTY3JpcHRzLm1hcChzY3JpcHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6ICBnZXRDdXN0b21DbGllbnRTY3JpcHRVcmwoc2NyaXB0IGFzIENsaWVudFNjcmlwdCksXG4gICAgICAgICAgICAgICAgcGFnZTogc2NyaXB0LnBhZ2UgYXMgUmVxdWVzdEZpbHRlclJ1bGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZS5zdHlsZXMucHVzaChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TVFlMRVMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaWQgKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uaWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpbmplY3RhYmxlICgpOiBJbmplY3RhYmxlUmVzb3VyY2VzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5pbmplY3RhYmxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRRdWFyYW50aW5lSW5mbyAocXVhcmFudGluZTogUXVhcmFudGluZSk6IHZvaWQge1xuICAgICAgICB0aGlzLnF1YXJhbnRpbmUgPSBxdWFyYW50aW5lO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5yZXF1ZXN0SG9va3MuaW5jbHVkZXMoaG9vaykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5wdXNoKGhvb2spO1xuICAgICAgICB0aGlzLl9pbml0UmVxdWVzdEhvb2soaG9vayk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudGVzdC5yZXF1ZXN0SG9va3MuaW5jbHVkZXMoaG9vaykpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgcHVsbCh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLCBob29rKTtcbiAgICAgICAgdGhpcy5fZGlzcG9zZVJlcXVlc3RIb29rKGhvb2spO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiB2b2lkIHtcbiAgICAgICAgaG9vay5fd2FybmluZ0xvZyA9IHRoaXMud2FybmluZ0xvZztcblxuICAgICAgICBob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSwge1xuICAgICAgICAgICAgICAgIG9uUmVxdWVzdDogICAgICAgICAgIGhvb2sub25SZXF1ZXN0LmJpbmQoaG9vayksXG4gICAgICAgICAgICAgICAgb25Db25maWd1cmVSZXNwb25zZTogaG9vay5fb25Db25maWd1cmVSZXNwb25zZS5iaW5kKGhvb2spLFxuICAgICAgICAgICAgICAgIG9uUmVzcG9uc2U6ICAgICAgICAgIGhvb2sub25SZXNwb25zZS5iaW5kKGhvb2spLFxuICAgICAgICAgICAgfSwgKGVycjogUmVxdWVzdEhvb2tNZXRob2RFcnJvcikgPT4gdGhpcy5fb25SZXF1ZXN0SG9va01ldGhvZEVycm9yKGVyciwgaG9vay5fY2xhc3NOYW1lKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2luaXRSZXF1ZXN0SG9va0ZvckNvbXBpbGVyU2VydmljZSAoaG9va0lkOiBzdHJpbmcsIGhvb2tDbGFzc05hbWU6IHN0cmluZywgcnVsZXM6IFJlcXVlc3RGaWx0ZXJSdWxlW10pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGVzdElkID0gdGhpcy50ZXN0LmlkO1xuXG4gICAgICAgIHJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUsIHtcbiAgICAgICAgICAgICAgICBvblJlcXVlc3Q6ICAgICAgICAgICAoZXZlbnQ6IFJlcXVlc3RFdmVudCkgPT4gdGhpcy5jb21waWxlclNlcnZpY2U/Lm9uUmVxdWVzdEhvb2tFdmVudCh7IHRlc3RJZCwgaG9va0lkLCBuYW1lOiBSZXF1ZXN0SG9va01ldGhvZE5hbWVzLm9uUmVxdWVzdCwgZXZlbnREYXRhOiBldmVudCB9KSxcbiAgICAgICAgICAgICAgICBvbkNvbmZpZ3VyZVJlc3BvbnNlOiAoZXZlbnQ6IENvbmZpZ3VyZVJlc3BvbnNlRXZlbnQpID0+IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5vblJlcXVlc3RIb29rRXZlbnQoeyB0ZXN0SWQsIGhvb2tJZCwgbmFtZTogUmVxdWVzdEhvb2tNZXRob2ROYW1lcy5fb25Db25maWd1cmVSZXNwb25zZSwgZXZlbnREYXRhOiBldmVudCB9KSxcbiAgICAgICAgICAgICAgICBvblJlc3BvbnNlOiAgICAgICAgICAoZXZlbnQ6IFJlc3BvbnNlRXZlbnQpID0+IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5vblJlcXVlc3RIb29rRXZlbnQoeyB0ZXN0SWQsIGhvb2tJZCwgbmFtZTogUmVxdWVzdEhvb2tNZXRob2ROYW1lcy5vblJlc3BvbnNlLCBldmVudERhdGE6IGV2ZW50IH0pLFxuICAgICAgICAgICAgfSwgZXJyID0+IHRoaXMuX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvcihlcnIsIGhvb2tDbGFzc05hbWUpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfb25SZXF1ZXN0SG9va01ldGhvZEVycm9yIChldmVudDogUmVxdWVzdEhvb2tNZXRob2RFcnJvciwgaG9va0NsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGxldCBlcnI6IEVycm9yIHwgVGVzdFJ1bkVycm9yQmFzZSAgICAgICAgICAgID0gZXZlbnQuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzUmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZE1ldGhvZEVycm9yID0gKGVyciBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckJhc2UpPy5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yO1xuXG4gICAgICAgIGlmICghaXNSZXF1ZXN0SG9va05vdEltcGxlbWVudGVkTWV0aG9kRXJyb3IpXG4gICAgICAgICAgICBlcnIgPSBuZXcgUmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcihlcnIsIGhvb2tDbGFzc05hbWUsIGV2ZW50Lm1ldGhvZE5hbWUpO1xuXG4gICAgICAgIHRoaXMuYWRkRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNwb3NlUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogdm9pZCB7XG4gICAgICAgIGhvb2suX3dhcm5pbmdMb2cgPSBudWxsO1xuXG4gICAgICAgIGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGV0YWNoUmVxdWVzdEV2ZW50TGlzdGVuZXJzIChydWxlczogUmVxdWVzdEZpbHRlclJ1bGVbXSk6IHZvaWQge1xuICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc3Vic2NyaWJlT25Db21waWxlclNlcnZpY2VFdmVudHMgKCk6IHZvaWQge1xuICAgICAgICBDT01QSUxFUl9TRVJWSUNFX0VWRU5UUy5mb3JFYWNoKGV2ZW50TmFtZSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZS5vbihldmVudE5hbWUsIGFzeW5jIGFyZ3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2Vzc2lvbltldmVudE5hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlLm9uKCdhZGRSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMnLCBhc3luYyAoeyBob29rSWQsIGhvb2tDbGFzc05hbWUsIHJ1bGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0UmVxdWVzdEhvb2tGb3JDb21waWxlclNlcnZpY2UoaG9va0lkLCBob29rQ2xhc3NOYW1lLCBydWxlcyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2Uub24oJ3JlbW92ZVJlcXVlc3RFdmVudExpc3RlbmVycycsIGFzeW5jICh7IHJ1bGVzIH0pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZXRhY2hSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0UmVxdWVzdEhvb2tzICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmVPbkNvbXBpbGVyU2VydmljZUV2ZW50cygpO1xuICAgICAgICAgICAgdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5mb3JFYWNoKGhvb2sgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRSZXF1ZXN0SG9va0ZvckNvbXBpbGVyU2VydmljZShob29rLmlkLCBob29rLl9jbGFzc05hbWUsIGhvb2suX3JlcXVlc3RGaWx0ZXJSdWxlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmZvckVhY2goaG9vayA9PiB0aGlzLl9pbml0UmVxdWVzdEhvb2soaG9vaykpO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgcGF5bG9hZFxuICAgIHB1YmxpYyBhc3luYyBnZXRQYXlsb2FkU2NyaXB0ICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihURVNUX1JVTl9URU1QTEFURSwge1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXNzaW9uLmlkKSxcbiAgICAgICAgICAgIGJyb3dzZXJJZDogICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWQpLFxuICAgICAgICAgICAgYnJvd3NlckhlYXJ0YmVhdFJlbGF0aXZlVXJsOiAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5oZWFydGJlYXRSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyU3RhdHVzUmVsYXRpdmVVcmw6ICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnN0YXR1c1JlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJTdGF0dXNEb25lUmVsYXRpdmVVcmw6IEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uc3RhdHVzRG9uZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJJZGxlUmVsYXRpdmVVcmw6ICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWRsZVJlbGF0aXZlVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJBY3RpdmVXaW5kb3dJZFVybDogICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYWN0aXZlV2luZG93SWRVcmwpLFxuICAgICAgICAgICAgYnJvd3NlckNsb3NlV2luZG93VXJsOiAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5jbG9zZVdpbmRvd1VybCksXG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnVzZXJBZ2VudCksXG4gICAgICAgICAgICB0ZXN0TmFtZTogICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRlc3QubmFtZSksXG4gICAgICAgICAgICBmaXh0dXJlTmFtZTogICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSgodGhpcy50ZXN0LmZpeHR1cmUgYXMgRml4dHVyZSkubmFtZSksXG4gICAgICAgICAgICBzZWxlY3RvclRpbWVvdXQ6ICAgICAgICAgICAgICB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0LFxuICAgICAgICAgICAgcGFnZUxvYWRUaW1lb3V0OiAgICAgICAgICAgICAgdGhpcy5wYWdlTG9hZFRpbWVvdXQsXG4gICAgICAgICAgICBjaGlsZFdpbmRvd1JlYWR5VGltZW91dDogICAgICBDSElMRF9XSU5ET1dfUkVBRFlfVElNRU9VVCxcbiAgICAgICAgICAgIHNraXBKc0Vycm9yczogICAgICAgICAgICAgICAgIHRoaXMub3B0cy5za2lwSnNFcnJvcnMsXG4gICAgICAgICAgICByZXRyeVRlc3RQYWdlczogICAgICAgICAgICAgICB0aGlzLm9wdHMucmV0cnlUZXN0UGFnZXMsXG4gICAgICAgICAgICBzcGVlZDogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNwZWVkLFxuICAgICAgICAgICAgZGlhbG9nSGFuZGxlcjogICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyKSxcbiAgICAgICAgICAgIGNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zOiAgIEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uY2FuVXNlRGVmYXVsdFdpbmRvd0FjdGlvbnMoKSksXG4gICAgICAgICAgICBwcm94eWxlc3M6ICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLm9wdHMucHJveHlsZXNzKSxcbiAgICAgICAgICAgIGRvbWFpbjogICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LnByb3h5LnNlcnZlcjFJbmZvLmRvbWFpbiksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRJZnJhbWVQYXlsb2FkU2NyaXB0ICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gTXVzdGFjaGUucmVuZGVyKElGUkFNRV9URVNUX1JVTl9URU1QTEFURSwge1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnNlc3Npb24uaWQpLFxuICAgICAgICAgICAgc2VsZWN0b3JUaW1lb3V0OiB0aGlzLm9wdHMuc2VsZWN0b3JUaW1lb3V0LFxuICAgICAgICAgICAgcGFnZUxvYWRUaW1lb3V0OiB0aGlzLnBhZ2VMb2FkVGltZW91dCxcbiAgICAgICAgICAgIHJldHJ5VGVzdFBhZ2VzOiAgISF0aGlzLm9wdHMucmV0cnlUZXN0UGFnZXMsXG4gICAgICAgICAgICBzcGVlZDogICAgICAgICAgIHRoaXMuc3BlZWQsXG4gICAgICAgICAgICBkaWFsb2dIYW5kbGVyOiAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgaGFuZGxlcnNcbiAgICBwdWJsaWMgZ2V0QXV0aENyZWRlbnRpYWxzICgpOiBudWxsIHwgQXV0aENyZWRlbnRpYWxzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdC5hdXRoQ3JlZGVudGlhbHM7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUZpbGVEb3dubG9hZCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSkge1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlQXR0YWNobWVudCAoZGF0YTogeyBpc09wZW5lZEluTmV3V2luZG93OiBib29sZWFuIH0pOiB2b2lkIHtcbiAgICAgICAgaWYgKGRhdGEuaXNPcGVuZWRJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZVBhZ2VFcnJvciAoY3R4OiBhbnksIGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbmV3IFBhZ2VMb2FkRXJyb3IoZXJyLCBjdHgucmVxT3B0cy51cmwpO1xuXG4gICAgICAgIGN0eC5yZWRpcmVjdChjdHgudG9Qcm94eVVybChTUEVDSUFMX0VSUk9SX1BBR0UpKTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGZ1bmN0aW9uIGV4ZWN1dGlvblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVUZXN0Rm4gKHBoYXNlOiBUZXN0UnVuUGhhc2UsIGZuOiBGdW5jdGlvbiwgdGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGwpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5waGFzZSA9IHBoYXNlO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBleGVjdXRlRm5XaXRoVGltZW91dChmbiwgdGltZW91dCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoKTtcblxuICAgICAgICAgICAgdGhpcy5hZGRFcnJvcihlcnIpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5fYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQmVmb3JlSG9vayAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5iZWZvcmVGbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuYmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQmVmb3JlRWFjaEhvb2ssIHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQWZ0ZXJIb29rICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5hZnRlckZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QWZ0ZXJIb29rLCB0aGlzLnRlc3QuYWZ0ZXJGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQWZ0ZXJFYWNoSG9vaywgdGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQWZ0ZXJGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEFmdGVySG9vaywgdGhpcy50ZXN0Lmdsb2JhbEFmdGVyRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZmluYWxpemVUZXN0UnVuIChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5nZXRXYXJuaW5nTWVzc2FnZXMoeyB0ZXN0UnVuSWQ6IGlkIH0pO1xuXG4gICAgICAgICAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHdhcm5pbmcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnJlbW92ZVRlc3RSdW5Gcm9tU3RhdGUoeyB0ZXN0UnVuSWQ6IGlkIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVzdFJ1blRyYWNrZXIucmVtb3ZlQWN0aXZlVGVzdFJ1bihpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGVzdFJ1blRyYWNrZXIuYWRkQWN0aXZlVGVzdFJ1bih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3N0YXJ0Jyk7XG5cbiAgICAgICAgY29uc3Qgb25EaXNjb25uZWN0ZWQgPSAoZXJyOiBFcnJvcik6IHZvaWQgPT4gdGhpcy5fZGlzY29ubmVjdChlcnIpO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ub25jZSgnZGlzY29ubmVjdGVkJywgb25EaXNjb25uZWN0ZWQpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25jZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdyZWFkeScpO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl9ydW5CZWZvcmVIb29rKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdCwgdGhpcy50ZXN0LmZuIGFzIEZ1bmN0aW9uLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcnVuQWZ0ZXJIb29rKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5wZW5kaW5nRmluYWxpemF0aW9uO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ucmVtb3ZlTGlzdGVuZXIoJ2Rpc2Nvbm5lY3RlZCcsIG9uRGlzY29ubmVjdGVkKTtcblxuICAgICAgICBpZiAodGhpcy5lcnJzLmxlbmd0aCAmJiB0aGlzLmRlYnVnT25GYWlsKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJTdHIgPSB0aGlzLmRlYnVnUmVwb3J0ZXJQbHVnaW5Ib3N0LmZvcm1hdEVycm9yKHRoaXMuZXJyc1swXSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCh2b2lkIDAsIGVyclN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZS1kb25lJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlRlc3REb25lQ29tbWFuZCgpKTtcblxuICAgICAgICB0aGlzLl9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmNsZWFyUmVxdWVzdEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9maW5hbGl6ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2RvbmUnKTtcbiAgICB9XG5cbiAgICAvLyBFcnJvcnNcbiAgICBwcml2YXRlIF9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkgKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUGFnZUVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yKHRoaXMucGVuZGluZ1BhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbnN1cmVFcnJvcklkIChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmlkID0gZXJyLmlkIHx8IG5hbm9pZCg3KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVFcnJvckFkYXB0ZXIgKGVycjogRXJyb3IpOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIge1xuICAgICAgICB0aGlzLl9lbnN1cmVFcnJvcklkKGVycik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIoZXJyLCB7XG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQsXG4gICAgICAgICAgICBzY3JlZW5zaG90UGF0aDogdGhpcy5lcnJTY3JlZW5zaG90UGF0aCB8fCAnJyxcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgdGVzdFJ1blBoYXNlOiAgIHRoaXMucGhhc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFcnJvciAoZXJyOiBFcnJvciB8IFRlc3RDYWZlRXJyb3JMaXN0IHwgVGVzdFJ1bkVycm9yQmFzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBlcnJMaXN0ID0gKGVyciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0ID8gZXJyLml0ZW1zIDogW2Vycl0pIGFzIEVycm9yW107XG5cbiAgICAgICAgZXJyTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2NyZWF0ZUVycm9yQWRhcHRlcihpdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJzLnB1c2goYWRhcHRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemVSZXF1ZXN0SG9va0Vycm9ycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIb29rRXJyb3JzID0gcmVtb3ZlKHRoaXMuZXJycywgZSA9PlxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yIHx8XG4gICAgICAgICAgICAoZSBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckJhc2UpLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yKTtcblxuICAgICAgICBpZiAoIXJlcXVlc3RIb29rRXJyb3JzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCB1bmlxUmVxdWVzdEhvb2tFcnJvcnMgPSBjaGFpbihyZXF1ZXN0SG9va0Vycm9ycylcbiAgICAgICAgICAgIC51bmlxQnkoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gZSBhcyB1bmtub3duIGFzIFJlcXVlc3RIb29rQmFzZUVycm9yO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyci5ob29rQ2xhc3NOYW1lICsgZXJyLm1ldGhvZE5hbWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnNvcnRCeShbJ2hvb2tDbGFzc05hbWUnLCAnbWV0aG9kTmFtZSddKVxuICAgICAgICAgICAgLnZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5lcnJzID0gdGhpcy5lcnJzLmNvbmNhdCh1bmlxUmVxdWVzdEhvb2tFcnJvcnMpO1xuICAgIH1cblxuICAgIC8vIFRhc2sgcXVldWVcbiAgICBwcml2YXRlIF9lbnF1ZXVlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdClcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChjb21tYW5kKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50LS07XG4gICAgICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZS5wdXNoKHsgY29tbWFuZCwgcmVzb2x2ZSwgcmVqZWN0LCBjYWxsc2l0ZSB9KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQpXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KEFMTF9EUklWRVJfVEFTS1NfQURERURfVE9fUVVFVUVfRVZFTlQsIHRoaXMuZHJpdmVyVGFza1F1ZXVlLmxlbmd0aCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZHJpdmVyVGFza1F1ZXVlTGVuZ3RoICgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50ID8gcHJvbWlzaWZ5RXZlbnQodGhpcyBhcyB1bmtub3duIGFzIEV2ZW50RW1pdHRlciwgQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCkgOiBQcm9taXNlLnJlc29sdmUodGhpcy5kcml2ZXJUYXNrUXVldWUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVCcm93c2VyQ29uc29sZU1lc3NhZ2VzQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgY29uc3QgY29uc29sZU1lc3NhZ2VDb3B5ID0gdGhpcy5jb25zb2xlTWVzc2FnZXMuZ2V0Q29weSgpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIGNvbnNvbGVNZXNzYWdlQ29weVtTdHJpbmcodGhpcy5hY3RpdmVXaW5kb3dJZCldO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZUdldENvb2tpZXMgKGNvbW1hbmQ6IEdldENvb2tpZXNDb21tYW5kKTogUHJvbWlzZTxQYXJ0aWFsPENvb2tpZU9wdGlvbnM+W10+IHtcbiAgICAgICAgY29uc3QgeyBjb29raWVzLCB1cmxzIH0gPSBjb21tYW5kO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uY29va2llcy5nZXRDb29raWVzKGNvb2tpZXMsIHVybHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZVNldENvb2tpZXMgKGNvbW1hbmQ6IFNldENvb2tpZXNDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBjb21tYW5kLmNvb2tpZXM7XG4gICAgICAgIGNvbnN0IHVybCAgICAgPSBjb21tYW5kLnVybCB8fCBhd2FpdCB0aGlzLmdldEN1cnJlbnRVcmwoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmNvb2tpZXMuc2V0Q29va2llcyhjb29raWVzLCB1cmwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZW5xdWV1ZURlbGV0ZUNvb2tpZXMgKGNvbW1hbmQ6IERlbGV0ZUNvb2tpZXNDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgY29va2llcywgdXJscyB9ID0gY29tbWFuZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmNvb2tpZXMuZGVsZXRlQ29va2llcyhjb29raWVzLCB1cmxzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQgKGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCB8IHVuZGVmaW5lZCwgZXJyb3I/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMuZGVidWdMb2dnZXIpXG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyLnNob3dCcmVha3BvaW50KHRoaXMuc2Vzc2lvbi5pZCwgdGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQsIGNhbGxzaXRlLCBlcnJvcik7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuU2V0QnJlYWtwb2ludENvbW1hbmQoISFlcnJvciwgISF0aGlzLmNvbXBpbGVyU2VydmljZSksIGNhbGxzaXRlKSBhcyBib29sZWFuO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlID0gdGhpcy5kcml2ZXJUYXNrUXVldWUuZmlsdGVyKGRyaXZlclRhc2sgPT4gaXNTZXJ2aWNlQ29tbWFuZChkcml2ZXJUYXNrLmNvbW1hbmQpKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZS5yZW1vdmVBbGxOb25TZXJ2aWNlTWFuaXB1bGF0aW9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZURlYnVnU3RhdGUgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogdm9pZCB7XG4gICAgICAgIGlmIChkcml2ZXJTdGF0dXMuZGVidWcpXG4gICAgICAgICAgICB0aGlzLmVtaXQoZHJpdmVyU3RhdHVzLmRlYnVnKTtcbiAgICB9XG5cbiAgICAvLyBDdXJyZW50IGRyaXZlciB0YXNrXG4gICAgcHVibGljIGdldCBjdXJyZW50RHJpdmVyVGFzayAoKTogRHJpdmVyVGFzayB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlclRhc2tRdWV1ZVswXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlQ3VycmVudERyaXZlclRhc2sgKHJlc3VsdD86IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdXJyZW50RHJpdmVyVGFzay5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkKVxuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVqZWN0Q3VycmVudERyaXZlclRhc2sgKGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlcnIuY2FsbHNpdGUgPSBlcnIuY2FsbHNpdGUgfHwgdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jYWxsc2l0ZTtcblxuICAgICAgICB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLnJlamVjdChlcnIpO1xuICAgICAgICB0aGlzLl9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MoKTtcbiAgICB9XG5cbiAgICAvLyBQZW5kaW5nIHJlcXVlc3RcbiAgICBwcml2YXRlIF9jbGVhclBlbmRpbmdSZXF1ZXN0ICgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBlbmRpbmdSZXF1ZXN0LnJlc3BvbnNlVGltZW91dCk7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc29sdmVQZW5kaW5nUmVxdWVzdCAoY29tbWFuZDogQ29tbWFuZEJhc2UgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gY29tbWFuZDtcblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdClcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QucmVzb2x2ZShjb21tYW5kKTtcblxuICAgICAgICB0aGlzLl9jbGVhclBlbmRpbmdSZXF1ZXN0KCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRyaXZlciByZXF1ZXN0XG4gICAgcHJpdmF0ZSBfc2hvdWxkUmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrIChkcml2ZXJTdGF0dXM6IERyaXZlclN0YXR1cyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjdXJyZW50Q29tbWFuZCA9IHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZDtcblxuICAgICAgICBjb25zdCBpc0V4ZWN1dGluZ09ic2VydmF0aW9uQ29tbWFuZCA9IGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2Ygb2JzZXJ2YXRpb25Db21tYW5kcy5FeGVjdXRlU2VsZWN0b3JDb21tYW5kIHx8XG4gICAgICAgICAgICBjdXJyZW50Q29tbWFuZCBpbnN0YW5jZW9mIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQ7XG5cbiAgICAgICAgY29uc3QgaXNEZWJ1Z0FjdGl2ZSA9IGN1cnJlbnRDb21tYW5kIGluc3RhbmNlb2Ygc2VydmljZUNvbW1hbmRzLlNldEJyZWFrcG9pbnRDb21tYW5kO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZEV4ZWN1dGVDdXJyZW50Q29tbWFuZCA9XG4gICAgICAgICAgICBkcml2ZXJTdGF0dXMuaXNGaXJzdFJlcXVlc3RBZnRlcldpbmRvd1N3aXRjaGluZyAmJiAoaXNFeGVjdXRpbmdPYnNlcnZhdGlvbkNvbW1hbmQgfHwgaXNEZWJ1Z0FjdGl2ZSk7XG5cbiAgICAgICAgcmV0dXJuICFzaG91bGRFeGVjdXRlQ3VycmVudENvbW1hbmQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrIChkcml2ZXJTdGF0dXM6IERyaXZlclN0YXR1cyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudERyaXZlclRhc2spXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGRyaXZlclN0YXR1cy5leGVjdXRpb25FcnJvcilcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cy5leGVjdXRpb25FcnJvcik7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3Nob3VsZFJlc29sdmVDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMpKVxuICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cy5yZXN1bHQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZVBhZ2VFcnJvclN0YXR1cyAocGFnZUVycm9yOiBFcnJvcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJpdmVyVGFzayAmJiBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IodGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5fcmVqZWN0Q3VycmVudERyaXZlclRhc2socGFnZUVycm9yKTtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gdGhpcy5wZW5kaW5nUGFnZUVycm9yIHx8IHBhZ2VFcnJvcjtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaGFuZGxlRHJpdmVyUmVxdWVzdCAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiBDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmcge1xuICAgICAgICBjb25zdCBpc1Rlc3REb25lICAgICAgICAgICAgICAgICA9IHRoaXMuY3VycmVudERyaXZlclRhc2sgJiYgdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kLnR5cGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9UWVBFLnRlc3REb25lO1xuICAgICAgICBjb25zdCBwYWdlRXJyb3IgICAgICAgICAgICAgICAgICA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvciB8fCBkcml2ZXJTdGF0dXMucGFnZUVycm9yO1xuICAgICAgICBjb25zdCBjdXJyZW50VGFza1JlamVjdGVkQnlFcnJvciA9IHBhZ2VFcnJvciAmJiB0aGlzLl9oYW5kbGVQYWdlRXJyb3JTdGF0dXMocGFnZUVycm9yKTtcblxuICAgICAgICB0aGlzLmNvbnNvbGVNZXNzYWdlcy5jb25jYXQoZHJpdmVyU3RhdHVzLmNvbnNvbGVNZXNzYWdlcyk7XG5cbiAgICAgICAgdGhpcy5faGFuZGxlRGVidWdTdGF0ZShkcml2ZXJTdGF0dXMpO1xuXG4gICAgICAgIGlmICghY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgJiYgZHJpdmVyU3RhdHVzLmlzQ29tbWFuZFJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGlzVGVzdERvbmUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNvbHZlQ3VycmVudERyaXZlclRhc2soKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBURVNUX0RPTkVfQ09ORklSTUFUSU9OX1JFU1BPTlNFO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9mdWxmaWxsQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKTtcblxuICAgICAgICAgICAgaWYgKGRyaXZlclN0YXR1cy5pc1BlbmRpbmdXaW5kb3dTd2l0Y2hpbmcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q3VycmVudERyaXZlclRhc2tDb21tYW5kKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q3VycmVudERyaXZlclRhc2tDb21tYW5kICgpOiBDb21tYW5kQmFzZSB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuY3VycmVudERyaXZlclRhc2spXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb21tYW5kID0gdGhpcy5jdXJyZW50RHJpdmVyVGFzay5jb21tYW5kO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5uYXZpZ2F0ZVRvICYmIChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdClcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi51c2VTdGF0ZVNuYXBzaG90KEpTT04ucGFyc2UoKGNvbW1hbmQgYXMgYW55KS5zdGF0ZVNuYXBzaG90KSk7XG5cbiAgICAgICAgcmV0dXJuIGNvbW1hbmQ7XG4gICAgfVxuXG4gICAgLy8gRXhlY3V0ZSBjb21tYW5kXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUpzRXhwcmVzc2lvbiAoY29tbWFuZDogRXhlY3V0ZUV4cHJlc3Npb25Db21tYW5kKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdFZhcmlhYmxlTmFtZSA9IGNvbW1hbmQucmVzdWx0VmFyaWFibGVOYW1lO1xuICAgICAgICBsZXQgZXhwcmVzc2lvbiAgICAgICAgICAgPSBjb21tYW5kLmV4cHJlc3Npb247XG5cbiAgICAgICAgaWYgKHJlc3VsdFZhcmlhYmxlTmFtZSlcbiAgICAgICAgICAgIGV4cHJlc3Npb24gPSBgJHtyZXN1bHRWYXJpYWJsZU5hbWV9ID0gJHtleHByZXNzaW9ufSwgJHtyZXN1bHRWYXJpYWJsZU5hbWV9YDtcblxuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5leGVjdXRlSnNFeHByZXNzaW9uKHtcbiAgICAgICAgICAgICAgICBleHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgIHsgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGV4ZWN1dGVKc0V4cHJlc3Npb24oZXhwcmVzc2lvbiwgdGhpcywgeyBza2lwVmlzaWJpbGl0eUNoZWNrOiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVBc3luY0V4cHJlc3Npb25Db21tYW5kLCBjYWxsc2l0ZT86IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIHRoaXMuYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXMuY2xlYXIoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXJTZXJ2aWNlLmV4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogY29tbWFuZC5leHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogIHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgY2FsbHNpdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oY29tbWFuZC5leHByZXNzaW9uLCB0aGlzLCBjYWxsc2l0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVkaXJlY3RSZUV4ZWN1dGFibGVQcm9taXNlRXhlY3V0aW9uVG9Db21waWxlclNlcnZpY2UgKGNvbW1hbmQ6IEFzc2VydGlvbkNvbW1hbmQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVyU2VydmljZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgICAgICBjb21tYW5kLmFjdHVhbCA9IFJlRXhlY3V0YWJsZVByb21pc2UuZnJvbUZuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXBpbGVyU2VydmljZT8uZ2V0QXNzZXJ0aW9uQWN0dWFsVmFsdWUoe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogc2VsZi5pZCxcbiAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGNvbW1hbmQuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVkaXJlY3RBc3NlcnRpb25GbkV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlIChleGVjdXRvcjogQXNzZXJ0aW9uRXhlY3V0b3IpOiB2b2lkIHtcbiAgICAgICAgZXhlY3V0b3IuZm4gPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2U/LmV4ZWN1dGVBc3NlcnRpb25Gbih7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNvbW1hbmRJZDogZXhlY3V0b3IuY29tbWFuZC5pZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVBc3NlcnRpb24gKGNvbW1hbmQ6IEFzc2VydGlvbkNvbW1hbmQsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoY29tbWFuZC5hY3R1YWwgPT09IFN5bWJvbC5mb3IoUkVfRVhFQ1VUQUJMRV9QUk9NSVNFX01BUktFUl9ERVNDUklQVElPTikpXG4gICAgICAgICAgICB0aGlzLl9yZWRpcmVjdFJlRXhlY3V0YWJsZVByb21pc2VFeGVjdXRpb25Ub0NvbXBpbGVyU2VydmljZShjb21tYW5kKTtcblxuICAgICAgICBjb25zdCBhc3NlcnRpb25UaW1lb3V0ID0gZ2V0QXNzZXJ0aW9uVGltZW91dChjb21tYW5kLCB0aGlzLm9wdHMpO1xuICAgICAgICBjb25zdCBleGVjdXRvciAgICAgICAgID0gbmV3IEFzc2VydGlvbkV4ZWN1dG9yKGNvbW1hbmQsIGFzc2VydGlvblRpbWVvdXQsIGNhbGxzaXRlKTtcblxuICAgICAgICBleGVjdXRvci5vbmNlKCdzdGFydC1hc3NlcnRpb24tcmV0cmllcycsICh0aW1lb3V0OiBudW1iZXIpID0+IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5TaG93QXNzZXJ0aW9uUmV0cmllc1N0YXR1c0NvbW1hbmQodGltZW91dCkpKTtcbiAgICAgICAgZXhlY3V0b3Iub25jZSgnZW5kLWFzc2VydGlvbi1yZXRyaWVzJywgKHN1Y2Nlc3M6IGJvb2xlYW4pID0+IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5IaWRlQXNzZXJ0aW9uUmV0cmllc1N0YXR1c0NvbW1hbmQoc3VjY2VzcykpKTtcbiAgICAgICAgZXhlY3V0b3Iub25jZSgnbm9uLXNlcmlhbGl6YWJsZS1hY3R1YWwtdmFsdWUnLCB0aGlzLl9yZWRpcmVjdEFzc2VydGlvbkZuRXhlY3V0aW9uVG9Db21waWxlclNlcnZpY2UpO1xuXG4gICAgICAgIGNvbnN0IGV4ZWN1dGVGbiA9IHRoaXMuZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cygoKSA9PiBleGVjdXRvci5ydW4oKSwgeyBwcmV2ZW50OiB0cnVlIH0pO1xuXG4gICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlRm4oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9hZGp1c3RDb25maWd1cmF0aW9uV2l0aENvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlKTogdm9pZCB7XG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS50ZXN0RG9uZSkge1xuICAgICAgICAgICAgdGhpcy50ZXN0RG9uZUNvbW1hbmRRdWV1ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdMb2dnZXIpXG4gICAgICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlci5oaWRlQnJlYWtwb2ludCh0aGlzLnNlc3Npb24uaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0TmF0aXZlRGlhbG9nSGFuZGxlcilcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciA9IChjb21tYW5kIGFzIGFueSkuZGlhbG9nSGFuZGxlcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb0lmcmFtZSlcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSAoY29tbWFuZCBhcyBhbnkpLnNlbGVjdG9yO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvTWFpbldpbmRvdylcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSBudWxsO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldFRlc3RTcGVlZClcbiAgICAgICAgICAgIHRoaXMuc3BlZWQgPSAoY29tbWFuZCBhcyBhbnkpLnNwZWVkO1xuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldFBhZ2VMb2FkVGltZW91dClcbiAgICAgICAgICAgIHRoaXMucGFnZUxvYWRUaW1lb3V0ID0gKGNvbW1hbmQgYXMgYW55KS5kdXJhdGlvbjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5kZWJ1ZylcbiAgICAgICAgICAgIHRoaXMuZGVidWdnaW5nID0gdHJ1ZTtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5kaXNhYmxlRGVidWcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuaGlkZUJyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkKTtcblxuICAgICAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfYWRqdXN0U2NyZWVuc2hvdENvbW1hbmQgKGNvbW1hbmQ6IFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgYnJvd3NlcklkICAgICAgICAgICAgICAgICAgICA9IHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaWQ7XG4gICAgICAgIGNvbnN0IHsgaGFzQ2hyb21lbGVzc1NjcmVlbnNob3RzIH0gPSBhd2FpdCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByb3ZpZGVyLmhhc0N1c3RvbUFjdGlvbkZvckJyb3dzZXIoYnJvd3NlcklkKTtcblxuICAgICAgICBpZiAoIWhhc0Nocm9tZWxlc3NTY3JlZW5zaG90cylcbiAgICAgICAgICAgIGNvbW1hbmQuZ2VuZXJhdGVTY3JlZW5zaG90TWFyaygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoKGNvbW1hbmQgYXMgYW55KS5vcHRpb25zPy5jb25maWRlbnRpYWwgIT09IHZvaWQgMClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudHlwZVRleHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvciwgY2FsbHNpdGUpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlcGxpY2F0b3IuZGVjb2RlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkub3B0aW9ucy5jb25maWRlbnRpYWwgPSBpc1Bhc3N3b3JkSW5wdXQobm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5wcmVzc0tleSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLkdldEFjdGl2ZUVsZW1lbnRDb21tYW5kKCkpO1xuXG4gICAgICAgICAgICBpZiAoIXJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnJlcGxpY2F0b3IuZGVjb2RlKHJlc3VsdCk7XG5cbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkub3B0aW9ucy5jb25maWRlbnRpYWwgPSBpc1Bhc3N3b3JkSW5wdXQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmRCYXNlICYmICEhdGhpcy5jb21waWxlclNlcnZpY2UgJiYgIXRoaXMuX2NsaWVudEVudmlyb25tZW50UHJlcGFyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NsaWVudEVudmlyb25tZW50UHJlcGFyZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuUHJlcGFyZUNsaWVudEVudmlyb25tZW50SW5EZWJ1Z01vZGUoY29tbWFuZC5lc21SdW50aW1lKSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfc2V0QnJlYWtwb2ludElmTmVjZXNzYXJ5IChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZURlYnVnQnJlYWtwb2ludHMgJiYgdGhpcy5kZWJ1Z2dpbmcgJiYgY2FuU2V0RGVidWdnZXJCcmVha3BvaW50QmVmb3JlQ29tbWFuZChjb21tYW5kKSlcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZChjYWxsc2l0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGV4ZWN1dGVDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSB8IEFjdGlvbkNvbW1hbmRCYXNlLCBjYWxsc2l0ZT86IHN0cmluZyB8IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiBjb21tYW5kIGluc3RhbmNlb2YgQWN0aW9uQ29tbWFuZEJhc2VcbiAgICAgICAgICAgID8gdGhpcy5fZXhlY3V0ZUFjdGlvbkNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpXG4gICAgICAgICAgICA6IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfZXhlY3V0ZUFjdGlvbkNvbW1hbmQgKGNvbW1hbmQ6IEFjdGlvbkNvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uQXJncyA9IHsgYXBpQWN0aW9uTmFtZTogY29tbWFuZC5tZXRob2ROYW1lLCBjb21tYW5kIH07XG5cbiAgICAgICAgbGV0IGVycm9yQWRhcHRlciA9IG51bGw7XG4gICAgICAgIGxldCBlcnJvciAgICAgICAgPSBudWxsO1xuICAgICAgICBsZXQgcmVzdWx0ICAgICAgID0gbnVsbDtcblxuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hZGp1c3RDb21tYW5kT3B0aW9uc0FuZEVudmlyb25tZW50KGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBlcnJvciA9IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEFjdGlvbkV2ZW50KCdhY3Rpb24tc3RhcnQnLCBhY3Rpb25BcmdzKTtcblxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWVycm9yKVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBoYXNlID09PSBUZXN0UnVuUGhhc2UucGVuZGluZ0ZpbmFsaXphdGlvbiAmJiBlcnIgaW5zdGFuY2VvZiBFeHRlcm5hbEFzc2VydGlvbkxpYnJhcnlFcnJvcilcbiAgICAgICAgICAgICAgICBhZGRSZW5kZXJlZFdhcm5pbmcodGhpcy53YXJuaW5nTG9nLCB7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS51bmF3YWl0ZWRNZXRob2RXaXRoQXNzZXJ0aW9uLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9LCBjYWxsc2l0ZSk7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnQ7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBjaGVjayBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCBpcyBzcGVjaWZpYyBmb3IgdGhlIGB1c2VSb2xlYCBhY3Rpb25cbiAgICAgICAgICAgIC8vIGlmIGVycm9yIGlzIFRlc3RDYWZlRXJyb3JMaXN0IHdlIGRvIG5vdCBuZWVkIHRvIGNyZWF0ZSBhbiBhZGFwdGVyLFxuICAgICAgICAgICAgLy8gc2luY2UgZXJyb3IgaXMgYWxyZWFkeSB3YXMgcHJvY2Vzc2VkIGluIHJvbGUgaW5pdGlhbGl6ZXJcbiAgICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgVGVzdENhZmVFcnJvckxpc3QpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoY29tbWFuZC5hY3Rpb25JZCk7XG5cbiAgICAgICAgICAgICAgICBlcnJvckFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocHJvY2Vzc1Rlc3RGbkVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gZXJyb3IuYWRhcHRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5hc3NpZ24oYWN0aW9uQXJncywge1xuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgZHVyYXRpb24sXG4gICAgICAgICAgICBlcnI6IGVycm9yQWRhcHRlcixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0QWN0aW9uRXZlbnQoJ2FjdGlvbi1kb25lJywgYWN0aW9uQXJncyk7XG5cbiAgICAgICAgaWYgKGVycm9yKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZT86IENhbGxzaXRlUmVjb3JkIHwgc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuY29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUGFnZUVycm9yICYmIGlzQ29tbWFuZFJlamVjdGFibGVCeVBhZ2VFcnJvcihjb21tYW5kKSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZWplY3RDb21tYW5kV2l0aFBhZ2VFcnJvcihjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGlzRXhlY3V0YWJsZU9uQ2xpZW50Q29tbWFuZChjb21tYW5kKSlcbiAgICAgICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCsrO1xuXG4gICAgICAgIHRoaXMuX2FkanVzdENvbmZpZ3VyYXRpb25XaXRoQ29tbWFuZChjb21tYW5kKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9zZXRCcmVha3BvaW50SWZOZWNlc3NhcnkoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc1NjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmRpc2FibGVTY3JlZW5zaG90cykge1xuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnNjcmVlbnNob3RzRGlzYWJsZWQsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2FkanVzdFNjcmVlbnNob3RDb21tYW5kKGNvbW1hbmQgYXMgVGFrZVNjcmVlbnNob3RCYXNlQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNCcm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUucHVzaChjb21tYW5kKTtcblxuICAgICAgICAgICAgaWYgKGlzUmVzaXplV2luZG93Q29tbWFuZChjb21tYW5kKSAmJiB0aGlzLm9wdHMudmlkZW9QYXRoKVxuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLnZpZGVvQnJvd3NlclJlc2l6aW5nLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9LCB0aGlzLnRlc3QubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUud2FpdClcbiAgICAgICAgICAgIHJldHVybiBkZWxheSgoY29tbWFuZCBhcyBhbnkpLnRpbWVvdXQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpIHtcbiAgICAgICAgICAgIC8vIE5PVEU6IEluIHJlZ3VsYXIgbW9kZSwgaXQncyBwb3NzaWJsZSB0byBkZWJ1ZyB0ZXN0cyBvbmx5IHVzaW5nIFRlc3RDYWZlIFVJICgnUmVzdW1lJyBhbmQgJ05leHQgc3RlcCcgYnV0dG9ucykuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIHdhcm4gb24gdHJ5aW5nIHRvIGRlYnVnIGluIGhlYWRsZXNzIG1vZGUuXG4gICAgICAgICAgICAvLyBJbiBjb21waWxlciBzZXJ2aWNlIG1vZGUsIHdlIGNhbiBkZWJ1ZyBldmVuIGluIGhlYWRsZXNzIG1vZGUgdXNpbmcgYW55IGRlYnVnZ2luZyB0b29scy4gU28sIGluIHRoaXMgY2FzZSwgdGhlIHdhcm5pbmcgaXMgZXhjZXNzaXZlLlxuICAgICAgICAgICAgY29uc3QgY2FuRGVidWcgPSAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlIHx8ICF0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlzSGVhZGxlc3NCcm93c2VyKCk7XG5cbiAgICAgICAgICAgIGlmIChjYW5EZWJ1ZylcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kKGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkLCB2b2lkIDApO1xuXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5kZWJ1Z0luSGVhZGxlc3NFcnJvciwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnVzZVJvbGUpIHtcbiAgICAgICAgICAgIGxldCBmbiA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuX3VzZVJvbGUoKGNvbW1hbmQgYXMgYW55KS5yb2xlLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgICAgIGZuID0gdGhpcy5kZWNvcmF0ZVByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKGZuLCB7IHByZXZlbnQ6IHRydWUgfSk7XG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVEaXNhYmxlRGVidWdCcmVha3BvaW50cyhmbiwgeyBkaXNhYmxlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5hc3NlcnRpb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzc2VydGlvbihjb21tYW5kIGFzIEFzc2VydGlvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZXhlY3V0ZUV4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZUpzRXhwcmVzc2lvbihjb21tYW5kIGFzIEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmV4ZWN1dGVBc3luY0V4cHJlc3Npb24pXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQgYXMgRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsIGNhbGxzaXRlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldEJyb3dzZXJDb25zb2xlTWVzc2FnZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUJyb3dzZXJDb25zb2xlTWVzc2FnZXNDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9QcmV2aW91c1dpbmRvdylcbiAgICAgICAgICAgIChjb21tYW5kIGFzIGFueSkud2luZG93SWQgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnByZXZpb3VzQWN0aXZlV2luZG93SWQ7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc3dpdGNoVG9XaW5kb3dCeVByZWRpY2F0ZShjb21tYW5kIGFzIFN3aXRjaFRvV2luZG93QnlQcmVkaWNhdGVDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZ2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlR2V0Q29va2llcyhjb21tYW5kIGFzIEdldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0Q29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlU2V0Q29va2llcyhjb21tYW5kIGFzIFNldENvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVsZXRlQ29va2llcylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnF1ZXVlRGVsZXRlQ29va2llcyhjb21tYW5kIGFzIERlbGV0ZUNvb2tpZXNDb21tYW5kKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlamVjdENvbW1hbmRXaXRoUGFnZUVycm9yIChjYWxsc2l0ZT86IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTxFcnJvcj4ge1xuICAgICAgICBjb25zdCBlcnIgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3I7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlcnIuY2FsbHNpdGUgICAgICAgICAgPSBjYWxsc2l0ZTtcbiAgICAgICAgdGhpcy5wZW5kaW5nUGFnZUVycm9yID0gbnVsbDtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZW5kQ2xvc2VDaGlsZFdpbmRvd09uRmlsZURvd25sb2FkaW5nQ29tbWFuZCAoKTogQ29tbWFuZEJhc2Uge1xuICAgICAgICByZXR1cm4gbmV3IGFjdGlvbkNvbW1hbmRzLkNsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBfbWFrZVNjcmVlbnNob3RPbkZhaWwgKGZhaWxlZEFjdGlvbklkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgc2NyZWVuc2hvdHMgfSA9IHRoaXMub3B0cztcblxuICAgICAgICBpZiAoIXRoaXMuZXJyU2NyZWVuc2hvdFBhdGggJiYgKHNjcmVlbnNob3RzIGFzIFNjcmVlbnNob3RPcHRpb25WYWx1ZSk/LnRha2VPbkZhaWxzKVxuICAgICAgICAgICAgdGhpcy5lcnJTY3JlZW5zaG90UGF0aCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IGJyb3dzZXJNYW5pcHVsYXRpb25Db21tYW5kcy5UYWtlU2NyZWVuc2hvdE9uRmFpbENvbW1hbmQoeyBmYWlsZWRBY3Rpb25JZCB9KSkgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RlY29yYXRlV2l0aEZsYWcgKGZuOiBGdW5jdGlvbiwgZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IGJvb2xlYW4pOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXNbZmxhZ05hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXNbZmxhZ05hbWVdID0gIXZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvcmF0ZVByZXZlbnRFbWl0QWN0aW9uRXZlbnRzIChmbjogRnVuY3Rpb24sIHsgcHJldmVudCB9OiB7IHByZXZlbnQ6IGJvb2xlYW4gfSk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb3JhdGVXaXRoRmxhZyhmbiwgJ3ByZXZlbnRFbWl0QWN0aW9uRXZlbnRzJywgcHJldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29yYXRlRGlzYWJsZURlYnVnQnJlYWtwb2ludHMgKGZuOiBGdW5jdGlvbiwgeyBkaXNhYmxlIH06IHsgZGlzYWJsZTogYm9vbGVhbiB9KTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcmF0ZVdpdGhGbGFnKGZuLCAnZGlzYWJsZURlYnVnQnJlYWtwb2ludHMnLCBkaXNhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hbmFnZW1lbnRcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3RhdGVTbmFwc2hvdCAoKTogUHJvbWlzZTxTdGF0ZVNuYXBzaG90PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zZXNzaW9uLmdldFN0YXRlU25hcHNob3QoKTtcblxuICAgICAgICBzdGF0ZS5zdG9yYWdlcyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5CYWNrdXBTdG9yYWdlc0NvbW1hbmQoKSkgYXMgU3RvcmFnZXNTbmFwc2hvdDtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2xlYW5VcEN0eHMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnNldEN0eCh7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2Uuc2V0Rml4dHVyZUN0eCh7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHggICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZUN0eCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRlc3RSdW5DdHggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN3aXRjaFRvQ2xlYW5SdW4gKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NsZWFuVXBDdHhzKCk7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMgPSBuZXcgQnJvd3NlckNvbnNvbGVNZXNzYWdlcygpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbi51c2VTdGF0ZVNuYXBzaG90KFN0YXRlU25hcHNob3QuZW1wdHkoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3BlZWQgIT09IHRoaXMub3B0cy5zcGVlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2V0U3BlZWRDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldFRlc3RTcGVlZENvbW1hbmQoeyBzcGVlZDogdGhpcy5vcHRzLnNwZWVkIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFNwZWVkQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlTG9hZFRpbWVvdXQgIT09IHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0UGFnZUxvYWRUaW1lb3V0Q29tbWFuZCh7IGR1cmF0aW9uOiB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvVXJsKHVybCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQoeyBkaWFsb2dIYW5kbGVyOiB7IGZuOiBudWxsIH0gfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQocmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5hdmlnYXRlVG9VcmwgKHVybDogc3RyaW5nLCBmb3JjZVJlbG9hZDogYm9vbGVhbiwgc3RhdGVTbmFwc2hvdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBuYXZpZ2F0ZUNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuTmF2aWdhdGVUb0NvbW1hbmQoeyB1cmwsIGZvcmNlUmVsb2FkLCBzdGF0ZVNuYXBzaG90IH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmF2aWdhdGVDb21tYW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRTdGF0ZVNuYXBzaG90RnJvbVJvbGUgKHJvbGU6IFJvbGUpOiBQcm9taXNlPFN0YXRlU25hcHNob3Q+IHtcbiAgICAgICAgY29uc3QgcHJldlBoYXNlID0gdGhpcy5waGFzZTtcblxuICAgICAgICBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5pbml0aWFsaXplZCAmJiByb2xlLmluaXRFcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCAmJiByb2xlLmluaXRFcnIuaGFzRXJyb3JzKVxuICAgICAgICAgICAgcm9sZS5pbml0RXJyLmFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocm9sZS5pbml0RXJyLml0ZW1zWzBdKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluUm9sZUluaXRpYWxpemVyO1xuXG4gICAgICAgIGlmIChyb2xlLnBoYXNlID09PSBST0xFX1BIQVNFLnVuaW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICBhd2FpdCByb2xlLmluaXRpYWxpemUodGhpcyk7XG5cbiAgICAgICAgZWxzZSBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5wZW5kaW5nSW5pdGlhbGl6YXRpb24pXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNpZnlFdmVudChyb2xlLCAnaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgICBpZiAocm9sZS5pbml0RXJyKVxuICAgICAgICAgICAgdGhyb3cgcm9sZS5pbml0RXJyO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBwcmV2UGhhc2U7XG5cbiAgICAgICAgcmV0dXJuIHJvbGUuc3RhdGVTbmFwc2hvdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF91c2VSb2xlIChyb2xlOiBSb2xlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucGhhc2UgPT09IFRlc3RSdW5QaGFzZS5pblJvbGVJbml0aWFsaXplcilcbiAgICAgICAgICAgIHRocm93IG5ldyBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcihjYWxsc2l0ZSk7XG5cbiAgICAgICAgY29uc3QgYm9va21hcmsgPSBuZXcgVGVzdFJ1bkJvb2ttYXJrKHRoaXMsIHJvbGUpO1xuXG4gICAgICAgIGF3YWl0IGJvb2ttYXJrLmluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um9sZUlkKVxuICAgICAgICAgICAgdGhpcy51c2VkUm9sZVN0YXRlc1t0aGlzLmN1cnJlbnRSb2xlSWRdID0gYXdhaXQgdGhpcy5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGVTbmFwc2hvdCA9IHRoaXMudXNlZFJvbGVTdGF0ZXNbcm9sZS5pZF0gfHwgYXdhaXQgdGhpcy5fZ2V0U3RhdGVTbmFwc2hvdEZyb21Sb2xlKHJvbGUpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbi51c2VTdGF0ZVNuYXBzaG90KHN0YXRlU25hcHNob3QpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCA9IHJvbGUuaWQ7XG5cbiAgICAgICAgYXdhaXQgYm9va21hcmsucmVzdG9yZShjYWxsc2l0ZSwgc3RhdGVTbmFwc2hvdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVcmwgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2xpZW50RnVuY3Rpb25CdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICB9LCB7IGJvdW5kVGVzdFJ1bjogdGhpcyB9KTtcblxuICAgICAgICBjb25zdCBnZXRMb2NhdGlvbiA9IGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlIChjb21tYW5kOiBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50V2luZG93cyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IEdldEN1cnJlbnRXaW5kb3dzQ29tbWFuZCh7fSwgdGhpcykgYXMgQ29tbWFuZEJhc2UpIGFzIE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uW107XG5cbiAgICAgICAgY29uc3Qgd2luZG93cyA9IGF3YWl0IGFzeW5jRmlsdGVyPE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uPihjdXJyZW50V2luZG93cywgYXN5bmMgd25kID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZGljYXRlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAgIG5ldyBVUkwod25kLnVybCksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB3bmQudGl0bGUsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlclNlcnZpY2VQcmVkaWNhdGVEYXRhID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVEYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGNvbW1hbmQuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5jaGVja1dpbmRvdyhjb21waWxlclNlcnZpY2VQcmVkaWNhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZC5jaGVja1dpbmRvdyhwcmVkaWNhdGVEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3dzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBXaW5kb3dOb3RGb3VuZEVycm9yKCk7XG5cbiAgICAgICAgaWYgKHdpbmRvd3MubGVuZ3RoID4gMSlcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHsgbWVzc2FnZTogV0FSTklOR19NRVNTQUdFLm11bHRpcGxlV2luZG93c0ZvdW5kQnlQcmVkaWNhdGUsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IFN3aXRjaFRvV2luZG93Q29tbWFuZCh7IHdpbmRvd0lkOiB3aW5kb3dzWzBdLmlkIH0sIHRoaXMpIGFzIENvbW1hbmRCYXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kaXNjb25uZWN0IChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50RHJpdmVyVGFzaylcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKGVycik7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdkaXNjb25uZWN0ZWQnLCBlcnIpO1xuXG4gICAgICAgIHRlc3RSdW5UcmFja2VyLnJlbW92ZUFjdGl2ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QgKCk6IENvbW1hbmRCYXNlIHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBlbWl0QWN0aW9uRXZlbnQgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF0aGlzLnByZXZlbnRFbWl0QWN0aW9uRXZlbnRzKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5lbWl0KGV2ZW50TmFtZSwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc011bHRpcGxlV2luZG93c0FsbG93ZWQgKHRlc3RSdW46IFRlc3RSdW4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgeyBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzLCB0ZXN0IH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIHJldHVybiAhZGlzYWJsZU11bHRpcGxlV2luZG93cyAmJiAhKHRlc3QgYXMgTGVnYWN5VGVzdFJ1bikuaXNMZWdhY3kgJiYgISF0ZXN0UnVuLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0aWFsaXplICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVyU2VydmljZSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5pbml0aWFsaXplVGVzdFJ1bkRhdGEoe1xuICAgICAgICAgICAgdGVzdFJ1bklkOiAgICAgIHRoaXMuaWQsXG4gICAgICAgICAgICB0ZXN0SWQ6ICAgICAgICAgdGhpcy50ZXN0LmlkLFxuICAgICAgICAgICAgYnJvd3NlcjogICAgICAgIHRoaXMuYnJvd3NlcixcbiAgICAgICAgICAgIGFjdGl2ZVdpbmRvd0lkOiB0aGlzLmFjdGl2ZVdpbmRvd0lkLFxuICAgICAgICAgICAgbWVzc2FnZUJ1czogICAgIHRoaXMuX21lc3NhZ2VCdXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYWN0aXZlV2luZG93SWQgKCk6IG51bGwgfCBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5hY3RpdmVXaW5kb3dJZDtcbiAgICB9XG5cbiAgICAvLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIGlzIHRpbWUtY3JpdGljYWwgYW5kIG11c3QgcmV0dXJuIEFTQVAgdG8gYXZvaWQgY2xpZW50IGRpc2Nvbm5lY3Rpb25cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMucmVhZHldIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKG1zZy5zdGF0dXMuaXNPYnNlcnZpbmdGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvdylcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlRG93bmxvYWRpbmdJbk5ld1dpbmRvd1JlcXVlc3QoKTtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy50ZXN0UnVuUmVxdWVzdEluRGlzY29ubmVjdGVkQnJvd3NlciwgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5icm93c2VySW5mby5hbGlhcykpO1xuXG4gICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nUmVxdWVzdCgpO1xuXG4gICAgICAgIC8vIE5PVEU6IHRoZSBkcml2ZXIgc2VuZHMgdGhlIHN0YXR1cyBmb3IgdGhlIHNlY29uZCB0aW1lIGlmIGl0IGRpZG4ndCBnZXQgYSByZXNwb25zZSBhdCB0aGVcbiAgICAgICAgLy8gZmlyc3QgdHJ5LiBUaGlzIGlzIHBvc3NpYmxlIHdoZW4gdGhlIHBhZ2Ugd2FzIHVubG9hZGVkIGFmdGVyIHRoZSBkcml2ZXIgc2VudCB0aGUgc3RhdHVzLlxuICAgICAgICBpZiAobXNnLnN0YXR1cy5pZCA9PT0gdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U7XG5cbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQgICAgICAgPSBtc2cuc3RhdHVzLmlkO1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IHRoaXMuX2hhbmRsZURyaXZlclJlcXVlc3QobXNnLnN0YXR1cyk7XG5cbiAgICAgICAgaWYgKHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlIHx8IG1zZy5zdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlO1xuXG4gICAgICAgIC8vIE5PVEU6IHdlIHNlbmQgYW4gZW1wdHkgcmVzcG9uc2UgYWZ0ZXIgdGhlIE1BWF9SRVNQT05TRV9ERUxBWSB0aW1lb3V0IGlzIGV4Y2VlZGVkIHRvIGtlZXAgY29ubmVjdGlvblxuICAgICAgICAvLyB3aXRoIHRoZSBjbGllbnQgYW5kIHByZXZlbnQgdGhlIHJlc3BvbnNlIHRpbWVvdXQgZXhjZXB0aW9uIG9uIHRoZSBjbGllbnQgc2lkZVxuICAgICAgICBjb25zdCByZXNwb25zZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChudWxsKSwgTUFYX1JFU1BPTlNFX0RFTEFZKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IHsgcmVzb2x2ZSwgcmVqZWN0LCByZXNwb25zZVRpbWVvdXQgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLnJlYWR5Rm9yQnJvd3Nlck1hbmlwdWxhdGlvbl0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8QnJvd3Nlck1hbmlwdWxhdGlvblJlc3VsdD4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmRyaXZlck1lc3NhZ2UobXNnKTtcblxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgbGV0IGVycm9yICA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLmV4ZWN1dGVQZW5kaW5nTWFuaXB1bGF0aW9uKG1zZywgdGhpcy5fbWVzc2FnZUJ1cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZXN1bHQsIGVycm9yIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBbQ0xJRU5UX01FU1NBR0VTLndhaXRGb3JGaWxlRG93bmxvYWRdIChtc2c6IERyaXZlck1lc3NhZ2UpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgdGhpcy5kZWJ1Z0xvZy5kcml2ZXJNZXNzYWdlKG1zZyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSByZXNvbHZlO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
1066
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC1ydW4vaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG1DQUlnQjtBQUVoQixtQ0FBZ0M7QUFDaEMsMkRBQXNEO0FBQ3RELHNFQUE2QztBQUM3Qyx3REFBZ0M7QUFDaEMsdUZBQTZEO0FBQzdELDREQUEwQztBQUMxQyxpR0FBb0Y7QUFDcEYsc0VBQXFEO0FBQ3JELCtDQUFpRDtBQUVqRCxrREFVNkI7QUFFN0Isd0VBQWdEO0FBQ2hELDJEQUEyQztBQUMzQywyREFBbUM7QUFDbkMsbUZBQXlEO0FBQ3pELG9FQUE0QztBQUM1QywrRUFBcUQ7QUFDckQsMERBQXVDO0FBQ3ZDLDBFQUF5RDtBQUN6RCwwRkFBZ0U7QUFDaEUsK0VBQXNEO0FBQ3RELHVGQUErRDtBQUUvRCw2REFVNkI7QUFFN0IsbUVBQXFEO0FBQ3JELDBEQUF3RTtBQUN4RSwrRUFBd0U7QUFDeEUsNENBQStFO0FBRS9FLDRDQVEwQjtBQUUxQixnREFTNEI7QUFFNUIsMkNBQWtFO0FBQ2xFLDRGQUFpRTtBQUNqRSwrRkFBNEU7QUFDNUUsK0RBQXlGO0FBS3pGLDhFQUFxRDtBQUVyRCw4RkFBb0U7QUFDcEUsOEZBQW9FO0FBTXBFLGdEQUFvRTtBQUtwRSx1R0FBNkU7QUFNN0Usb0RBQW1DO0FBRW5DLHdEQUlnQztBQUVoQyxtSEFBa0o7QUFDbEosMkZBQWlFO0FBQ2pFLGlHQUF1RTtBQUN2RSx1RUFBOEM7QUFDOUMsc0VBQXVEO0FBQ3ZELHlFQUFnRDtBQUdoRCwrRkFBb0U7QUFDcEUsNkJBQTBCO0FBRTFCLDBEQUFtRTtBQUVuRSxNQUFNLFdBQVcsR0FBbUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLE1BQU0scUJBQXFCLEdBQVMsV0FBVyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7QUFDL0YsTUFBTSxl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QUUsR0FBa0I7UUFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQztnQkFDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2pCOztnQkFFRyxJQUFJLENBQUMsb0NBQW9DLEdBQUcsT0FBTyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBMzBDRCwwQkEyMENDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBwdWxsLFxuICAgIHJlbW92ZSxcbiAgICBjaGFpbixcbn0gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSAnbmFub2lkJztcbmltcG9ydCB7IHJlYWRTeW5jIGFzIHJlYWQgfSBmcm9tICdyZWFkLWZpbGUtcmVsYXRpdmUnO1xuaW1wb3J0IHByb21pc2lmeUV2ZW50IGZyb20gJ3Byb21pc2lmeS1ldmVudCc7XG5pbXBvcnQgTXVzdGFjaGUgZnJvbSAnbXVzdGFjaGUnO1xuaW1wb3J0IEFzeW5jRXZlbnRFbWl0dGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWV2ZW50LWVtaXR0ZXInO1xuaW1wb3J0IFRlc3RSdW5EZWJ1Z0xvZyBmcm9tICcuL2RlYnVnLWxvZyc7XG5pbXBvcnQgVGVzdFJ1bkVycm9yRm9ybWF0dGFibGVBZGFwdGVyIGZyb20gJy4uL2Vycm9ycy90ZXN0LXJ1bi9mb3JtYXR0YWJsZS1hZGFwdGVyJztcbmltcG9ydCBUZXN0Q2FmZUVycm9yTGlzdCBmcm9tICcuLi9lcnJvcnMvZXJyb3ItbGlzdCc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5cbmltcG9ydCB7XG4gICAgUmVxdWVzdEhvb2tVbmhhbmRsZWRFcnJvcixcbiAgICBQYWdlTG9hZEVycm9yLFxuICAgIFJvbGVTd2l0Y2hJblJvbGVJbml0aWFsaXplckVycm9yLFxuICAgIFN3aXRjaFRvV2luZG93UHJlZGljYXRlRXJyb3IsXG4gICAgV2luZG93Tm90Rm91bmRFcnJvcixcbiAgICBSZXF1ZXN0SG9va0Jhc2VFcnJvcixcbiAgICBUZXN0VGltZW91dEVycm9yLFxuICAgIEV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yLFxuICAgIFJ1blRpbWVvdXRFcnJvcixcbn0gZnJvbSAnLi4vZXJyb3JzL3Rlc3QtcnVuLyc7XG5cbmltcG9ydCBDTElFTlRfTUVTU0FHRVMgZnJvbSAnLi9jbGllbnQtbWVzc2FnZXMnO1xuaW1wb3J0IENPTU1BTkRfVFlQRSBmcm9tICcuL2NvbW1hbmRzL3R5cGUnO1xuaW1wb3J0IGRlbGF5IGZyb20gJy4uL3V0aWxzL2RlbGF5JztcbmltcG9ydCBpc1Bhc3N3b3JkSW5wdXQgZnJvbSAnLi4vdXRpbHMvaXMtcGFzc3dvcmQtaW5wdXQnO1xuaW1wb3J0IHRlc3RSdW5NYXJrZXIgZnJvbSAnLi9tYXJrZXItc3ltYm9sJztcbmltcG9ydCB0ZXN0UnVuVHJhY2tlciBmcm9tICcuLi9hcGkvdGVzdC1ydW4tdHJhY2tlcic7XG5pbXBvcnQgUk9MRV9QSEFTRSBmcm9tICcuLi9yb2xlL3BoYXNlJztcbmltcG9ydCBSZXBvcnRlclBsdWdpbkhvc3QgZnJvbSAnLi4vcmVwb3J0ZXIvcGx1Z2luLWhvc3QnO1xuaW1wb3J0IEJyb3dzZXJDb25zb2xlTWVzc2FnZXMgZnJvbSAnLi9icm93c2VyLWNvbnNvbGUtbWVzc2FnZXMnO1xuaW1wb3J0IFdhcm5pbmdMb2cgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLWxvZyc7XG5pbXBvcnQgV0FSTklOR19NRVNTQUdFIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvd2FybmluZy1tZXNzYWdlJztcblxuaW1wb3J0IHtcbiAgICBTdGF0ZVNuYXBzaG90LFxuICAgIFNQRUNJQUxfRVJST1JfUEFHRSxcbiAgICBSZXF1ZXN0RmlsdGVyUnVsZSxcbiAgICBJbmplY3RhYmxlUmVzb3VyY2VzLFxuICAgIFJlcXVlc3RFdmVudCxcbiAgICBDb25maWd1cmVSZXNwb25zZUV2ZW50LFxuICAgIFJlc3BvbnNlRXZlbnQsXG4gICAgUmVxdWVzdEhvb2tNZXRob2RFcnJvcixcbiAgICBTdG9yYWdlc1NuYXBzaG90LFxufSBmcm9tICd0ZXN0Y2FmZS1oYW1tZXJoZWFkJztcblxuaW1wb3J0ICogYXMgSU5KRUNUQUJMRVMgZnJvbSAnLi4vYXNzZXRzL2luamVjdGFibGVzJztcbmltcG9ydCB7IGZpbmRQcm9ibGVtYXRpY1NjcmlwdHMgfSBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvdXRpbHMnO1xuaW1wb3J0IGdldEN1c3RvbUNsaWVudFNjcmlwdFVybCBmcm9tICcuLi9jdXN0b20tY2xpZW50LXNjcmlwdHMvZ2V0LXVybCc7XG5pbXBvcnQgeyBnZXRQbHVyYWxTdWZmaXgsIGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyB9IGZyb20gJy4uL3V0aWxzL3N0cmluZyc7XG5cbmltcG9ydCB7XG4gICAgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yLFxuICAgIGlzQnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmQsXG4gICAgaXNTY3JlZW5zaG90Q29tbWFuZCxcbiAgICBpc1NlcnZpY2VDb21tYW5kLFxuICAgIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQsXG4gICAgaXNFeGVjdXRhYmxlT25DbGllbnRDb21tYW5kLFxuICAgIGlzUmVzaXplV2luZG93Q29tbWFuZCxcbn0gZnJvbSAnLi9jb21tYW5kcy91dGlscyc7XG5cbmltcG9ydCB7XG4gICAgRXhlY3V0ZUFzeW5jRXhwcmVzc2lvbkNvbW1hbmQsXG4gICAgRXhlY3V0ZUV4cHJlc3Npb25Db21tYW5kLFxuICAgIEdldEN1cnJlbnRXaW5kb3dzQ29tbWFuZCxcbiAgICBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCxcbiAgICBTd2l0Y2hUb1dpbmRvd0NvbW1hbmQsXG4gICAgR2V0Q29va2llc0NvbW1hbmQsXG4gICAgU2V0Q29va2llc0NvbW1hbmQsXG4gICAgRGVsZXRlQ29va2llc0NvbW1hbmQsXG59IGZyb20gJy4vY29tbWFuZHMvYWN0aW9ucyc7XG5cbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTLCBURVNUX1JVTl9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuaW1wb3J0IHByb2Nlc3NUZXN0Rm5FcnJvciBmcm9tICcuLi9lcnJvcnMvcHJvY2Vzcy10ZXN0LWZuLWVycm9yJztcbmltcG9ydCBSZXF1ZXN0SG9va01ldGhvZE5hbWVzIGZyb20gJy4uL2FwaS9yZXF1ZXN0LWhvb2tzL2hvb2stbWV0aG9kLW5hbWVzJztcbmltcG9ydCB7IGNyZWF0ZVJlcGxpY2F0b3IsIFNlbGVjdG9yTm9kZVRyYW5zZm9ybSB9IGZyb20gJy4uL2NsaWVudC1mdW5jdGlvbnMvcmVwbGljYXRvcic7XG5pbXBvcnQgVGVzdCBmcm9tICcuLi9hcGkvc3RydWN0dXJlL3Rlc3QnO1xuaW1wb3J0IENhcHR1cmVyIGZyb20gJy4uL3NjcmVlbnNob3RzL2NhcHR1cmVyJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICcuLi9jb25maWd1cmF0aW9uL2ludGVyZmFjZXMnO1xuaW1wb3J0IENvbXBpbGVyU2VydmljZSBmcm9tICcuLi9zZXJ2aWNlcy9jb21waWxlci9ob3N0JztcbmltcG9ydCBTZXNzaW9uQ29udHJvbGxlciBmcm9tICcuL3Nlc3Npb24tY29udHJvbGxlcic7XG5pbXBvcnQgVGVzdENvbnRyb2xsZXIgZnJvbSAnLi4vYXBpL3Rlc3QtY29udHJvbGxlcic7XG5pbXBvcnQgQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlIGZyb20gJy4vYnJvd3Nlci1tYW5pcHVsYXRpb24tcXVldWUnO1xuaW1wb3J0IE9ic2VydmVkQ2FsbHNpdGVzU3RvcmFnZSBmcm9tICcuL29ic2VydmVkLWNhbGxzaXRlcy1zdG9yYWdlJztcbmltcG9ydCBDbGllbnRTY3JpcHQgZnJvbSAnLi4vY3VzdG9tLWNsaWVudC1zY3JpcHRzL2NsaWVudC1zY3JpcHQnO1xuaW1wb3J0IEJyb3dzZXJDb25uZWN0aW9uIGZyb20gJy4uL2Jyb3dzZXIvY29ubmVjdGlvbic7XG5pbXBvcnQgeyBRdWFyYW50aW5lIH0gZnJvbSAnLi4vdXRpbHMvZ2V0LW9wdGlvbnMvcXVhcmFudGluZSc7XG5pbXBvcnQgUmVxdWVzdEhvb2sgZnJvbSAnLi4vYXBpL3JlcXVlc3QtaG9va3MvaG9vayc7XG5pbXBvcnQgRHJpdmVyU3RhdHVzIGZyb20gJy4uL2NsaWVudC9kcml2ZXIvc3RhdHVzJztcbmltcG9ydCB7IENvbW1hbmRCYXNlLCBBY3Rpb25Db21tYW5kQmFzZSB9IGZyb20gJy4vY29tbWFuZHMvYmFzZS5qcyc7XG5pbXBvcnQgUm9sZSBmcm9tICcuLi9yb2xlL3JvbGUnO1xuaW1wb3J0IHsgVGVzdFJ1bkVycm9yQmFzZSB9IGZyb20gJy4uL3NoYXJlZC9lcnJvcnMnO1xuaW1wb3J0IHsgQ2FsbHNpdGVSZWNvcmQgfSBmcm9tICdjYWxsc2l0ZS1yZWNvcmQnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IGdldEFzc2VydGlvblRpbWVvdXQgZnJvbSAnLi4vdXRpbHMvZ2V0LW9wdGlvbnMvZ2V0LWFzc2VydGlvbi10aW1lb3V0JztcbmltcG9ydCB7IEFzc2VydGlvbkNvbW1hbmQgfSBmcm9tICcuL2NvbW1hbmRzL2Fzc2VydGlvbic7XG5pbXBvcnQgeyBUYWtlU2NyZWVuc2hvdEJhc2VDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcy9icm93c2VyLW1hbmlwdWxhdGlvbic7XG4vL0B0cy1pZ25vcmVcbmltcG9ydCB7IFRlc3RSdW4gYXMgTGVnYWN5VGVzdFJ1biB9IGZyb20gJ3Rlc3RjYWZlLWxlZ2FjeS1hcGknO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWxzIH0gZnJvbSAnLi4vYXBpL3N0cnVjdHVyZS9pbnRlcmZhY2VzJztcbmltcG9ydCBUZXN0UnVuUGhhc2UgZnJvbSAnLi9waGFzZSc7XG5cbmltcG9ydCB7XG4gICAgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZCxcbiAgICBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSxcbiAgICBFeGVjdXRlU2VsZWN0b3JDb21tYW5kLFxufSBmcm9tICcuL2NvbW1hbmRzL29ic2VydmF0aW9uJztcblxuaW1wb3J0IHsgUkVfRVhFQ1VUQUJMRV9QUk9NSVNFX01BUktFUl9ERVNDUklQVElPTiB9IGZyb20gJy4uL3NlcnZpY2VzL3NlcmlhbGl6YXRpb24vcmVwbGljYXRvci90cmFuc2Zvcm1zL3JlLWV4ZWN1dGFibGUtcHJvbWlzZS10cmFuc2Zvcm0vbWFya2VyJztcbmltcG9ydCBSZUV4ZWN1dGFibGVQcm9taXNlIGZyb20gJy4uL3V0aWxzL3JlLWV4ZWN1dGFibGUtcHJvbWlzZSc7XG5pbXBvcnQgYWRkUmVuZGVyZWRXYXJuaW5nIGZyb20gJy4uL25vdGlmaWNhdGlvbnMvYWRkLXJlbmRlcmVkLXdhcm5pbmcnO1xuaW1wb3J0IGdldEJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvZ2V0LWJyb3dzZXInO1xuaW1wb3J0IEFzc2VydGlvbkV4ZWN1dG9yIGZyb20gJy4uL2Fzc2VydGlvbnMvZXhlY3V0b3InO1xuaW1wb3J0IGFzeW5jRmlsdGVyIGZyb20gJy4uL3V0aWxzL2FzeW5jLWZpbHRlcic7XG5pbXBvcnQgRml4dHVyZSBmcm9tICcuLi9hcGkvc3RydWN0dXJlL2ZpeHR1cmUnO1xuaW1wb3J0IE1lc3NhZ2VCdXMgZnJvbSAnLi4vdXRpbHMvbWVzc2FnZS1idXMnO1xuaW1wb3J0IGV4ZWN1dGVGbldpdGhUaW1lb3V0IGZyb20gJy4uL3V0aWxzL2V4ZWN1dGUtZm4td2l0aC10aW1lb3V0JztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBDb29raWVPcHRpb25zIH0gZnJvbSAnLi9jb21tYW5kcy9vcHRpb25zJztcbmltcG9ydCB7IHByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb25zIH0gZnJvbSAnLi4vYXBpL3NraXAtanMtZXJyb3JzJztcblxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICAgICAgICAgID0gcmVxdWlyZSgnaW1wb3J0LWxhenknKShyZXF1aXJlKTtcbmNvbnN0IENsaWVudEZ1bmN0aW9uQnVpbGRlciAgICAgICA9IGxhenlSZXF1aXJlKCcuLi9jbGllbnQtZnVuY3Rpb25zL2NsaWVudC1mdW5jdGlvbi1idWlsZGVyJyk7XG5jb25zdCBUZXN0UnVuQm9va21hcmsgICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi9ib29rbWFyaycpO1xuY29uc3QgYWN0aW9uQ29tbWFuZHMgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYWN0aW9ucycpO1xuY29uc3QgYnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmRzID0gbGF6eVJlcXVpcmUoJy4vY29tbWFuZHMvYnJvd3Nlci1tYW5pcHVsYXRpb24nKTtcbmNvbnN0IHNlcnZpY2VDb21tYW5kcyAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL3NlcnZpY2UnKTtcbmNvbnN0IG9ic2VydmF0aW9uQ29tbWFuZHMgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2NvbW1hbmRzL29ic2VydmF0aW9uJyk7XG5cbmNvbnN0IHsgZXhlY3V0ZUpzRXhwcmVzc2lvbiwgZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIH0gPSBsYXp5UmVxdWlyZSgnLi9leGVjdXRlLWpzLWV4cHJlc3Npb24nKTtcblxuY29uc3QgVEVTVF9SVU5fVEVNUExBVEUgICAgICAgICAgICAgICA9IHJlYWQoJy4uL2NsaWVudC90ZXN0LXJ1bi9pbmRleC5qcy5tdXN0YWNoZScpIGFzIHN0cmluZztcbmNvbnN0IElGUkFNRV9URVNUX1JVTl9URU1QTEFURSAgICAgICAgPSByZWFkKCcuLi9jbGllbnQvdGVzdC1ydW4vaWZyYW1lLmpzLm11c3RhY2hlJykgYXMgc3RyaW5nO1xuY29uc3QgVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRSA9ICd0ZXN0LWRvbmUtY29uZmlybWF0aW9uJztcbmNvbnN0IE1BWF9SRVNQT05TRV9ERUxBWSAgICAgICAgICAgICAgPSAzMDAwO1xuY29uc3QgQ0hJTERfV0lORE9XX1JFQURZX1RJTUVPVVQgICAgICA9IDMwICogMTAwMDtcblxuY29uc3QgQUxMX0RSSVZFUl9UQVNLU19BRERFRF9UT19RVUVVRV9FVkVOVCA9ICdhbGwtZHJpdmVyLXRhc2tzLWFkZGVkLXRvLXF1ZXVlJztcblxuY29uc3QgQ09NUElMRVJfU0VSVklDRV9FVkVOVFMgPSBbXG4gICAgJ3NldE1vY2snLFxuICAgICdzZXRDb25maWd1cmVSZXNwb25zZUV2ZW50T3B0aW9ucycsXG4gICAgJ3NldEhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG4gICAgJ3JlbW92ZUhlYWRlck9uQ29uZmlndXJlUmVzcG9uc2VFdmVudCcsXG5dO1xuXG5cbmludGVyZmFjZSBUZXN0UnVuSW5pdCB7XG4gICAgdGVzdDogVGVzdDtcbiAgICBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgc2NyZWVuc2hvdENhcHR1cmVyOiBDYXB0dXJlcjtcbiAgICBnbG9iYWxXYXJuaW5nTG9nOiBXYXJuaW5nTG9nO1xuICAgIG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIGNvbXBpbGVyU2VydmljZT86IENvbXBpbGVyU2VydmljZTtcbiAgICBtZXNzYWdlQnVzPzogTWVzc2FnZUJ1cztcbiAgICBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xufVxuXG5pbnRlcmZhY2UgRHJpdmVyVGFzayB7XG4gICAgY29tbWFuZDogQ29tbWFuZEJhc2U7XG4gICAgcmVzb2x2ZTogRnVuY3Rpb247XG4gICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQ7XG59XG5cbmludGVyZmFjZSBEcml2ZXJNZXNzYWdlIHtcbiAgICBzdGF0dXM6IERyaXZlclN0YXR1cztcbn1cblxuaW50ZXJmYWNlIFJlcXVlc3RUaW1lb3V0IHtcbiAgICBwYWdlPzogbnVtYmVyO1xuICAgIGFqYXg/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBFeGVjdXRpb25UaW1lb3V0IHtcbiAgICB0aW1lb3V0OiBudW1iZXI7XG4gICAgcmVqZWN0V2l0aDogVGVzdFRpbWVvdXRFcnJvciB8IFJ1blRpbWVvdXRFcnJvcjtcbn1cblxuaW50ZXJmYWNlIFBlbmRpbmdSZXF1ZXN0IHtcbiAgICByZXNwb25zZVRpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0O1xuICAgIHJlc29sdmU6IEZ1bmN0aW9uO1xuICAgIHJlamVjdDogRnVuY3Rpb247XG59XG5cbmludGVyZmFjZSBCcm93c2VyTWFuaXB1bGF0aW9uUmVzdWx0IHtcbiAgICByZXN1bHQ6IHVua25vd247XG4gICAgZXJyb3I6IEVycm9yO1xufVxuXG5pbnRlcmZhY2UgT3BlbmVkV2luZG93SW5mb3JtYXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVzdFJ1biBleHRlbmRzIEFzeW5jRXZlbnRFbWl0dGVyIHtcbiAgICBwcml2YXRlIFt0ZXN0UnVuTWFya2VyXTogYm9vbGVhbjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ0xvZzogV2FybmluZ0xvZztcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+O1xuICAgIHB1YmxpYyByZWFkb25seSB0ZXN0OiBUZXN0O1xuICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQ29ubmVjdGlvbjogQnJvd3NlckNvbm5lY3Rpb247XG4gICAgcHVibGljIHVuc3RhYmxlOiBib29sZWFuO1xuICAgIHB1YmxpYyBwaGFzZTogVGVzdFJ1blBoYXNlO1xuICAgIHByaXZhdGUgZHJpdmVyVGFza1F1ZXVlOiBEcml2ZXJUYXNrW107XG4gICAgcHJpdmF0ZSB0ZXN0RG9uZUNvbW1hbmRRdWV1ZWQ6IGJvb2xlYW47XG4gICAgcHVibGljIGFjdGl2ZURpYWxvZ0hhbmRsZXI6IEV4ZWN1dGVDbGllbnRGdW5jdGlvbkNvbW1hbmQgfCBudWxsO1xuICAgIHB1YmxpYyBhY3RpdmVJZnJhbWVTZWxlY3RvcjogRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8IG51bGw7XG4gICAgcHVibGljIHNwZWVkOiBudW1iZXI7XG4gICAgcHVibGljIHBhZ2VMb2FkVGltZW91dDogbnVtYmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdGVzdEV4ZWN1dGlvblRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcnVuRXhlY3V0aW9uVGltZW91dDogRXhlY3V0aW9uVGltZW91dCB8IG51bGw7XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZVJlbG9hZHM6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlUGFnZUNhY2hpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkaXNhYmxlTXVsdGlwbGVXaW5kb3dzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVxdWVzdFRpbWVvdXQ6IFJlcXVlc3RUaW1lb3V0O1xuICAgIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uQ29udHJvbGxlcjtcbiAgICBwdWJsaWMgY29uc29sZU1lc3NhZ2VzOiBCcm93c2VyQ29uc29sZU1lc3NhZ2VzO1xuICAgIHByaXZhdGUgcGVuZGluZ1JlcXVlc3Q6IFBlbmRpbmdSZXF1ZXN0IHwgbnVsbDtcbiAgICBwcml2YXRlIHBlbmRpbmdQYWdlRXJyb3I6IFBhZ2VMb2FkRXJyb3IgfCBFcnJvciB8IG51bGw7XG4gICAgcHVibGljIGNvbnRyb2xsZXI6IFRlc3RDb250cm9sbGVyIHwgbnVsbDtcbiAgICBwdWJsaWMgY3R4OiBvYmplY3Q7XG4gICAgcHVibGljIGZpeHR1cmVDdHg6IG9iamVjdCB8IG51bGw7XG4gICAgcHVibGljIHRlc3RSdW5DdHg6IG9iamVjdCB8IG51bGw7XG4gICAgcHJpdmF0ZSBjdXJyZW50Um9sZUlkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlZFJvbGVTdGF0ZXM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgcHVibGljIGVycnM6IFRlc3RSdW5FcnJvckZvcm1hdHRhYmxlQWRhcHRlcltdO1xuICAgIHByaXZhdGUgbGFzdERyaXZlclN0YXR1c0lkOiBzdHJpbmcgfCBudWxsO1xuICAgIHByaXZhdGUgbGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlOiBDb21tYW5kQmFzZSB8IG51bGwgfCBzdHJpbmc7XG4gICAgcHJpdmF0ZSBmaWxlRG93bmxvYWRpbmdIYW5kbGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZTogRnVuY3Rpb24gfCBudWxsO1xuICAgIHByaXZhdGUgYWRkaW5nRHJpdmVyVGFza3NDb3VudDogbnVtYmVyO1xuICAgIHB1YmxpYyBkZWJ1Z2dpbmc6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z09uRmFpbDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVidWdSZXBvcnRlclBsdWdpbkhvc3Q6IFJlcG9ydGVyUGx1Z2luSG9zdDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZTogQnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlO1xuICAgIHByaXZhdGUgZGVidWdMb2c6IFRlc3RSdW5EZWJ1Z0xvZztcbiAgICBwdWJsaWMgcXVhcmFudGluZTogUXVhcmFudGluZSB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJ1Z0xvZ2dlcjogYW55O1xuICAgIHB1YmxpYyBvYnNlcnZlZENhbGxzaXRlczogT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlO1xuICAgIHB1YmxpYyByZWFkb25seSBjb21waWxlclNlcnZpY2U/OiBDb21waWxlclNlcnZpY2U7XG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBsaWNhdG9yOiBhbnk7XG4gICAgcHJpdmF0ZSBkaXNjb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBlcnJTY3JlZW5zaG90UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICBwcml2YXRlIGFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzOiBNYXA8c3RyaW5nLCBDYWxsc2l0ZVJlY29yZD47XG4gICAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXI6IEJyb3dzZXI7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfbWVzc2FnZUJ1cz86IE1lc3NhZ2VCdXM7XG4gICAgcHJpdmF0ZSBfY2xpZW50RW52aXJvbm1lbnRQcmVwYXJlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyByZWFkb25seSBzdGFydFJ1bkV4ZWN1dGlvblRpbWU/OiBEYXRlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICh7IHRlc3QsIGJyb3dzZXJDb25uZWN0aW9uLCBzY3JlZW5zaG90Q2FwdHVyZXIsIGdsb2JhbFdhcm5pbmdMb2csIG9wdHMsIGNvbXBpbGVyU2VydmljZSwgbWVzc2FnZUJ1cywgc3RhcnRSdW5FeGVjdXRpb25UaW1lIH06IFRlc3RSdW5Jbml0KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpc1t0ZXN0UnVuTWFya2VyXSAgICA9IHRydWU7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VCdXMgICAgICAgPSBtZXNzYWdlQnVzO1xuICAgICAgICB0aGlzLndhcm5pbmdMb2cgICAgICAgID0gbmV3IFdhcm5pbmdMb2coZ2xvYmFsV2FybmluZ0xvZywgV2FybmluZ0xvZy5jcmVhdGVBZGRXYXJuaW5nQ2FsbGJhY2sobWVzc2FnZUJ1cywgdGhpcykpO1xuICAgICAgICB0aGlzLm9wdHMgICAgICAgICAgICAgID0gb3B0cztcbiAgICAgICAgdGhpcy50ZXN0ICAgICAgICAgICAgICA9IHRlc3Q7XG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24gPSBicm93c2VyQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy51bnN0YWJsZSAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJyb3dzZXIgICAgICAgICAgID0gZ2V0QnJvd3Nlcihicm93c2VyQ29ubmVjdGlvbik7XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5pbml0aWFsO1xuXG4gICAgICAgIHRoaXMuZHJpdmVyVGFza1F1ZXVlICAgICAgID0gW107XG4gICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5hY3RpdmVEaWFsb2dIYW5kbGVyICA9IG51bGw7XG4gICAgICAgIHRoaXMuYWN0aXZlSWZyYW1lU2VsZWN0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLnNwZWVkICAgICAgICAgICAgICAgID0gdGhpcy5vcHRzLnNwZWVkIGFzIG51bWJlcjtcbiAgICAgICAgdGhpcy5wYWdlTG9hZFRpbWVvdXQgICAgICA9IHRoaXMuX2dldFBhZ2VMb2FkVGltZW91dCh0ZXN0LCBvcHRzKTtcbiAgICAgICAgdGhpcy50ZXN0RXhlY3V0aW9uVGltZW91dCA9IHRoaXMuX2dldFRlc3RFeGVjdXRpb25UaW1lb3V0KG9wdHMpO1xuXG4gICAgICAgIHRoaXMuZGlzYWJsZVBhZ2VSZWxvYWRzICAgPSB0ZXN0LmRpc2FibGVQYWdlUmVsb2FkcyB8fCBvcHRzLmRpc2FibGVQYWdlUmVsb2FkcyBhcyBib29sZWFuICYmIHRlc3QuZGlzYWJsZVBhZ2VSZWxvYWRzICE9PSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaXNhYmxlUGFnZUNhY2hpbmcgICA9IHRlc3QuZGlzYWJsZVBhZ2VDYWNoaW5nIHx8IG9wdHMuZGlzYWJsZVBhZ2VDYWNoaW5nIGFzIGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzID0gb3B0cy5kaXNhYmxlTXVsdGlwbGVXaW5kb3dzIGFzIGJvb2xlYW47XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHRoaXMuX2dldFJlcXVlc3RUaW1lb3V0KHRlc3QsIG9wdHMpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbiA9IFNlc3Npb25Db250cm9sbGVyLmdldFNlc3Npb24odGhpcyk7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMgPSBuZXcgQnJvd3NlckNvbnNvbGVNZXNzYWdlcygpO1xuXG4gICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3QgICA9IG51bGw7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5jb250cm9sbGVyID0gbnVsbDtcbiAgICAgICAgdGhpcy5jdHggICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5maXh0dXJlQ3R4ID0gbnVsbDtcbiAgICAgICAgdGhpcy50ZXN0UnVuQ3R4ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmN1cnJlbnRSb2xlSWQgID0gbnVsbDtcbiAgICAgICAgdGhpcy51c2VkUm9sZVN0YXRlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgICAgICAgdGhpcy5lcnJzID0gW107XG5cbiAgICAgICAgdGhpcy5sYXN0RHJpdmVyU3RhdHVzSWQgICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5maWxlRG93bmxvYWRpbmdIYW5kbGVkICAgICAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCA9IDA7XG5cbiAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgICAgICAgICAgICAgICA9IHRoaXMub3B0cy5kZWJ1Z01vZGUgYXMgYm9vbGVhbjtcbiAgICAgICAgdGhpcy5kZWJ1Z09uRmFpbCAgICAgICAgICAgICA9IHRoaXMub3B0cy5kZWJ1Z09uRmFpbCBhcyBib29sZWFuO1xuICAgICAgICB0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVidWdSZXBvcnRlclBsdWdpbkhvc3QgPSBuZXcgUmVwb3J0ZXJQbHVnaW5Ib3N0KHsgbm9Db2xvcnM6IGZhbHNlIH0pO1xuXG4gICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlID0gbmV3IEJyb3dzZXJNYW5pcHVsYXRpb25RdWV1ZShicm93c2VyQ29ubmVjdGlvbiwgc2NyZWVuc2hvdENhcHR1cmVyLCB0aGlzLndhcm5pbmdMb2cpO1xuXG4gICAgICAgIHRoaXMuZGVidWdMb2cgPSBuZXcgVGVzdFJ1bkRlYnVnTG9nKHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50KTtcblxuICAgICAgICB0aGlzLnF1YXJhbnRpbmUgID0gbnVsbDtcblxuICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyID0gdGhpcy5vcHRzLmRlYnVnTG9nZ2VyO1xuXG4gICAgICAgIHRoaXMub2JzZXJ2ZWRDYWxsc2l0ZXMgICAgICAgICAgPSBuZXcgT2JzZXJ2ZWRDYWxsc2l0ZXNTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlICAgICAgICAgICAgPSBjb21waWxlclNlcnZpY2U7XG4gICAgICAgIHRoaXMuYXN5bmNKc0V4cHJlc3Npb25DYWxsc2l0ZXMgPSBuZXcgTWFwPHN0cmluZywgQ2FsbHNpdGVSZWNvcmQ+KCk7XG5cbiAgICAgICAgdGhpcy5yZXBsaWNhdG9yID0gY3JlYXRlUmVwbGljYXRvcihbIG5ldyBTZWxlY3Rvck5vZGVUcmFuc2Zvcm0oKSBdKTtcblxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RlZCAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBudWxsO1xuXG4gICAgICAgIHRoaXMuc3RhcnRSdW5FeGVjdXRpb25UaW1lID0gc3RhcnRSdW5FeGVjdXRpb25UaW1lO1xuICAgICAgICB0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQgICA9IHRoaXMuX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQob3B0cyk7XG5cbiAgICAgICAgdGhpcy5fYWRkSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgdGhpcy5faW5pdFJlcXVlc3RIb29rcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFBhZ2VMb2FkVGltZW91dCAodGVzdDogVGVzdCwgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBudW1iZXIge1xuICAgICAgICBpZiAodGVzdC50aW1lb3V0cz8ucGFnZUxvYWRUaW1lb3V0ICE9PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm4gdGVzdC50aW1lb3V0cy5wYWdlTG9hZFRpbWVvdXQ7XG5cbiAgICAgICAgcmV0dXJuIG9wdHMucGFnZUxvYWRUaW1lb3V0IGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRSZXF1ZXN0VGltZW91dCAodGVzdDogVGVzdCwgb3B0czogRGljdGlvbmFyeTxPcHRpb25WYWx1ZT4pOiBSZXF1ZXN0VGltZW91dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlOiB0ZXN0LnRpbWVvdXRzPy5wYWdlUmVxdWVzdFRpbWVvdXQgfHwgb3B0cy5wYWdlUmVxdWVzdFRpbWVvdXQgYXMgbnVtYmVyLFxuICAgICAgICAgICAgYWpheDogdGVzdC50aW1lb3V0cz8uYWpheFJlcXVlc3RUaW1lb3V0IHx8IG9wdHMuYWpheFJlcXVlc3RUaW1lb3V0IGFzIG51bWJlcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRFeGVjdXRpb25UaW1lb3V0ICh0aW1lb3V0OiBudW1iZXIsIGVycm9yOiBUZXN0VGltZW91dEVycm9yIHwgUnVuVGltZW91dEVycm9yKTogRXhlY3V0aW9uVGltZW91dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgICAgcmVqZWN0V2l0aDogZXJyb3IsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0VGVzdEV4ZWN1dGlvblRpbWVvdXQgKG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+KTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBjb25zdCB0ZXN0RXhlY3V0aW9uVGltZW91dCA9IG9wdHMudGVzdEV4ZWN1dGlvblRpbWVvdXQgYXMgbnVtYmVyIHx8IDA7XG5cbiAgICAgICAgaWYgKCF0ZXN0RXhlY3V0aW9uVGltZW91dClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFeGVjdXRpb25UaW1lb3V0KHRlc3RFeGVjdXRpb25UaW1lb3V0LCBuZXcgVGVzdFRpbWVvdXRFcnJvcih0ZXN0RXhlY3V0aW9uVGltZW91dCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFJ1bkV4ZWN1dGlvblRpbWVvdXQgKG9wdHM6IERpY3Rpb25hcnk8T3B0aW9uVmFsdWU+KTogRXhlY3V0aW9uVGltZW91dCB8IG51bGwge1xuICAgICAgICBjb25zdCBydW5FeGVjdXRpb25UaW1lb3V0ID0gb3B0cy5ydW5FeGVjdXRpb25UaW1lb3V0IGFzIG51bWJlciB8fCAwO1xuXG4gICAgICAgIGlmICghcnVuRXhlY3V0aW9uVGltZW91dClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRFeGVjdXRpb25UaW1lb3V0KHJ1bkV4ZWN1dGlvblRpbWVvdXQsIG5ldyBSdW5UaW1lb3V0RXJyb3IocnVuRXhlY3V0aW9uVGltZW91dCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQgKCk6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXJ0UnVuRXhlY3V0aW9uVGltZSB8fCAhdGhpcy5ydW5FeGVjdXRpb25UaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY3VycmVudFRpbWVvdXQgPSBNYXRoLm1heCh0aGlzLnJ1bkV4ZWN1dGlvblRpbWVvdXQudGltZW91dCAtIChEYXRlLm5vdygpIC0gdGhpcy5zdGFydFJ1bkV4ZWN1dGlvblRpbWUuZ2V0VGltZSgpKSwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEV4ZWN1dGlvblRpbWVvdXQoY3VycmVudFRpbWVvdXQsIHRoaXMucnVuRXhlY3V0aW9uVGltZW91dC5yZWplY3RXaXRoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblRpbWVvdXQgKCk6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQgJiYgKCF0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0IHx8IHRoaXMucmVzdFJ1bkV4ZWN1dGlvblRpbWVvdXQudGltZW91dCA8IHRoaXMudGVzdEV4ZWN1dGlvblRpbWVvdXQudGltZW91dClcbiAgICAgICAgICAgID8gdGhpcy5yZXN0UnVuRXhlY3V0aW9uVGltZW91dFxuICAgICAgICAgICAgOiB0aGlzLnRlc3RFeGVjdXRpb25UaW1lb3V0IHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkQ2xpZW50U2NyaXB0Q29udGVudFdhcm5pbmdzSWZOZWNlc3NhcnkgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGVtcHR5LCBkdXBsaWNhdGVkQ29udGVudCB9ID0gZmluZFByb2JsZW1hdGljU2NyaXB0cyh0aGlzLnRlc3QuY2xpZW50U2NyaXB0cyBhcyBDbGllbnRTY3JpcHRbXSk7XG5cbiAgICAgICAgaWYgKGVtcHR5Lmxlbmd0aClcbiAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKFdBUk5JTkdfTUVTU0FHRS5jbGllbnRTY3JpcHRzV2l0aEVtcHR5Q29udGVudCk7XG5cbiAgICAgICAgaWYgKGR1cGxpY2F0ZWRDb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0UGx1cmFsU3VmZml4KGR1cGxpY2F0ZWRDb250ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZWRDb250ZW50Q2xpZW50U2NyaXB0c1N0ciA9IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZyhkdXBsaWNhdGVkQ29udGVudCwgJ1xcbicpO1xuXG4gICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyhXQVJOSU5HX01FU1NBR0UuY2xpZW50U2NyaXB0c1dpdGhEdXBsaWNhdGVkQ29udGVudCwgc3VmZml4LCBkdXBsaWNhdGVkQ29udGVudENsaWVudFNjcmlwdHNTdHIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRkSW5qZWN0YWJsZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZGRDbGllbnRTY3JpcHRDb250ZW50V2FybmluZ3NJZk5lY2Vzc2FyeSgpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUuc2NyaXB0cy5wdXNoKC4uLklOSkVDVEFCTEVTLlNDUklQVFMpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUudXNlclNjcmlwdHMucHVzaCguLi50aGlzLnRlc3QuY2xpZW50U2NyaXB0cy5tYXAoc2NyaXB0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiAgZ2V0Q3VzdG9tQ2xpZW50U2NyaXB0VXJsKHNjcmlwdCBhcyBDbGllbnRTY3JpcHQpLFxuICAgICAgICAgICAgICAgIHBhZ2U6IHNjcmlwdC5wYWdlIGFzIFJlcXVlc3RGaWx0ZXJSdWxlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSkpO1xuICAgICAgICB0aGlzLmluamVjdGFibGUuc3R5bGVzLnB1c2goSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1RZTEVTKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGlkICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaW5qZWN0YWJsZSAoKTogSW5qZWN0YWJsZVJlc291cmNlcyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUXVhcmFudGluZUluZm8gKHF1YXJhbnRpbmU6IFF1YXJhbnRpbmUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5xdWFyYW50aW5lID0gcXVhcmFudGluZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudGVzdC5yZXF1ZXN0SG9va3MucHVzaChob29rKTtcbiAgICAgICAgdGhpcy5faW5pdFJlcXVlc3RIb29rKGhvb2spO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVSZXF1ZXN0SG9vayAoaG9vazogUmVxdWVzdEhvb2spOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnRlc3QucmVxdWVzdEhvb2tzLmluY2x1ZGVzKGhvb2spKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHB1bGwodGhpcy50ZXN0LnJlcXVlc3RIb29rcywgaG9vayk7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VSZXF1ZXN0SG9vayhob29rKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0UmVxdWVzdEhvb2sgKGhvb2s6IFJlcXVlc3RIb29rKTogdm9pZCB7XG4gICAgICAgIGhvb2suX3dhcm5pbmdMb2cgPSB0aGlzLndhcm5pbmdMb2c7XG5cbiAgICAgICAgaG9vay5fcmVxdWVzdEZpbHRlclJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGUsIHtcbiAgICAgICAgICAgICAgICBvblJlcXVlc3Q6ICAgICAgICAgICBob29rLm9uUmVxdWVzdC5iaW5kKGhvb2spLFxuICAgICAgICAgICAgICAgIG9uQ29uZmlndXJlUmVzcG9uc2U6IGhvb2suX29uQ29uZmlndXJlUmVzcG9uc2UuYmluZChob29rKSxcbiAgICAgICAgICAgICAgICBvblJlc3BvbnNlOiAgICAgICAgICBob29rLm9uUmVzcG9uc2UuYmluZChob29rKSxcbiAgICAgICAgICAgIH0sIChlcnI6IFJlcXVlc3RIb29rTWV0aG9kRXJyb3IpID0+IHRoaXMuX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvcihlcnIsIGhvb2suX2NsYXNzTmFtZSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pbml0UmVxdWVzdEhvb2tGb3JDb21waWxlclNlcnZpY2UgKGhvb2tJZDogc3RyaW5nLCBob29rQ2xhc3NOYW1lOiBzdHJpbmcsIHJ1bGVzOiBSZXF1ZXN0RmlsdGVyUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRlc3RJZCA9IHRoaXMudGVzdC5pZDtcblxuICAgICAgICBydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFkZFJlcXVlc3RFdmVudExpc3RlbmVycyhydWxlLCB7XG4gICAgICAgICAgICAgICAgb25SZXF1ZXN0OiAgICAgICAgICAgKGV2ZW50OiBSZXF1ZXN0RXZlbnQpID0+IHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5vblJlcXVlc3RIb29rRXZlbnQoeyB0ZXN0SWQsIGhvb2tJZCwgbmFtZTogUmVxdWVzdEhvb2tNZXRob2ROYW1lcy5vblJlcXVlc3QsIGV2ZW50RGF0YTogZXZlbnQgfSksXG4gICAgICAgICAgICAgICAgb25Db25maWd1cmVSZXNwb25zZTogKGV2ZW50OiBDb25maWd1cmVSZXNwb25zZUV2ZW50KSA9PiB0aGlzLmNvbXBpbGVyU2VydmljZT8ub25SZXF1ZXN0SG9va0V2ZW50KHsgdGVzdElkLCBob29rSWQsIG5hbWU6IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMuX29uQ29uZmlndXJlUmVzcG9uc2UsIGV2ZW50RGF0YTogZXZlbnQgfSksXG4gICAgICAgICAgICAgICAgb25SZXNwb25zZTogICAgICAgICAgKGV2ZW50OiBSZXNwb25zZUV2ZW50KSA9PiB0aGlzLmNvbXBpbGVyU2VydmljZT8ub25SZXF1ZXN0SG9va0V2ZW50KHsgdGVzdElkLCBob29rSWQsIG5hbWU6IFJlcXVlc3RIb29rTWV0aG9kTmFtZXMub25SZXNwb25zZSwgZXZlbnREYXRhOiBldmVudCB9KSxcbiAgICAgICAgICAgIH0sIGVyciA9PiB0aGlzLl9vblJlcXVlc3RIb29rTWV0aG9kRXJyb3IoZXJyLCBob29rQ2xhc3NOYW1lKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX29uUmVxdWVzdEhvb2tNZXRob2RFcnJvciAoZXZlbnQ6IFJlcXVlc3RIb29rTWV0aG9kRXJyb3IsIGhvb2tDbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBsZXQgZXJyOiBFcnJvciB8IFRlc3RSdW5FcnJvckJhc2UgICAgICAgICAgICA9IGV2ZW50LmVycm9yO1xuICAgICAgICBjb25zdCBpc1JlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRNZXRob2RFcnJvciA9IChlcnIgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKT8uY29kZSA9PT0gVEVTVF9SVU5fRVJST1JTLnJlcXVlc3RIb29rTm90SW1wbGVtZW50ZWRFcnJvcjtcblxuICAgICAgICBpZiAoIWlzUmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZE1ldGhvZEVycm9yKVxuICAgICAgICAgICAgZXJyID0gbmV3IFJlcXVlc3RIb29rVW5oYW5kbGVkRXJyb3IoZXJyLCBob29rQ2xhc3NOYW1lLCBldmVudC5tZXRob2ROYW1lKTtcblxuICAgICAgICB0aGlzLmFkZEVycm9yKGVycik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzcG9zZVJlcXVlc3RIb29rIChob29rOiBSZXF1ZXN0SG9vayk6IHZvaWQge1xuICAgICAgICBob29rLl93YXJuaW5nTG9nID0gbnVsbDtcblxuICAgICAgICBob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RldGFjaFJlcXVlc3RFdmVudExpc3RlbmVycyAocnVsZXM6IFJlcXVlc3RGaWx0ZXJSdWxlW10pOiB2b2lkIHtcbiAgICAgICAgcnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMocnVsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3N1YnNjcmliZU9uQ29tcGlsZXJTZXJ2aWNlRXZlbnRzICgpOiB2b2lkIHtcbiAgICAgICAgQ09NUElMRVJfU0VSVklDRV9FVkVOVFMuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21waWxlclNlcnZpY2Uub24oZXZlbnROYW1lLCBhc3luYyBhcmdzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNlc3Npb25bZXZlbnROYW1lXSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBpbGVyU2VydmljZS5vbignYWRkUmVxdWVzdEV2ZW50TGlzdGVuZXJzJywgYXN5bmMgKHsgaG9va0lkLCBob29rQ2xhc3NOYW1lLCBydWxlcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdFJlcXVlc3RIb29rRm9yQ29tcGlsZXJTZXJ2aWNlKGhvb2tJZCwgaG9va0NsYXNzTmFtZSwgcnVsZXMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29tcGlsZXJTZXJ2aWNlLm9uKCdyZW1vdmVSZXF1ZXN0RXZlbnRMaXN0ZW5lcnMnLCBhc3luYyAoeyBydWxlcyB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGV0YWNoUmVxdWVzdEV2ZW50TGlzdGVuZXJzKHJ1bGVzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaW5pdFJlcXVlc3RIb29rcyAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlT25Db21waWxlclNlcnZpY2VFdmVudHMoKTtcbiAgICAgICAgICAgIHRoaXMudGVzdC5yZXF1ZXN0SG9va3MuZm9yRWFjaChob29rID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9pbml0UmVxdWVzdEhvb2tGb3JDb21waWxlclNlcnZpY2UoaG9vay5pZCwgaG9vay5fY2xhc3NOYW1lLCBob29rLl9yZXF1ZXN0RmlsdGVyUnVsZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy50ZXN0LnJlcXVlc3RIb29rcy5mb3JFYWNoKGhvb2sgPT4gdGhpcy5faW5pdFJlcXVlc3RIb29rKGhvb2spKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlU2tpcEpzRXJyb3JzT3B0aW9uICgpOiBib29sZWFuIHwgRXhlY3V0ZUNsaWVudEZ1bmN0aW9uQ29tbWFuZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLnRlc3Quc2tpcEpzRXJyb3JzT3B0aW9ucyAhPT0gdm9pZCAwXG4gICAgICAgICAgICA/IHRoaXMudGVzdC5za2lwSnNFcnJvcnNPcHRpb25zXG4gICAgICAgICAgICA6IHRoaXMub3B0cy5za2lwSnNFcnJvcnMgYXMgU2tpcEpzRXJyb3JzT3B0aW9uc09iamVjdCB8IGJvb2xlYW4gfHwgZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHByZXBhcmVTa2lwSnNFcnJvcnNPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIEhhbW1lcmhlYWQgcGF5bG9hZFxuICAgIHB1YmxpYyBhc3luYyBnZXRQYXlsb2FkU2NyaXB0ICgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc29sdmVXYWl0Rm9yRmlsZURvd25sb2FkaW5nUHJvbWlzZSA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc2tpcEpzRXJyb3JzID0gdGhpcy5fcHJlcGFyZVNraXBKc0Vycm9yc09wdGlvbigpO1xuXG4gICAgICAgIHJldHVybiBNdXN0YWNoZS5yZW5kZXIoVEVTVF9SVU5fVEVNUExBVEUsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuc2Vzc2lvbi5pZCksXG4gICAgICAgICAgICBicm93c2VySWQ6ICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkKSxcbiAgICAgICAgICAgIGJyb3dzZXJIZWFydGJlYXRSZWxhdGl2ZVVybDogIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uaGVhcnRiZWF0UmVsYXRpdmVVcmwpLFxuICAgICAgICAgICAgYnJvd3NlclN0YXR1c1JlbGF0aXZlVXJsOiAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi5zdGF0dXNSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyU3RhdHVzRG9uZVJlbGF0aXZlVXJsOiBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLnN0YXR1c0RvbmVSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VySWRsZVJlbGF0aXZlVXJsOiAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkbGVSZWxhdGl2ZVVybCksXG4gICAgICAgICAgICBicm93c2VyQWN0aXZlV2luZG93SWRVcmw6ICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkVXJsKSxcbiAgICAgICAgICAgIGJyb3dzZXJDbG9zZVdpbmRvd1VybDogICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYnJvd3NlckNvbm5lY3Rpb24uY2xvc2VXaW5kb3dVcmwpLFxuICAgICAgICAgICAgdXNlckFnZW50OiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQpLFxuICAgICAgICAgICAgdGVzdE5hbWU6ICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50ZXN0Lm5hbWUpLFxuICAgICAgICAgICAgZml4dHVyZU5hbWU6ICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoKHRoaXMudGVzdC5maXh0dXJlIGFzIEZpeHR1cmUpLm5hbWUpLFxuICAgICAgICAgICAgc2VsZWN0b3JUaW1lb3V0OiAgICAgICAgICAgICAgdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCxcbiAgICAgICAgICAgIHBhZ2VMb2FkVGltZW91dDogICAgICAgICAgICAgIHRoaXMucGFnZUxvYWRUaW1lb3V0LFxuICAgICAgICAgICAgY2hpbGRXaW5kb3dSZWFkeVRpbWVvdXQ6ICAgICAgQ0hJTERfV0lORE9XX1JFQURZX1RJTUVPVVQsXG4gICAgICAgICAgICBza2lwSnNFcnJvcnM6ICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShza2lwSnNFcnJvcnMpLFxuICAgICAgICAgICAgcmV0cnlUZXN0UGFnZXM6ICAgICAgICAgICAgICAgdGhpcy5vcHRzLnJldHJ5VGVzdFBhZ2VzLFxuICAgICAgICAgICAgc3BlZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVlZCxcbiAgICAgICAgICAgIGRpYWxvZ0hhbmRsZXI6ICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlciksXG4gICAgICAgICAgICBjYW5Vc2VEZWZhdWx0V2luZG93QWN0aW9uczogICBKU09OLnN0cmluZ2lmeShhd2FpdCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmNhblVzZURlZmF1bHRXaW5kb3dBY3Rpb25zKCkpLFxuICAgICAgICAgICAgcHJveHlsZXNzOiAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5vcHRzLnByb3h5bGVzcyksXG4gICAgICAgICAgICBkb21haW46ICAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5wcm94eS5zZXJ2ZXIxSW5mby5kb21haW4pLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0SWZyYW1lUGF5bG9hZFNjcmlwdCAoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIE11c3RhY2hlLnJlbmRlcihJRlJBTUVfVEVTVF9SVU5fVEVNUExBVEUsIHtcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5zZXNzaW9uLmlkKSxcbiAgICAgICAgICAgIHNlbGVjdG9yVGltZW91dDogdGhpcy5vcHRzLnNlbGVjdG9yVGltZW91dCxcbiAgICAgICAgICAgIHBhZ2VMb2FkVGltZW91dDogdGhpcy5wYWdlTG9hZFRpbWVvdXQsXG4gICAgICAgICAgICByZXRyeVRlc3RQYWdlczogICEhdGhpcy5vcHRzLnJldHJ5VGVzdFBhZ2VzLFxuICAgICAgICAgICAgc3BlZWQ6ICAgICAgICAgICB0aGlzLnNwZWVkLFxuICAgICAgICAgICAgZGlhbG9nSGFuZGxlcjogICBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBIYW1tZXJoZWFkIGhhbmRsZXJzXG4gICAgcHVibGljIGdldEF1dGhDcmVkZW50aWFscyAoKTogbnVsbCB8IEF1dGhDcmVkZW50aWFscyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3QuYXV0aENyZWRlbnRpYWxzO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVGaWxlRG93bmxvYWQgKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlV2FpdEZvckZpbGVEb3dubG9hZGluZ1Byb21pc2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkaW5nSGFuZGxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUF0dGFjaG1lbnQgKGRhdGE6IHsgaXNPcGVuZWRJbk5ld1dpbmRvdzogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgICAgIGlmIChkYXRhLmlzT3BlbmVkSW5OZXdXaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmF0dGFjaG1lbnREb3dubG9hZGluZ0hhbmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVQYWdlRXJyb3IgKGN0eDogYW55LCBlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG5ldyBQYWdlTG9hZEVycm9yKGVyciwgY3R4LnJlcU9wdHMudXJsKTtcblxuICAgICAgICBjdHgucmVkaXJlY3QoY3R4LnRvUHJveHlVcmwoU1BFQ0lBTF9FUlJPUl9QQUdFKSk7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBmdW5jdGlvbiBleGVjdXRpb25cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlVGVzdEZuIChwaGFzZTogVGVzdFJ1blBoYXNlLCBmbjogRnVuY3Rpb24sIHRpbWVvdXQ6IEV4ZWN1dGlvblRpbWVvdXQgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMucGhhc2UgPSBwaGFzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUZuV2l0aFRpbWVvdXQoZm4sIHRpbWVvdXQsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fbWFrZVNjcmVlbnNob3RPbkZhaWwoKTtcblxuICAgICAgICAgICAgdGhpcy5hZGRFcnJvcihlcnIpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmVyclNjcmVlbnNob3RQYXRoID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhdGhpcy5fYWRkUGVuZGluZ1BhZ2VFcnJvcklmQW55KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQmVmb3JlSG9vayAoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4pXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuZ2xvYmFsQmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5iZWZvcmVGbilcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9leGVjdXRlVGVzdEZuKFRlc3RSdW5QaGFzZS5pblRlc3RCZWZvcmVIb29rLCB0aGlzLnRlc3QuYmVmb3JlRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgaWYgKHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4pXG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQmVmb3JlRWFjaEhvb2ssIHRoaXMudGVzdC5maXh0dXJlPy5iZWZvcmVFYWNoRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuQWZ0ZXJIb29rICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMudGVzdC5hZnRlckZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5UZXN0QWZ0ZXJIb29rLCB0aGlzLnRlc3QuYWZ0ZXJGbiwgdGhpcy5leGVjdXRpb25UaW1lb3V0KTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZXhlY3V0ZVRlc3RGbihUZXN0UnVuUGhhc2UuaW5GaXh0dXJlQWZ0ZXJFYWNoSG9vaywgdGhpcy50ZXN0LmZpeHR1cmU/LmFmdGVyRWFjaEZuLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3QuZ2xvYmFsQWZ0ZXJGbilcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdEFmdGVySG9vaywgdGhpcy50ZXN0Lmdsb2JhbEFmdGVyRm4sIHRoaXMuZXhlY3V0aW9uVGltZW91dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZmluYWxpemVUZXN0UnVuIChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgY29uc3Qgd2FybmluZ3MgPSBhd2FpdCB0aGlzLmNvbXBpbGVyU2VydmljZS5nZXRXYXJuaW5nTWVzc2FnZXMoeyB0ZXN0UnVuSWQ6IGlkIH0pO1xuXG4gICAgICAgICAgICB3YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMud2FybmluZ0xvZy5hZGRXYXJuaW5nKHdhcm5pbmcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnJlbW92ZVRlc3RSdW5Gcm9tU3RhdGUoeyB0ZXN0UnVuSWQ6IGlkIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGVzdFJ1blRyYWNrZXIucmVtb3ZlQWN0aXZlVGVzdFJ1bihpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN0YXJ0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGVzdFJ1blRyYWNrZXIuYWRkQWN0aXZlVGVzdFJ1bih0aGlzKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ3N0YXJ0Jyk7XG5cbiAgICAgICAgY29uc3Qgb25EaXNjb25uZWN0ZWQgPSAoZXJyOiBFcnJvcik6IHZvaWQgPT4gdGhpcy5fZGlzY29ubmVjdChlcnIpO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ub25jZSgnZGlzY29ubmVjdGVkJywgb25EaXNjb25uZWN0ZWQpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25jZSgnY29ubmVjdGVkJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5lbWl0KCdyZWFkeScpO1xuXG4gICAgICAgIGlmIChhd2FpdCB0aGlzLl9ydW5CZWZvcmVIb29rKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V4ZWN1dGVUZXN0Rm4oVGVzdFJ1blBoYXNlLmluVGVzdCwgdGhpcy50ZXN0LmZuIGFzIEZ1bmN0aW9uLCB0aGlzLmV4ZWN1dGlvblRpbWVvdXQpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcnVuQWZ0ZXJIb29rKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5kaXNjb25uZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5waGFzZSA9IFRlc3RSdW5QaGFzZS5wZW5kaW5nRmluYWxpemF0aW9uO1xuXG4gICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24ucmVtb3ZlTGlzdGVuZXIoJ2Rpc2Nvbm5lY3RlZCcsIG9uRGlzY29ubmVjdGVkKTtcblxuICAgICAgICBpZiAodGhpcy5lcnJzLmxlbmd0aCAmJiB0aGlzLmRlYnVnT25GYWlsKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJTdHIgPSB0aGlzLmRlYnVnUmVwb3J0ZXJQbHVnaW5Ib3N0LmZvcm1hdEVycm9yKHRoaXMuZXJyc1swXSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZCh2b2lkIDAsIGVyclN0cik7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2JlZm9yZS1kb25lJyk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlRlc3REb25lQ29tbWFuZCgpKTtcblxuICAgICAgICB0aGlzLl9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmNsZWFyUmVxdWVzdEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplUmVxdWVzdEhvb2tFcnJvcnMoKTtcblxuICAgICAgICBhd2FpdCB0aGlzLl9maW5hbGl6ZVRlc3RSdW4odGhpcy5zZXNzaW9uLmlkKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXQoJ2RvbmUnKTtcbiAgICB9XG5cbiAgICAvLyBFcnJvcnNcbiAgICBwcml2YXRlIF9hZGRQZW5kaW5nUGFnZUVycm9ySWZBbnkgKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUGFnZUVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVycm9yKHRoaXMucGVuZGluZ1BhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbnN1cmVFcnJvcklkIChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmlkID0gZXJyLmlkIHx8IG5hbm9pZCg3KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jcmVhdGVFcnJvckFkYXB0ZXIgKGVycjogRXJyb3IpOiBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIge1xuICAgICAgICB0aGlzLl9lbnN1cmVFcnJvcklkKGVycik7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBUZXN0UnVuRXJyb3JGb3JtYXR0YWJsZUFkYXB0ZXIoZXJyLCB7XG4gICAgICAgICAgICB1c2VyQWdlbnQ6ICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbi51c2VyQWdlbnQsXG4gICAgICAgICAgICBzY3JlZW5zaG90UGF0aDogdGhpcy5lcnJTY3JlZW5zaG90UGF0aCB8fCAnJyxcbiAgICAgICAgICAgIHRlc3RSdW5JZDogICAgICB0aGlzLmlkLFxuICAgICAgICAgICAgdGVzdFJ1blBoYXNlOiAgIHRoaXMucGhhc2UsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRFcnJvciAoZXJyOiBFcnJvciB8IFRlc3RDYWZlRXJyb3JMaXN0IHwgVGVzdFJ1bkVycm9yQmFzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBlcnJMaXN0ID0gKGVyciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0ID8gZXJyLml0ZW1zIDogW2Vycl0pIGFzIEVycm9yW107XG5cbiAgICAgICAgZXJyTGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuX2NyZWF0ZUVycm9yQWRhcHRlcihpdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5lcnJzLnB1c2goYWRhcHRlcik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBub3JtYWxpemVSZXF1ZXN0SG9va0Vycm9ycyAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RIb29rRXJyb3JzID0gcmVtb3ZlKHRoaXMuZXJycywgZSA9PlxuICAgICAgICAgICAgKGUgYXMgdW5rbm93biBhcyBUZXN0UnVuRXJyb3JCYXNlKS5jb2RlID09PSBURVNUX1JVTl9FUlJPUlMucmVxdWVzdEhvb2tOb3RJbXBsZW1lbnRlZEVycm9yIHx8XG4gICAgICAgICAgICAoZSBhcyB1bmtub3duIGFzIFRlc3RSdW5FcnJvckJhc2UpLmNvZGUgPT09IFRFU1RfUlVOX0VSUk9SUy5yZXF1ZXN0SG9va1VuaGFuZGxlZEVycm9yKTtcblxuICAgICAgICBpZiAoIXJlcXVlc3RIb29rRXJyb3JzLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCB1bmlxUmVxdWVzdEhvb2tFcnJvcnMgPSBjaGFpbihyZXF1ZXN0SG9va0Vycm9ycylcbiAgICAgICAgICAgIC51bmlxQnkoZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gZSBhcyB1bmtub3duIGFzIFJlcXVlc3RIb29rQmFzZUVycm9yO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyci5ob29rQ2xhc3NOYW1lICsgZXJyLm1ldGhvZE5hbWU7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnNvcnRCeShbJ2hvb2tDbGFzc05hbWUnLCAnbWV0aG9kTmFtZSddKVxuICAgICAgICAgICAgLnZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5lcnJzID0gdGhpcy5lcnJzLmNvbmNhdCh1bmlxUmVxdWVzdEhvb2tFcnJvcnMpO1xuICAgIH1cblxuICAgIC8vIFRhc2sgcXVldWVcbiAgICBwcml2YXRlIF9lbnF1ZXVlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlOiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nUmVxdWVzdClcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVQZW5kaW5nUmVxdWVzdChjb21tYW5kKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudC0tO1xuICAgICAgICAgICAgdGhpcy5kcml2ZXJUYXNrUXVldWUucHVzaCh7IGNvbW1hbmQsIHJlc29sdmUsIHJlamVjdCwgY2FsbHNpdGUgfSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRpbmdEcml2ZXJUYXNrc0NvdW50KVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZW1pdChBTExfRFJJVkVSX1RBU0tTX0FEREVEX1RPX1FVRVVFX0VWRU5ULCB0aGlzLmRyaXZlclRhc2tRdWV1ZS5sZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRyaXZlclRhc2tRdWV1ZUxlbmd0aCAoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkaW5nRHJpdmVyVGFza3NDb3VudCA/IHByb21pc2lmeUV2ZW50KHRoaXMgYXMgdW5rbm93biBhcyBFdmVudEVtaXR0ZXIsIEFMTF9EUklWRVJfVEFTS1NfQURERURfVE9fUVVFVUVfRVZFTlQpIDogUHJvbWlzZS5yZXNvbHZlKHRoaXMuZHJpdmVyVGFza1F1ZXVlLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9lbnF1ZXVlQnJvd3NlckNvbnNvbGVNZXNzYWdlc0NvbW1hbmQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fZW5xdWV1ZUNvbW1hbmQoY29tbWFuZCwgY2FsbHNpdGUpO1xuXG4gICAgICAgIGNvbnN0IGNvbnNvbGVNZXNzYWdlQ29weSA9IHRoaXMuY29uc29sZU1lc3NhZ2VzLmdldENvcHkoKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHJldHVybiBjb25zb2xlTWVzc2FnZUNvcHlbU3RyaW5nKHRoaXMuYWN0aXZlV2luZG93SWQpXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVHZXRDb29raWVzIChjb21tYW5kOiBHZXRDb29raWVzQ29tbWFuZCk6IFByb21pc2U8UGFydGlhbDxDb29raWVPcHRpb25zPltdPiB7XG4gICAgICAgIGNvbnN0IHsgY29va2llcywgdXJscyB9ID0gY29tbWFuZDtcblxuICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLmNvb2tpZXMuZ2V0Q29va2llcyhjb29raWVzLCB1cmxzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVTZXRDb29raWVzIChjb21tYW5kOiBTZXRDb29raWVzQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjb29raWVzID0gY29tbWFuZC5jb29raWVzO1xuICAgICAgICBjb25zdCB1cmwgICAgID0gY29tbWFuZC51cmwgfHwgYXdhaXQgdGhpcy5nZXRDdXJyZW50VXJsKCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jb29raWVzLnNldENvb2tpZXMoY29va2llcywgdXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2VucXVldWVEZWxldGVDb29raWVzIChjb21tYW5kOiBEZWxldGVDb29raWVzQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IGNvb2tpZXMsIHVybHMgfSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jb29raWVzLmRlbGV0ZUNvb2tpZXMoY29va2llcywgdXJscyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZW5xdWV1ZVNldEJyZWFrcG9pbnRDb21tYW5kIChjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQgfCB1bmRlZmluZWQsIGVycm9yPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgdGhpcy5kZWJ1Z0xvZ2dlci5zaG93QnJlYWtwb2ludCh0aGlzLnNlc3Npb24uaWQsIHRoaXMuYnJvd3NlckNvbm5lY3Rpb24udXNlckFnZW50LCBjYWxsc2l0ZSwgZXJyb3IpO1xuXG4gICAgICAgIHRoaXMuZGVidWdnaW5nID0gYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlNldEJyZWFrcG9pbnRDb21tYW5kKCEhZXJyb3IsICEhdGhpcy5jb21waWxlclNlcnZpY2UpLCBjYWxsc2l0ZSkgYXMgYm9vbGVhbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW1vdmVBbGxOb25TZXJ2aWNlVGFza3MgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZSA9IHRoaXMuZHJpdmVyVGFza1F1ZXVlLmZpbHRlcihkcml2ZXJUYXNrID0+IGlzU2VydmljZUNvbW1hbmQoZHJpdmVyVGFzay5jb21tYW5kKSk7XG5cbiAgICAgICAgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUucmVtb3ZlQWxsTm9uU2VydmljZU1hbmlwdWxhdGlvbnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVEZWJ1Z1N0YXRlIChkcml2ZXJTdGF0dXM6IERyaXZlclN0YXR1cyk6IHZvaWQge1xuICAgICAgICBpZiAoZHJpdmVyU3RhdHVzLmRlYnVnKVxuICAgICAgICAgICAgdGhpcy5lbWl0KGRyaXZlclN0YXR1cy5kZWJ1Zyk7XG4gICAgfVxuXG4gICAgLy8gQ3VycmVudCBkcml2ZXIgdGFza1xuICAgIHB1YmxpYyBnZXQgY3VycmVudERyaXZlclRhc2sgKCk6IERyaXZlclRhc2sge1xuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXJUYXNrUXVldWVbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrIChyZXN1bHQ/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudERyaXZlclRhc2sucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB0aGlzLmRyaXZlclRhc2tRdWV1ZS5zaGlmdCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRlc3REb25lQ29tbWFuZFF1ZXVlZClcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbE5vblNlcnZpY2VUYXNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrIChlcnI6IEVycm9yKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmNhbGxzaXRlID0gZXJyLmNhbGxzaXRlIHx8IHRoaXMuY3VycmVudERyaXZlclRhc2suY2FsbHNpdGU7XG5cbiAgICAgICAgdGhpcy5jdXJyZW50RHJpdmVyVGFzay5yZWplY3QoZXJyKTtcbiAgICAgICAgdGhpcy5fcmVtb3ZlQWxsTm9uU2VydmljZVRhc2tzKCk7XG4gICAgfVxuXG4gICAgLy8gUGVuZGluZyByZXF1ZXN0XG4gICAgcHJpdmF0ZSBfY2xlYXJQZW5kaW5nUmVxdWVzdCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdSZXF1ZXN0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5wZW5kaW5nUmVxdWVzdC5yZXNwb25zZVRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdCA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXNvbHZlUGVuZGluZ1JlcXVlc3QgKGNvbW1hbmQ6IENvbW1hbmRCYXNlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZSA9IGNvbW1hbmQ7XG5cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3QpXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0LnJlc29sdmUoY29tbWFuZCk7XG5cbiAgICAgICAgdGhpcy5fY2xlYXJQZW5kaW5nUmVxdWVzdCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkcml2ZXIgcmVxdWVzdFxuICAgIHByaXZhdGUgX3Nob3VsZFJlc29sdmVDdXJyZW50RHJpdmVyVGFzayAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbW1hbmQgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrLmNvbW1hbmQ7XG5cbiAgICAgICAgY29uc3QgaXNFeGVjdXRpbmdPYnNlcnZhdGlvbkNvbW1hbmQgPSBjdXJyZW50Q29tbWFuZCBpbnN0YW5jZW9mIG9ic2VydmF0aW9uQ29tbWFuZHMuRXhlY3V0ZVNlbGVjdG9yQ29tbWFuZCB8fFxuICAgICAgICAgICAgY3VycmVudENvbW1hbmQgaW5zdGFuY2VvZiBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kO1xuXG4gICAgICAgIGNvbnN0IGlzRGVidWdBY3RpdmUgPSBjdXJyZW50Q29tbWFuZCBpbnN0YW5jZW9mIHNlcnZpY2VDb21tYW5kcy5TZXRCcmVha3BvaW50Q29tbWFuZDtcblxuICAgICAgICBjb25zdCBzaG91bGRFeGVjdXRlQ3VycmVudENvbW1hbmQgPVxuICAgICAgICAgICAgZHJpdmVyU3RhdHVzLmlzRmlyc3RSZXF1ZXN0QWZ0ZXJXaW5kb3dTd2l0Y2hpbmcgJiYgKGlzRXhlY3V0aW5nT2JzZXJ2YXRpb25Db21tYW5kIHx8IGlzRGVidWdBY3RpdmUpO1xuXG4gICAgICAgIHJldHVybiAhc2hvdWxkRXhlY3V0ZUN1cnJlbnRDb21tYW5kO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Z1bGZpbGxDdXJyZW50RHJpdmVyVGFzayAoZHJpdmVyU3RhdHVzOiBEcml2ZXJTdGF0dXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGlmIChkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpXG4gICAgICAgICAgICB0aGlzLl9yZWplY3RDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMuZXhlY3V0aW9uRXJyb3IpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLl9zaG91bGRSZXNvbHZlQ3VycmVudERyaXZlclRhc2soZHJpdmVyU3RhdHVzKSlcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVDdXJyZW50RHJpdmVyVGFzayhkcml2ZXJTdGF0dXMucmVzdWx0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVQYWdlRXJyb3JTdGF0dXMgKHBhZ2VFcnJvcjogRXJyb3IpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERyaXZlclRhc2sgJiYgaXNDb21tYW5kUmVqZWN0YWJsZUJ5UGFnZUVycm9yKHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlamVjdEN1cnJlbnREcml2ZXJUYXNrKHBhZ2VFcnJvcik7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IHRoaXMucGVuZGluZ1BhZ2VFcnJvciB8fCBwYWdlRXJyb3I7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZURyaXZlclJlcXVlc3QgKGRyaXZlclN0YXR1czogRHJpdmVyU3RhdHVzKTogQ29tbWFuZEJhc2UgfCBudWxsIHwgc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaXNUZXN0RG9uZSAgICAgICAgICAgICAgICAgPSB0aGlzLmN1cnJlbnREcml2ZXJUYXNrICYmIHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZC50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfVFlQRS50ZXN0RG9uZTtcbiAgICAgICAgY29uc3QgcGFnZUVycm9yICAgICAgICAgICAgICAgICAgPSB0aGlzLnBlbmRpbmdQYWdlRXJyb3IgfHwgZHJpdmVyU3RhdHVzLnBhZ2VFcnJvcjtcbiAgICAgICAgY29uc3QgY3VycmVudFRhc2tSZWplY3RlZEJ5RXJyb3IgPSBwYWdlRXJyb3IgJiYgdGhpcy5faGFuZGxlUGFnZUVycm9yU3RhdHVzKHBhZ2VFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMuY29uY2F0KGRyaXZlclN0YXR1cy5jb25zb2xlTWVzc2FnZXMpO1xuXG4gICAgICAgIHRoaXMuX2hhbmRsZURlYnVnU3RhdGUoZHJpdmVyU3RhdHVzKTtcblxuICAgICAgICBpZiAoIWN1cnJlbnRUYXNrUmVqZWN0ZWRCeUVycm9yICYmIGRyaXZlclN0YXR1cy5pc0NvbW1hbmRSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmIChpc1Rlc3REb25lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUN1cnJlbnREcml2ZXJUYXNrKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gVEVTVF9ET05FX0NPTkZJUk1BVElPTl9SRVNQT05TRTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZnVsZmlsbEN1cnJlbnREcml2ZXJUYXNrKGRyaXZlclN0YXR1cyk7XG5cbiAgICAgICAgICAgIGlmIChkcml2ZXJTdGF0dXMuaXNQZW5kaW5nV2luZG93U3dpdGNoaW5nKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEN1cnJlbnREcml2ZXJUYXNrQ29tbWFuZCAoKTogQ29tbWFuZEJhc2UgfCBudWxsIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgY29tbWFuZCA9IHRoaXMuY3VycmVudERyaXZlclRhc2suY29tbWFuZDtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUubmF2aWdhdGVUbyAmJiAoY29tbWFuZCBhcyBhbnkpLnN0YXRlU25hcHNob3QpXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24udXNlU3RhdGVTbmFwc2hvdChKU09OLnBhcnNlKChjb21tYW5kIGFzIGFueSkuc3RhdGVTbmFwc2hvdCkpO1xuXG4gICAgICAgIHJldHVybiBjb21tYW5kO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgY29tbWFuZFxuICAgIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVKc0V4cHJlc3Npb24gKGNvbW1hbmQ6IEV4ZWN1dGVFeHByZXNzaW9uQ29tbWFuZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCByZXN1bHRWYXJpYWJsZU5hbWUgPSBjb21tYW5kLnJlc3VsdFZhcmlhYmxlTmFtZTtcbiAgICAgICAgbGV0IGV4cHJlc3Npb24gICAgICAgICAgID0gY29tbWFuZC5leHByZXNzaW9uO1xuXG4gICAgICAgIGlmIChyZXN1bHRWYXJpYWJsZU5hbWUpXG4gICAgICAgICAgICBleHByZXNzaW9uID0gYCR7cmVzdWx0VmFyaWFibGVOYW1lfSA9ICR7ZXhwcmVzc2lvbn0sICR7cmVzdWx0VmFyaWFibGVOYW1lfWA7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21waWxlclNlcnZpY2UuZXhlY3V0ZUpzRXhwcmVzc2lvbih7XG4gICAgICAgICAgICAgICAgZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICB7IHNraXBWaXNpYmlsaXR5Q2hlY2s6IGZhbHNlIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGVjdXRlSnNFeHByZXNzaW9uKGV4cHJlc3Npb24sIHRoaXMsIHsgc2tpcFZpc2liaWxpdHlDaGVjazogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uIChjb21tYW5kOiBFeGVjdXRlQXN5bmNFeHByZXNzaW9uQ29tbWFuZCwgY2FsbHNpdGU/OiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsZXJTZXJ2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLmFzeW5jSnNFeHByZXNzaW9uQ2FsbHNpdGVzLmNsZWFyKCk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5leGVjdXRlQXN5bmNKc0V4cHJlc3Npb24oe1xuICAgICAgICAgICAgICAgIGV4cHJlc3Npb246IGNvbW1hbmQuZXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6ICB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIGNhbGxzaXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhlY3V0ZUFzeW5jSnNFeHByZXNzaW9uKGNvbW1hbmQuZXhwcmVzc2lvbiwgdGhpcywgY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0UmVFeGVjdXRhYmxlUHJvbWlzZUV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlclNlcnZpY2UpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgY29tbWFuZC5hY3R1YWwgPSBSZUV4ZWN1dGFibGVQcm9taXNlLmZyb21Gbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlclNlcnZpY2U/LmdldEFzc2VydGlvbkFjdHVhbFZhbHVlKHtcbiAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHNlbGYuaWQsXG4gICAgICAgICAgICAgICAgY29tbWFuZElkOiBjb21tYW5kLmlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlZGlyZWN0QXNzZXJ0aW9uRm5FeGVjdXRpb25Ub0NvbXBpbGVyU2VydmljZSAoZXhlY3V0b3I6IEFzc2VydGlvbkV4ZWN1dG9yKTogdm9pZCB7XG4gICAgICAgIGV4ZWN1dG9yLmZuID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZXJTZXJ2aWNlPy5leGVjdXRlQXNzZXJ0aW9uRm4oe1xuICAgICAgICAgICAgICAgIHRlc3RSdW5JZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGV4ZWN1dG9yLmNvbW1hbmQuaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9leGVjdXRlQXNzZXJ0aW9uIChjb21tYW5kOiBBc3NlcnRpb25Db21tYW5kLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQuYWN0dWFsID09PSBTeW1ib2wuZm9yKFJFX0VYRUNVVEFCTEVfUFJPTUlTRV9NQVJLRVJfREVTQ1JJUFRJT04pKVxuICAgICAgICAgICAgdGhpcy5fcmVkaXJlY3RSZUV4ZWN1dGFibGVQcm9taXNlRXhlY3V0aW9uVG9Db21waWxlclNlcnZpY2UoY29tbWFuZCk7XG5cbiAgICAgICAgY29uc3QgYXNzZXJ0aW9uVGltZW91dCA9IGdldEFzc2VydGlvblRpbWVvdXQoY29tbWFuZCwgdGhpcy5vcHRzKTtcbiAgICAgICAgY29uc3QgZXhlY3V0b3IgICAgICAgICA9IG5ldyBBc3NlcnRpb25FeGVjdXRvcihjb21tYW5kLCBhc3NlcnRpb25UaW1lb3V0LCBjYWxsc2l0ZSk7XG5cbiAgICAgICAgZXhlY3V0b3Iub25jZSgnc3RhcnQtYXNzZXJ0aW9uLXJldHJpZXMnLCAodGltZW91dDogbnVtYmVyKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuU2hvd0Fzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHRpbWVvdXQpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ2VuZC1hc3NlcnRpb24tcmV0cmllcycsIChzdWNjZXNzOiBib29sZWFuKSA9PiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBzZXJ2aWNlQ29tbWFuZHMuSGlkZUFzc2VydGlvblJldHJpZXNTdGF0dXNDb21tYW5kKHN1Y2Nlc3MpKSk7XG4gICAgICAgIGV4ZWN1dG9yLm9uY2UoJ25vbi1zZXJpYWxpemFibGUtYWN0dWFsLXZhbHVlJywgdGhpcy5fcmVkaXJlY3RBc3NlcnRpb25GbkV4ZWN1dGlvblRvQ29tcGlsZXJTZXJ2aWNlKTtcblxuICAgICAgICBjb25zdCBleGVjdXRlRm4gPSB0aGlzLmRlY29yYXRlUHJldmVudEVtaXRBY3Rpb25FdmVudHMoKCkgPT4gZXhlY3V0b3IucnVuKCksIHsgcHJldmVudDogdHJ1ZSB9KTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUZuKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfYWRqdXN0Q29uZmlndXJhdGlvbldpdGhDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSk6IHZvaWQge1xuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUudGVzdERvbmUpIHtcbiAgICAgICAgICAgIHRoaXMudGVzdERvbmVDb21tYW5kUXVldWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnTG9nZ2VyKVxuICAgICAgICAgICAgICAgIHRoaXMuZGVidWdMb2dnZXIuaGlkZUJyZWFrcG9pbnQodGhpcy5zZXNzaW9uLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldE5hdGl2ZURpYWxvZ0hhbmRsZXIpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZ0hhbmRsZXIgPSAoY29tbWFuZCBhcyBhbnkpLmRpYWxvZ0hhbmRsZXI7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc3dpdGNoVG9JZnJhbWUpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gKGNvbW1hbmQgYXMgYW55KS5zZWxlY3RvcjtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb01haW5XaW5kb3cpXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUlmcmFtZVNlbGVjdG9yID0gbnVsbDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRUZXN0U3BlZWQpXG4gICAgICAgICAgICB0aGlzLnNwZWVkID0gKGNvbW1hbmQgYXMgYW55KS5zcGVlZDtcblxuICAgICAgICBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zZXRQYWdlTG9hZFRpbWVvdXQpXG4gICAgICAgICAgICB0aGlzLnBhZ2VMb2FkVGltZW91dCA9IChjb21tYW5kIGFzIGFueSkuZHVyYXRpb247XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGVidWcpXG4gICAgICAgICAgICB0aGlzLmRlYnVnZ2luZyA9IHRydWU7XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuZGlzYWJsZURlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnTG9nZ2VyLmhpZGVCcmVha3BvaW50KHRoaXMuc2Vzc2lvbi5pZCk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWdnaW5nID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2FkanVzdFNjcmVlbnNob3RDb21tYW5kIChjb21tYW5kOiBUYWtlU2NyZWVuc2hvdEJhc2VDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGJyb3dzZXJJZCAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmlkO1xuICAgICAgICBjb25zdCB7IGhhc0Nocm9tZWxlc3NTY3JlZW5zaG90cyB9ID0gYXdhaXQgdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcm92aWRlci5oYXNDdXN0b21BY3Rpb25Gb3JCcm93c2VyKGJyb3dzZXJJZCk7XG5cbiAgICAgICAgaWYgKCFoYXNDaHJvbWVsZXNzU2NyZWVuc2hvdHMpXG4gICAgICAgICAgICBjb21tYW5kLmdlbmVyYXRlU2NyZWVuc2hvdE1hcmsoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2FkanVzdENvbW1hbmRPcHRpb25zQW5kRW52aXJvbm1lbnQgKGNvbW1hbmQ6IENvbW1hbmRCYXNlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKChjb21tYW5kIGFzIGFueSkub3B0aW9ucz8uY29uZmlkZW50aWFsICE9PSB2b2lkIDApXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnR5cGVUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKChjb21tYW5kIGFzIGFueSkuc2VsZWN0b3IsIGNhbGxzaXRlKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZWxzZSBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUucHJlc3NLZXkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5HZXRBY3RpdmVFbGVtZW50Q29tbWFuZCgpKTtcblxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5yZXBsaWNhdG9yLmRlY29kZShyZXN1bHQpO1xuXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLm9wdGlvbnMuY29uZmlkZW50aWFsID0gaXNQYXNzd29yZElucHV0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBFeGVjdXRlQ2xpZW50RnVuY3Rpb25Db21tYW5kQmFzZSAmJiAhIXRoaXMuY29tcGlsZXJTZXJ2aWNlICYmICF0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jbGllbnRFbnZpcm9ubWVudFByZXBhcmVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgc2VydmljZUNvbW1hbmRzLlByZXBhcmVDbGllbnRFbnZpcm9ubWVudEluRGVidWdNb2RlKGNvbW1hbmQuZXNtUnVudGltZSkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX3NldEJyZWFrcG9pbnRJZk5lY2Vzc2FyeSAoY29tbWFuZDogQ29tbWFuZEJhc2UsIGNhbGxzaXRlPzogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEZWJ1Z0JyZWFrcG9pbnRzICYmIHRoaXMuZGVidWdnaW5nICYmIGNhblNldERlYnVnZ2VyQnJlYWtwb2ludEJlZm9yZUNvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9lbnF1ZXVlU2V0QnJlYWtwb2ludENvbW1hbmQoY2FsbHNpdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQ29tbWFuZCAoY29tbWFuZDogQ29tbWFuZEJhc2UgfCBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU/OiBzdHJpbmcgfCBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gY29tbWFuZCBpbnN0YW5jZW9mIEFjdGlvbkNvbW1hbmRCYXNlXG4gICAgICAgICAgICA/IHRoaXMuX2V4ZWN1dGVBY3Rpb25Db21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKVxuICAgICAgICAgICAgOiB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX2V4ZWN1dGVBY3Rpb25Db21tYW5kIChjb21tYW5kOiBBY3Rpb25Db21tYW5kQmFzZSwgY2FsbHNpdGU6IENhbGxzaXRlUmVjb3JkKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IGFjdGlvbkFyZ3MgPSB7IGFwaUFjdGlvbk5hbWU6IGNvbW1hbmQubWV0aG9kTmFtZSwgY29tbWFuZCB9O1xuXG4gICAgICAgIGxldCBlcnJvckFkYXB0ZXIgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgICAgICAgID0gbnVsbDtcbiAgICAgICAgbGV0IHJlc3VsdCAgICAgICA9IG51bGw7XG5cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fYWRqdXN0Q29tbWFuZE9wdGlvbnNBbmRFbnZpcm9ubWVudChjb21tYW5kLCBjYWxsc2l0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgZXJyb3IgPSBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmVtaXRBY3Rpb25FdmVudCgnYWN0aW9uLXN0YXJ0JywgYWN0aW9uQXJncyk7XG5cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCFlcnJvcilcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5waGFzZSA9PT0gVGVzdFJ1blBoYXNlLnBlbmRpbmdGaW5hbGl6YXRpb24gJiYgZXJyIGluc3RhbmNlb2YgRXh0ZXJuYWxBc3NlcnRpb25MaWJyYXJ5RXJyb3IpXG4gICAgICAgICAgICAgICAgYWRkUmVuZGVyZWRXYXJuaW5nKHRoaXMud2FybmluZ0xvZywgeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UudW5hd2FpdGVkTWV0aG9kV2l0aEFzc2VydGlvbiwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgY2FsbHNpdGUpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHN0YXJ0O1xuXG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgLy8gTk9URTogY2hlY2sgaWYgZXJyb3IgaXMgVGVzdENhZmVFcnJvckxpc3QgaXMgc3BlY2lmaWMgZm9yIHRoZSBgdXNlUm9sZWAgYWN0aW9uXG4gICAgICAgICAgICAvLyBpZiBlcnJvciBpcyBUZXN0Q2FmZUVycm9yTGlzdCB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYW4gYWRhcHRlcixcbiAgICAgICAgICAgIC8vIHNpbmNlIGVycm9yIGlzIGFscmVhZHkgd2FzIHByb2Nlc3NlZCBpbiByb2xlIGluaXRpYWxpemVyXG4gICAgICAgICAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFRlc3RDYWZlRXJyb3JMaXN0KSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX21ha2VTY3JlZW5zaG90T25GYWlsKGNvbW1hbmQuYWN0aW9uSWQpO1xuXG4gICAgICAgICAgICAgICAgZXJyb3JBZGFwdGVyID0gdGhpcy5fY3JlYXRlRXJyb3JBZGFwdGVyKHByb2Nlc3NUZXN0Rm5FcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGVycm9yQWRhcHRlciA9IGVycm9yLmFkYXB0ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBPYmplY3QuYXNzaWduKGFjdGlvbkFyZ3MsIHtcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGR1cmF0aW9uLFxuICAgICAgICAgICAgZXJyOiBlcnJvckFkYXB0ZXIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuZW1pdEFjdGlvbkV2ZW50KCdhY3Rpb24tZG9uZScsIGFjdGlvbkFyZ3MpO1xuXG4gICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIF9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kIChjb21tYW5kOiBDb21tYW5kQmFzZSwgY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCB8IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICB0aGlzLmRlYnVnTG9nLmNvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ1BhZ2VFcnJvciAmJiBpc0NvbW1hbmRSZWplY3RhYmxlQnlQYWdlRXJyb3IoY29tbWFuZCkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVqZWN0Q29tbWFuZFdpdGhQYWdlRXJyb3IoY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgIGlmIChpc0V4ZWN1dGFibGVPbkNsaWVudENvbW1hbmQoY29tbWFuZCkpXG4gICAgICAgICAgICB0aGlzLmFkZGluZ0RyaXZlclRhc2tzQ291bnQrKztcblxuICAgICAgICB0aGlzLl9hZGp1c3RDb25maWd1cmF0aW9uV2l0aENvbW1hbmQoY29tbWFuZCk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0QnJlYWtwb2ludElmTmVjZXNzYXJ5KGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcblxuICAgICAgICBpZiAoaXNTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0cy5kaXNhYmxlU2NyZWVuc2hvdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS5zY3JlZW5zaG90c0Rpc2FibGVkLCBhY3Rpb25JZDogY29tbWFuZC5hY3Rpb25JZCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9hZGp1c3RTY3JlZW5zaG90Q29tbWFuZChjb21tYW5kIGFzIFRha2VTY3JlZW5zaG90QmFzZUNvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQnJvd3Nlck1hbmlwdWxhdGlvbkNvbW1hbmQoY29tbWFuZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYnJvd3Nlck1hbmlwdWxhdGlvblF1ZXVlLnB1c2goY29tbWFuZCk7XG5cbiAgICAgICAgICAgIGlmIChpc1Jlc2l6ZVdpbmRvd0NvbW1hbmQoY29tbWFuZCkgJiYgdGhpcy5vcHRzLnZpZGVvUGF0aClcbiAgICAgICAgICAgICAgICB0aGlzLndhcm5pbmdMb2cuYWRkV2FybmluZyh7IG1lc3NhZ2U6IFdBUk5JTkdfTUVTU0FHRS52aWRlb0Jyb3dzZXJSZXNpemluZywgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSwgdGhpcy50ZXN0Lm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLndhaXQpXG4gICAgICAgICAgICByZXR1cm4gZGVsYXkoKGNvbW1hbmQgYXMgYW55KS50aW1lb3V0KTtcblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuc2V0UGFnZUxvYWRUaW1lb3V0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmRlYnVnKSB7XG4gICAgICAgICAgICAvLyBOT1RFOiBJbiByZWd1bGFyIG1vZGUsIGl0J3MgcG9zc2libGUgdG8gZGVidWcgdGVzdHMgb25seSB1c2luZyBUZXN0Q2FmZSBVSSAoJ1Jlc3VtZScgYW5kICdOZXh0IHN0ZXAnIGJ1dHRvbnMpLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCB3YXJuIG9uIHRyeWluZyB0byBkZWJ1ZyBpbiBoZWFkbGVzcyBtb2RlLlxuICAgICAgICAgICAgLy8gSW4gY29tcGlsZXIgc2VydmljZSBtb2RlLCB3ZSBjYW4gZGVidWcgZXZlbiBpbiBoZWFkbGVzcyBtb2RlIHVzaW5nIGFueSBkZWJ1Z2dpbmcgdG9vbHMuIFNvLCBpbiB0aGlzIGNhc2UsIHRoZSB3YXJuaW5nIGlzIGV4Y2Vzc2l2ZS5cbiAgICAgICAgICAgIGNvbnN0IGNhbkRlYnVnID0gISF0aGlzLmNvbXBpbGVyU2VydmljZSB8fCAhdGhpcy5icm93c2VyQ29ubmVjdGlvbi5pc0hlYWRsZXNzQnJvd3NlcigpO1xuXG4gICAgICAgICAgICBpZiAoY2FuRGVidWcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2VucXVldWVTZXRCcmVha3BvaW50Q29tbWFuZChjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCwgdm9pZCAwKTtcblxuICAgICAgICAgICAgdGhpcy5kZWJ1Z2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UuZGVidWdJbkhlYWRsZXNzRXJyb3IsIGFjdGlvbklkOiBjb21tYW5kLmFjdGlvbklkIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS51c2VSb2xlKSB7XG4gICAgICAgICAgICBsZXQgZm4gPSAoKTogUHJvbWlzZTx2b2lkPiA9PiB0aGlzLl91c2VSb2xlKChjb21tYW5kIGFzIGFueSkucm9sZSwgY2FsbHNpdGUgYXMgQ2FsbHNpdGVSZWNvcmQpO1xuXG4gICAgICAgICAgICBmbiA9IHRoaXMuZGVjb3JhdGVQcmV2ZW50RW1pdEFjdGlvbkV2ZW50cyhmbiwgeyBwcmV2ZW50OiB0cnVlIH0pO1xuICAgICAgICAgICAgZm4gPSB0aGlzLmRlY29yYXRlRGlzYWJsZURlYnVnQnJlYWtwb2ludHMoZm4sIHsgZGlzYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZC50eXBlID09PSBDT01NQU5EX1RZUEUuYXNzZXJ0aW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3NlcnRpb24oY29tbWFuZCBhcyBBc3NlcnRpb25Db21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmV4ZWN1dGVFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2V4ZWN1dGVKc0V4cHJlc3Npb24oY29tbWFuZCBhcyBFeGVjdXRlRXhwcmVzc2lvbkNvbW1hbmQpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5leGVjdXRlQXN5bmNFeHByZXNzaW9uKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3luY0pzRXhwcmVzc2lvbihjb21tYW5kIGFzIEV4ZWN1dGVBc3luY0V4cHJlc3Npb25Db21tYW5kLCBjYWxsc2l0ZSBhcyBzdHJpbmcpO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5nZXRCcm93c2VyQ29uc29sZU1lc3NhZ2VzKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VucXVldWVCcm93c2VyQ29uc29sZU1lc3NhZ2VzQ29tbWFuZChjb21tYW5kLCBjYWxsc2l0ZSBhcyBDYWxsc2l0ZVJlY29yZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnN3aXRjaFRvUHJldmlvdXNXaW5kb3cpXG4gICAgICAgICAgICAoY29tbWFuZCBhcyBhbnkpLndpbmRvd0lkID0gdGhpcy5icm93c2VyQ29ubmVjdGlvbi5wcmV2aW91c0FjdGl2ZVdpbmRvd0lkO1xuXG4gICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT09IENPTU1BTkRfVFlQRS5zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N3aXRjaFRvV2luZG93QnlQcmVkaWNhdGUoY29tbWFuZCBhcyBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmdldENvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZUdldENvb2tpZXMoY29tbWFuZCBhcyBHZXRDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLnNldENvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZVNldENvb2tpZXMoY29tbWFuZCBhcyBTZXRDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PT0gQ09NTUFORF9UWVBFLmRlbGV0ZUNvb2tpZXMpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5xdWV1ZURlbGV0ZUNvb2tpZXMoY29tbWFuZCBhcyBEZWxldGVDb29raWVzQ29tbWFuZCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VucXVldWVDb21tYW5kKGNvbW1hbmQsIGNhbGxzaXRlIGFzIENhbGxzaXRlUmVjb3JkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWplY3RDb21tYW5kV2l0aFBhZ2VFcnJvciAoY2FsbHNpdGU/OiBDYWxsc2l0ZVJlY29yZCk6IFByb21pc2U8RXJyb3I+IHtcbiAgICAgICAgY29uc3QgZXJyID0gdGhpcy5wZW5kaW5nUGFnZUVycm9yO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXJyLmNhbGxzaXRlICAgICAgICAgID0gY2FsbHNpdGU7XG4gICAgICAgIHRoaXMucGVuZGluZ1BhZ2VFcnJvciA9IG51bGw7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2VuZENsb3NlQ2hpbGRXaW5kb3dPbkZpbGVEb3dubG9hZGluZ0NvbW1hbmQgKCk6IENvbW1hbmRCYXNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhY3Rpb25Db21tYW5kcy5DbG9zZUNoaWxkV2luZG93T25GaWxlRG93bmxvYWRpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgX21ha2VTY3JlZW5zaG90T25GYWlsIChmYWlsZWRBY3Rpb25JZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB7IHNjcmVlbnNob3RzIH0gPSB0aGlzLm9wdHM7XG5cbiAgICAgICAgaWYgKCF0aGlzLmVyclNjcmVlbnNob3RQYXRoICYmIChzY3JlZW5zaG90cyBhcyBTY3JlZW5zaG90T3B0aW9uVmFsdWUpPy50YWtlT25GYWlscylcbiAgICAgICAgICAgIHRoaXMuZXJyU2NyZWVuc2hvdFBhdGggPSBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKG5ldyBicm93c2VyTWFuaXB1bGF0aW9uQ29tbWFuZHMuVGFrZVNjcmVlbnNob3RPbkZhaWxDb21tYW5kKHsgZmFpbGVkQWN0aW9uSWQgfSkpIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9kZWNvcmF0ZVdpdGhGbGFnIChmbjogRnVuY3Rpb24sIGZsYWdOYW1lOiBzdHJpbmcsIHZhbHVlOiBib29sZWFuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzW2ZsYWdOYW1lXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXNbZmxhZ05hbWVdID0gIXZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBkZWNvcmF0ZVByZXZlbnRFbWl0QWN0aW9uRXZlbnRzIChmbjogRnVuY3Rpb24sIHsgcHJldmVudCB9OiB7IHByZXZlbnQ6IGJvb2xlYW4gfSk6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVjb3JhdGVXaXRoRmxhZyhmbiwgJ3ByZXZlbnRFbWl0QWN0aW9uRXZlbnRzJywgcHJldmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlY29yYXRlRGlzYWJsZURlYnVnQnJlYWtwb2ludHMgKGZuOiBGdW5jdGlvbiwgeyBkaXNhYmxlIH06IHsgZGlzYWJsZTogYm9vbGVhbiB9KTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWNvcmF0ZVdpdGhGbGFnKGZuLCAnZGlzYWJsZURlYnVnQnJlYWtwb2ludHMnLCBkaXNhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBSb2xlIG1hbmFnZW1lbnRcbiAgICBwdWJsaWMgYXN5bmMgZ2V0U3RhdGVTbmFwc2hvdCAoKTogUHJvbWlzZTxTdGF0ZVNuYXBzaG90PiB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zZXNzaW9uLmdldFN0YXRlU25hcHNob3QoKTtcblxuICAgICAgICBzdGF0ZS5zdG9yYWdlcyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IHNlcnZpY2VDb21tYW5kcy5CYWNrdXBTdG9yYWdlc0NvbW1hbmQoKSkgYXMgU3RvcmFnZXNTbmFwc2hvdDtcblxuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfY2xlYW5VcEN0eHMgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5jb21waWxlclNlcnZpY2UpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLnNldEN0eCh7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21waWxlclNlcnZpY2Uuc2V0Rml4dHVyZUN0eCh7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bklkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiAgICAgT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jdHggICAgICAgID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZml4dHVyZUN0eCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRlc3RSdW5DdHggPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN3aXRjaFRvQ2xlYW5SdW4gKHVybDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2NsZWFuVXBDdHhzKCk7XG5cbiAgICAgICAgdGhpcy5jb25zb2xlTWVzc2FnZXMgPSBuZXcgQnJvd3NlckNvbnNvbGVNZXNzYWdlcygpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbi51c2VTdGF0ZVNuYXBzaG90KFN0YXRlU25hcHNob3QuZW1wdHkoKSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3BlZWQgIT09IHRoaXMub3B0cy5zcGVlZCkge1xuICAgICAgICAgICAgY29uc3Qgc2V0U3BlZWRDb21tYW5kID0gbmV3IGFjdGlvbkNvbW1hbmRzLlNldFRlc3RTcGVlZENvbW1hbmQoeyBzcGVlZDogdGhpcy5vcHRzLnNwZWVkIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFNwZWVkQ29tbWFuZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYWdlTG9hZFRpbWVvdXQgIT09IHRoaXMub3B0cy5wYWdlTG9hZFRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0UGFnZUxvYWRUaW1lb3V0Q29tbWFuZCh7IGR1cmF0aW9uOiB0aGlzLm9wdHMucGFnZUxvYWRUaW1lb3V0IH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9pbnRlcm5hbEV4ZWN1dGVDb21tYW5kKHNldFBhZ2VMb2FkVGltZW91dENvbW1hbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0ZVRvVXJsKHVybCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlRGlhbG9nSGFuZGxlcikge1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuU2V0TmF0aXZlRGlhbG9nSGFuZGxlckNvbW1hbmQoeyBkaWFsb2dIYW5kbGVyOiB7IGZuOiBudWxsIH0gfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQocmVtb3ZlRGlhbG9nSGFuZGxlckNvbW1hbmQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIG5hdmlnYXRlVG9VcmwgKHVybDogc3RyaW5nLCBmb3JjZVJlbG9hZDogYm9vbGVhbiwgc3RhdGVTbmFwc2hvdD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBuYXZpZ2F0ZUNvbW1hbmQgPSBuZXcgYWN0aW9uQ29tbWFuZHMuTmF2aWdhdGVUb0NvbW1hbmQoeyB1cmwsIGZvcmNlUmVsb2FkLCBzdGF0ZVNuYXBzaG90IH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmF2aWdhdGVDb21tYW5kKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9nZXRTdGF0ZVNuYXBzaG90RnJvbVJvbGUgKHJvbGU6IFJvbGUpOiBQcm9taXNlPFN0YXRlU25hcHNob3Q+IHtcbiAgICAgICAgY29uc3QgcHJldlBoYXNlID0gdGhpcy5waGFzZTtcblxuICAgICAgICBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5pbml0aWFsaXplZCAmJiByb2xlLmluaXRFcnIgaW5zdGFuY2VvZiBUZXN0Q2FmZUVycm9yTGlzdCAmJiByb2xlLmluaXRFcnIuaGFzRXJyb3JzKVxuICAgICAgICAgICAgcm9sZS5pbml0RXJyLmFkYXB0ZXIgPSB0aGlzLl9jcmVhdGVFcnJvckFkYXB0ZXIocm9sZS5pbml0RXJyLml0ZW1zWzBdKTtcblxuICAgICAgICB0aGlzLnBoYXNlID0gVGVzdFJ1blBoYXNlLmluUm9sZUluaXRpYWxpemVyO1xuXG4gICAgICAgIGlmIChyb2xlLnBoYXNlID09PSBST0xFX1BIQVNFLnVuaW5pdGlhbGl6ZWQpXG4gICAgICAgICAgICBhd2FpdCByb2xlLmluaXRpYWxpemUodGhpcyk7XG5cbiAgICAgICAgZWxzZSBpZiAocm9sZS5waGFzZSA9PT0gUk9MRV9QSEFTRS5wZW5kaW5nSW5pdGlhbGl6YXRpb24pXG4gICAgICAgICAgICBhd2FpdCBwcm9taXNpZnlFdmVudChyb2xlLCAnaW5pdGlhbGl6ZWQnKTtcblxuICAgICAgICBpZiAocm9sZS5pbml0RXJyKVxuICAgICAgICAgICAgdGhyb3cgcm9sZS5pbml0RXJyO1xuXG4gICAgICAgIHRoaXMucGhhc2UgPSBwcmV2UGhhc2U7XG5cbiAgICAgICAgcmV0dXJuIHJvbGUuc3RhdGVTbmFwc2hvdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF91c2VSb2xlIChyb2xlOiBSb2xlLCBjYWxsc2l0ZTogQ2FsbHNpdGVSZWNvcmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucGhhc2UgPT09IFRlc3RSdW5QaGFzZS5pblJvbGVJbml0aWFsaXplcilcbiAgICAgICAgICAgIHRocm93IG5ldyBSb2xlU3dpdGNoSW5Sb2xlSW5pdGlhbGl6ZXJFcnJvcihjYWxsc2l0ZSk7XG5cbiAgICAgICAgY29uc3QgYm9va21hcmsgPSBuZXcgVGVzdFJ1bkJvb2ttYXJrKHRoaXMsIHJvbGUpO1xuXG4gICAgICAgIGF3YWl0IGJvb2ttYXJrLmluaXQoKTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Um9sZUlkKVxuICAgICAgICAgICAgdGhpcy51c2VkUm9sZVN0YXRlc1t0aGlzLmN1cnJlbnRSb2xlSWRdID0gYXdhaXQgdGhpcy5nZXRTdGF0ZVNuYXBzaG90KCk7XG5cbiAgICAgICAgY29uc3Qgc3RhdGVTbmFwc2hvdCA9IHRoaXMudXNlZFJvbGVTdGF0ZXNbcm9sZS5pZF0gfHwgYXdhaXQgdGhpcy5fZ2V0U3RhdGVTbmFwc2hvdEZyb21Sb2xlKHJvbGUpO1xuXG4gICAgICAgIHRoaXMuc2Vzc2lvbi51c2VTdGF0ZVNuYXBzaG90KHN0YXRlU25hcHNob3QpO1xuXG4gICAgICAgIHRoaXMuY3VycmVudFJvbGVJZCA9IHJvbGUuaWQ7XG5cbiAgICAgICAgYXdhaXQgYm9va21hcmsucmVzdG9yZShjYWxsc2l0ZSwgc3RhdGVTbmFwc2hvdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldEN1cnJlbnRVcmwgKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ2xpZW50RnVuY3Rpb25CdWlsZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaHJlZjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuICAgICAgICB9LCB7IGJvdW5kVGVzdFJ1bjogdGhpcyB9KTtcblxuICAgICAgICBjb25zdCBnZXRMb2NhdGlvbiA9IGJ1aWxkZXIuZ2V0RnVuY3Rpb24oKTtcblxuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0TG9jYXRpb24oKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIF9zd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlIChjb21tYW5kOiBTd2l0Y2hUb1dpbmRvd0J5UHJlZGljYXRlQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBjdXJyZW50V2luZG93cyA9IGF3YWl0IHRoaXMuX2ludGVybmFsRXhlY3V0ZUNvbW1hbmQobmV3IEdldEN1cnJlbnRXaW5kb3dzQ29tbWFuZCh7fSwgdGhpcykgYXMgQ29tbWFuZEJhc2UpIGFzIE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uW107XG5cbiAgICAgICAgY29uc3Qgd2luZG93cyA9IGF3YWl0IGFzeW5jRmlsdGVyPE9wZW5lZFdpbmRvd0luZm9ybWF0aW9uPihjdXJyZW50V2luZG93cywgYXN5bmMgd25kID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlZGljYXRlRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAgIG5ldyBVUkwod25kLnVybCksXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB3bmQudGl0bGUsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBpbGVyU2VydmljZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlclNlcnZpY2VQcmVkaWNhdGVEYXRhID0gT2JqZWN0LmFzc2lnbihwcmVkaWNhdGVEYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVuSWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kSWQ6IGNvbW1hbmQuaWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVyU2VydmljZS5jaGVja1dpbmRvdyhjb21waWxlclNlcnZpY2VQcmVkaWNhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZC5jaGVja1dpbmRvdyhwcmVkaWNhdGVEYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3dpdGNoVG9XaW5kb3dQcmVkaWNhdGVFcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXdpbmRvd3MubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFdpbmRvd05vdEZvdW5kRXJyb3IoKTtcblxuICAgICAgICBpZiAod2luZG93cy5sZW5ndGggPiAxKVxuICAgICAgICAgICAgdGhpcy53YXJuaW5nTG9nLmFkZFdhcm5pbmcoeyBtZXNzYWdlOiBXQVJOSU5HX01FU1NBR0UubXVsdGlwbGVXaW5kb3dzRm91bmRCeVByZWRpY2F0ZSwgYWN0aW9uSWQ6IGNvbW1hbmQuYWN0aW9uSWQgfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5faW50ZXJuYWxFeGVjdXRlQ29tbWFuZChuZXcgU3dpdGNoVG9XaW5kb3dDb21tYW5kKHsgd2luZG93SWQ6IHdpbmRvd3NbMF0uaWQgfSwgdGhpcykgYXMgQ29tbWFuZEJhc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Rpc2Nvbm5lY3QgKGVycjogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnREcml2ZXJUYXNrKVxuICAgICAgICAgICAgdGhpcy5fcmVqZWN0Q3VycmVudERyaXZlclRhc2soZXJyKTtcblxuICAgICAgICB0aGlzLmVtaXQoJ2Rpc2Nvbm5lY3RlZCcsIGVycik7XG5cbiAgICAgICAgdGVzdFJ1blRyYWNrZXIucmVtb3ZlQWN0aXZlVGVzdFJ1bih0aGlzLnNlc3Npb24uaWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hhbmRsZUZpbGVEb3dubG9hZGluZ0luTmV3V2luZG93UmVxdWVzdCAoKTogQ29tbWFuZEJhc2UgfCBudWxsIHtcbiAgICAgICAgaWYgKHRoaXMuYXR0YWNobWVudERvd25sb2FkaW5nSGFuZGxlZCkge1xuICAgICAgICAgICAgdGhpcy5hdHRhY2htZW50RG93bmxvYWRpbmdIYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZW5kQ2xvc2VDaGlsZFdpbmRvd09uRmlsZURvd25sb2FkaW5nQ29tbWFuZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGVtaXRBY3Rpb25FdmVudCAoZXZlbnROYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXRoaXMucHJldmVudEVtaXRBY3Rpb25FdmVudHMpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmVtaXQoZXZlbnROYW1lLCBhcmdzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTXVsdGlwbGVXaW5kb3dzQWxsb3dlZCAodGVzdFJ1bjogVGVzdFJ1bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB7IGRpc2FibGVNdWx0aXBsZVdpbmRvd3MsIHRlc3QgfSA9IHRlc3RSdW47XG5cbiAgICAgICAgcmV0dXJuICFkaXNhYmxlTXVsdGlwbGVXaW5kb3dzICYmICEodGVzdCBhcyBMZWdhY3lUZXN0UnVuKS5pc0xlZ2FjeSAmJiAhIXRlc3RSdW4uYWN0aXZlV2luZG93SWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGluaXRpYWxpemUgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZXJTZXJ2aWNlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuY29tcGlsZXJTZXJ2aWNlLmluaXRpYWxpemVUZXN0UnVuRGF0YSh7XG4gICAgICAgICAgICB0ZXN0UnVuSWQ6ICAgICAgdGhpcy5pZCxcbiAgICAgICAgICAgIHRlc3RJZDogICAgICAgICB0aGlzLnRlc3QuaWQsXG4gICAgICAgICAgICBicm93c2VyOiAgICAgICAgdGhpcy5icm93c2VyLFxuICAgICAgICAgICAgYWN0aXZlV2luZG93SWQ6IHRoaXMuYWN0aXZlV2luZG93SWQsXG4gICAgICAgICAgICBtZXNzYWdlQnVzOiAgICAgdGhpcy5fbWVzc2FnZUJ1cyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBhY3RpdmVXaW5kb3dJZCAoKTogbnVsbCB8IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmFjdGl2ZVdpbmRvd0lkO1xuICAgIH1cblxuICAgIC8vIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgdGltZS1jcml0aWNhbCBhbmQgbXVzdCByZXR1cm4gQVNBUCB0byBhdm9pZCBjbGllbnQgZGlzY29ubmVjdGlvblxuICAgIHByaXZhdGUgYXN5bmMgW0NMSUVOVF9NRVNTQUdFUy5yZWFkeV0gKG1zZzogRHJpdmVyTWVzc2FnZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBpZiAobXNnLnN0YXR1cy5pc09ic2VydmluZ0ZpbGVEb3dubG9hZGluZ0luTmV3V2luZG93KVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVEb3dubG9hZGluZ0luTmV3V2luZG93UmVxdWVzdCgpO1xuXG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIGlmICh0aGlzLmRpc2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLnRlc3RSdW5SZXF1ZXN0SW5EaXNjb25uZWN0ZWRCcm93c2VyLCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uLmJyb3dzZXJJbmZvLmFsaWFzKSk7XG5cbiAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcblxuICAgICAgICB0aGlzLl9jbGVhclBlbmRpbmdSZXF1ZXN0KCk7XG5cbiAgICAgICAgLy8gTk9URTogdGhlIGRyaXZlciBzZW5kcyB0aGUgc3RhdHVzIGZvciB0aGUgc2Vjb25kIHRpbWUgaWYgaXQgZGlkbid0IGdldCBhIHJlc3BvbnNlIGF0IHRoZVxuICAgICAgICAvLyBmaXJzdCB0cnkuIFRoaXMgaXMgcG9zc2libGUgd2hlbiB0aGUgcGFnZSB3YXMgdW5sb2FkZWQgYWZ0ZXIgdGhlIGRyaXZlciBzZW50IHRoZSBzdGF0dXMuXG4gICAgICAgIGlmIChtc2cuc3RhdHVzLmlkID09PSB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxhc3REcml2ZXJTdGF0dXNSZXNwb25zZTtcblxuICAgICAgICB0aGlzLmxhc3REcml2ZXJTdGF0dXNJZCAgICAgICA9IG1zZy5zdGF0dXMuaWQ7XG4gICAgICAgIHRoaXMubGFzdERyaXZlclN0YXR1c1Jlc3BvbnNlID0gdGhpcy5faGFuZGxlRHJpdmVyUmVxdWVzdChtc2cuc3RhdHVzKTtcblxuICAgICAgICBpZiAodGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2UgfHwgbXNnLnN0YXR1cy5pc1BlbmRpbmdXaW5kb3dTd2l0Y2hpbmcpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0RHJpdmVyU3RhdHVzUmVzcG9uc2U7XG5cbiAgICAgICAgLy8gTk9URTogd2Ugc2VuZCBhbiBlbXB0eSByZXNwb25zZSBhZnRlciB0aGUgTUFYX1JFU1BPTlNFX0RFTEFZIHRpbWVvdXQgaXMgZXhjZWVkZWQgdG8ga2VlcCBjb25uZWN0aW9uXG4gICAgICAgIC8vIHdpdGggdGhlIGNsaWVudCBhbmQgcHJldmVudCB0aGUgcmVzcG9uc2UgdGltZW91dCBleGNlcHRpb24gb24gdGhlIGNsaWVudCBzaWRlXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fcmVzb2x2ZVBlbmRpbmdSZXF1ZXN0KG51bGwpLCBNQVhfUkVTUE9OU0VfREVMQVkpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0ID0geyByZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlVGltZW91dCB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIFtDTElFTlRfTUVTU0FHRVMucmVhZHlGb3JCcm93c2VyTWFuaXB1bGF0aW9uXSAobXNnOiBEcml2ZXJNZXNzYWdlKTogUHJvbWlzZTxCcm93c2VyTWFuaXB1bGF0aW9uUmVzdWx0PiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xuICAgICAgICBsZXQgZXJyb3IgID0gbnVsbDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5icm93c2VyTWFuaXB1bGF0aW9uUXVldWUuZXhlY3V0ZVBlbmRpbmdNYW5pcHVsYXRpb24obXNnLCB0aGlzLl9tZXNzYWdlQnVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIGVycm9yID0gZXJyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0LCBlcnJvciB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgW0NMSUVOVF9NRVNTQUdFUy53YWl0Rm9yRmlsZURvd25sb2FkXSAobXNnOiBEcml2ZXJNZXNzYWdlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuZGVidWdMb2cuZHJpdmVyTWVzc2FnZShtc2cpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZGluZ0hhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRoaXMucmVzb2x2ZVdhaXRGb3JGaWxlRG93bmxvYWRpbmdQcm9taXNlID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19