obsidian-integration-testing 4.4.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +51 -54
  2. package/dist/lib/cjs/global-setup-core.cjs +13 -9
  3. package/dist/lib/cjs/global-setup-core.d.cts +1 -1
  4. package/dist/lib/cjs/index.cjs +1 -4
  5. package/dist/lib/cjs/index.d.cts +2 -3
  6. package/dist/lib/cjs/kill-process-tree.cjs +57 -0
  7. package/dist/lib/cjs/kill-process-tree.d.cts +16 -0
  8. package/dist/lib/cjs/library.cjs +1 -1
  9. package/dist/lib/cjs/obsidian-config.cjs +11 -85
  10. package/dist/lib/cjs/obsidian-config.d.cts +12 -72
  11. package/dist/lib/cjs/obsidian-installer.cjs +180 -0
  12. package/dist/lib/cjs/obsidian-installer.d.cts +45 -0
  13. package/dist/lib/cjs/obsidian-instance.cjs +100 -0
  14. package/dist/lib/cjs/obsidian-instance.d.cts +55 -0
  15. package/dist/lib/cjs/obsidian-version-switch.cjs +105 -0
  16. package/dist/lib/cjs/obsidian-version-switch.d.cts +63 -0
  17. package/dist/lib/cjs/obsidian-version.cjs +85 -0
  18. package/dist/lib/cjs/obsidian-version.d.cts +111 -0
  19. package/dist/lib/cjs/transport-desktop-cdp.cjs +121 -7
  20. package/dist/lib/cjs/transport-desktop-cdp.d.cts +75 -14
  21. package/dist/lib/cjs/transport-factory.cjs +63 -32
  22. package/dist/lib/cjs/transport-options.cjs +1 -1
  23. package/dist/lib/cjs/transport-options.d.cts +37 -14
  24. package/dist/lib/cjs/transport.cjs +1 -1
  25. package/dist/lib/cjs/transport.d.cts +1 -1
  26. package/dist/lib/cjs/vitest/global-setup.cjs +2 -2
  27. package/dist/lib/cjs/vitest/typings.d.cts +1 -1
  28. package/dist/lib/esm/global-setup-core.d.mts +1 -1
  29. package/dist/lib/esm/global-setup-core.mjs +13 -9
  30. package/dist/lib/esm/index.d.mts +2 -3
  31. package/dist/lib/esm/index.mjs +1 -3
  32. package/dist/lib/esm/kill-process-tree.d.mts +16 -0
  33. package/dist/lib/esm/kill-process-tree.mjs +23 -0
  34. package/dist/lib/esm/library.mjs +1 -1
  35. package/dist/lib/esm/obsidian-config.d.mts +12 -72
  36. package/dist/lib/esm/obsidian-config.mjs +10 -78
  37. package/dist/lib/esm/obsidian-installer.d.mts +45 -0
  38. package/dist/lib/esm/obsidian-installer.mjs +158 -0
  39. package/dist/lib/esm/obsidian-instance.d.mts +55 -0
  40. package/dist/lib/esm/obsidian-instance.mjs +75 -0
  41. package/dist/lib/esm/obsidian-version-switch.d.mts +63 -0
  42. package/dist/lib/esm/obsidian-version-switch.mjs +89 -0
  43. package/dist/lib/esm/obsidian-version.d.mts +111 -0
  44. package/dist/lib/esm/obsidian-version.mjs +55 -0
  45. package/dist/lib/esm/transport-desktop-cdp.d.mts +75 -14
  46. package/dist/lib/esm/transport-desktop-cdp.mjs +125 -7
  47. package/dist/lib/esm/transport-factory.mjs +68 -28
  48. package/dist/lib/esm/transport-options.d.mts +37 -14
  49. package/dist/lib/esm/transport.d.mts +1 -1
  50. package/dist/lib/esm/vitest/global-setup.mjs +2 -2
  51. package/dist/lib/esm/vitest/typings.d.mts +1 -1
  52. package/dist/obsidian-integration-testing-5.0.0.tgz +0 -0
  53. package/package.json +16 -15
  54. package/dist/lib/cjs/transport-desktop-cli.cjs +0 -540
  55. package/dist/lib/cjs/transport-desktop-cli.d.cts +0 -154
  56. package/dist/lib/esm/transport-desktop-cli.d.mts +0 -154
  57. package/dist/lib/esm/transport-desktop-cli.mjs +0 -520
  58. package/dist/obsidian-integration-testing-4.4.0.tgz +0 -0
@@ -32,7 +32,7 @@ export interface CoreSetupResult {
32
32
  readonly tempVault: TempVault;
33
33
  /** The transport instance used during setup. */
34
34
  readonly transport: ObsidianTransport;
35
- /** Short label for log messages (e.g. `"obsidian-cli"`, `"obsidian-cdp"`). */
35
+ /** Short label for log messages (e.g. `"obsidian-cdp"`). */
36
36
  readonly transportLabel: string;
37
37
  /** The transport options that were resolved. */
38
38
  readonly transportOptions: ObsidianTransportOptions | undefined;
@@ -19,7 +19,7 @@ import { acquireSetupLock } from "./setup-lock.mjs";
19
19
  import { TempVault } from "./temp-vault.mjs";
20
20
  import { AppiumTransport } from "./transport-appium.mjs";
21
21
  import { createTransportFromOptions } from "./transport-factory.mjs";
22
- const DEFAULT_TRANSPORT_TYPE = "obsidian-cli";
22
+ const DEFAULT_TRANSPORT_TYPE = "obsidian-cdp";
23
23
  const DIST_DEV = "dist/dev";
24
24
  const DIST_BUILD = "dist/build";
25
25
  const MAIN_JS = "main.js";
@@ -30,7 +30,6 @@ const activeSetups = /* @__PURE__ */ new Set();
30
30
  const disposedResults = /* @__PURE__ */ new WeakSet();
31
31
  let isCleanupHandlerRegistered = false;
32
32
  const setupLocks = /* @__PURE__ */ new Map();
33
- const DESKTOP_LOCK_SCOPE = "desktop";
34
33
  const ANDROID_LOCK_SCOPE = "android";
35
34
  async function coreSetup(params) {
36
35
  const projectRoot = findProjectRoot();
@@ -41,9 +40,12 @@ async function coreSetup(params) {
41
40
  const transportOptions = params?.transportOptions;
42
41
  const label = transportOptions?.type ?? DEFAULT_TRANSPORT_TYPE;
43
42
  const lockScope = getLockScope(transportOptions);
44
- log(`[integration-setup:${label}] Acquiring '${lockScope}' setup lock (serializes against any concurrent integration-test run)...`);
45
- const lock = await acquireSetupLock({ label, scope: lockScope });
46
- log(`[integration-setup:${label}] Setup lock acquired.`);
43
+ let lock;
44
+ if (lockScope !== void 0) {
45
+ log(`[integration-setup:${label}] Acquiring '${lockScope}' setup lock (serializes against any concurrent integration-test run)...`);
46
+ lock = await acquireSetupLock({ label, scope: lockScope });
47
+ log(`[integration-setup:${label}] Setup lock acquired.`);
48
+ }
47
49
  let transport;
48
50
  let tempVault;
49
51
  try {
@@ -93,7 +95,9 @@ async function coreSetup(params) {
93
95
  const augmentedOptions = augmentTransportOptions(transportOptions, transport);
94
96
  const result = { tempVault, transport, transportLabel: label, transportOptions: augmentedOptions };
95
97
  activeSetups.add(result);
96
- setupLocks.set(result, lock);
98
+ if (lock) {
99
+ setupLocks.set(result, lock);
100
+ }
97
101
  registerProcessCleanupHandler();
98
102
  return result;
99
103
  } catch (error) {
@@ -110,7 +114,7 @@ async function coreSetup(params) {
110
114
  } catch (cleanupError) {
111
115
  log(`[integration-setup:${label}] Transport cleanup error (non-fatal): ${serializeError(cleanupError)}`);
112
116
  }
113
- lock.release();
117
+ lock?.release();
114
118
  log(`[integration-setup:${label}] NOTE: If the test runner reports "No test files found", ignore it \u2014 it is a side effect of the setup failure above.`);
115
119
  throw error;
116
120
  }
@@ -156,7 +160,7 @@ function findProjectRoot() {
156
160
  }
157
161
  }
158
162
  function getLockScope(transportOptions) {
159
- return transportOptions?.type === "obsidian-android-appium" ? ANDROID_LOCK_SCOPE : DESKTOP_LOCK_SCOPE;
163
+ return transportOptions?.type === "obsidian-android-appium" ? ANDROID_LOCK_SCOPE : void 0;
160
164
  }
161
165
  function registerProcessCleanupHandler() {
162
166
  if (isCleanupHandlerRegistered) {
@@ -247,4 +251,4 @@ export {
247
251
  coreSetup,
248
252
  coreTeardown
249
253
  };
250
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBhY3F1aXJlU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2xpJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IERFU0tUT1BfTE9DS19TQ09QRSA9ICdkZXNrdG9wJztcbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfSkuXG4gICAqIFVzZSB0aGlzIGZvciBsYXJnZSBmaXh0dXJlcyBcdTIwMTQgd3JpdGluZyB0aG91c2FuZHMgb2Ygbm90ZXMgYWZ0ZXIgb3BlbiBhbmRcbiAgICogZm9yY2luZyBhIHJlLXNjYW4gaXMgZmFyIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHVsYXRlPzogUG9wdWxhdGVGaWxlc1BhcmFtcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2xpXCJgLCBgXCJvYnNpZGlhbi1jZHBcImApLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IG9wdGlvbnMgdGhhdCB3ZXJlIHJlc29sdmVkLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCBzZXR1cCBsb2dpYy5cbiAqXG4gKiBMb2FkcyBgLmVudmAgZnJvbSB0aGUgcHJvamVjdCByb290LCBjcmVhdGVzIGEgdHJhbnNwb3J0LCBjb3BpZXMgdGhlIGJ1aWx0XG4gKiBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgcmVnaXN0ZXJzIHRoZSB2YXVsdCB3aXRoIE9ic2lkaWFuLCBhbmRcbiAqIGVuYWJsZXMgdGhlIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2V0dXAgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIFRoZSBzZXR1cCByZXN1bHQgY29udGFpbmluZyB0aGUgdGVtcCB2YXVsdCwgdHJhbnNwb3J0LCBhbmQgcmVzb2x2ZWQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVTZXR1cChwYXJhbXM/OiBDb3JlU2V0dXBQYXJhbXMpOiBQcm9taXNlPENvcmVTZXR1cFJlc3VsdD4ge1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IGZpbmRQcm9qZWN0Um9vdCgpO1xuICBjb25zdCBlbnZGaWxlUGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsICcuZW52Jyk7XG4gIGlmIChleGlzdHNTeW5jKGVudkZpbGVQYXRoKSkge1xuICAgIGxvYWRFbnZGaWxlKGVudkZpbGVQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBwYXJhbXM/LnRyYW5zcG9ydE9wdGlvbnM7XG4gIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyBERUZBVUxUX1RSQU5TUE9SVF9UWVBFO1xuICBjb25zdCBsb2NrU2NvcGUgPSBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9ucyk7XG5cbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEFjcXVpcmluZyAnJHtsb2NrU2NvcGV9JyBzZXR1cCBsb2NrIChzZXJpYWxpemVzIGFnYWluc3QgYW55IGNvbmN1cnJlbnQgaW50ZWdyYXRpb24tdGVzdCBydW4pLi4uYCk7XG4gIGNvbnN0IGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBsb2NrIGFjcXVpcmVkLmApO1xuXG4gIGxldCB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuICBsZXQgdGVtcFZhdWx0OiBUZW1wVmF1bHQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRpbmcgdHJhbnNwb3J0Li4uYCk7XG4gICAgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnModHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFByb2plY3Qgcm9vdDogJHtwcm9qZWN0Um9vdH1gKTtcbiAgICBjb25zdCBkaXN0UGF0aCA9IGF3YWl0IHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdCk7XG4gICAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBtYW5pZmVzdEpzb24uaWQ7XG5cbiAgICBpZiAodHJhbnNwb3J0LmlzTW9iaWxlICYmIG1hbmlmZXN0SnNvbi5pc0Rlc2t0b3BPbmx5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIE1vYmlsZSBpbnRlZ3JhdGlvbiB0ZXN0cyBjYW5ub3QgcnVuIGZvciBkZXNrdG9wLW9ubHkgcGx1Z2lucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1haW5KcyA9IGpvaW4oZGlzdFBhdGgsIE1BSU5fSlMpO1xuICAgIGNvbnN0IGJ1aWxkU3RhdCA9IGF3YWl0IHN0YXQobWFpbkpzKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICAgIHRlbXBWYXVsdCA9IG5ldyBUZW1wVmF1bHQoKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQ3JlYXRlZCB0ZW1wIHZhdWx0OiAke3RlbXBWYXVsdC5wYXRofWApO1xuICAgIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gICAgYXdhaXQgbWtkaXIocGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCBjcChkaXN0UGF0aCwgcGx1Z2luRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICAgIGlmIChwYXJhbXM/LnBvcHVsYXRlKSB7XG4gICAgICBjb25zdCBlbnRyeUNvdW50ID0gT2JqZWN0LmtleXMocGFyYW1zLnBvcHVsYXRlKS5sZW5ndGg7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUG9wdWxhdGluZyB2YXVsdCB3aXRoICR7U3RyaW5nKGVudHJ5Q291bnQpfSBlbnRyaWVzIGJlZm9yZSBvcGVuLi4uYCk7XG4gICAgICB0ZW1wVmF1bHQucG9wdWxhdGUocGFyYW1zLnBvcHVsYXRlKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQuc3luY1RvRGV2aWNlKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFJlZ2lzdGVyaW5nIHZhdWx0Li4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFZhdWx0IHJlZ2lzdGVyZWQuYCk7XG5cbiAgICAvLyBFbmFibGUgdGhlIHBsdWdpbiBhbmQgdmVyaWZ5IGl0IGxvYWRlZC4gT2JzaWRpYW4ncyBlbmFibGVQbHVnaW4oKSB3cmFwc1xuICAgIC8vIExvYWRQbHVnaW4oKSBpbiBhIHRyeS1jYXRjaCB0aGF0IHN3YWxsb3dzIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZS5cbiAgICAvLyBXZSBtb25rZXktcGF0Y2ggbG9hZFBsdWdpbigpIHRvIGNhcHR1cmUgdGhlIGVycm9yIGJlZm9yZSBpdCdzIHN3YWxsb3dlZC5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gRW5hYmxpbmcgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIi4uLmApO1xuICAgIGNvbnN0IHsgZXJyb3JNZXNzYWdlIH0gPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgICBhcmdzOiB7IHBsdWdpbklkIH0sXG4gICAgICBmbjogZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSxcbiAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICB2YXVsdFBhdGg6IHRlbXBWYXVsdC5wYXRoXG4gICAgfSk7XG5cbiAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZmFpbGVkIHRvIGxvYWQ6ICR7ZXJyb3JNZXNzYWdlfWApO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuYWJsZWQgc3VjY2Vzc2Z1bGx5LmApO1xuXG4gICAgY29uc3QgYXVnbWVudGVkT3B0aW9ucyA9IGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMsIHRyYW5zcG9ydCk7XG4gICAgY29uc3QgcmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQgPSB7IHRlbXBWYXVsdCwgdHJhbnNwb3J0LCB0cmFuc3BvcnRMYWJlbDogbGFiZWwsIHRyYW5zcG9ydE9wdGlvbnM6IGF1Z21lbnRlZE9wdGlvbnMgfTtcbiAgICBhY3RpdmVTZXR1cHMuYWRkKHJlc3VsdCk7XG4gICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCAmJiB0cmFuc3BvcnQpIHtcbiAgICAgICAgYXdhaXQgdGVtcFZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyBhIHdhaXRpbmcgcnVuIGNhbiBwcm9jZWVkIGV2ZW4gdGhvdWdoIHRoaXMgcnVuIGZhaWxlZC5cbiAgICBsb2NrLnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhY3RpdmVTZXR1cHMuZGVsZXRlKHJlc3VsdCk7XG4gICAgcmVsZWFzZVNldHVwTG9jayhyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogQXVnbWVudHMgdHJhbnNwb3J0IG9wdGlvbnMgd2l0aCBzZXNzaW9uIHJldXNlIGluZm8gd2hlbiB0aGUgdHJhbnNwb3J0XG4gKiBzdXBwb3J0cyBpdCAoY3VycmVudGx5IEFwcGl1bSBvbmx5KS5cbiAqXG4gKiBUaGUgYXVnbWVudGVkIG9wdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRlc3Qgd29ya2VycyBzbyB0aGV5IGNhbiByZWF0dGFjaFxuICogdG8gdGhlIGV4aXN0aW5nIHNlc3Npb24gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlICE9PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nIHx8ICEodHJhbnNwb3J0IGluc3RhbmNlb2YgQXBwaXVtVHJhbnNwb3J0KSkge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgY29uc3Qgc2Vzc2lvbkluZm8gPSB0cmFuc3BvcnQuZ2V0U2Vzc2lvbkluZm8oKTtcbiAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGRldmljZUlkOiBzZXNzaW9uSW5mby5kZXZpY2VJZCxcbiAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICB9O1xufVxuXG4vKipcbiAqIEZpbmRzIHRoZSBwcm9qZWN0IHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIGBwcm9jZXNzLmN3ZCgpYCBsb29raW5nIGZvciBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICovXG5mdW5jdGlvbiBmaW5kUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb24gLS0gTG9vcCB0ZXJtaW5hdGVzIGF0IGZpbGVzeXN0ZW0gcm9vdC5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBpZiAoZXhpc3RzU3luYyhqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gam9pbihkaXIsICcuLicpO1xuICAgIGlmIChwYXJlbnQgPT09IGRpcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgZmluZCBwcm9qZWN0IHJvb3QgKG5vIHBhY2thZ2UuanNvbiBmb3VuZCkuJyk7XG4gICAgfVxuICAgIGRpciA9IHBhcmVudDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydC4gUnVucyB0aGF0IHNoYXJlIGFuIE9ic2lkaWFuIGluc3RhbmNlXG4gKiBhbmQgaXRzIHJlc291cmNlcyBtdXN0IHNlcmlhbGl6ZSBhZ2FpbnN0IGVhY2ggb3RoZXIsIHNvIHRoZSBDTEkgYW5kIENEUFxuICogZGVza3RvcCB0cmFuc3BvcnRzIHNoYXJlIG9uZSBzY29wZSB3aGlsZSB0aGUgQW5kcm9pZCB0cmFuc3BvcnQgdXNlcyBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBnZXRMb2NrU2NvcGUodHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPT09ICdvYnNpZGlhbi1hbmRyb2lkLWFwcGl1bScgPyBBTkRST0lEX0xPQ0tfU0NPUEUgOiBERVNLVE9QX0xPQ0tfU0NPUEU7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGNsZWFudXAgaGFuZGxlcnMgZm9yIG9ycGhhbmVkIHNldHVwcyB0aGF0IHdlcmUgbmV2ZXIgZXhwbGljaXRseVxuICogdG9ybiBkb3duLlxuICpcbiAqIFR3byBoYW5kbGVycyBjb3ZlciBkaWZmZXJlbnQgZXhpdCBzY2VuYXJpb3M6XG4gKlxuICogLSBgYmVmb3JlRXhpdGAgXHUyMDE0IGZpcmVzIHdoZW4gdGhlIGV2ZW50IGxvb3AgZHJhaW5zIG5hdHVyYWxseS4gQWxsb3dzIGZ1bGxcbiAqICAgYXN5bmMgdGVhcmRvd24gKHVucmVnaXN0ZXIgdmF1bHRzLCBkaXNwb3NlIHRyYW5zcG9ydHMpLiBEb2VzIE5PVCBmaXJlXG4gKiAgIHdoZW4gYHByb2Nlc3MuZXhpdCgpYCBpcyBjYWxsZWQgZGlyZWN0bHkuXG4gKlxuICogLSBgdW5oYW5kbGVkUmVqZWN0aW9uYCBcdTIwMTQgY2F0Y2hlcyBhc3luYyBlcnJvcnMgdGhhdCBieXBhc3MgYGNvcmVTZXR1cGAnc1xuICogICBjYXRjaCBibG9jay4gUGVyZm9ybXMgZnVsbCBhc3luYyB0ZWFyZG93biB3aGlsZSB3ZSBzdGlsbCBjYW4uXG4gKlxuICogLSBgZXhpdGAgXHUyMDE0IGZpcmVzIG9uIGV2ZXJ5IGV4aXQsIGluY2x1ZGluZyBgcHJvY2Vzcy5leGl0KClgLiBPbmx5IHN5bmNocm9ub3VzXG4gKiAgIHdvcmsgaXMgcG9zc2libGUsIHNvIHRoaXMgaGFuZGxlciBkb2VzIGJlc3QtZWZmb3J0IGNsZWFudXA6IGtpbGxzIGNoaWxkXG4gKiAgIHByb2Nlc3NlcyB2aWEgYGRpc3Bvc2VTeW5jKClgIGFuZCByZW1vdmVzIHRlbXAgdmF1bHQgZGlyZWN0b3JpZXMgd2l0aFxuICogICBgcm1TeW5jYC4gVW5yZWdpc3RlcmluZyB2YXVsdHMgKHdoaWNoIHJlcXVpcmVzIElQQyB3aXRoIE9ic2lkaWFuKSBpc1xuICogICBza2lwcGVkIFx1MjAxNCBhIHN0YWxlIHZhdWx0IGVudHJ5IGlzIGFuIGFjY2VwdGFibGUgdHJhZGUtb2ZmIHZzLiBsZWFrZWRcbiAqICAgcHJvY2Vzc2VzIGFuZCB0ZW1wIGRpcmVjdG9yaWVzLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpOiB2b2lkIHtcbiAgaWYgKGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzQ2xlYW51cEhhbmRsZXJSZWdpc3RlcmVkID0gdHJ1ZTtcblxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBQcm9jZXNzIGV4aXRpbmcgd2l0aCAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IHNldHVwKHMpIG5vdCB0b3JuIGRvd24uIENsZWFuaW5nIHVwLi4uYCk7XG5cbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUHJvY2VzcyBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBTeW5jIGNsZWFudXA6ICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gb3JwaGFuZWQgc2V0dXAocykuYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIHJtU3luYyhyZXN1bHQudGVtcFZhdWx0LnBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB2YXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIGFuZCBmb3JnZXRzIHRoZSBzZXR1cCBsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIHJlc3VsdCwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHdob3NlIGxvY2sgc2hvdWxkIGJlIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogdm9pZCB7XG4gIGNvbnN0IGxvY2sgPSBzZXR1cExvY2tzLmdldChyZXN1bHQpO1xuICBpZiAobG9jaykge1xuICAgIGxvY2sucmVsZWFzZSgpO1xuICAgIHNldHVwTG9ja3MuZGVsZXRlKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBWUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixPQUFPLFdBQVcsbUJBQW1CO0FBT3JDLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsV0FBVztBQUNwQixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHdCQUF3QjtBQUNqQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGtDQUFrQztBQUUzQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFRL0IsTUFBTSxlQUFlLG9CQUFJLElBQXFCO0FBQzlDLE1BQU0sa0JBQWtCLG9CQUFJLFFBQXlCO0FBQ3JELElBQUksNkJBQTZCO0FBT2pDLE1BQU0sYUFBYSxvQkFBSSxJQUFnQztBQUV2RCxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLHFCQUFxQjtBQThDM0IsZUFBc0IsVUFBVSxRQUFvRDtBQUNsRixRQUFNLGNBQWMsZ0JBQWdCO0FBQ3BDLFFBQU0sY0FBYyxLQUFLLGFBQWEsTUFBTTtBQUM1QyxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLGdCQUFZLFdBQVc7QUFBQSxFQUN6QjtBQUVBLFFBQU0sbUJBQW1CLFFBQVE7QUFDakMsUUFBTSxRQUFRLGtCQUFrQixRQUFRO0FBQ3hDLFFBQU0sWUFBWSxhQUFhLGdCQUFnQjtBQUUvQyxNQUFJLHNCQUFzQixLQUFLLGdCQUFnQixTQUFTLDBFQUEwRTtBQUNsSSxRQUFNLE9BQU8sTUFBTSxpQkFBaUIsRUFBRSxPQUFPLE9BQU8sVUFBVSxDQUFDO0FBQy9ELE1BQUksc0JBQXNCLEtBQUssd0JBQXdCO0FBRXZELE1BQUk7QUFDSixNQUFJO0FBRUosTUFBSTtBQUNGLFFBQUksc0JBQXNCLEtBQUsseUJBQXlCO0FBQ3hELGdCQUFZLE1BQU0sMkJBQTJCLGdCQUFnQjtBQUM3RCxRQUFJLHNCQUFzQixLQUFLLHdCQUF3QixVQUFVLFlBQVksSUFBSSxFQUFFO0FBRW5GLFFBQUksc0JBQXNCLEtBQUssbUJBQW1CLFdBQVcsRUFBRTtBQUMvRCxVQUFNLFdBQVcsTUFBTSxnQkFBZ0IsV0FBVztBQUNsRCxVQUFNLGVBQWUsS0FBSyxNQUFNLE1BQU0sU0FBUyxLQUFLLFVBQVUsZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUN4RixVQUFNLFdBQVcsYUFBYTtBQUU5QixRQUFJLFVBQVUsWUFBWSxhQUFhLGVBQWU7QUFDcEQsWUFBTSxJQUFJO0FBQUEsUUFDUixXQUFXLFFBQVE7QUFBQSxNQUNyQjtBQUFBLElBQ0Y7QUFFQSxVQUFNLFNBQVMsS0FBSyxVQUFVLE9BQU87QUFDckMsVUFBTSxZQUFZLE1BQU0sS0FBSyxNQUFNO0FBRW5DLFFBQUksc0JBQXNCLEtBQUssV0FBVyxRQUFRLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQywwQkFBMEI7QUFFOUcsZ0JBQVksSUFBSSxVQUFVO0FBQzFCLFFBQUksc0JBQXNCLEtBQUsseUJBQXlCLFVBQVUsSUFBSSxFQUFFO0FBQ3hFLFVBQU0sWUFBWSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsYUFBYSxRQUFRO0FBQ2pGLFVBQU0sTUFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsVUFBTSxHQUFHLFVBQVUsV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFVBQU0sVUFBVSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsc0JBQXNCLEdBQUcsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0csUUFBSSxRQUFRLFVBQVU7QUFDcEIsWUFBTSxhQUFhLE9BQU8sS0FBSyxPQUFPLFFBQVEsRUFBRTtBQUNoRCxVQUFJLHNCQUFzQixLQUFLLDJCQUEyQixPQUFPLFVBQVUsQ0FBQyx5QkFBeUI7QUFDckcsZ0JBQVUsU0FBUyxPQUFPLFFBQVE7QUFBQSxJQUNwQztBQUVBLFFBQUksc0JBQXNCLEtBQUssOEJBQThCO0FBQzdELFVBQU0sVUFBVSxhQUFhLFNBQVM7QUFDdEMsUUFBSSxzQkFBc0IsS0FBSyx3QkFBd0I7QUFDdkQsVUFBTSxVQUFVLFNBQVMsU0FBUztBQUNsQyxRQUFJLHNCQUFzQixLQUFLLHFCQUFxQjtBQUtwRCxRQUFJLHNCQUFzQixLQUFLLHNCQUFzQixRQUFRLE1BQU07QUFDbkUsVUFBTSxFQUFFLGFBQWEsSUFBSSxNQUFNLGVBQWU7QUFBQSxNQUM1QyxNQUFNLEVBQUUsU0FBUztBQUFBLE1BQ2pCLElBQUk7QUFBQSxNQUNKLDJCQUEyQjtBQUFBLE1BQzNCO0FBQUEsTUFDQSxXQUFXLFVBQVU7QUFBQSxJQUN2QixDQUFDO0FBRUQsUUFBSSxjQUFjO0FBQ2hCLFlBQU0sSUFBSSxNQUFNLFdBQVcsUUFBUSxxQkFBcUIsWUFBWSxFQUFFO0FBQUEsSUFDeEU7QUFFQSxRQUFJLHNCQUFzQixLQUFLLGFBQWEsUUFBUSx5QkFBeUI7QUFFN0UsVUFBTSxtQkFBbUIsd0JBQXdCLGtCQUFrQixTQUFTO0FBQzVFLFVBQU0sU0FBMEIsRUFBRSxXQUFXLFdBQVcsZ0JBQWdCLE9BQU8sa0JBQWtCLGlCQUFpQjtBQUNsSCxpQkFBYSxJQUFJLE1BQU07QUFDdkIsZUFBVyxJQUFJLFFBQVEsSUFBSTtBQUMzQixrQ0FBOEI7QUFDOUIsV0FBTztBQUFBLEVBQ1QsU0FBUyxPQUFnQjtBQUN2QixRQUFJLHNCQUFzQixLQUFLLGdDQUFnQztBQUMvRCxRQUFJO0FBQ0YsVUFBSSxhQUFhLFdBQVc7QUFDMUIsY0FBTSxVQUFVLFFBQVEsU0FBUztBQUFBLE1BQ25DO0FBQUEsSUFDRixTQUFTLGNBQXVCO0FBQzlCLFVBQUksc0JBQXNCLEtBQUssc0NBQXNDLGVBQWUsWUFBWSxDQUFDLEVBQUU7QUFBQSxJQUNyRztBQUNBLFFBQUk7QUFDRixZQUFNLFdBQVcsVUFBVTtBQUFBLElBQzdCLFNBQVMsY0FBdUI7QUFDOUIsVUFBSSxzQkFBc0IsS0FBSywwQ0FBMEMsZUFBZSxZQUFZLENBQUMsRUFBRTtBQUFBLElBQ3pHO0FBR0EsU0FBSyxRQUFRO0FBRWIsUUFBSSxzQkFBc0IsS0FBSyw0SEFBdUg7QUFDdEosVUFBTTtBQUFBLEVBQ1I7QUFDRjtBQVNBLGVBQXNCLGFBQWEsUUFBeUM7QUFDMUUsTUFBSSxDQUFDLFVBQVUsZ0JBQWdCLElBQUksTUFBTSxHQUFHO0FBQzFDO0FBQUEsRUFDRjtBQUNBLGtCQUFnQixJQUFJLE1BQU07QUFFMUIsTUFBSSx5QkFBeUIsT0FBTyxjQUFjLG1CQUFtQjtBQUVyRSxNQUFJO0FBQ0YsVUFBTSxjQUFjLE1BQU07QUFBQSxFQUM1QixTQUFTLE9BQWdCO0FBQ3ZCLFFBQUkseUJBQXlCLE9BQU8sY0FBYyxnQ0FBZ0MsZUFBZSxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQzNHLFVBQUU7QUFDQSxpQkFBYSxPQUFPLE1BQU07QUFDMUIscUJBQWlCLE1BQU07QUFBQSxFQUN6QjtBQUNGO0FBYUEsU0FBUyx3QkFDUCxTQUNBLFdBQ3NDO0FBQ3RDLE1BQUksU0FBUyxTQUFTLDZCQUE2QixFQUFFLHFCQUFxQixrQkFBa0I7QUFDMUYsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLGNBQWMsVUFBVSxlQUFlO0FBQzdDLE1BQUksc0JBQXNCLFFBQVEsSUFBSSxtQ0FBbUMsWUFBWSxTQUFTLGNBQWMsWUFBWSxRQUFRLEVBQUU7QUFFbEksU0FBTztBQUFBLElBQ0wsR0FBRztBQUFBLElBQ0gsVUFBVSxZQUFZO0FBQUEsSUFDdEIsV0FBVyxZQUFZO0FBQUEsRUFDekI7QUFDRjtBQU9BLFNBQVMsa0JBQTBCO0FBQ2pDLE1BQUksTUFBTSxRQUFRLElBQUk7QUFHdEIsU0FBTyxNQUFNO0FBQ1gsUUFBSSxXQUFXLEtBQUssS0FBSyxjQUFjLENBQUMsR0FBRztBQUN6QyxhQUFPO0FBQUEsSUFDVDtBQUNBLFVBQU0sU0FBUyxLQUFLLEtBQUssSUFBSTtBQUM3QixRQUFJLFdBQVcsS0FBSztBQUNsQixZQUFNLElBQUksTUFBTSxzREFBc0Q7QUFBQSxJQUN4RTtBQUNBLFVBQU07QUFBQSxFQUNSO0FBQ0Y7QUFVQSxTQUFTLGFBQWEsa0JBQWdFO0FBQ3BGLFNBQU8sa0JBQWtCLFNBQVMsNEJBQTRCLHFCQUFxQjtBQUNyRjtBQXNCQSxTQUFTLGdDQUFzQztBQUM3QyxNQUFJLDRCQUE0QjtBQUM5QjtBQUFBLEVBQ0Y7QUFDQSwrQkFBNkI7QUFFN0IsVUFBUSxHQUFHLGNBQWMsTUFBTTtBQUM3QixRQUFJLGFBQWEsU0FBUyxHQUFHO0FBQzNCO0FBQUEsSUFDRjtBQUVBLFFBQUksK0NBQStDLE9BQU8sYUFBYSxJQUFJLENBQUMseUNBQXlDO0FBRXJILGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLG1CQUFhLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBbUI7QUFDN0MsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLHdDQUF3QyxlQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDbkgsQ0FBQztBQUFBLElBQ0g7QUFBQSxFQUNGLENBQUM7QUFFRCxVQUFRLEdBQUcsc0JBQXNCLE1BQU07QUFDckMsUUFBSSxhQUFhLFNBQVMsR0FBRztBQUMzQjtBQUFBLElBQ0Y7QUFFQSxRQUFJLHFFQUFxRSxPQUFPLGFBQWEsSUFBSSxDQUFDLHFCQUFxQjtBQUN2SCxlQUFXLFVBQVUsQ0FBQyxHQUFHLFlBQVksR0FBRztBQUN0QyxtQkFBYSxNQUFNLEVBQUUsTUFBTSxDQUFDLFVBQW1CO0FBQzdDLFlBQUkseUJBQXlCLE9BQU8sY0FBYywwQ0FBMEMsZUFBZSxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3JILENBQUM7QUFBQSxJQUNIO0FBQUEsRUFDRixDQUFDO0FBRUQsVUFBUSxHQUFHLFFBQVEsTUFBTTtBQUN2QixRQUFJLGFBQWEsU0FBUyxHQUFHO0FBQzNCO0FBQUEsSUFDRjtBQUVBLFFBQUksd0NBQXdDLE9BQU8sYUFBYSxJQUFJLENBQUMscUJBQXFCO0FBQzFGLGVBQVcsVUFBVSxDQUFDLEdBQUcsWUFBWSxHQUFHO0FBQ3RDLFVBQUk7QUFDRixlQUFPLFVBQVUsY0FBYztBQUFBLE1BQ2pDLFNBQVMsT0FBZ0I7QUFDdkIsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLCtDQUErQyxlQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDMUg7QUFDQSxVQUFJO0FBQ0YsZUFBTyxPQUFPLFVBQVUsTUFBTSxFQUFFLE9BQU8sTUFBTSxXQUFXLEtBQUssQ0FBQztBQUFBLE1BQ2hFLFNBQVMsT0FBZ0I7QUFDdkIsWUFBSSx5QkFBeUIsT0FBTyxjQUFjLDJDQUEyQyxlQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsTUFDdEg7QUFDQSx1QkFBaUIsTUFBTTtBQUFBLElBQ3pCO0FBQ0EsaUJBQWEsTUFBTTtBQUFBLEVBQ3JCLENBQUM7QUFDSDtBQU9BLFNBQVMsaUJBQWlCLFFBQStCO0FBQ3ZELFFBQU0sT0FBTyxXQUFXLElBQUksTUFBTTtBQUNsQyxNQUFJLE1BQU07QUFDUixTQUFLLFFBQVE7QUFDYixlQUFXLE9BQU8sTUFBTTtBQUFBLEVBQzFCO0FBQ0Y7QUFXQSxlQUFlLGdCQUFnQixhQUFzQztBQUNuRSxRQUFNLFVBQVUsS0FBSyxhQUFhLFFBQVE7QUFDMUMsUUFBTSxZQUFZLEtBQUssYUFBYSxVQUFVO0FBQzlDLFFBQU0sWUFBWSxLQUFLLFNBQVMsT0FBTztBQUN2QyxRQUFNLGNBQWMsS0FBSyxXQUFXLE9BQU87QUFDM0MsUUFBTSxVQUFVLFdBQVcsU0FBUyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUk7QUFDaEUsUUFBTSxZQUFZLFdBQVcsV0FBVyxJQUFJLE1BQU0sS0FBSyxXQUFXLElBQUk7QUFFdEUsTUFBSSxXQUFXLFdBQVc7QUFDeEIsV0FBTyxRQUFRLFFBQVEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUNyRDtBQUVBLE1BQUksU0FBUztBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxXQUFXO0FBQ2IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLElBQUksTUFBTSw2REFBNkQ7QUFDL0U7QUFPQSxlQUFlLGNBQWMsUUFBd0M7QUFDbkUsTUFBSTtBQUNGLFVBQU0sT0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTO0FBQUEsRUFDakQsU0FBUyxPQUFnQjtBQUN2QixRQUFJLHlCQUF5QixPQUFPLGNBQWMsc0NBQXNDLGVBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNqSDtBQUVBLE1BQUk7QUFDRixVQUFNLE9BQU8sVUFBVSxVQUFVO0FBQUEsRUFDbkMsU0FBUyxPQUFnQjtBQUN2QixRQUFJLHlCQUF5QixPQUFPLGNBQWMsMENBQTBDLGVBQWUsS0FBSyxDQUFDLEVBQUU7QUFBQSxFQUNySDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
254
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLm1qcyc7XG5pbXBvcnQgeyBhY3F1aXJlU2V0dXBMb2NrIH0gZnJvbSAnLi9zZXR1cC1sb2NrLm1qcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmltcG9ydCB7IEFwcGl1bVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IERJU1RfREVWID0gJ2Rpc3QvZGV2JztcbmNvbnN0IERJU1RfQlVJTEQgPSAnZGlzdC9idWlsZCc7XG5jb25zdCBNQUlOX0pTID0gJ21haW4uanMnO1xuY29uc3QgT0JTSURJQU5fQ09ORklHX0RJUiA9ICcub2JzaWRpYW4nO1xuY29uc3QgUExVR0lOU19ESVIgPSAncGx1Z2lucyc7XG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19KU09OID0gJ2NvbW11bml0eS1wbHVnaW5zLmpzb24nO1xuXG4vKipcbiAqIFRyYWNrcyBzZXR1cHMgdGhhdCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCBoYXZlbid0IGJlZW4gdG9ybiBkb3duIHlldC5cbiAqIFVzZWQgYnkgdGhlIGBiZWZvcmVFeGl0YCBoYW5kbGVyIHRvIGNsZWFuIHVwIHdoZW4gYSB0ZXN0IHJ1bm5lciBleGl0c1xuICogd2l0aG91dCBjYWxsaW5nIHRlYXJkb3duIChlLmcuLCB3aGVuIG9uZSBwcm9qZWN0J3Mgc2V0dXAgZmFpbHMgYW5kIHRoZVxuICogcnVubmVyIGFib3J0cyBiZWZvcmUgdGVhcmluZyBkb3duIGFscmVhZHktaW5pdGlhbGl6ZWQgcHJvamVjdHMpLlxuICovXG5jb25zdCBhY3RpdmVTZXR1cHMgPSBuZXcgU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmNvbnN0IGRpc3Bvc2VkUmVzdWx0cyA9IG5ldyBXZWFrU2V0PENvcmVTZXR1cFJlc3VsdD4oKTtcbmxldCBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKipcbiAqIFRoZSBjcm9zcy1wcm9jZXNzIHNldHVwIGxvY2sgaGVsZCBieSBlYWNoIGFjdGl2ZSBzZXR1cC4gUmVsZWFzZWQgd2hlbiB0aGVcbiAqIHNldHVwIGlzIHRvcm4gZG93biAob3IgYnkgdGhlIHByb2Nlc3MgY2xlYW51cCBoYW5kbGVycyksIGFsbG93aW5nIGEgY29tcGV0aW5nXG4gKiBydW4gdG8gcHJvY2VlZC4gU2VlIHtAbGluayBhY3F1aXJlU2V0dXBMb2NrfS5cbiAqL1xuY29uc3Qgc2V0dXBMb2NrcyA9IG5ldyBNYXA8Q29yZVNldHVwUmVzdWx0LCBTZXR1cExvY2s+KCk7XG5cbmNvbnN0IEFORFJPSURfTE9DS19TQ09QRSA9ICdhbmRyb2lkJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29yZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogRmlsZXMgYW5kIGZvbGRlcnMgdG8gd3JpdGUgaW50byB0aGUgdmF1bHQgKipiZWZvcmUqKiBPYnNpZGlhbiBvcGVucyBpdCwgc29cbiAgICogaXRzIHN0YXJ0dXAgc2NhbiBpbmRleGVzIHRoZW0gaW4gb25lIHBhc3MgKHNlZSB7QGxpbmsgVGVtcFZhdWx0LnBvcHVsYXRlfSkuXG4gICAqIFVzZSB0aGlzIGZvciBsYXJnZSBmaXh0dXJlcyBcdTIwMTQgd3JpdGluZyB0aG91c2FuZHMgb2Ygbm90ZXMgYWZ0ZXIgb3BlbiBhbmRcbiAgICogZm9yY2luZyBhIHJlLXNjYW4gaXMgZmFyIHNsb3dlciBhbmQgbGVzcyByZWxpYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHBvcHVsYXRlPzogUG9wdWxhdGVGaWxlc1BhcmFtcyB8IHVuZGVmaW5lZDtcblxuICAvKiogVHJhbnNwb3J0IG9wdGlvbnMuIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gdGhlIENMSSB0cmFuc3BvcnQuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IHJldHVybmVkIGJ5IHtAbGluayBjb3JlU2V0dXB9LCB1c2VkIGJ5IGZyYW1ld29yayBhZGFwdGVyc1xuICogdG8gcGFzcyBjb250ZXh0IHRvIHRlc3Qgd29ya2Vycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3JlU2V0dXBSZXN1bHQge1xuICAvKiogVGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC4gKi9cbiAgcmVhZG9ubHkgdGVtcFZhdWx0OiBUZW1wVmF1bHQ7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgdXNlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQ7XG5cbiAgLyoqIFNob3J0IGxhYmVsIGZvciBsb2cgbWVzc2FnZXMgKGUuZy4gYFwib2JzaWRpYW4tY2RwXCJgKS4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0TGFiZWw6IHN0cmluZztcblxuICAvKiogVGhlIHRyYW5zcG9ydCBvcHRpb25zIHRoYXQgd2VyZSByZXNvbHZlZC4gKi9cbiAgcmVhZG9ubHkgdHJhbnNwb3J0T3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgc2V0dXAgbG9naWMuXG4gKlxuICogTG9hZHMgYC5lbnZgIGZyb20gdGhlIHByb2plY3Qgcm9vdCwgY3JlYXRlcyBhIHRyYW5zcG9ydCwgY29waWVzIHRoZSBidWlsdFxuICogcGx1Z2luIGludG8gYSB0ZW1wb3JhcnkgdmF1bHQsIHJlZ2lzdGVycyB0aGUgdmF1bHQgd2l0aCBPYnNpZGlhbiwgYW5kXG4gKiBlbmFibGVzIHRoZSBwbHVnaW4uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFNldHVwIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgc2V0dXAgcmVzdWx0IGNvbnRhaW5pbmcgdGhlIHRlbXAgdmF1bHQsIHRyYW5zcG9ydCwgYW5kIHJlc29sdmVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3JlU2V0dXAocGFyYW1zPzogQ29yZVNldHVwUGFyYW1zKTogUHJvbWlzZTxDb3JlU2V0dXBSZXN1bHQ+IHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBmaW5kUHJvamVjdFJvb3QoKTtcbiAgY29uc3QgZW52RmlsZVBhdGggPSBqb2luKHByb2plY3RSb290LCAnLmVudicpO1xuICBpZiAoZXhpc3RzU3luYyhlbnZGaWxlUGF0aCkpIHtcbiAgICBsb2FkRW52RmlsZShlbnZGaWxlUGF0aCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gcGFyYW1zPy50cmFuc3BvcnRPcHRpb25zO1xuICBjb25zdCBsYWJlbCA9IHRyYW5zcG9ydE9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcbiAgY29uc3QgbG9ja1Njb3BlID0gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnMpO1xuXG4gIGxldCBsb2NrOiBTZXR1cExvY2sgfCB1bmRlZmluZWQ7XG4gIGlmIChsb2NrU2NvcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBBY3F1aXJpbmcgJyR7bG9ja1Njb3BlfScgc2V0dXAgbG9jayAoc2VyaWFsaXplcyBhZ2FpbnN0IGFueSBjb25jdXJyZW50IGludGVncmF0aW9uLXRlc3QgcnVuKS4uLmApO1xuICAgIGxvY2sgPSBhd2FpdCBhY3F1aXJlU2V0dXBMb2NrKHsgbGFiZWwsIHNjb3BlOiBsb2NrU2NvcGUgfSk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGxvY2sgYWNxdWlyZWQuYCk7XG4gIH1cblxuICBsZXQgdHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCB8IHVuZGVmaW5lZDtcbiAgbGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0aW5nIHRyYW5zcG9ydC4uLmApO1xuICAgIHRyYW5zcG9ydCA9IGF3YWl0IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBUcmFuc3BvcnQgY3JlYXRlZDogJHt0cmFuc3BvcnQuY29uc3RydWN0b3IubmFtZX1gKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gICAgY29uc3QgZGlzdFBhdGggPSBhd2FpdCByZXNvbHZlRGlzdFBhdGgocHJvamVjdFJvb3QpO1xuICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUoam9pbihkaXN0UGF0aCwgJ21hbmlmZXN0Lmpzb24nKSwgJ3V0Zi04JykpIGFzIFBsdWdpbk1hbmlmZXN0O1xuICAgIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gICAgaWYgKHRyYW5zcG9ydC5pc01vYmlsZSAmJiBtYW5pZmVzdEpzb24uaXNEZXNrdG9wT25seSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgICBjb25zdCBidWlsZFN0YXQgPSBhd2FpdCBzdGF0KG1haW5Kcyk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVXNpbmcgJHtkaXN0UGF0aH0gKCR7YnVpbGRTdGF0Lm10aW1lLnRvSVNPU3RyaW5nKCl9KS4gSWYgb3V0ZGF0ZWQsIHJlYnVpbGQuYCk7XG5cbiAgICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIENyZWF0ZWQgdGVtcCB2YXVsdDogJHt0ZW1wVmF1bHQucGF0aH1gKTtcbiAgICBjb25zdCBwbHVnaW5EaXIgPSBqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBQTFVHSU5TX0RJUiwgcGx1Z2luSWQpO1xuICAgIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgY3AoZGlzdFBhdGgsIHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIENPTU1VTklUWV9QTFVHSU5TX0pTT04pLCBKU09OLnN0cmluZ2lmeShbcGx1Z2luSWRdKSk7XG5cbiAgICBpZiAocGFyYW1zPy5wb3B1bGF0ZSkge1xuICAgICAgY29uc3QgZW50cnlDb3VudCA9IE9iamVjdC5rZXlzKHBhcmFtcy5wb3B1bGF0ZSkubGVuZ3RoO1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBvcHVsYXRpbmcgdmF1bHQgd2l0aCAke1N0cmluZyhlbnRyeUNvdW50KX0gZW50cmllcyBiZWZvcmUgb3Blbi4uLmApO1xuICAgICAgdGVtcFZhdWx0LnBvcHVsYXRlKHBhcmFtcy5wb3B1bGF0ZSk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFN5bmNpbmcgdmF1bHQgdG8gZGV2aWNlLi4uYCk7XG4gICAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBSZWdpc3RlcmluZyB2YXVsdC4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5yZWdpc3Rlcih0cmFuc3BvcnQpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCByZWdpc3RlcmVkLmApO1xuXG4gICAgLy8gRW5hYmxlIHRoZSBwbHVnaW4gYW5kIHZlcmlmeSBpdCBsb2FkZWQuIE9ic2lkaWFuJ3MgZW5hYmxlUGx1Z2luKCkgd3JhcHNcbiAgICAvLyBMb2FkUGx1Z2luKCkgaW4gYSB0cnktY2F0Y2ggdGhhdCBzd2FsbG93cyBlcnJvcnMgYW5kIHJldHVybnMgZmFsc2UuXG4gICAgLy8gV2UgbW9ua2V5LXBhdGNoIGxvYWRQbHVnaW4oKSB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIEVuYWJsaW5nIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIuLi5gKTtcbiAgICBjb25zdCB7IGVycm9yTWVzc2FnZSB9ID0gYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgICAgZm46IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUsXG4gICAgICBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzOiB0cnVlLFxuICAgICAgdHJhbnNwb3J0LFxuICAgICAgdmF1bHRQYXRoOiB0ZW1wVmF1bHQucGF0aFxuICAgIH0pO1xuXG4gICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGZhaWxlZCB0byBsb2FkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseS5gKTtcblxuICAgIGNvbnN0IGF1Z21lbnRlZE9wdGlvbnMgPSBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zLCB0cmFuc3BvcnQpO1xuICAgIGNvbnN0IHJlc3VsdDogQ29yZVNldHVwUmVzdWx0ID0geyB0ZW1wVmF1bHQsIHRyYW5zcG9ydCwgdHJhbnNwb3J0TGFiZWw6IGxhYmVsLCB0cmFuc3BvcnRPcHRpb25zOiBhdWdtZW50ZWRPcHRpb25zIH07XG4gICAgYWN0aXZlU2V0dXBzLmFkZChyZXN1bHQpO1xuICAgIGlmIChsb2NrKSB7XG4gICAgICBzZXR1cExvY2tzLnNldChyZXN1bHQsIGxvY2spO1xuICAgIH1cbiAgICByZWdpc3RlclByb2Nlc3NDbGVhbnVwSGFuZGxlcigpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFNldHVwIGZhaWxlZCwgY2xlYW5pbmcgdXAuLi5gKTtcbiAgICB0cnkge1xuICAgICAgaWYgKHRlbXBWYXVsdCAmJiB0cmFuc3BvcnQpIHtcbiAgICAgICAgYXdhaXQgdGVtcFZhdWx0LmRpc3Bvc2UodHJhbnNwb3J0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChjbGVhbnVwRXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgbG9jayBzbyBhIHdhaXRpbmcgcnVuIGNhbiBwcm9jZWVkIGV2ZW4gdGhvdWdoIHRoaXMgcnVuIGZhaWxlZC5cbiAgICBsb2NrPy5yZWxlYXNlKCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gTk9URTogSWYgdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMgXCJObyB0ZXN0IGZpbGVzIGZvdW5kXCIsIGlnbm9yZSBpdCBcdTIwMTQgaXQgaXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgc2V0dXAgZmFpbHVyZSBhYm92ZS5gKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIEZyYW1ld29yay1hZ25vc3RpYyBnbG9iYWwgdGVhcmRvd24gbG9naWMuXG4gKlxuICogRGlzcG9zZXMgb2YgdGhlIHRlbXBvcmFyeSB2YXVsdCBhbmQgdHJhbnNwb3J0IGNyZWF0ZWQgZHVyaW5nIHNldHVwLlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgcmVzdWx0IGZyb20ge0BsaW5rIGNvcmVTZXR1cH0uIFdoZW4gYHVuZGVmaW5lZGAsIGRvZXMgbm90aGluZy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcmVUZWFyZG93bihyZXN1bHQ/OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFyZXN1bHQgfHwgZGlzcG9zZWRSZXN1bHRzLmhhcyhyZXN1bHQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpc3Bvc2VkUmVzdWx0cy5hZGQocmVzdWx0KTtcblxuICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRlYXJpbmcgZG93bi4uLmApO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgdGVhcmRvd25Bc3luYyhyZXN1bHQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gQ2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU2V0dXBzLmRlbGV0ZShyZXN1bHQpO1xuICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgfVxufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggc2Vzc2lvbiByZXVzZSBpbmZvIHdoZW4gdGhlIHRyYW5zcG9ydFxuICogc3VwcG9ydHMgaXQgKGN1cnJlbnRseSBBcHBpdW0gb25seSkuXG4gKlxuICogVGhlIGF1Z21lbnRlZCBvcHRpb25zIGFyZSBwcm92aWRlZCB0byB0ZXN0IHdvcmtlcnMgc28gdGhleSBjYW4gcmVhdHRhY2hcbiAqIHRvIHRoZSBleGlzdGluZyBzZXNzaW9uIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9yaWdpbmFsIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKiBAcmV0dXJucyBUaGUgYXVnbWVudGVkIG9wdGlvbnMsIG9yIHRoZSBvcmlnaW5hbCBvcHRpb25zIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyhcbiAgb3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0XG4pOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucz8udHlwZSAhPT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyB8fCAhKHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkpIHtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxuXG4gIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7b3B0aW9ucy50eXBlfV0gU2Vzc2lvbiByZXVzZSBpbmZvOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSW5mby5zZXNzaW9uSWR9LCBkZXZpY2VJZD0ke3Nlc3Npb25JbmZvLmRldmljZUlkfWApO1xuXG4gIHJldHVybiB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgc2Vzc2lvbklkOiBzZXNzaW9uSW5mby5zZXNzaW9uSWRcbiAgfTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY3Jvc3MtcHJvY2VzcyBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogbG9jayBpcyBuZWVkZWQuXG4gKlxuICogRGVza3RvcCBydW5zIHVzZSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZXMgKHRoZWlyIG93biB1c2VyLWRhdGEgZGlyXG4gKiBhbmQgQ0RQIHBvcnQpLCBzbyB0aGV5IG5vIGxvbmdlciBjb250ZW5kIGFuZCBuZWVkIG5vIGxvY2suIE9ubHkgdGhlIEFuZHJvaWRcbiAqIHRyYW5zcG9ydCwgd2hpY2ggc2hhcmVzIHRoZSBzaW5nbGUgZW11bGF0b3IgYW5kIEFwcGl1bSBzZXJ2ZXIsIG11c3Qgc2VyaWFsaXplLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiBubyBsb2NrIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nID8gQU5EUk9JRF9MT0NLX1NDT1BFIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbignZXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gU3luYyBjbGVhbnVwOiAke1N0cmluZyhhY3RpdmVTZXR1cHMuc2l6ZSl9IG9ycGhhbmVkIHNldHVwKHMpLmApO1xuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2VTeW5jPy4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gU3luYyB0cmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhbmQgZm9yZ2V0cyB0aGUgc2V0dXAgbG9jayBhc3NvY2lhdGVkIHdpdGggYSByZXN1bHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB3aG9zZSBsb2NrIHNob3VsZCBiZSByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVNldHVwTG9jayhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IHZvaWQge1xuICBjb25zdCBsb2NrID0gc2V0dXBMb2Nrcy5nZXQocmVzdWx0KTtcbiAgaWYgKGxvY2spIHtcbiAgICBsb2NrLnJlbGVhc2UoKTtcbiAgICBzZXR1cExvY2tzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhc3luYyB0ZWFyZG93biB3b3JrICh2YXVsdCBkaXNwb3NhbCArIHRyYW5zcG9ydCBkaXNwb3NhbCkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgdG8gdGVhciBkb3duLlxuICovXG5hc3luYyBmdW5jdGlvbiB0ZWFyZG93bkFzeW5jKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRlbXBWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZT8uKCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBUcmFuc3BvcnQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxXQUFXLG1CQUFtQjtBQU9yQyxTQUFTLG9DQUFvQztBQUM3QyxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLFdBQVc7QUFDcEIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxrQ0FBa0M7QUFFM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLFVBQVU7QUFDaEIsTUFBTSxzQkFB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
@@ -12,10 +12,9 @@ export type { PopulateFileContent, PopulateFilesParams } from './temp-vault.mjs'
12
12
  export { TempVault } from './temp-vault.mjs';
13
13
  export type { AppiumSessionInfo, AppiumTransportConfig } from './transport-appium.mjs';
14
14
  export { AppiumTransport } from './transport-appium.mjs';
15
- export type { DesktopCdpTransportConfig } from './transport-desktop-cdp.mjs';
15
+ export type { DesktopCdpTransportConfig, OwnedInstanceAsar, OwnedInstanceConfig } from './transport-desktop-cdp.mjs';
16
16
  export { DesktopCdpTransport } from './transport-desktop-cdp.mjs';
17
- export { DesktopCliTransport } from './transport-desktop-cli.mjs';
18
17
  export { createTransportFromOptions } from './transport-factory.mjs';
19
- export type { ObsidianAndroidAppiumTransportOptions, ObsidianCdpTransportOptions, ObsidianCliTransportOptions, ObsidianTransportOptions } from './transport-options.mjs';
18
+ export type { ObsidianAndroidAppiumTransportOptions, ObsidianCdpTransportOptions, ObsidianTransportOptions } from './transport-options.mjs';
20
19
  export type { ObsidianTransport, TransportEvalOptions } from './transport.mjs';
21
20
  export { registerVault, unregisterVault } from './vault-registry.mjs';
@@ -7,7 +7,6 @@ import { evalInObsidian } from "./eval-in-obsidian.mjs";
7
7
  import { TempVault } from "./temp-vault.mjs";
8
8
  import { AppiumTransport } from "./transport-appium.mjs";
9
9
  import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
10
- import { DesktopCliTransport } from "./transport-desktop-cli.mjs";
11
10
  import { createTransportFromOptions } from "./transport-factory.mjs";
12
11
  import {
13
12
  registerVault,
@@ -17,7 +16,6 @@ export {
17
16
  AppiumTransport,
18
17
  ContextId,
19
18
  DesktopCdpTransport,
20
- DesktopCliTransport,
21
19
  TempVault,
22
20
  createTransportFromOptions,
23
21
  evalInObsidian,
@@ -26,4 +24,4 @@ export {
26
24
  setVaultPathResolver,
27
25
  unregisterVault
28
26
  };
29
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgVmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQge1xuICBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIHNldFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5tanMnO1xuZXhwb3J0IHR5cGUgeyBFdmFsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgdHlwZSB7IERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2xpVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jbGkubWpzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2xpVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5leHBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBTUEsU0FBUyxpQkFBaUI7QUFLMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHNCQUFzQjtBQUsvQixTQUFTLGlCQUFpQjtBQUsxQixTQUFTLHVCQUF1QjtBQUVoQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtDQUFrQztBQVczQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSzsiLAogICJuYW1lcyI6IFtdCn0K
27
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgVmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQge1xuICBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIHNldFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5tanMnO1xuZXhwb3J0IHR5cGUgeyBFdmFsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgUG9wdWxhdGVGaWxlQ29udGVudCxcbiAgUG9wdWxhdGVGaWxlc1BhcmFtc1xufSBmcm9tICcuL3RlbXAtdmF1bHQubWpzJztcbmV4cG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcbiJdLAogICJtYXBwaW5ncyI6ICJBQU1BLFNBQVMsaUJBQWlCO0FBSzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxzQkFBc0I7QUFLL0IsU0FBUyxpQkFBaUI7QUFLMUIsU0FBUyx1QkFBdUI7QUFNaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxrQ0FBa0M7QUFVM0M7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Cross-platform helper to kill a child process and its entire process tree.
5
+ */
6
+ import type { ChildProcess } from 'node:child_process';
7
+ /**
8
+ * Kills a child process and its entire process tree.
9
+ *
10
+ * On Windows, `child.kill()` only sends SIGTERM to the direct process,
11
+ * leaving spawned grandchildren (e.g. Electron renderer/GPU helpers, QEMU,
12
+ * UiAutomator) alive. `taskkill /F /T /PID` forcefully terminates the entire tree.
13
+ *
14
+ * @param child - The child process to kill.
15
+ */
16
+ export declare function killProcessTree(child: ChildProcess): void;
@@ -0,0 +1,23 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import process from "node:process";
3
+ import { log } from "./log.mjs";
4
+ function killProcessTree(child) {
5
+ if (child.pid === void 0) {
6
+ return;
7
+ }
8
+ if (process.platform === "win32") {
9
+ try {
10
+ execFileSync("taskkill", ["/F", "/T", "/PID", String(child.pid)], { stdio: "ignore" });
11
+ } catch (error) {
12
+ log(
13
+ `[kill-process-tree] taskkill for PID ${String(child.pid)} failed (may have already exited): ${error instanceof Error ? error.message : "unknown error"}`
14
+ );
15
+ }
16
+ } else {
17
+ child.kill("SIGKILL");
18
+ }
19
+ }
20
+ export {
21
+ killProcessTree
22
+ };
23
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2tpbGwtcHJvY2Vzcy10cmVlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIHRvIGtpbGwgYSBjaGlsZCBwcm9jZXNzIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBwcm9jZXNzIG1hbmFnZW1lbnQgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcblxuaW1wb3J0IHsgZXhlY0ZpbGVTeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5cbi8qKlxuICogS2lsbHMgYSBjaGlsZCBwcm9jZXNzIGFuZCBpdHMgZW50aXJlIHByb2Nlc3MgdHJlZS5cbiAqXG4gKiBPbiBXaW5kb3dzLCBgY2hpbGQua2lsbCgpYCBvbmx5IHNlbmRzIFNJR1RFUk0gdG8gdGhlIGRpcmVjdCBwcm9jZXNzLFxuICogbGVhdmluZyBzcGF3bmVkIGdyYW5kY2hpbGRyZW4gKGUuZy4gRWxlY3Ryb24gcmVuZGVyZXIvR1BVIGhlbHBlcnMsIFFFTVUsXG4gKiBVaUF1dG9tYXRvcikgYWxpdmUuIGB0YXNra2lsbCAvRiAvVCAvUElEYCBmb3JjZWZ1bGx5IHRlcm1pbmF0ZXMgdGhlIGVudGlyZSB0cmVlLlxuICpcbiAqIEBwYXJhbSBjaGlsZCAtIFRoZSBjaGlsZCBwcm9jZXNzIHRvIGtpbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBraWxsUHJvY2Vzc1RyZWUoY2hpbGQ6IENoaWxkUHJvY2Vzcyk6IHZvaWQge1xuICBpZiAoY2hpbGQucGlkID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHRyeSB7XG4gICAgICBleGVjRmlsZVN5bmMoJ3Rhc2traWxsJywgWycvRicsICcvVCcsICcvUElEJywgU3RyaW5nKGNoaWxkLnBpZCldLCB7IHN0ZGlvOiAnaWdub3JlJyB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKFxuICAgICAgICBgW2tpbGwtcHJvY2Vzcy10cmVlXSB0YXNra2lsbCBmb3IgUElEICR7U3RyaW5nKGNoaWxkLnBpZCl9IGZhaWxlZCAobWF5IGhhdmUgYWxyZWFkeSBleGl0ZWQpOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNoaWxkLmtpbGwoJ1NJR0tJTEwnKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUEsU0FBUyxvQkFBb0I7QUFDN0IsT0FBTyxhQUFhO0FBRXBCLFNBQVMsV0FBVztBQVdiLFNBQVMsZ0JBQWdCLE9BQTJCO0FBQ3pELE1BQUksTUFBTSxRQUFRLFFBQVc7QUFDM0I7QUFBQSxFQUNGO0FBRUEsTUFBSSxRQUFRLGFBQWEsU0FBUztBQUNoQyxRQUFJO0FBQ0YsbUJBQWEsWUFBWSxDQUFDLE1BQU0sTUFBTSxRQUFRLE9BQU8sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sU0FBUyxDQUFDO0FBQUEsSUFDdkYsU0FBUyxPQUFnQjtBQUN2QjtBQUFBLFFBQ0Usd0NBQXdDLE9BQU8sTUFBTSxHQUFHLENBQUMsc0NBQXNDLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxlQUFlO0FBQUEsTUFDeko7QUFBQSxJQUNGO0FBQUEsRUFDRixPQUFPO0FBQ0wsVUFBTSxLQUFLLFNBQVM7QUFBQSxFQUN0QjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "4.3.0";
1
+ const LIBRARY_VERSION = false ? "dev" : "4.4.0";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };
@@ -1,58 +1,24 @@
1
1
  /**
2
2
  * @file
3
3
  *
4
- * Reads and queries Obsidian's local configuration (`obsidian.json`).
5
- */
6
- /**
7
- * A registered vault entry returned by {@link getRegisteredVaults}.
8
- */
9
- export interface RegisteredVault {
10
- /**
11
- * The hex vault ID from `obsidian.json`.
12
- */
13
- id: string;
14
- /**
15
- * Whether the vault is currently marked as open.
16
- */
17
- open: boolean;
18
- /**
19
- * The absolute path to the vault folder.
20
- */
21
- path: string;
22
- }
23
- /**
24
- * Enables the CLI in Obsidian's `obsidian.json` config file.
25
- *
26
- * Sets `cli: true` so that Obsidian starts its CLI server on next launch.
27
- * If the config file doesn't exist, creates it with an empty vaults object.
28
- */
29
- export declare function enableCliInConfig(): void;
30
- /**
31
- * Returns the absolute path of any currently-open vault.
32
- *
33
- * Prefer this over {@link getAnyRegisteredVaultPath} when the path is going
34
- * to be used as the target of an `obsidian eval` call: targeting a registered
35
- * but **closed** vault causes Obsidian's CLI handler to spawn a fresh window
36
- * for it (`pe(o, false)` in `main.js`), leaving a stray window behind.
4
+ * Reads and queries the user's Obsidian local configuration (`obsidian.json`).
37
5
  *
38
- * @returns The absolute path to an open vault, or `undefined` if none are open.
6
+ * Used by the CDP transport's **attach** mode (targeting an already-running,
7
+ * user-scope Obsidian). Harness-owned isolated instances write their own
8
+ * `obsidian.json` directly into a temporary user-data dir and do not use these
9
+ * helpers.
39
10
  */
40
- export declare function getAnyOpenVaultPath(): string | undefined;
41
11
  /**
42
- * Returns the path of any vault that is currently registered in Obsidian's registry.
43
- *
44
- * This is useful when an `obsidian eval` call must run inside an existing vault
45
- * window (e.g., to issue IPC commands that register or remove other vaults).
12
+ * Returns the platform-specific path to the **user's** Obsidian config (user-data)
13
+ * directory — `%APPDATA%\obsidian` on Windows, `~/Library/Application Support/obsidian`
14
+ * on macOS, `$XDG_CONFIG_HOME/obsidian` (or `~/.config/obsidian`) on Linux.
46
15
  *
47
- * @returns The absolute path to a registered vault, or `undefined` if no vaults are registered.
48
- */
49
- export declare function getAnyRegisteredVaultPath(): string | undefined;
50
- /**
51
- * Returns all registered vaults from Obsidian's `obsidian.json` registry.
16
+ * This is the user-scope directory; harness-owned isolated instances use their
17
+ * own temporary user-data dir instead.
52
18
  *
53
- * @returns An array of registered vault entries.
19
+ * @returns The absolute path to the `obsidian/` config directory.
54
20
  */
55
- export declare function getRegisteredVaults(): RegisteredVault[];
21
+ export declare function getObsidianConfigDir(): string;
56
22
  /**
57
23
  * Returns the hex vault ID for a given vault path from Obsidian's registry.
58
24
  *
@@ -60,22 +26,6 @@ export declare function getRegisteredVaults(): RegisteredVault[];
60
26
  * @returns The vault ID, or `undefined` if the vault is not registered.
61
27
  */
62
28
  export declare function getVaultId(vaultPath: string): string | undefined;
63
- /**
64
- * Checks whether the Obsidian CLI is enabled in Obsidian's settings.
65
- *
66
- * @returns `true` if the CLI is enabled, `false` otherwise.
67
- */
68
- export declare function isCliEnabled(): boolean;
69
- /**
70
- * Checks whether a vault is marked as open in Obsidian's vault registry.
71
- *
72
- * Note: This checks the `open` flag in `obsidian.json`, which is updated
73
- * asynchronously by Obsidian. It may not reflect the current runtime state.
74
- *
75
- * @param vaultPath - The absolute path to the vault folder.
76
- * @returns `true` if the vault is registered and marked as open, `false` otherwise.
77
- */
78
- export declare function isVaultOpen(vaultPath: string): boolean;
79
29
  /**
80
30
  * Checks whether a vault path is registered in Obsidian's vault registry.
81
31
  *
@@ -83,16 +33,6 @@ export declare function isVaultOpen(vaultPath: string): boolean;
83
33
  * @returns `true` if the vault is registered, `false` otherwise.
84
34
  */
85
35
  export declare function isVaultRegistered(vaultPath: string): boolean;
86
- /**
87
- * Registers a vault directly in Obsidian's `obsidian.json` config file.
88
- *
89
- * This writes a new vault entry with a random hex ID. Used when no existing
90
- * vault is available to send IPC commands through — the vault is registered
91
- * "offline" so Obsidian will open it on next launch.
92
- *
93
- * @param vaultPath - The absolute path to the vault folder.
94
- */
95
- export declare function registerVaultInConfig(vaultPath: string): void;
96
36
  /**
97
37
  * Removes a vault entry from Obsidian's `obsidian.json` config file.
98
38
  *
@@ -1,4 +1,3 @@
1
- import { randomBytes } from "node:crypto";
2
1
  import {
3
2
  readFileSync,
4
3
  writeFileSync
@@ -9,41 +8,17 @@ import {
9
8
  resolve
10
9
  } from "node:path";
11
10
  import process from "node:process";
12
- function enableCliInConfig() {
13
- const config = readObsidianJson() ?? { vaults: {} };
14
- config.cli = true;
15
- writeObsidianJson(config);
16
- }
17
- function getAnyOpenVaultPath() {
18
- const config = readObsidianJson();
19
- if (!config) {
20
- return void 0;
21
- }
22
- for (const entry of Object.values(config.vaults)) {
23
- if (entry.open === true) {
24
- return entry.path;
11
+ function getObsidianConfigDir() {
12
+ if (process.platform === "win32") {
13
+ const appData = process.env["APPDATA"];
14
+ if (appData) {
15
+ return join(appData, "obsidian");
25
16
  }
26
17
  }
27
- return void 0;
28
- }
29
- function getAnyRegisteredVaultPath() {
30
- const config = readObsidianJson();
31
- if (!config) {
32
- return void 0;
33
- }
34
- const firstEntry = Object.values(config.vaults)[0];
35
- return firstEntry?.path;
36
- }
37
- function getRegisteredVaults() {
38
- const config = readObsidianJson();
39
- if (!config) {
40
- return [];
18
+ if (process.platform === "darwin") {
19
+ return join(homedir(), "Library", "Application Support", "obsidian");
41
20
  }
42
- return Object.entries(config.vaults).map(([id, entry]) => ({
43
- id,
44
- open: entry.open === true,
45
- path: entry.path
46
- }));
21
+ return join(process.env["XDG_CONFIG_HOME"] ?? join(homedir(), ".config"), "obsidian");
47
22
  }
48
23
  function getVaultId(vaultPath) {
49
24
  const config = readObsidianJson();
@@ -58,34 +33,9 @@ function getVaultId(vaultPath) {
58
33
  }
59
34
  return void 0;
60
35
  }
61
- function isCliEnabled() {
62
- const config = readObsidianJson();
63
- return config?.cli === true;
64
- }
65
- function isVaultOpen(vaultPath) {
66
- const config = readObsidianJson();
67
- if (!config) {
68
- return false;
69
- }
70
- const normalizedTarget = normalizePath(vaultPath);
71
- for (const entry of Object.values(config.vaults)) {
72
- if (normalizePath(entry.path) === normalizedTarget) {
73
- return entry.open === true;
74
- }
75
- }
76
- return false;
77
- }
78
36
  function isVaultRegistered(vaultPath) {
79
37
  return getVaultId(vaultPath) !== void 0;
80
38
  }
81
- function registerVaultInConfig(vaultPath) {
82
- const config = readObsidianJson() ?? { vaults: {} };
83
- const VAULT_ID_BYTE_LENGTH = 8;
84
- const id = randomBytes(VAULT_ID_BYTE_LENGTH).toString("hex");
85
- config.vaults[id] = { path: vaultPath, ts: Date.now() };
86
- config.cli = true;
87
- writeObsidianJson(config);
88
- }
89
39
  function removeVaultFromConfig(vaultPath) {
90
40
  const config = readObsidianJson();
91
41
  if (!config) {
@@ -105,18 +55,6 @@ function removeVaultFromConfig(vaultPath) {
105
55
  }
106
56
  return wasFound;
107
57
  }
108
- function getObsidianConfigDir() {
109
- if (process.platform === "win32") {
110
- const appData = process.env["APPDATA"];
111
- if (appData) {
112
- return join(appData, "obsidian");
113
- }
114
- }
115
- if (process.platform === "darwin") {
116
- return join(homedir(), "Library", "Application Support", "obsidian");
117
- }
118
- return join(process.env["XDG_CONFIG_HOME"] ?? join(homedir(), ".config"), "obsidian");
119
- }
120
58
  function normalizePath(vaultPath) {
121
59
  const resolved = resolve(vaultPath);
122
60
  return process.platform === "win32" ? resolved.toLowerCase() : resolved;
@@ -135,15 +73,9 @@ function writeObsidianJson(config) {
135
73
  writeFileSync(configPath, JSON.stringify(config));
136
74
  }
137
75
  export {
138
- enableCliInConfig,
139
- getAnyOpenVaultPath,
140
- getAnyRegisteredVaultPath,
141
- getRegisteredVaults,
76
+ getObsidianConfigDir,
142
77
  getVaultId,
143
- isCliEnabled,
144
- isVaultOpen,
145
78
  isVaultRegistered,
146
- registerVaultInConfig,
147
79
  removeVaultFromConfig
148
80
  };
149
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCBxdWVyaWVzIE9ic2lkaWFuJ3MgbG9jYWwgY29uZmlndXJhdGlvbiAoYG9ic2lkaWFuLmpzb25gKS5cbiAqL1xuXG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7XG4gIHJlYWRGaWxlU3luYyxcbiAgd3JpdGVGaWxlU3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7XG4gIGpvaW4sXG4gIHJlc29sdmVcbn0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbi8qKlxuICogQSByZWdpc3RlcmVkIHZhdWx0IGVudHJ5IHJldHVybmVkIGJ5IHtAbGluayBnZXRSZWdpc3RlcmVkVmF1bHRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlcmVkVmF1bHQge1xuICAvKipcbiAgICogVGhlIGhleCB2YXVsdCBJRCBmcm9tIGBvYnNpZGlhbi5qc29uYC5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhdWx0IGlzIGN1cnJlbnRseSBtYXJrZWQgYXMgb3Blbi5cbiAgICovXG4gIG9wZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUgb2YgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhbkpzb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIGlzIGVuYWJsZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBjbGk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNYXAgb2YgdmF1bHQgSURzIHRvIHZhdWx0IGVudHJpZXMuXG4gICAqL1xuICB2YXVsdHM6IFJlY29yZDxzdHJpbmcsIE9ic2lkaWFuVmF1bHRFbnRyeT47XG59XG5cbi8qKlxuICogQSBzaW5nbGUgdmF1bHQgZW50cnkgaW4gYG9ic2lkaWFuLmpzb25gLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5WYXVsdEVudHJ5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhdWx0IGlzIGN1cnJlbnRseSBvcGVuLlxuICAgKi9cbiAgb3Blbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBvZiB0aGUgbGFzdCBhY2Nlc3MuXG4gICAqL1xuICB0czogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgdGhlIENMSSBpbiBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBTZXRzIGBjbGk6IHRydWVgIHNvIHRoYXQgT2JzaWRpYW4gc3RhcnRzIGl0cyBDTEkgc2VydmVyIG9uIG5leHQgbGF1bmNoLlxuICogSWYgdGhlIGNvbmZpZyBmaWxlIGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZXMgaXQgd2l0aCBhbiBlbXB0eSB2YXVsdHMgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlQ2xpSW5Db25maWcoKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKSA/PyB7IHZhdWx0czoge30gfTtcbiAgY29uZmlnLmNsaSA9IHRydWU7XG4gIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiBhbnkgY3VycmVudGx5LW9wZW4gdmF1bHQuXG4gKlxuICogUHJlZmVyIHRoaXMgb3ZlciB7QGxpbmsgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aH0gd2hlbiB0aGUgcGF0aCBpcyBnb2luZ1xuICogdG8gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mIGFuIGBvYnNpZGlhbiBldmFsYCBjYWxsOiB0YXJnZXRpbmcgYSByZWdpc3RlcmVkXG4gKiBidXQgKipjbG9zZWQqKiB2YXVsdCBjYXVzZXMgT2JzaWRpYW4ncyBDTEkgaGFuZGxlciB0byBzcGF3biBhIGZyZXNoIHdpbmRvd1xuICogZm9yIGl0IChgcGUobywgZmFsc2UpYCBpbiBgbWFpbi5qc2ApLCBsZWF2aW5nIGEgc3RyYXkgd2luZG93IGJlaGluZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byBhbiBvcGVuIHZhdWx0LCBvciBgdW5kZWZpbmVkYCBpZiBub25lIGFyZSBvcGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW55T3BlblZhdWx0UGF0aCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LnZhbHVlcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChlbnRyeS5vcGVuID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZW50cnkucGF0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIG9mIGFueSB2YXVsdCB0aGF0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIGluIE9ic2lkaWFuJ3MgcmVnaXN0cnkuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgd2hlbiBhbiBgb2JzaWRpYW4gZXZhbGAgY2FsbCBtdXN0IHJ1biBpbnNpZGUgYW4gZXhpc3RpbmcgdmF1bHRcbiAqIHdpbmRvdyAoZS5nLiwgdG8gaXNzdWUgSVBDIGNvbW1hbmRzIHRoYXQgcmVnaXN0ZXIgb3IgcmVtb3ZlIG90aGVyIHZhdWx0cykuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gYSByZWdpc3RlcmVkIHZhdWx0LCBvciBgdW5kZWZpbmVkYCBpZiBubyB2YXVsdHMgYXJlIHJlZ2lzdGVyZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZmlyc3RFbnRyeSA9IE9iamVjdC52YWx1ZXMoY29uZmlnLnZhdWx0cylbMF07XG4gIHJldHVybiBmaXJzdEVudHJ5Py5wYXRoO1xufVxuXG4vKipcbiAqIFJldHVybnMgYWxsIHJlZ2lzdGVyZWQgdmF1bHRzIGZyb20gT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgcmVnaXN0cnkuXG4gKlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgcmVnaXN0ZXJlZCB2YXVsdCBlbnRyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZFZhdWx0cygpOiBSZWdpc3RlcmVkVmF1bHRbXSB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29uZmlnLnZhdWx0cykubWFwKChbaWQsIGVudHJ5XSkgPT4gKHtcbiAgICBpZCxcbiAgICBvcGVuOiBlbnRyeS5vcGVuID09PSB0cnVlLFxuICAgIHBhdGg6IGVudHJ5LnBhdGhcbiAgfSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGhleCB2YXVsdCBJRCBmb3IgYSBnaXZlbiB2YXVsdCBwYXRoIGZyb20gT2JzaWRpYW4ncyByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIFRoZSB2YXVsdCBJRCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmF1bHRJZCh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IG5vcm1hbGl6ZVBhdGgodmF1bHRQYXRoKTtcblxuICBmb3IgKGNvbnN0IFtpZCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YXVsdHMpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZVBhdGgoZW50cnkucGF0aCkgPT09IG5vcm1hbGl6ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBPYnNpZGlhbiBDTEkgaXMgZW5hYmxlZCBpbiBPYnNpZGlhbidzIHNldHRpbmdzLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgQ0xJIGlzIGVuYWJsZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDbGlFbmFibGVkKCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIHJldHVybiBjb25maWc/LmNsaSA9PT0gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IGlzIG1hcmtlZCBhcyBvcGVuIGluIE9ic2lkaWFuJ3MgdmF1bHQgcmVnaXN0cnkuXG4gKlxuICogTm90ZTogVGhpcyBjaGVja3MgdGhlIGBvcGVuYCBmbGFnIGluIGBvYnNpZGlhbi5qc29uYCwgd2hpY2ggaXMgdXBkYXRlZFxuICogYXN5bmNocm9ub3VzbHkgYnkgT2JzaWRpYW4uIEl0IG1heSBub3QgcmVmbGVjdCB0aGUgY3VycmVudCBydW50aW1lIHN0YXRlLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkIGFuZCBtYXJrZWQgYXMgb3BlbiwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhdWx0T3Blbih2YXVsdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IG5vcm1hbGl6ZVBhdGgodmF1bHRQYXRoKTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIE9iamVjdC52YWx1ZXMoY29uZmlnLnZhdWx0cykpIHtcbiAgICBpZiAobm9ybWFsaXplUGF0aChlbnRyeS5wYXRoKSA9PT0gbm9ybWFsaXplZFRhcmdldCkge1xuICAgICAgcmV0dXJuIGVudHJ5Lm9wZW4gPT09IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgdmF1bHQgcGF0aCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuJ3MgdmF1bHQgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFZhdWx0SWQodmF1bHRQYXRoKSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHZhdWx0IGRpcmVjdGx5IGluIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGNvbmZpZyBmaWxlLlxuICpcbiAqIFRoaXMgd3JpdGVzIGEgbmV3IHZhdWx0IGVudHJ5IHdpdGggYSByYW5kb20gaGV4IElELiBVc2VkIHdoZW4gbm8gZXhpc3RpbmdcbiAqIHZhdWx0IGlzIGF2YWlsYWJsZSB0byBzZW5kIElQQyBjb21tYW5kcyB0aHJvdWdoIFx1MjAxNCB0aGUgdmF1bHQgaXMgcmVnaXN0ZXJlZFxuICogXCJvZmZsaW5lXCIgc28gT2JzaWRpYW4gd2lsbCBvcGVuIGl0IG9uIG5leHQgbGF1bmNoLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJWYXVsdEluQ29uZmlnKHZhdWx0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKSA/PyB7IHZhdWx0czoge30gfTtcbiAgY29uc3QgVkFVTFRfSURfQllURV9MRU5HVEggPSA4O1xuICBjb25zdCBpZCA9IHJhbmRvbUJ5dGVzKFZBVUxUX0lEX0JZVEVfTEVOR1RIKS50b1N0cmluZygnaGV4Jyk7XG4gIGNvbmZpZy52YXVsdHNbaWRdID0geyBwYXRoOiB2YXVsdFBhdGgsIHRzOiBEYXRlLm5vdygpIH07XG4gIGNvbmZpZy5jbGkgPSB0cnVlO1xuICB3cml0ZU9ic2lkaWFuSnNvbihjb25maWcpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYSB2YXVsdCBlbnRyeSBmcm9tIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGNvbmZpZyBmaWxlLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXVsdCB3YXMgZm91bmQgYW5kIHJlbW92ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbmZpZyA9IHJlYWRPYnNpZGlhbkpzb24oKTtcbiAgaWYgKCFjb25maWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkVGFyZ2V0ID0gbm9ybWFsaXplUGF0aCh2YXVsdFBhdGgpO1xuICBsZXQgd2FzRm91bmQgPSBmYWxzZTtcblxuICBmb3IgKGNvbnN0IFtpZCwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy52YXVsdHMpKSB7XG4gICAgaWYgKG5vcm1hbGl6ZVBhdGgoZW50cnkucGF0aCkgPT09IG5vcm1hbGl6ZWRUYXJnZXQpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gUmVtb3ZpbmcgYSB2YXVsdCBlbnRyeSBieSBpdHMgZHluYW1pYyBrZXkuXG4gICAgICBkZWxldGUgY29uZmlnLnZhdWx0c1tpZF07XG4gICAgICB3YXNGb3VuZCA9IHRydWU7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAod2FzRm91bmQpIHtcbiAgICB3cml0ZU9ic2lkaWFuSnNvbihjb25maWcpO1xuICB9XG5cbiAgcmV0dXJuIHdhc0ZvdW5kO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggdG8gT2JzaWRpYW4ncyBjb25maWcgZGlyZWN0b3J5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBgb2JzaWRpYW4vYCBjb25maWcgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBnZXRPYnNpZGlhbkNvbmZpZ0RpcigpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGFwcERhdGEgPSBwcm9jZXNzLmVudlsnQVBQREFUQSddO1xuICAgIGlmIChhcHBEYXRhKSB7XG4gICAgICByZXR1cm4gam9pbihhcHBEYXRhLCAnb2JzaWRpYW4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gam9pbihob21lZGlyKCksICdMaWJyYXJ5JywgJ0FwcGxpY2F0aW9uIFN1cHBvcnQnLCAnb2JzaWRpYW4nKTtcbiAgfVxuXG4gIHJldHVybiBqb2luKHByb2Nlc3MuZW52WydYREdfQ09ORklHX0hPTUUnXSA/PyBqb2luKGhvbWVkaXIoKSwgJy5jb25maWcnKSwgJ29ic2lkaWFuJyk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHZhdWx0IHBhdGggZm9yIGNvbXBhcmlzb24uXG4gKiBPbiBXaW5kb3dzLCBwYXRocyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBhbmQgc2VwYXJhdG9ycyBtYXkgdmFyeS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHBhdGggdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aCh2YXVsdFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZSh2YXVsdFBhdGgpO1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHJlc29sdmVkLnRvTG93ZXJDYXNlKCkgOiByZXNvbHZlZDtcbn1cblxuLyoqXG4gKiBSZWFkcyBhbmQgcGFyc2VzIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGNvbmZpZyBmaWxlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgY29uZmlnLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIGNhbid0IGJlIHBhcnNlZC5cbiAqL1xuZnVuY3Rpb24gcmVhZE9ic2lkaWFuSnNvbigpOiBPYnNpZGlhbkpzb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWdQYXRoID0gam9pbihnZXRPYnNpZGlhbkNvbmZpZ0RpcigpLCAnb2JzaWRpYW4uanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCkgYXMgT2JzaWRpYW5Kc29uO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIHRoZSBnaXZlbiBjb25maWcgb2JqZWN0IHRvIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGZpbGUuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjb25maWcgdG8gd3JpdGUuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlT2JzaWRpYW5Kc29uKGNvbmZpZzogT2JzaWRpYW5Kc29uKTogdm9pZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGdldE9ic2lkaWFuQ29uZmlnRGlyKCksICdvYnNpZGlhbi5qc29uJyk7XG4gIHdyaXRlRmlsZVN5bmMoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFNQSxTQUFTLG1CQUFtQjtBQUM1QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sYUFBYTtBQStEYixTQUFTLG9CQUEwQjtBQUN4QyxRQUFNLFNBQVMsaUJBQWlCLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtBQUNsRCxTQUFPLE1BQU07QUFDYixvQkFBa0IsTUFBTTtBQUMxQjtBQVlPLFNBQVMsc0JBQTBDO0FBQ3hELFFBQU0sU0FBUyxpQkFBaUI7QUFDaEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLGFBQVcsU0FBUyxPQUFPLE9BQU8sT0FBTyxNQUFNLEdBQUc7QUFDaEQsUUFBSSxNQUFNLFNBQVMsTUFBTTtBQUN2QixhQUFPLE1BQU07QUFBQSxJQUNmO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQVVPLFNBQVMsNEJBQWdEO0FBQzlELFFBQU0sU0FBUyxpQkFBaUI7QUFDaEMsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sYUFBYSxPQUFPLE9BQU8sT0FBTyxNQUFNLEVBQUUsQ0FBQztBQUNqRCxTQUFPLFlBQVk7QUFDckI7QUFPTyxTQUFTLHNCQUF5QztBQUN2RCxRQUFNLFNBQVMsaUJBQWlCO0FBQ2hDLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTyxDQUFDO0FBQUEsRUFDVjtBQUVBLFNBQU8sT0FBTyxRQUFRLE9BQU8sTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPO0FBQUEsSUFDekQ7QUFBQSxJQUNBLE1BQU0sTUFBTSxTQUFTO0FBQUEsSUFDckIsTUFBTSxNQUFNO0FBQUEsRUFDZCxFQUFFO0FBQ0o7QUFRTyxTQUFTLFdBQVcsV0FBdUM7QUFDaEUsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsY0FBYyxTQUFTO0FBRWhELGFBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxPQUFPLFFBQVEsT0FBTyxNQUFNLEdBQUc7QUFDdkQsUUFBSSxjQUFjLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUNsRCxhQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFPTyxTQUFTLGVBQXdCO0FBQ3RDLFFBQU0sU0FBUyxpQkFBaUI7QUFDaEMsU0FBTyxRQUFRLFFBQVE7QUFDekI7QUFXTyxTQUFTLFlBQVksV0FBNEI7QUFDdEQsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsY0FBYyxTQUFTO0FBRWhELGFBQVcsU0FBUyxPQUFPLE9BQU8sT0FBTyxNQUFNLEdBQUc7QUFDaEQsUUFBSSxjQUFjLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUNsRCxhQUFPLE1BQU0sU0FBUztBQUFBLElBQ3hCO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsa0JBQWtCLFdBQTRCO0FBQzVELFNBQU8sV0FBVyxTQUFTLE1BQU07QUFDbkM7QUFXTyxTQUFTLHNCQUFzQixXQUF5QjtBQUM3RCxRQUFNLFNBQVMsaUJBQWlCLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtBQUNsRCxRQUFNLHVCQUF1QjtBQUM3QixRQUFNLEtBQUssWUFBWSxvQkFBb0IsRUFBRSxTQUFTLEtBQUs7QUFDM0QsU0FBTyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQ3RELFNBQU8sTUFBTTtBQUNiLG9CQUFrQixNQUFNO0FBQzFCO0FBUU8sU0FBUyxzQkFBc0IsV0FBNEI7QUFDaEUsUUFBTSxTQUFTLGlCQUFpQjtBQUNoQyxNQUFJLENBQUMsUUFBUTtBQUNYLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxtQkFBbUIsY0FBYyxTQUFTO0FBQ2hELE1BQUksV0FBVztBQUVmLGFBQVcsQ0FBQyxJQUFJLEtBQUssS0FBSyxPQUFPLFFBQVEsT0FBTyxNQUFNLEdBQUc7QUFDdkQsUUFBSSxjQUFjLE1BQU0sSUFBSSxNQUFNLGtCQUFrQjtBQUVsRCxhQUFPLE9BQU8sT0FBTyxFQUFFO0FBQ3ZCLGlCQUFXO0FBQ1g7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLE1BQUksVUFBVTtBQUNaLHNCQUFrQixNQUFNO0FBQUEsRUFDMUI7QUFFQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLHVCQUErQjtBQUN0QyxNQUFJLFFBQVEsYUFBYSxTQUFTO0FBQ2hDLFVBQU0sVUFBVSxRQUFRLElBQUksU0FBUztBQUNyQyxRQUFJLFNBQVM7QUFDWCxhQUFPLEtBQUssU0FBUyxVQUFVO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBRUEsTUFBSSxRQUFRLGFBQWEsVUFBVTtBQUNqQyxXQUFPLEtBQUssUUFBUSxHQUFHLFdBQVcsdUJBQXVCLFVBQVU7QUFBQSxFQUNyRTtBQUVBLFNBQU8sS0FBSyxRQUFRLElBQUksaUJBQWlCLEtBQUssS0FBSyxRQUFRLEdBQUcsU0FBUyxHQUFHLFVBQVU7QUFDdEY7QUFTQSxTQUFTLGNBQWMsV0FBMkI7QUFDaEQsUUFBTSxXQUFXLFFBQVEsU0FBUztBQUNsQyxTQUFPLFFBQVEsYUFBYSxVQUFVLFNBQVMsWUFBWSxJQUFJO0FBQ2pFO0FBT0EsU0FBUyxtQkFBNkM7QUFDcEQsUUFBTSxhQUFhLEtBQUsscUJBQXFCLEdBQUcsZUFBZTtBQUMvRCxNQUFJO0FBQ0YsVUFBTSxVQUFVLGFBQWEsWUFBWSxPQUFPO0FBQ2hELFdBQU8sS0FBSyxNQUFNLE9BQU87QUFBQSxFQUMzQixRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQU9BLFNBQVMsa0JBQWtCLFFBQTRCO0FBQ3JELFFBQU0sYUFBYSxLQUFLLHFCQUFxQixHQUFHLGVBQWU7QUFDL0QsZ0JBQWMsWUFBWSxLQUFLLFVBQVUsTUFBTSxDQUFDO0FBQ2xEOyIsCiAgIm5hbWVzIjogW10KfQo=
81
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuLWNvbmZpZy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlYWRzIGFuZCBxdWVyaWVzIHRoZSB1c2VyJ3MgT2JzaWRpYW4gbG9jYWwgY29uZmlndXJhdGlvbiAoYG9ic2lkaWFuLmpzb25gKS5cbiAqXG4gKiBVc2VkIGJ5IHRoZSBDRFAgdHJhbnNwb3J0J3MgKiphdHRhY2gqKiBtb2RlICh0YXJnZXRpbmcgYW4gYWxyZWFkeS1ydW5uaW5nLFxuICogdXNlci1zY29wZSBPYnNpZGlhbikuIEhhcm5lc3Mtb3duZWQgaXNvbGF0ZWQgaW5zdGFuY2VzIHdyaXRlIHRoZWlyIG93blxuICogYG9ic2lkaWFuLmpzb25gIGRpcmVjdGx5IGludG8gYSB0ZW1wb3JhcnkgdXNlci1kYXRhIGRpciBhbmQgZG8gbm90IHVzZSB0aGVzZVxuICogaGVscGVycy5cbiAqL1xuXG5pbXBvcnQge1xuICByZWFkRmlsZVN5bmMsXG4gIHdyaXRlRmlsZVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQge1xuICBqb2luLFxuICByZXNvbHZlXG59IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG4vKipcbiAqIFRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlIG9mIE9ic2lkaWFuJ3MgYG9ic2lkaWFuLmpzb25gIGNvbmZpZyBmaWxlLlxuICovXG5pbnRlcmZhY2UgT2JzaWRpYW5Kc29uIHtcbiAgLyoqXG4gICAqIE1hcCBvZiB2YXVsdCBJRHMgdG8gdmF1bHQgZW50cmllcy5cbiAgICovXG4gIHZhdWx0czogUmVjb3JkPHN0cmluZywgT2JzaWRpYW5WYXVsdEVudHJ5Pjtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSB2YXVsdCBlbnRyeSBpbiBgb2JzaWRpYW4uanNvbmAuXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhblZhdWx0RW50cnkge1xuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIG9mIHRoZSBsYXN0IGFjY2Vzcy5cbiAgICovXG4gIHRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCB0byB0aGUgKip1c2VyJ3MqKiBPYnNpZGlhbiBjb25maWcgKHVzZXItZGF0YSlcbiAqIGRpcmVjdG9yeSBcdTIwMTQgYCVBUFBEQVRBJVxcb2JzaWRpYW5gIG9uIFdpbmRvd3MsIGB+L0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC9vYnNpZGlhbmBcbiAqIG9uIG1hY09TLCBgJFhER19DT05GSUdfSE9NRS9vYnNpZGlhbmAgKG9yIGB+Ly5jb25maWcvb2JzaWRpYW5gKSBvbiBMaW51eC5cbiAqXG4gKiBUaGlzIGlzIHRoZSB1c2VyLXNjb3BlIGRpcmVjdG9yeTsgaGFybmVzcy1vd25lZCBpc29sYXRlZCBpbnN0YW5jZXMgdXNlIHRoZWlyXG4gKiBvd24gdGVtcG9yYXJ5IHVzZXItZGF0YSBkaXIgaW5zdGVhZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgYG9ic2lkaWFuL2AgY29uZmlnIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9ic2lkaWFuQ29uZmlnRGlyKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgYXBwRGF0YSA9IHByb2Nlc3MuZW52WydBUFBEQVRBJ107XG4gICAgaWYgKGFwcERhdGEpIHtcbiAgICAgIHJldHVybiBqb2luKGFwcERhdGEsICdvYnNpZGlhbicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBqb2luKGhvbWVkaXIoKSwgJ0xpYnJhcnknLCAnQXBwbGljYXRpb24gU3VwcG9ydCcsICdvYnNpZGlhbicpO1xuICB9XG5cbiAgcmV0dXJuIGpvaW4ocHJvY2Vzcy5lbnZbJ1hER19DT05GSUdfSE9NRSddID8/IGpvaW4oaG9tZWRpcigpLCAnLmNvbmZpZycpLCAnb2JzaWRpYW4nKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBoZXggdmF1bHQgSUQgZm9yIGEgZ2l2ZW4gdmF1bHQgcGF0aCBmcm9tIE9ic2lkaWFuJ3MgcmVnaXN0cnkuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKiBAcmV0dXJucyBUaGUgdmF1bHQgSUQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhdWx0SWQodmF1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRUYXJnZXQgPSBub3JtYWxpemVQYXRoKHZhdWx0UGF0aCk7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IHBhdGggaXMgcmVnaXN0ZXJlZCBpbiBPYnNpZGlhbidzIHZhdWx0IHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRWYXVsdElkKHZhdWx0UGF0aCkgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGEgdmF1bHQgZW50cnkgZnJvbSBPYnNpZGlhbidzIGBvYnNpZGlhbi5qc29uYCBjb25maWcgZmlsZS5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmF1bHQgd2FzIGZvdW5kIGFuZCByZW1vdmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVZhdWx0RnJvbUNvbmZpZyh2YXVsdFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSByZWFkT2JzaWRpYW5Kc29uKCk7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZFRhcmdldCA9IG5vcm1hbGl6ZVBhdGgodmF1bHRQYXRoKTtcbiAgbGV0IHdhc0ZvdW5kID0gZmFsc2U7XG5cbiAgZm9yIChjb25zdCBbaWQsIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhjb25maWcudmF1bHRzKSkge1xuICAgIGlmIChub3JtYWxpemVQYXRoKGVudHJ5LnBhdGgpID09PSBub3JtYWxpemVkVGFyZ2V0KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIFJlbW92aW5nIGEgdmF1bHQgZW50cnkgYnkgaXRzIGR5bmFtaWMga2V5LlxuICAgICAgZGVsZXRlIGNvbmZpZy52YXVsdHNbaWRdO1xuICAgICAgd2FzRm91bmQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdhc0ZvdW5kKSB7XG4gICAgd3JpdGVPYnNpZGlhbkpzb24oY29uZmlnKTtcbiAgfVxuXG4gIHJldHVybiB3YXNGb3VuZDtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgdmF1bHQgcGF0aCBmb3IgY29tcGFyaXNvbi5cbiAqIE9uIFdpbmRvd3MsIHBhdGhzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIGFuZCBzZXBhcmF0b3JzIG1heSB2YXJ5LlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgcGF0aCB0byBub3JtYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKHZhdWx0UGF0aCk7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gcmVzb2x2ZWQudG9Mb3dlckNhc2UoKSA6IHJlc29sdmVkO1xufVxuXG4vKipcbiAqIFJlYWRzIGFuZCBwYXJzZXMgT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgY29uZmlnIGZpbGUuXG4gKlxuICogQHJldHVybnMgVGhlIHBhcnNlZCBjb25maWcsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3Qgb3IgY2FuJ3QgYmUgcGFyc2VkLlxuICovXG5mdW5jdGlvbiByZWFkT2JzaWRpYW5Kc29uKCk6IE9ic2lkaWFuSnNvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGdldE9ic2lkaWFuQ29uZmlnRGlyKCksICdvYnNpZGlhbi5qc29uJyk7XG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KSBhcyBPYnNpZGlhbkpzb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXcml0ZXMgdGhlIGdpdmVuIGNvbmZpZyBvYmplY3QgdG8gT2JzaWRpYW4ncyBgb2JzaWRpYW4uanNvbmAgZmlsZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZyB0byB3cml0ZS5cbiAqL1xuZnVuY3Rpb24gd3JpdGVPYnNpZGlhbkpzb24oY29uZmlnOiBPYnNpZGlhbkpzb24pOiB2b2lkIHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oZ2V0T2JzaWRpYW5Db25maWdEaXIoKSwgJ29ic2lkaWFuLmpzb24nKTtcbiAgd3JpdGVGaWxlU3luYyhjb25maWdQYXRoLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVdBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxhQUFhO0FBcUNiLFNBQVMsdUJBQStCO0FBQzdDLE1BQUksUUFBUSxhQUFhLFNBQVM7QUFDaEMsVUFBTSxVQUFVLFFBQVEsSUFBSSxTQUFTO0FBQ3JDLFFBQUksU0FBUztBQUNYLGFBQU8sS0FBSyxTQUFTLFVBQVU7QUFBQSxJQUNqQztBQUFBLEVBQ0Y7QUFFQSxNQUFJLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU8sS0FBSyxRQUFRLEdBQUcsV0FBVyx1QkFBdUIsVUFBVTtBQUFBLEVBQ3JFO0FBRUEsU0FBTyxLQUFLLFFBQVEsSUFBSSxpQkFBaUIsS0FBSyxLQUFLLFFBQVEsR0FBRyxTQUFTLEdBQUcsVUFBVTtBQUN0RjtBQVFPLFNBQVMsV0FBVyxXQUF1QztBQUNoRSxRQUFNLFNBQVMsaUJBQWlCO0FBQ2hDLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixjQUFjLFNBQVM7QUFFaEQsYUFBVyxDQUFDLElBQUksS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLE1BQU0sR0FBRztBQUN2RCxRQUFJLGNBQWMsTUFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBQ2xELGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsa0JBQWtCLFdBQTRCO0FBQzVELFNBQU8sV0FBVyxTQUFTLE1BQU07QUFDbkM7QUFRTyxTQUFTLHNCQUFzQixXQUE0QjtBQUNoRSxRQUFNLFNBQVMsaUJBQWlCO0FBQ2hDLE1BQUksQ0FBQyxRQUFRO0FBQ1gsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLG1CQUFtQixjQUFjLFNBQVM7QUFDaEQsTUFBSSxXQUFXO0FBRWYsYUFBVyxDQUFDLElBQUksS0FBSyxLQUFLLE9BQU8sUUFBUSxPQUFPLE1BQU0sR0FBRztBQUN2RCxRQUFJLGNBQWMsTUFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBRWxELGFBQU8sT0FBTyxPQUFPLEVBQUU7QUFDdkIsaUJBQVc7QUFDWDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsTUFBSSxVQUFVO0FBQ1osc0JBQWtCLE1BQU07QUFBQSxFQUMxQjtBQUVBLFNBQU87QUFDVDtBQVNBLFNBQVMsY0FBYyxXQUEyQjtBQUNoRCxRQUFNLFdBQVcsUUFBUSxTQUFTO0FBQ2xDLFNBQU8sUUFBUSxhQUFhLFVBQVUsU0FBUyxZQUFZLElBQUk7QUFDakU7QUFPQSxTQUFTLG1CQUE2QztBQUNwRCxRQUFNLGFBQWEsS0FBSyxxQkFBcUIsR0FBRyxlQUFlO0FBQy9ELE1BQUk7QUFDRixVQUFNLFVBQVUsYUFBYSxZQUFZLE9BQU87QUFDaEQsV0FBTyxLQUFLLE1BQU0sT0FBTztBQUFBLEVBQzNCLFFBQVE7QUFDTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBT0EsU0FBUyxrQkFBa0IsUUFBNEI7QUFDckQsUUFBTSxhQUFhLEtBQUsscUJBQXFCLEdBQUcsZUFBZTtBQUMvRCxnQkFBYyxZQUFZLEtBQUssVUFBVSxNQUFNLENBQUM7QUFDbEQ7IiwKICAibmFtZXMiOiBbXQp9Cg==