obsidian-integration-testing 8.0.1 → 8.1.1

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 (65) hide show
  1. package/README.md +23 -4
  2. package/dist/lib/cjs/cli.cjs +29 -8
  3. package/dist/lib/cjs/cli.d.cts +2 -1
  4. package/dist/lib/cjs/connect-to-cdp.cjs +17 -11
  5. package/dist/lib/cjs/connect-to-cdp.d.cts +35 -3
  6. package/dist/lib/cjs/context-provider.cjs +1 -1
  7. package/dist/lib/cjs/context-provider.d.cts +1 -1
  8. package/dist/lib/cjs/global-setup-core.cjs +17 -5
  9. package/dist/lib/cjs/global-setup-core.d.cts +11 -1
  10. package/dist/lib/cjs/incompatible-installer-version-error.cjs +52 -0
  11. package/dist/lib/cjs/incompatible-installer-version-error.d.cts +44 -0
  12. package/dist/lib/cjs/index.cjs +13 -1
  13. package/dist/lib/cjs/index.d.cts +7 -0
  14. package/dist/lib/cjs/installer-compatibility.cjs +64 -0
  15. package/dist/lib/cjs/installer-compatibility.d.cts +75 -0
  16. package/dist/lib/cjs/library.cjs +1 -1
  17. package/dist/lib/cjs/namespace-bootstrap.cjs +16 -7
  18. package/dist/lib/cjs/obsidian-installer.cjs +7 -4
  19. package/dist/lib/cjs/obsidian-metadata.cjs +1811 -0
  20. package/dist/lib/cjs/obsidian-metadata.d.cts +56 -0
  21. package/dist/lib/cjs/renderer-boot-detection.cjs +49 -0
  22. package/dist/lib/cjs/renderer-boot-detection.d.cts +83 -0
  23. package/dist/lib/cjs/renderer-failed-to-initialize-error.cjs +41 -0
  24. package/dist/lib/cjs/renderer-failed-to-initialize-error.d.cts +23 -0
  25. package/dist/lib/cjs/transport-desktop-cdp.cjs +85 -3
  26. package/dist/lib/cjs/transport-desktop-cdp.d.cts +55 -1
  27. package/dist/lib/cjs/transport-factory.cjs +76 -21
  28. package/dist/lib/cjs/transport-factory.d.cts +1 -1
  29. package/dist/lib/cjs/transport-options.cjs +1 -1
  30. package/dist/lib/cjs/transport-options.d.cts +37 -4
  31. package/dist/lib/cjs/visibility.cjs +10 -2
  32. package/dist/lib/cjs/visibility.d.cts +27 -8
  33. package/dist/lib/esm/cli.d.mts +2 -1
  34. package/dist/lib/esm/cli.mjs +29 -8
  35. package/dist/lib/esm/connect-to-cdp.d.mts +35 -3
  36. package/dist/lib/esm/connect-to-cdp.mjs +17 -11
  37. package/dist/lib/esm/context-provider.d.mts +1 -1
  38. package/dist/lib/esm/context-provider.mjs +1 -1
  39. package/dist/lib/esm/global-setup-core.d.mts +11 -1
  40. package/dist/lib/esm/global-setup-core.mjs +15 -4
  41. package/dist/lib/esm/incompatible-installer-version-error.d.mts +44 -0
  42. package/dist/lib/esm/incompatible-installer-version-error.mjs +28 -0
  43. package/dist/lib/esm/index.d.mts +7 -0
  44. package/dist/lib/esm/index.mjs +9 -1
  45. package/dist/lib/esm/installer-compatibility.d.mts +75 -0
  46. package/dist/lib/esm/installer-compatibility.mjs +40 -0
  47. package/dist/lib/esm/library.mjs +1 -1
  48. package/dist/lib/esm/namespace-bootstrap.mjs +16 -7
  49. package/dist/lib/esm/obsidian-installer.mjs +7 -4
  50. package/dist/lib/esm/obsidian-metadata.d.mts +56 -0
  51. package/dist/lib/esm/obsidian-metadata.mjs +1787 -0
  52. package/dist/lib/esm/renderer-boot-detection.d.mts +83 -0
  53. package/dist/lib/esm/renderer-boot-detection.mjs +23 -0
  54. package/dist/lib/esm/renderer-failed-to-initialize-error.d.mts +23 -0
  55. package/dist/lib/esm/renderer-failed-to-initialize-error.mjs +17 -0
  56. package/dist/lib/esm/transport-desktop-cdp.d.mts +55 -1
  57. package/dist/lib/esm/transport-desktop-cdp.mjs +89 -3
  58. package/dist/lib/esm/transport-factory.d.mts +1 -1
  59. package/dist/lib/esm/transport-factory.mjs +76 -21
  60. package/dist/lib/esm/transport-options.d.mts +37 -4
  61. package/dist/lib/esm/visibility.d.mts +27 -8
  62. package/dist/lib/esm/visibility.mjs +8 -2
  63. package/dist/obsidian-integration-testing-8.1.1.tgz +0 -0
  64. package/package.json +2 -3
  65. package/dist/obsidian-integration-testing-8.0.1.tgz +0 -0
@@ -38,8 +38,8 @@ async function coreSetup(params) {
38
38
  if (existsSync(envFilePath)) {
39
39
  loadEnvFile(envFilePath);
40
40
  }
41
- const transportOptions = params?.transportOptions;
42
- const label = transportOptions?.type ?? DEFAULT_TRANSPORT_TYPE;
41
+ const transportOptions = resolveIntegrationTransportOptions(params?.transportOptions);
42
+ const label = transportOptions.type;
43
43
  const lockScope = getLockScope(transportOptions);
44
44
  let lock;
45
45
  if (lockScope !== void 0) {
@@ -135,6 +135,16 @@ async function coreTeardown(result) {
135
135
  releaseSetupLock(result);
136
136
  }
137
137
  }
138
+ function resolveIntegrationTransportOptions(options) {
139
+ if (options?.type === "obsidian-android-appium") {
140
+ return options;
141
+ }
142
+ return {
143
+ ...options,
144
+ isObsidianAppVisible: options?.isObsidianAppVisible ?? false,
145
+ type: "obsidian-cdp"
146
+ };
147
+ }
138
148
  function augmentTransportOptions(options, transport) {
139
149
  if (options?.type === "obsidian-android-appium" && transport instanceof AppiumTransport) {
140
150
  const sessionInfo = transport.getSessionInfo();
@@ -263,6 +273,7 @@ async function teardownAsync(result) {
263
273
  }
264
274
  export {
265
275
  coreSetup,
266
- coreTeardown
276
+ coreTeardown,
277
+ resolveIntegrationTransportOptions
267
278
  };
268
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGFjcXVpcmVTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG5jb25zdCBBTkRST0lEX0xPQ0tfU0NPUEUgPSAnYW5kcm9pZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIEZpbGVzIGFuZCBmb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0ICoqYmVmb3JlKiogT2JzaWRpYW4gb3BlbnMgaXQsIHNvXG4gICAqIGl0cyBzdGFydHVwIHNjYW4gaW5kZXhlcyB0aGVtIGluIG9uZSBwYXNzIChzZWUge0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0pLlxuICAgKiBVc2UgdGhpcyBmb3IgbGFyZ2UgZml4dHVyZXMgXHUyMDE0IHdyaXRpbmcgdGhvdXNhbmRzIG9mIG5vdGVzIGFmdGVyIG9wZW4gYW5kXG4gICAqIGZvcmNpbmcgYSByZS1zY2FuIGlzIGZhciBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuXG4gICAqL1xuICByZWFkb25seSBwb3B1bGF0ZT86IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRyYW5zcG9ydCBvcHRpb25zLiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIHRoZSBDTEkgdHJhbnNwb3J0LiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSB7QGxpbmsgY29yZVNldHVwfSwgdXNlZCBieSBmcmFtZXdvcmsgYWRhcHRlcnNcbiAqIHRvIHBhc3MgY29udGV4dCB0byB0ZXN0IHdvcmtlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUmVzdWx0IHtcbiAgLyoqIFRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IGluc3RhbmNlIHVzZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzIChlLmcuIGBcIm9ic2lkaWFuLWNkcFwiYCkuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0aGF0IHdlcmUgcmVzb2x2ZWQuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNvcGllcyB0aGUgYnVpbHRcbiAqIHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCByZWdpc3RlcnMgdGhlIHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZFxuICogZW5hYmxlcyB0aGUgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBTZXR1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNldHVwIHJlc3VsdCBjb250YWluaW5nIHRoZSB0ZW1wIHZhdWx0LCB0cmFuc3BvcnQsIGFuZCByZXNvbHZlZCBvcHRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVNldHVwKHBhcmFtcz86IENvcmVTZXR1cFBhcmFtcyk6IFByb21pc2U8Q29yZVNldHVwUmVzdWx0PiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IGVudkZpbGVQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJy5lbnYnKTtcbiAgaWYgKGV4aXN0c1N5bmMoZW52RmlsZVBhdGgpKSB7XG4gICAgbG9hZEVudkZpbGUoZW52RmlsZVBhdGgpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IHBhcmFtcz8udHJhbnNwb3J0T3B0aW9ucztcbiAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG4gIGNvbnN0IGxvY2tTY29wZSA9IGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zKTtcblxuICBsZXQgbG9jazogU2V0dXBMb2NrIHwgdW5kZWZpbmVkO1xuICBpZiAobG9ja1Njb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQWNxdWlyaW5nICcke2xvY2tTY29wZX0nIHNldHVwIGxvY2sgKHNlcmlhbGl6ZXMgYWdhaW5zdCBhbnkgY29uY3VycmVudCBpbnRlZ3JhdGlvbi10ZXN0IHJ1bikuLi5gKTtcbiAgICBsb2NrID0gYXdhaXQgYWNxdWlyZVNldHVwTG9jayh7IGxhYmVsLCBzY29wZTogbG9ja1Njb3BlIH0pO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBsb2NrIGFjcXVpcmVkLmApO1xuICB9XG5cbiAgbGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGluZyB0cmFuc3BvcnQuLi5gKTtcbiAgICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUHJvamVjdCByb290OiAke3Byb2plY3RSb290fWApO1xuICAgIGNvbnN0IGRpc3RQYXRoID0gYXdhaXQgcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290KTtcbiAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlzdFBhdGgsICdtYW5pZmVzdC5qc29uJyksICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcbiAgICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICAgIGlmICh0cmFuc3BvcnQuaXNNb2JpbGUgJiYgbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gICAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gICAgdGVtcFZhdWx0ID0gbmV3IFRlbXBWYXVsdCgpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGVkIHRlbXAgdmF1bHQ6ICR7dGVtcFZhdWx0LnBhdGh9YCk7XG4gICAgY29uc3QgcGx1Z2luRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgICBhd2FpdCBta2RpcihwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xuXG4gICAgaWYgKHBhcmFtcz8ucG9wdWxhdGUpIHtcbiAgICAgIGNvbnN0IGVudHJ5Q291bnQgPSBPYmplY3Qua2V5cyhwYXJhbXMucG9wdWxhdGUpLmxlbmd0aDtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQb3B1bGF0aW5nIHZhdWx0IHdpdGggJHtTdHJpbmcoZW50cnlDb3VudCl9IGVudHJpZXMgYmVmb3JlIG9wZW4uLi5gKTtcbiAgICAgIHRlbXBWYXVsdC5wb3B1bGF0ZShwYXJhbXMucG9wdWxhdGUpO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUmVnaXN0ZXJpbmcgdmF1bHQuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgcmVnaXN0ZXJlZC5gKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gICAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAgIC8vIFdlIG1vbmtleS1wYXRjaCBsb2FkUGx1Z2luKCkgdG8gY2FwdHVyZSB0aGUgZXJyb3IgYmVmb3JlIGl0J3Mgc3dhbGxvd2VkLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gICAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgIGFyZ3M6IHsgcGx1Z2luSWQgfSxcbiAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICB9KTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkuYCk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdWdtZW50cyB0cmFuc3BvcnQgb3B0aW9ucyB3aXRoIHJldXNlIGluZm8gc28gdGVzdCB3b3JrZXJzIGNhbiByZWF0dGFjaCB0byB0aGVcbiAqIGluc3RhbmNlIHRoZSBnbG9iYWwgc2V0dXAgYWxyZWFkeSBsYXVuY2hlZCBpbnN0ZWFkIG9mIGNyZWF0aW5nIHRoZWlyIG93bjpcbiAqXG4gKiAtICoqQXBwaXVtKiogXHUyMDE0IGluamVjdHMgdGhlIGVzdGFibGlzaGVkIGBzZXNzaW9uSWRgL2BkZXZpY2VJZGAuXG4gKiAtICoqT3duZWQgZGVza3RvcCBDRFAqKiBcdTIwMTQgaW5qZWN0cyB0aGUgb3duZWQgaW5zdGFuY2UncyBgaG9zdGAvYHBvcnRgIChjaG9zZW5cbiAqICAgYXQgbGF1bmNoKSBwbHVzIHRoZSBpbnRlcm5hbCBgaXNIYXJuZXNzT3duZWRJbnN0YW5jZWAgZmxhZywgc28gZWFjaCB3b3JrZXJcbiAqICAgKiphdHRhY2hlcyoqIHRvIHRoYXQgaW5zdGFuY2Ugb3ZlciBDRFAgcmF0aGVyIHRoYW4gbGF1bmNoaW5nIChhbmQgbmV2ZXJcbiAqICAgcmVnaXN0ZXJpbmcpIGl0cyBvd24gXHUyMDE0IHRoZSBidWcgdGhhdCBvdGhlcndpc2UgbGVhdmVzIGEgd29ya2VyJ3MgdHJhbnNwb3J0XG4gKiAgIHdpdGggbm8gQ0RQIGVuZHBvaW50LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9yaWdpbmFsIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgaW5zdGFuY2UgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKiBAcmV0dXJucyBUaGUgYXVnbWVudGVkIG9wdGlvbnMsIG9yIHRoZSBvcmlnaW5hbCBvcHRpb25zIGlmIG5vdCBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBhdWdtZW50VHJhbnNwb3J0T3B0aW9ucyhcbiAgb3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0XG4pOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBBcHBpdW1UcmFuc3BvcnQpIHtcbiAgICBjb25zdCBzZXNzaW9uSW5mbyA9IHRyYW5zcG9ydC5nZXRTZXNzaW9uSW5mbygpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7b3B0aW9ucy50eXBlfV0gU2Vzc2lvbiByZXVzZSBpbmZvOiBzZXNzaW9uSWQ9JHtzZXNzaW9uSW5mby5zZXNzaW9uSWR9LCBkZXZpY2VJZD0ke3Nlc3Npb25JbmZvLmRldmljZUlkfWApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZGV2aWNlSWQ6IHNlc3Npb25JbmZvLmRldmljZUlkLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSW5mby5zZXNzaW9uSWRcbiAgICB9O1xuICB9XG5cbiAgaWYgKChvcHRpb25zID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykgJiYgdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCkge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gdHJhbnNwb3J0LmdldE93bmVkSW5zdGFuY2VFbmRwb2ludCgpO1xuICAgIGlmIChlbmRwb2ludCkge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtERUZBVUxUX1RSQU5TUE9SVF9UWVBFfV0gT3duZWQgaW5zdGFuY2UgcmV1c2UgaW5mbzogaG9zdD0ke2VuZHBvaW50Lmhvc3R9LCBwb3J0PSR7U3RyaW5nKGVuZHBvaW50LnBvcnQpfWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgaG9zdDogZW5kcG9pbnQuaG9zdCxcbiAgICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogdHJ1ZSxcbiAgICAgICAgcG9ydDogZW5kcG9pbnQucG9ydCxcbiAgICAgICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNyb3NzLXByb2Nlc3MgbG9jayBzY29wZSBmb3IgYSB0cmFuc3BvcnQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9cbiAqIGxvY2sgaXMgbmVlZGVkLlxuICpcbiAqIERlc2t0b3AgcnVucyB1c2UgaGFybmVzcy1vd25lZCwgaXNvbGF0ZWQgaW5zdGFuY2VzICh0aGVpciBvd24gdXNlci1kYXRhIGRpclxuICogYW5kIENEUCBwb3J0KSwgc28gdGhleSBubyBsb25nZXIgY29udGVuZCBhbmQgbmVlZCBubyBsb2NrLiBPbmx5IHRoZSBBbmRyb2lkXG4gKiB0cmFuc3BvcnQsIHdoaWNoIHNoYXJlcyB0aGUgc2luZ2xlIGVtdWxhdG9yIGFuZCBBcHBpdW0gc2VydmVyLCBtdXN0IHNlcmlhbGl6ZS5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBsb2NrIHNjb3BlIHN0cmluZywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gbG9jayBpcyBuZWVkZWQuXG4gKi9cbmZ1bmN0aW9uIGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJyA/IEFORFJPSURfTE9DS19TQ09QRSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgY2xlYW51cCBoYW5kbGVycyBmb3Igb3JwaGFuZWQgc2V0dXBzIHRoYXQgd2VyZSBuZXZlciBleHBsaWNpdGx5XG4gKiB0b3JuIGRvd24uXG4gKlxuICogVHdvIGhhbmRsZXJzIGNvdmVyIGRpZmZlcmVudCBleGl0IHNjZW5hcmlvczpcbiAqXG4gKiAtIGBiZWZvcmVFeGl0YCBcdTIwMTQgZmlyZXMgd2hlbiB0aGUgZXZlbnQgbG9vcCBkcmFpbnMgbmF0dXJhbGx5LiBBbGxvd3MgZnVsbFxuICogICBhc3luYyB0ZWFyZG93biAodW5yZWdpc3RlciB2YXVsdHMsIGRpc3Bvc2UgdHJhbnNwb3J0cykuIERvZXMgTk9UIGZpcmVcbiAqICAgd2hlbiBgcHJvY2Vzcy5leGl0KClgIGlzIGNhbGxlZCBkaXJlY3RseS5cbiAqXG4gKiAtIGB1bmhhbmRsZWRSZWplY3Rpb25gIFx1MjAxNCBjYXRjaGVzIGFzeW5jIGVycm9ycyB0aGF0IGJ5cGFzcyBgY29yZVNldHVwYCdzXG4gKiAgIGNhdGNoIGJsb2NrLiBQZXJmb3JtcyBmdWxsIGFzeW5jIHRlYXJkb3duIHdoaWxlIHdlIHN0aWxsIGNhbi5cbiAqXG4gKiAtIGBleGl0YCBcdTIwMTQgZmlyZXMgb24gZXZlcnkgZXhpdCwgaW5jbHVkaW5nIGBwcm9jZXNzLmV4aXQoKWAuIE9ubHkgc3luY2hyb25vdXNcbiAqICAgd29yayBpcyBwb3NzaWJsZSwgc28gdGhpcyBoYW5kbGVyIGRvZXMgYmVzdC1lZmZvcnQgY2xlYW51cDoga2lsbHMgY2hpbGRcbiAqICAgcHJvY2Vzc2VzIHZpYSBgZGlzcG9zZVN5bmMoKWAgYW5kIHJlbW92ZXMgdGVtcCB2YXVsdCBkaXJlY3RvcmllcyB3aXRoXG4gKiAgIGBybVN5bmNgLiBVbnJlZ2lzdGVyaW5nIHZhdWx0cyAod2hpY2ggcmVxdWlyZXMgSVBDIHdpdGggT2JzaWRpYW4pIGlzXG4gKiAgIHNraXBwZWQgXHUyMDE0IGEgc3RhbGUgdmF1bHQgZW50cnkgaXMgYW4gYWNjZXB0YWJsZSB0cmFkZS1vZmYgdnMuIGxlYWtlZFxuICogICBwcm9jZXNzZXMgYW5kIHRlbXAgZGlyZWN0b3JpZXMuXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvY2Vzc0NsZWFudXBIYW5kbGVyKCk6IHZvaWQge1xuICBpZiAoaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSB0cnVlO1xuXG4gIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFByb2Nlc3MgZXhpdGluZyB3aXRoICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gc2V0dXAocykgbm90IHRvcm4gZG93bi4gQ2xlYW5pbmcgdXAuLi5gKTtcblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIFsuLi5hY3RpdmVTZXR1cHNdKSB7XG4gICAgICBjb3JlVGVhcmRvd24ocmVzdWx0KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBQcm9jZXNzIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gVW5oYW5kbGVkIHJlamVjdGlvbiBkZXRlY3RlZC4gVGVhcmluZyBkb3duICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gYWN0aXZlIHNldHVwKHMpLi4uYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFJlamVjdGlvbiBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBwcm9jZXNzLm9uKCdleGl0JywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBTeW5jIGNsZWFudXA6ICR7U3RyaW5nKGFjdGl2ZVNldHVwcy5zaXplKX0gb3JwaGFuZWQgc2V0dXAocykuYCk7XG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdC50cmFuc3BvcnQuZGlzcG9zZVN5bmM/LigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgcm1TeW5jKHJlc3VsdC50ZW1wVmF1bHQucGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBTeW5jIHZhdWx0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gICAgfVxuICAgIGFjdGl2ZVNldHVwcy5jbGVhcigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWxlYXNlcyBhbmQgZm9yZ2V0cyB0aGUgc2V0dXAgbG9jayBhc3NvY2lhdGVkIHdpdGggYSByZXN1bHQsIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB3aG9zZSBsb2NrIHNob3VsZCBiZSByZWxlYXNlZC5cbiAqL1xuZnVuY3Rpb24gcmVsZWFzZVNldHVwTG9jayhyZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCk6IHZvaWQge1xuICBjb25zdCBsb2NrID0gc2V0dXBMb2Nrcy5nZXQocmVzdWx0KTtcbiAgaWYgKGxvY2spIHtcbiAgICBsb2NrLnJlbGVhc2UoKTtcbiAgICBzZXR1cExvY2tzLmRlbGV0ZShyZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhc3luYyB0ZWFyZG93biB3b3JrICh2YXVsdCBkaXNwb3NhbCArIHRyYW5zcG9ydCBkaXNwb3NhbCkuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBzZXR1cCByZXN1bHQgdG8gdGVhciBkb3duLlxuICovXG5hc3luYyBmdW5jdGlvbiB0ZWFyZG93bkFzeW5jKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRlbXBWYXVsdC5kaXNwb3NlKHJlc3VsdC50cmFuc3BvcnQpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFZQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sV0FBVyxtQkFBbUI7QUFPckMsU0FBUyxvQ0FBb0M7QUFDN0MsU0FBUyxxQkFBcUI7QUFDOUIsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0NBQWtDO0FBRTNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sV0FB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
279
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2dsb2JhbC1zZXR1cC1jb3JlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgbG9naWMgZm9yIGludGVncmF0aW9uIHRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93bi5cbiAqXG4gKiBWaXRlc3QgYW5kIEplc3QgYWRhcHRlcnMgZGVsZWdhdGUgdG8gdGhlc2UgZnVuY3Rpb25zLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hbmlmZXN0IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBleGlzdHNTeW5jLFxuICBybVN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBwcm9jZXNzLCB7IGxvYWRFbnZGaWxlIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB0eXBlIHsgUG9wdWxhdGVGaWxlc1BhcmFtcyB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZSB9IGZyb20gJy4vZW5hYmxlLXBsdWdpbi5tanMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4vZXJyb3ItdG8tc3RyaW5nLm1qcyc7XG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGFjcXVpcmVTZXR1cExvY2sgfSBmcm9tICcuL3NldHVwLWxvY2subWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5pbXBvcnQgeyBEZXNrdG9wQ2RwVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmltcG9ydCB7IGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5tanMnO1xuXG5jb25zdCBERUZBVUxUX1RSQU5TUE9SVF9UWVBFID0gJ29ic2lkaWFuLWNkcCc7XG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxuLyoqXG4gKiBUcmFja3Mgc2V0dXBzIHRoYXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBidXQgaGF2ZW4ndCBiZWVuIHRvcm4gZG93biB5ZXQuXG4gKiBVc2VkIGJ5IHRoZSBgYmVmb3JlRXhpdGAgaGFuZGxlciB0byBjbGVhbiB1cCB3aGVuIGEgdGVzdCBydW5uZXIgZXhpdHNcbiAqIHdpdGhvdXQgY2FsbGluZyB0ZWFyZG93biAoZS5nLiwgd2hlbiBvbmUgcHJvamVjdCdzIHNldHVwIGZhaWxzIGFuZCB0aGVcbiAqIHJ1bm5lciBhYm9ydHMgYmVmb3JlIHRlYXJpbmcgZG93biBhbHJlYWR5LWluaXRpYWxpemVkIHByb2plY3RzKS5cbiAqL1xuY29uc3QgYWN0aXZlU2V0dXBzID0gbmV3IFNldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5jb25zdCBkaXNwb3NlZFJlc3VsdHMgPSBuZXcgV2Vha1NldDxDb3JlU2V0dXBSZXN1bHQ+KCk7XG5sZXQgaXNDbGVhbnVwSGFuZGxlclJlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBUaGUgY3Jvc3MtcHJvY2VzcyBzZXR1cCBsb2NrIGhlbGQgYnkgZWFjaCBhY3RpdmUgc2V0dXAuIFJlbGVhc2VkIHdoZW4gdGhlXG4gKiBzZXR1cCBpcyB0b3JuIGRvd24gKG9yIGJ5IHRoZSBwcm9jZXNzIGNsZWFudXAgaGFuZGxlcnMpLCBhbGxvd2luZyBhIGNvbXBldGluZ1xuICogcnVuIHRvIHByb2NlZWQuIFNlZSB7QGxpbmsgYWNxdWlyZVNldHVwTG9ja30uXG4gKi9cbmNvbnN0IHNldHVwTG9ja3MgPSBuZXcgTWFwPENvcmVTZXR1cFJlc3VsdCwgU2V0dXBMb2NrPigpO1xuXG5jb25zdCBBTkRST0lEX0xPQ0tfU0NPUEUgPSAnYW5kcm9pZCc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNvcmVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIEZpbGVzIGFuZCBmb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0ICoqYmVmb3JlKiogT2JzaWRpYW4gb3BlbnMgaXQsIHNvXG4gICAqIGl0cyBzdGFydHVwIHNjYW4gaW5kZXhlcyB0aGVtIGluIG9uZSBwYXNzIChzZWUge0BsaW5rIFRlbXBWYXVsdC5wb3B1bGF0ZX0pLlxuICAgKiBVc2UgdGhpcyBmb3IgbGFyZ2UgZml4dHVyZXMgXHUyMDE0IHdyaXRpbmcgdGhvdXNhbmRzIG9mIG5vdGVzIGFmdGVyIG9wZW4gYW5kXG4gICAqIGZvcmNpbmcgYSByZS1zY2FuIGlzIGZhciBzbG93ZXIgYW5kIGxlc3MgcmVsaWFibGUuXG4gICAqL1xuICByZWFkb25seSBwb3B1bGF0ZT86IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRyYW5zcG9ydCBvcHRpb25zLiBXaGVuIG9taXR0ZWQsIHVzZXMgYW4gb2ZmLXNjcmVlbiBvd25lZCBkZXNrdG9wIGluc3RhbmNlLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnRPcHRpb25zPzogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCByZXR1cm5lZCBieSB7QGxpbmsgY29yZVNldHVwfSwgdXNlZCBieSBmcmFtZXdvcmsgYWRhcHRlcnNcbiAqIHRvIHBhc3MgY29udGV4dCB0byB0ZXN0IHdvcmtlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNldHVwUmVzdWx0IHtcbiAgLyoqIFRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuICovXG4gIHJlYWRvbmx5IHRlbXBWYXVsdDogVGVtcFZhdWx0O1xuXG4gIC8qKiBUaGUgdHJhbnNwb3J0IGluc3RhbmNlIHVzZWQgZHVyaW5nIHNldHVwLiAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKiBTaG9ydCBsYWJlbCBmb3IgbG9nIG1lc3NhZ2VzIChlLmcuIGBcIm9ic2lkaWFuLWNkcFwiYCkuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0aGF0IHdlcmUgcmVzb2x2ZWQuICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGcmFtZXdvcmstYWdub3N0aWMgZ2xvYmFsIHNldHVwIGxvZ2ljLlxuICpcbiAqIExvYWRzIGAuZW52YCBmcm9tIHRoZSBwcm9qZWN0IHJvb3QsIGNyZWF0ZXMgYSB0cmFuc3BvcnQsIGNvcGllcyB0aGUgYnVpbHRcbiAqIHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCByZWdpc3RlcnMgdGhlIHZhdWx0IHdpdGggT2JzaWRpYW4sIGFuZFxuICogZW5hYmxlcyB0aGUgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBTZXR1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNldHVwIHJlc3VsdCBjb250YWluaW5nIHRoZSB0ZW1wIHZhdWx0LCB0cmFuc3BvcnQsIGFuZCByZXNvbHZlZCBvcHRpb25zLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVNldHVwKHBhcmFtcz86IENvcmVTZXR1cFBhcmFtcyk6IFByb21pc2U8Q29yZVNldHVwUmVzdWx0PiB7XG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnN0IGVudkZpbGVQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgJy5lbnYnKTtcbiAgaWYgKGV4aXN0c1N5bmMoZW52RmlsZVBhdGgpKSB7XG4gICAgbG9hZEVudkZpbGUoZW52RmlsZVBhdGgpO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IHJlc29sdmVJbnRlZ3JhdGlvblRyYW5zcG9ydE9wdGlvbnMocGFyYW1zPy50cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zLnR5cGU7XG4gIGNvbnN0IGxvY2tTY29wZSA9IGdldExvY2tTY29wZSh0cmFuc3BvcnRPcHRpb25zKTtcblxuICBsZXQgbG9jazogU2V0dXBMb2NrIHwgdW5kZWZpbmVkO1xuICBpZiAobG9ja1Njb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gQWNxdWlyaW5nICcke2xvY2tTY29wZX0nIHNldHVwIGxvY2sgKHNlcmlhbGl6ZXMgYWdhaW5zdCBhbnkgY29uY3VycmVudCBpbnRlZ3JhdGlvbi10ZXN0IHJ1bikuLi5gKTtcbiAgICBsb2NrID0gYXdhaXQgYWNxdWlyZVNldHVwTG9jayh7IGxhYmVsLCBzY29wZTogbG9ja1Njb3BlIH0pO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBsb2NrIGFjcXVpcmVkLmApO1xuICB9XG5cbiAgbGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG4gIGxldCB0ZW1wVmF1bHQ6IFRlbXBWYXVsdCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGluZyB0cmFuc3BvcnQuLi5gKTtcbiAgICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVHJhbnNwb3J0IGNyZWF0ZWQ6ICR7dHJhbnNwb3J0LmNvbnN0cnVjdG9yLm5hbWV9YCk7XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUHJvamVjdCByb290OiAke3Byb2plY3RSb290fWApO1xuICAgIGNvbnN0IGRpc3RQYXRoID0gYXdhaXQgcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290KTtcbiAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlzdFBhdGgsICdtYW5pZmVzdC5qc29uJyksICd1dGYtOCcpKSBhcyBQbHVnaW5NYW5pZmVzdDtcbiAgICBjb25zdCBwbHVnaW5JZCA9IG1hbmlmZXN0SnNvbi5pZDtcblxuICAgIGlmICh0cmFuc3BvcnQuaXNNb2JpbGUgJiYgbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGlzRGVza3RvcE9ubHk6IHRydWUgaW4gbWFuaWZlc3QuanNvbi4gTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFpbkpzID0gam9pbihkaXN0UGF0aCwgTUFJTl9KUyk7XG4gICAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFVzaW5nICR7ZGlzdFBhdGh9ICgke2J1aWxkU3RhdC5tdGltZS50b0lTT1N0cmluZygpfSkuIElmIG91dGRhdGVkLCByZWJ1aWxkLmApO1xuXG4gICAgdGVtcFZhdWx0ID0gbmV3IFRlbXBWYXVsdCgpO1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBDcmVhdGVkIHRlbXAgdmF1bHQ6ICR7dGVtcFZhdWx0LnBhdGh9YCk7XG4gICAgY29uc3QgcGx1Z2luRGlyID0gam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgUExVR0lOU19ESVIsIHBsdWdpbklkKTtcbiAgICBhd2FpdCBta2RpcihwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHRlbXBWYXVsdC5wYXRoLCBPQlNJRElBTl9DT05GSUdfRElSLCBDT01NVU5JVFlfUExVR0lOU19KU09OKSwgSlNPTi5zdHJpbmdpZnkoW3BsdWdpbklkXSkpO1xuXG4gICAgaWYgKHBhcmFtcz8ucG9wdWxhdGUpIHtcbiAgICAgIGNvbnN0IGVudHJ5Q291bnQgPSBPYmplY3Qua2V5cyhwYXJhbXMucG9wdWxhdGUpLmxlbmd0aDtcbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBQb3B1bGF0aW5nIHZhdWx0IHdpdGggJHtTdHJpbmcoZW50cnlDb3VudCl9IGVudHJpZXMgYmVmb3JlIG9wZW4uLi5gKTtcbiAgICAgIHRlbXBWYXVsdC5wb3B1bGF0ZShwYXJhbXMucG9wdWxhdGUpO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTeW5jaW5nIHZhdWx0IHRvIGRldmljZS4uLmApO1xuICAgIGF3YWl0IHRlbXBWYXVsdC5zeW5jVG9EZXZpY2UodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gUmVnaXN0ZXJpbmcgdmF1bHQuLi5gKTtcbiAgICBhd2FpdCB0ZW1wVmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcbiAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgcmVnaXN0ZXJlZC5gKTtcblxuICAgIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gICAgLy8gTG9hZFBsdWdpbigpIGluIGEgdHJ5LWNhdGNoIHRoYXQgc3dhbGxvd3MgZXJyb3JzIGFuZCByZXR1cm5zIGZhbHNlLlxuICAgIC8vIFdlIG1vbmtleS1wYXRjaCBsb2FkUGx1Z2luKCkgdG8gY2FwdHVyZSB0aGUgZXJyb3IgYmVmb3JlIGl0J3Mgc3dhbGxvd2VkLlxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gICAgY29uc3QgeyBlcnJvck1lc3NhZ2UgfSA9IGF3YWl0IGV2YWxJbk9ic2lkaWFuKHtcbiAgICAgIGFyZ3M6IHsgcGx1Z2luSWQgfSxcbiAgICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgICAgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrczogdHJ1ZSxcbiAgICAgIHRyYW5zcG9ydCxcbiAgICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgICB9KTtcblxuICAgIGlmIChlcnJvck1lc3NhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgZW5hYmxlZCBzdWNjZXNzZnVsbHkuYCk7XG5cbiAgICBjb25zdCBhdWdtZW50ZWRPcHRpb25zID0gYXVnbWVudFRyYW5zcG9ydE9wdGlvbnModHJhbnNwb3J0T3B0aW9ucywgdHJhbnNwb3J0KTtcbiAgICBjb25zdCByZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCA9IHsgdGVtcFZhdWx0LCB0cmFuc3BvcnQsIHRyYW5zcG9ydExhYmVsOiBsYWJlbCwgdHJhbnNwb3J0T3B0aW9uczogYXVnbWVudGVkT3B0aW9ucyB9O1xuICAgIGFjdGl2ZVNldHVwcy5hZGQocmVzdWx0KTtcbiAgICBpZiAobG9jaykge1xuICAgICAgc2V0dXBMb2Nrcy5zZXQocmVzdWx0LCBsb2NrKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQsIGNsZWFuaW5nIHVwLi4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0ZW1wVmF1bHQgJiYgdHJhbnNwb3J0KSB7XG4gICAgICAgIGF3YWl0IHRlbXBWYXVsdC5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoY2xlYW51cEVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke2xhYmVsfV0gVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGNsZWFudXBFcnJvcil9YCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0cmFuc3BvcnQ/LmRpc3Bvc2U/LigpO1xuICAgIH0gY2F0Y2ggKGNsZWFudXBFcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtsYWJlbH1dIFRyYW5zcG9ydCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoY2xlYW51cEVycm9yKX1gKTtcbiAgICB9XG5cbiAgICAvLyBSZWxlYXNlIHRoZSBsb2NrIHNvIGEgd2FpdGluZyBydW4gY2FuIHByb2NlZWQgZXZlbiB0aG91Z2ggdGhpcyBydW4gZmFpbGVkLlxuICAgIGxvY2s/LnJlbGVhc2UoKTtcblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBOT1RFOiBJZiB0aGUgdGVzdCBydW5uZXIgcmVwb3J0cyBcIk5vIHRlc3QgZmlsZXMgZm91bmRcIiwgaWdub3JlIGl0IFx1MjAxNCBpdCBpcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBzZXR1cCBmYWlsdXJlIGFib3ZlLmApO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIGdsb2JhbCB0ZWFyZG93biBsb2dpYy5cbiAqXG4gKiBEaXNwb3NlcyBvZiB0aGUgdGVtcG9yYXJ5IHZhdWx0IGFuZCB0cmFuc3BvcnQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSByZXN1bHQgZnJvbSB7QGxpbmsgY29yZVNldHVwfS4gV2hlbiBgdW5kZWZpbmVkYCwgZG9lcyBub3RoaW5nLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29yZVRlYXJkb3duKHJlc3VsdD86IENvcmVTZXR1cFJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc3VsdCB8fCBkaXNwb3NlZFJlc3VsdHMuaGFzKHJlc3VsdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlzcG9zZWRSZXN1bHRzLmFkZChyZXN1bHQpO1xuXG4gIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVGVhcmluZyBkb3duLi4uYCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0ZWFyZG93bkFzeW5jKHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBDbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGFjdGl2ZVNldHVwcy5kZWxldGUocmVzdWx0KTtcbiAgICByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0cmFuc3BvcnQgb3B0aW9ucyBmb3IgYW4gaW50ZWdyYXRpb24gcnVuLlxuICpcbiAqIERlc2t0b3AgbGF1bmNoZXMgYXJlIG5vcm1hbGx5IHZpc2libGUsIGJ1dCB0ZXN0IHNldHVwIGV4cGxpY2l0bHkga2VlcHMgaXRzXG4gKiBvd25lZCBpbnN0YW5jZSBvZmYtc2NyZWVuIHNvIGl0IGRvZXMgbm90IGludGVycnVwdCB0aGUgZGV2ZWxvcGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29uc3VtZXItcHJvdmlkZWQgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBPcHRpb25zIHdpdGggdGhlIGRlc2t0b3AgaW50ZWdyYXRpb24gdmlzaWJpbGl0eSBkZWZhdWx0IGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlSW50ZWdyYXRpb25UcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMge1xuICBpZiAob3B0aW9ucz8udHlwZSA9PT0gJ29ic2lkaWFuLWFuZHJvaWQtYXBwaXVtJykge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSA/PyBmYWxzZSxcbiAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICB9O1xufVxuXG4vKipcbiAqIEF1Z21lbnRzIHRyYW5zcG9ydCBvcHRpb25zIHdpdGggcmV1c2UgaW5mbyBzbyB0ZXN0IHdvcmtlcnMgY2FuIHJlYXR0YWNoIHRvIHRoZVxuICogaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBhbHJlYWR5IGxhdW5jaGVkIGluc3RlYWQgb2YgY3JlYXRpbmcgdGhlaXIgb3duOlxuICpcbiAqIC0gKipBcHBpdW0qKiBcdTIwMTQgaW5qZWN0cyB0aGUgZXN0YWJsaXNoZWQgYHNlc3Npb25JZGAvYGRldmljZUlkYC5cbiAqIC0gKipPd25lZCBkZXNrdG9wIENEUCoqIFx1MjAxNCBpbmplY3RzIHRoZSBvd25lZCBpbnN0YW5jZSdzIGBob3N0YC9gcG9ydGAgKGNob3NlblxuICogICBhdCBsYXVuY2gpIHBsdXMgdGhlIGludGVybmFsIGBpc0hhcm5lc3NPd25lZEluc3RhbmNlYCBmbGFnLCBzbyBlYWNoIHdvcmtlclxuICogICAqKmF0dGFjaGVzKiogdG8gdGhhdCBpbnN0YW5jZSBvdmVyIENEUCByYXRoZXIgdGhhbiBsYXVuY2hpbmcgKGFuZCBuZXZlclxuICogICByZWdpc3RlcmluZykgaXRzIG93biBcdTIwMTQgdGhlIGJ1ZyB0aGF0IG90aGVyd2lzZSBsZWF2ZXMgYSB3b3JrZXIncyB0cmFuc3BvcnRcbiAqICAgd2l0aCBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3JpZ2luYWwgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBpbnN0YW5jZSBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqIEByZXR1cm5zIFRoZSBhdWdtZW50ZWQgb3B0aW9ucywgb3IgdGhlIG9yaWdpbmFsIG9wdGlvbnMgaWYgbm90IGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIGF1Z21lbnRUcmFuc3BvcnRPcHRpb25zKFxuICBvcHRpb25zOiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnRcbik6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nICYmIHRyYW5zcG9ydCBpbnN0YW5jZW9mIEFwcGl1bVRyYW5zcG9ydCkge1xuICAgIGNvbnN0IHNlc3Npb25JbmZvID0gdHJhbnNwb3J0LmdldFNlc3Npb25JbmZvKCk7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tc2V0dXA6JHtvcHRpb25zLnR5cGV9XSBTZXNzaW9uIHJldXNlIGluZm86IHNlc3Npb25JZD0ke3Nlc3Npb25JbmZvLnNlc3Npb25JZH0sIGRldmljZUlkPSR7c2Vzc2lvbkluZm8uZGV2aWNlSWR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBkZXZpY2VJZDogc2Vzc2lvbkluZm8uZGV2aWNlSWQsXG4gICAgICBzZXNzaW9uSWQ6IHNlc3Npb25JbmZvLnNlc3Npb25JZFxuICAgIH07XG4gIH1cblxuICBpZiAoKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnR5cGUgPT09ICdvYnNpZGlhbi1jZHAnKSAmJiB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0KSB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSB0cmFuc3BvcnQuZ2V0T3duZWRJbnN0YW5jZUVuZHBvaW50KCk7XG4gICAgaWYgKGVuZHBvaW50KSB7XG4gICAgICBsb2coYFtpbnRlZ3JhdGlvbi1zZXR1cDoke0RFRkFVTFRfVFJBTlNQT1JUX1RZUEV9XSBPd25lZCBpbnN0YW5jZSByZXVzZSBpbmZvOiBob3N0PSR7ZW5kcG9pbnQuaG9zdH0sIHBvcnQ9JHtTdHJpbmcoZW5kcG9pbnQucG9ydCl9YCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBob3N0OiBlbmRwb2ludC5ob3N0LFxuICAgICAgICBpc0hhcm5lc3NPd25lZEluc3RhbmNlOiB0cnVlLFxuICAgICAgICBwb3J0OiBlbmRwb2ludC5wb3J0LFxuICAgICAgICB0eXBlOiAnb2JzaWRpYW4tY2RwJ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3B0aW9ucztcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgcHJvamVjdCByb290IGJ5IHdhbGtpbmcgdXAgZnJvbSBgcHJvY2Vzcy5jd2QoKWAgbG9va2luZyBmb3IgYHBhY2thZ2UuanNvbmAuXG4gKlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZmluZFByb2plY3RSb290KCk6IHN0cmluZyB7XG4gIGxldCBkaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uIC0tIExvb3AgdGVybWluYXRlcyBhdCBmaWxlc3lzdGVtIHJvb3QuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGV4aXN0c1N5bmMoam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSkpIHtcbiAgICAgIHJldHVybiBkaXI7XG4gICAgfVxuICAgIGNvbnN0IHBhcmVudCA9IGpvaW4oZGlyLCAnLi4nKTtcbiAgICBpZiAocGFyZW50ID09PSBkaXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcHJvamVjdCByb290IChubyBwYWNrYWdlLmpzb24gZm91bmQpLicpO1xuICAgIH1cbiAgICBkaXIgPSBwYXJlbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgY3Jvc3MtcHJvY2VzcyBsb2NrIHNjb3BlIGZvciBhIHRyYW5zcG9ydCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBub1xuICogbG9jayBpcyBuZWVkZWQuXG4gKlxuICogRGVza3RvcCBydW5zIHVzZSBoYXJuZXNzLW93bmVkLCBpc29sYXRlZCBpbnN0YW5jZXMgKHRoZWlyIG93biB1c2VyLWRhdGEgZGlyXG4gKiBhbmQgQ0RQIHBvcnQpLCBzbyB0aGV5IG5vIGxvbmdlciBjb250ZW5kIGFuZCBuZWVkIG5vIGxvY2suIE9ubHkgdGhlIEFuZHJvaWRcbiAqIHRyYW5zcG9ydCwgd2hpY2ggc2hhcmVzIHRoZSBzaW5nbGUgZW11bGF0b3IgYW5kIEFwcGl1bSBzZXJ2ZXIsIG11c3Qgc2VyaWFsaXplLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnRPcHRpb25zIC0gVGhlIHJlc29sdmVkIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGxvY2sgc2NvcGUgc3RyaW5nLCBvciBgdW5kZWZpbmVkYCBpZiBubyBsb2NrIGlzIG5lZWRlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0TG9ja1Njb3BlKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0cmFuc3BvcnRPcHRpb25zPy50eXBlID09PSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nID8gQU5EUk9JRF9MT0NLX1NDT1BFIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBjbGVhbnVwIGhhbmRsZXJzIGZvciBvcnBoYW5lZCBzZXR1cHMgdGhhdCB3ZXJlIG5ldmVyIGV4cGxpY2l0bHlcbiAqIHRvcm4gZG93bi5cbiAqXG4gKiBUd28gaGFuZGxlcnMgY292ZXIgZGlmZmVyZW50IGV4aXQgc2NlbmFyaW9zOlxuICpcbiAqIC0gYGJlZm9yZUV4aXRgIFx1MjAxNCBmaXJlcyB3aGVuIHRoZSBldmVudCBsb29wIGRyYWlucyBuYXR1cmFsbHkuIEFsbG93cyBmdWxsXG4gKiAgIGFzeW5jIHRlYXJkb3duICh1bnJlZ2lzdGVyIHZhdWx0cywgZGlzcG9zZSB0cmFuc3BvcnRzKS4gRG9lcyBOT1QgZmlyZVxuICogICB3aGVuIGBwcm9jZXNzLmV4aXQoKWAgaXMgY2FsbGVkIGRpcmVjdGx5LlxuICpcbiAqIC0gYHVuaGFuZGxlZFJlamVjdGlvbmAgXHUyMDE0IGNhdGNoZXMgYXN5bmMgZXJyb3JzIHRoYXQgYnlwYXNzIGBjb3JlU2V0dXBgJ3NcbiAqICAgY2F0Y2ggYmxvY2suIFBlcmZvcm1zIGZ1bGwgYXN5bmMgdGVhcmRvd24gd2hpbGUgd2Ugc3RpbGwgY2FuLlxuICpcbiAqIC0gYGV4aXRgIFx1MjAxNCBmaXJlcyBvbiBldmVyeSBleGl0LCBpbmNsdWRpbmcgYHByb2Nlc3MuZXhpdCgpYC4gT25seSBzeW5jaHJvbm91c1xuICogICB3b3JrIGlzIHBvc3NpYmxlLCBzbyB0aGlzIGhhbmRsZXIgZG9lcyBiZXN0LWVmZm9ydCBjbGVhbnVwOiBraWxscyBjaGlsZFxuICogICBwcm9jZXNzZXMgdmlhIGBkaXNwb3NlU3luYygpYCBhbmQgcmVtb3ZlcyB0ZW1wIHZhdWx0IGRpcmVjdG9yaWVzIHdpdGhcbiAqICAgYHJtU3luY2AuIFVucmVnaXN0ZXJpbmcgdmF1bHRzICh3aGljaCByZXF1aXJlcyBJUEMgd2l0aCBPYnNpZGlhbikgaXNcbiAqICAgc2tpcHBlZCBcdTIwMTQgYSBzdGFsZSB2YXVsdCBlbnRyeSBpcyBhbiBhY2NlcHRhYmxlIHRyYWRlLW9mZiB2cy4gbGVha2VkXG4gKiAgIHByb2Nlc3NlcyBhbmQgdGVtcCBkaXJlY3Rvcmllcy5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJQcm9jZXNzQ2xlYW51cEhhbmRsZXIoKTogdm9pZCB7XG4gIGlmIChpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc0NsZWFudXBIYW5kbGVyUmVnaXN0ZXJlZCA9IHRydWU7XG5cbiAgcHJvY2Vzcy5vbignYmVmb3JlRXhpdCcsICgpID0+IHtcbiAgICBpZiAoYWN0aXZlU2V0dXBzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bl0gUHJvY2VzcyBleGl0aW5nIHdpdGggJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBzZXR1cChzKSBub3QgdG9ybiBkb3duLiBDbGVhbmluZyB1cC4uLmApO1xuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgWy4uLmFjdGl2ZVNldHVwc10pIHtcbiAgICAgIGNvcmVUZWFyZG93bihyZXN1bHQpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFByb2Nlc3MgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTZXR1cHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duXSBVbmhhbmRsZWQgcmVqZWN0aW9uIGRldGVjdGVkLiBUZWFyaW5nIGRvd24gJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBhY3RpdmUgc2V0dXAocykuLi5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgY29yZVRlYXJkb3duKHJlc3VsdCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gUmVqZWN0aW9uIGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiB7XG4gICAgaWYgKGFjdGl2ZVNldHVwcy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd25dIFN5bmMgY2xlYW51cDogJHtTdHJpbmcoYWN0aXZlU2V0dXBzLnNpemUpfSBvcnBoYW5lZCBzZXR1cChzKS5gKTtcbiAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBbLi4uYWN0aXZlU2V0dXBzXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LnRyYW5zcG9ydC5kaXNwb3NlU3luYz8uKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBybVN5bmMocmVzdWx0LnRlbXBWYXVsdC5wYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgICBsb2coYFtpbnRlZ3JhdGlvbi10ZWFyZG93bjoke3Jlc3VsdC50cmFuc3BvcnRMYWJlbH1dIFN5bmMgdmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHJlbGVhc2VTZXR1cExvY2socmVzdWx0KTtcbiAgICB9XG4gICAgYWN0aXZlU2V0dXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbGVhc2VzIGFuZCBmb3JnZXRzIHRoZSBzZXR1cCBsb2NrIGFzc29jaWF0ZWQgd2l0aCBhIHJlc3VsdCwgaWYgYW55LlxuICpcbiAqIEBwYXJhbSByZXN1bHQgLSBUaGUgc2V0dXAgcmVzdWx0IHdob3NlIGxvY2sgc2hvdWxkIGJlIHJlbGVhc2VkLlxuICovXG5mdW5jdGlvbiByZWxlYXNlU2V0dXBMb2NrKHJlc3VsdDogQ29yZVNldHVwUmVzdWx0KTogdm9pZCB7XG4gIGNvbnN0IGxvY2sgPSBzZXR1cExvY2tzLmdldChyZXN1bHQpO1xuICBpZiAobG9jaykge1xuICAgIGxvY2sucmVsZWFzZSgpO1xuICAgIHNldHVwTG9ja3MuZGVsZXRlKHJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgZGlzdCBwYXRoIHRvIHVzZSBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKlxuICogUGlja3Mgd2hpY2hldmVyIG9mIGBkaXN0L2RldmAgYW5kIGBkaXN0L2J1aWxkYCBoYXMgYSBuZXdlciBgbWFpbi5qc2AuXG4gKiBJZiBvbmx5IG9uZSBleGlzdHMsIHRoYXQgb25lIGlzIHVzZWQuIFRocm93cyBpZiBuZWl0aGVyIGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdFJvb3QgLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290LlxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGNob3NlbiBkaXN0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBkZXZQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9ERVYpO1xuICBjb25zdCBidWlsZFBhdGggPSBqb2luKHByb2plY3RSb290LCBESVNUX0JVSUxEKTtcbiAgY29uc3QgZGV2TWFpbkpzID0gam9pbihkZXZQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRNYWluSnMgPSBqb2luKGJ1aWxkUGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGRldlN0YXQgPSBleGlzdHNTeW5jKGRldk1haW5KcykgPyBhd2FpdCBzdGF0KGRldk1haW5KcykgOiBudWxsO1xuICBjb25zdCBidWlsZFN0YXQgPSBleGlzdHNTeW5jKGJ1aWxkTWFpbkpzKSA/IGF3YWl0IHN0YXQoYnVpbGRNYWluSnMpIDogbnVsbDtcblxuICBpZiAoZGV2U3RhdCAmJiBidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gZGV2U3RhdC5tdGltZSA+IGJ1aWxkU3RhdC5tdGltZSA/IGRldlBhdGggOiBidWlsZFBhdGg7XG4gIH1cblxuICBpZiAoZGV2U3RhdCkge1xuICAgIHJldHVybiBkZXZQYXRoO1xuICB9XG5cbiAgaWYgKGJ1aWxkU3RhdCkge1xuICAgIHJldHVybiBidWlsZFBhdGg7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJ1aWxkIGZvdW5kLiBSdW4gYG5wbSBydW4gYnVpbGRgIG9yIGBucG0gcnVuIGRldmAgZmlyc3QuJyk7XG59XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIGFzeW5jIHRlYXJkb3duIHdvcmsgKHZhdWx0IGRpc3Bvc2FsICsgdHJhbnNwb3J0IGRpc3Bvc2FsKS5cbiAqXG4gKiBAcGFyYW0gcmVzdWx0IC0gVGhlIHNldHVwIHJlc3VsdCB0byB0ZWFyIGRvd24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duQXN5bmMocmVzdWx0OiBDb3JlU2V0dXBSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudGVtcFZhdWx0LmRpc3Bvc2UocmVzdWx0LnRyYW5zcG9ydCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbaW50ZWdyYXRpb24tdGVhcmRvd246JHtyZXN1bHQudHJhbnNwb3J0TGFiZWx9XSBWYXVsdCBjbGVhbnVwIGVycm9yIChub24tZmF0YWwpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZXN1bHQudHJhbnNwb3J0LmRpc3Bvc2U/LigpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2ludGVncmF0aW9uLXRlYXJkb3duOiR7cmVzdWx0LnRyYW5zcG9ydExhYmVsfV0gVHJhbnNwb3J0IGNsZWFudXAgZXJyb3IgKG5vbi1mYXRhbCk6ICR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVlBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsT0FBTyxXQUFXLG1CQUFtQjtBQU9yQyxTQUFTLG9DQUFvQztBQUM3QyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHNCQUFzQjtBQUMvQixTQUFTLFdBQVc7QUFDcEIsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyxrQ0FBa0M7QUFFM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLFVBQVU7QUFDaEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxjQUFjO0FBQ3BCLE1BQU0seUJBQXlCO0FBUS9CLE1BQU0sZUFBZSxvQkFBSSxJQUFxQjtBQUM5QyxNQUFNLGtCQUFrQixvQkFBSSxRQUF5QjtBQUNyRCxJQUFJLDZCQUE2QjtBQU9qQyxNQUFNLGFBQWEsb0JBQUksSUFBZ0M7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QUFBQSxNQUNqQyxTQUFTLE9BQWdCO0FBQ3ZCLFlBQUkseUJBQXlCLE9BQU8sY0FBYywrQ0FBK0MsY0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3pIO0FBQ0EsVUFBSTtBQUNGLGVBQU8sT0FBTyxVQUFVLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFBQSxNQUNoRSxTQUFTLE9BQWdCO0FBQ3ZCLFlBQUkseUJBQXlCLE9BQU8sY0FBYywyQ0FBMkMsY0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLE1BQ3JIO0FBQ0EsdUJBQWlCLE1BQU07QUFBQSxJQUN6QjtBQUNBLGlCQUFhLE1BQU07QUFBQSxFQUNyQixDQUFDO0FBQ0g7QUFPQSxTQUFTLGlCQUFpQixRQUErQjtBQUN2RCxRQUFNLE9BQU8sV0FBVyxJQUFJLE1BQU07QUFDbEMsTUFBSSxNQUFNO0FBQ1IsU0FBSyxRQUFRO0FBQ2IsZUFBVyxPQUFPLE1BQU07QUFBQSxFQUMxQjtBQUNGO0FBV0EsZUFBZSxnQkFBZ0IsYUFBc0M7QUFDbkUsUUFBTSxVQUFVLEtBQUssYUFBYSxRQUFRO0FBQzFDLFFBQU0sWUFBWSxLQUFLLGFBQWEsVUFBVTtBQUM5QyxRQUFNLFlBQVksS0FBSyxTQUFTLE9BQU87QUFDdkMsUUFBTSxjQUFjLEtBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJO0FBQ2hFLFFBQU0sWUFBWSxXQUFXLFdBQVcsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJO0FBRXRFLE1BQUksV0FBVyxXQUFXO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLFVBQVUsUUFBUSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxNQUFJLFNBQVM7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksV0FBVztBQUNiLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQy9FO0FBT0EsZUFBZSxjQUFjLFFBQXdDO0FBQ25FLE1BQUk7QUFDRixVQUFNLE9BQU8sVUFBVSxRQUFRLE9BQU8sU0FBUztBQUFBLEVBQ2pELFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSx5QkFBeUIsT0FBTyxjQUFjLHNDQUFzQyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDaEg7QUFFQSxNQUFJO0FBQ0YsVUFBTSxPQUFPLFVBQVUsVUFBVTtBQUFBLEVBQ25DLFNBQVMsT0FBZ0I7QUFDdkIsUUFBSSx5QkFBeUIsT0FBTyxjQUFjLDBDQUEwQyxjQUFjLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDcEg7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when a pinned Obsidian installer/Electron shell is
5
+ * too old to run the pinned Obsidian app (asar) version — the resolved installer
6
+ * is below that app version's empirically-measured run floor
7
+ * (`minRunnableInstallerVersion` in `metadata.json`). Unlike
8
+ * `RendererFailedToInitializeError` (which is discovered reactively, after the
9
+ * dead renderer has burned the boot grace window), this is thrown *proactively*
10
+ * from the version-resolution step, before anything is downloaded or launched, so
11
+ * the message can name the installer version that would work.
12
+ */
13
+ /**
14
+ * Parameters for the {@link IncompatibleInstallerVersionError} constructor.
15
+ */
16
+ export interface IncompatibleInstallerVersionErrorConstructorParams {
17
+ /** The resolved Obsidian app (asar) version that was requested. */
18
+ readonly appVersion: string;
19
+ /** The resolved installer/Electron shell version that is too old to run it. */
20
+ readonly installerVersion: string;
21
+ /** The oldest installer version that can boot {@link appVersion}. */
22
+ readonly minRunnableInstallerVersion: string;
23
+ }
24
+ /**
25
+ * Thrown when the resolved installer/Electron shell version is below the run
26
+ * floor for the resolved Obsidian app version, so the app could not boot on it.
27
+ * Carries the three versions so callers can `instanceof`-match and surface an
28
+ * actionable remedy.
29
+ */
30
+ export declare class IncompatibleInstallerVersionError extends Error {
31
+ /** The resolved Obsidian app (asar) version that was requested. */
32
+ readonly appVersion: string;
33
+ /** The resolved installer/Electron shell version that is too old to run it. */
34
+ readonly installerVersion: string;
35
+ /** The oldest installer version that can boot {@link appVersion}. */
36
+ readonly minRunnableInstallerVersion: string;
37
+ /**
38
+ * Creates the error from the resolved versions and the run floor.
39
+ *
40
+ * @param params - The requested app version, the too-old installer version,
41
+ * and the run floor that would work.
42
+ */
43
+ constructor(params: IncompatibleInstallerVersionErrorConstructorParams);
44
+ }
@@ -0,0 +1,28 @@
1
+ class IncompatibleInstallerVersionError extends Error {
2
+ /** The resolved Obsidian app (asar) version that was requested. */
3
+ appVersion;
4
+ /** The resolved installer/Electron shell version that is too old to run it. */
5
+ installerVersion;
6
+ /** The oldest installer version that can boot {@link appVersion}. */
7
+ minRunnableInstallerVersion;
8
+ /**
9
+ * Creates the error from the resolved versions and the run floor.
10
+ *
11
+ * @param params - The requested app version, the too-old installer version,
12
+ * and the run floor that would work.
13
+ */
14
+ constructor(params) {
15
+ const { appVersion, installerVersion, minRunnableInstallerVersion } = params;
16
+ super(
17
+ `Obsidian installer ${installerVersion} cannot run Obsidian ${appVersion} \u2014 it needs installer ${minRunnableInstallerVersion} or newer. Pin a newer obsidianInstallerVersion, or align obsidianVersion with the installer.`
18
+ );
19
+ this.name = "IncompatibleInstallerVersionError";
20
+ this.appVersion = appVersion;
21
+ this.installerVersion = installerVersion;
22
+ this.minRunnableInstallerVersion = minRunnableInstallerVersion;
23
+ }
24
+ }
25
+ export {
26
+ IncompatibleInstallerVersionError
27
+ };
28
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiBhIHBpbm5lZCBPYnNpZGlhbiBpbnN0YWxsZXIvRWxlY3Ryb24gc2hlbGwgaXNcbiAqIHRvbyBvbGQgdG8gcnVuIHRoZSBwaW5uZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIFx1MjAxNCB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyXG4gKiBpcyBiZWxvdyB0aGF0IGFwcCB2ZXJzaW9uJ3MgZW1waXJpY2FsbHktbWVhc3VyZWQgcnVuIGZsb29yXG4gKiAoYG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbmAgaW4gYG1ldGFkYXRhLmpzb25gKS4gVW5saWtlXG4gKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAgKHdoaWNoIGlzIGRpc2NvdmVyZWQgcmVhY3RpdmVseSwgYWZ0ZXIgdGhlXG4gKiBkZWFkIHJlbmRlcmVyIGhhcyBidXJuZWQgdGhlIGJvb3QgZ3JhY2Ugd2luZG93KSwgdGhpcyBpcyB0aHJvd24gKnByb2FjdGl2ZWx5KlxuICogZnJvbSB0aGUgdmVyc2lvbi1yZXNvbHV0aW9uIHN0ZXAsIGJlZm9yZSBhbnl0aGluZyBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkLCBzb1xuICogdGhlIG1lc3NhZ2UgY2FuIG5hbWUgdGhlIGluc3RhbGxlciB2ZXJzaW9uIHRoYXQgd291bGQgd29yay5cbiAqL1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2FzIHJlcXVlc3RlZC4gKi9cbiAgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL0VsZWN0cm9uIHNoZWxsIHZlcnNpb24gdGhhdCBpcyB0b28gb2xkIHRvIHJ1biBpdC4gKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgb2xkZXN0IGluc3RhbGxlciB2ZXJzaW9uIHRoYXQgY2FuIGJvb3Qge0BsaW5rIGFwcFZlcnNpb259LiAqL1xuICByZWFkb25seSBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcmVzb2x2ZWQgaW5zdGFsbGVyL0VsZWN0cm9uIHNoZWxsIHZlcnNpb24gaXMgYmVsb3cgdGhlIHJ1blxuICogZmxvb3IgZm9yIHRoZSByZXNvbHZlZCBPYnNpZGlhbiBhcHAgdmVyc2lvbiwgc28gdGhlIGFwcCBjb3VsZCBub3QgYm9vdCBvbiBpdC5cbiAqIENhcnJpZXMgdGhlIHRocmVlIHZlcnNpb25zIHNvIGNhbGxlcnMgY2FuIGBpbnN0YW5jZW9mYC1tYXRjaCBhbmQgc3VyZmFjZSBhblxuICogYWN0aW9uYWJsZSByZW1lZHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBUaGUgcmVzb2x2ZWQgT2JzaWRpYW4gYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2FzIHJlcXVlc3RlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZztcblxuICAvKiogVGhlIHJlc29sdmVkIGluc3RhbGxlci9FbGVjdHJvbiBzaGVsbCB2ZXJzaW9uIHRoYXQgaXMgdG9vIG9sZCB0byBydW4gaXQuICovXG4gIHB1YmxpYyByZWFkb25seSBpbnN0YWxsZXJWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBvbGRlc3QgaW5zdGFsbGVyIHZlcnNpb24gdGhhdCBjYW4gYm9vdCB7QGxpbmsgYXBwVmVyc2lvbn0uICovXG4gIHB1YmxpYyByZWFkb25seSBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB0aGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSBydW4gZmxvb3IuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWVzdGVkIGFwcCB2ZXJzaW9uLCB0aGUgdG9vLW9sZCBpbnN0YWxsZXIgdmVyc2lvbixcbiAgICogICBhbmQgdGhlIHJ1biBmbG9vciB0aGF0IHdvdWxkIHdvcmsuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIGNvbnN0IHsgYXBwVmVyc2lvbiwgaW5zdGFsbGVyVmVyc2lvbiwgbWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uIH0gPSBwYXJhbXM7XG4gICAgc3VwZXIoXG4gICAgICBgT2JzaWRpYW4gaW5zdGFsbGVyICR7aW5zdGFsbGVyVmVyc2lvbn0gY2Fubm90IHJ1biBPYnNpZGlhbiAke2FwcFZlcnNpb259IFx1MjAxNCBgXG4gICAgICAgICsgYGl0IG5lZWRzIGluc3RhbGxlciAke21pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbn0gb3IgbmV3ZXIuIGBcbiAgICAgICAgKyAnUGluIGEgbmV3ZXIgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uLCBvciBhbGlnbiBvYnNpZGlhblZlcnNpb24gd2l0aCB0aGUgaW5zdGFsbGVyLidcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3InO1xuICAgIHRoaXMuYXBwVmVyc2lvbiA9IGFwcFZlcnNpb247XG4gICAgdGhpcy5pbnN0YWxsZXJWZXJzaW9uID0gaW5zdGFsbGVyVmVyc2lvbjtcbiAgICB0aGlzLm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbiA9IG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBaUNPLE1BQU0sMENBQTBDLE1BQU07QUFBQTtBQUFBLEVBRTNDO0FBQUE7QUFBQSxFQUdBO0FBQUE7QUFBQSxFQUdBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRVCxZQUFZLFFBQTREO0FBQzdFLFVBQU0sRUFBRSxZQUFZLGtCQUFrQiw0QkFBNEIsSUFBSTtBQUN0RTtBQUFBLE1BQ0Usc0JBQXNCLGdCQUFnQix3QkFBd0IsVUFBVSw4QkFDOUMsMkJBQTJCO0FBQUEsSUFFdkQ7QUFDQSxTQUFLLE9BQU87QUFDWixTQUFLLGFBQWE7QUFDbEIsU0FBSyxtQkFBbUI7QUFDeEIsU0FBSyw4QkFBOEI7QUFBQSxFQUNyQztBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -10,8 +10,15 @@ export type { TransportOptionsResolver, VaultPathResolver } from './context-prov
10
10
  export { setTransportOptionsResolver, setVaultPathResolver } from './context-provider.mjs';
11
11
  export type { EvalInObsidianParams, HoverElementParams, Lib, MoveMouseParams, PressKeyParams, TypeIntoEditorParams, UnhoverElementParams, WaitUntilParams } from './eval-in-obsidian.mjs';
12
12
  export { evalInObsidian } from './eval-in-obsidian.mjs';
13
+ export type { IncompatibleInstallerVersionErrorConstructorParams } from './incompatible-installer-version-error.mjs';
14
+ export { IncompatibleInstallerVersionError } from './incompatible-installer-version-error.mjs';
15
+ export type { CheckInstallerCompatibilityParams, InstallerCompatibility, InstallerCompatibilityTier } from './installer-compatibility.mjs';
16
+ export { checkInstallerCompatibility } from './installer-compatibility.mjs';
13
17
  export type { LibResolver } from './lib-registry.mjs';
14
18
  export { registerLibResolver } from './lib-registry.mjs';
19
+ export type { ObsidianVersionMetadata } from './obsidian-metadata.mjs';
20
+ export { getVersionMetadata } from './obsidian-metadata.mjs';
21
+ export { RendererFailedToInitializeError } from './renderer-failed-to-initialize-error.mjs';
15
22
  export type { PopulateFileContent, PopulateFilesParams } from './temp-vault.mjs';
16
23
  export { TempVault } from './temp-vault.mjs';
17
24
  export type { AppiumSessionInfo, AppiumTransportConfig } from './transport-appium.mjs';
@@ -5,7 +5,11 @@ import {
5
5
  setVaultPathResolver
6
6
  } from "./context-provider.mjs";
7
7
  import { evalInObsidian } from "./eval-in-obsidian.mjs";
8
+ import { IncompatibleInstallerVersionError } from "./incompatible-installer-version-error.mjs";
9
+ import { checkInstallerCompatibility } from "./installer-compatibility.mjs";
8
10
  import { registerLibResolver } from "./lib-registry.mjs";
11
+ import { getVersionMetadata } from "./obsidian-metadata.mjs";
12
+ import { RendererFailedToInitializeError } from "./renderer-failed-to-initialize-error.mjs";
9
13
  import { TempVault } from "./temp-vault.mjs";
10
14
  import { AppiumTransport } from "./transport-appium.mjs";
11
15
  import { DesktopCdpTransport } from "./transport-desktop-cdp.mjs";
@@ -18,14 +22,18 @@ export {
18
22
  AppiumTransport,
19
23
  ContextId,
20
24
  DesktopCdpTransport,
25
+ IncompatibleInstallerVersionError,
26
+ RendererFailedToInitializeError,
21
27
  TempVault,
28
+ checkInstallerCompatibility,
22
29
  connectToCdp,
23
30
  createTransportFromOptions,
24
31
  evalInObsidian,
32
+ getVersionMetadata,
25
33
  registerLibResolver,
26
34
  registerVault,
27
35
  setTransportOptionsResolver,
28
36
  setVaultPathResolver,
29
37
  unregisterVault
30
38
  };
31
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5tanMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTGliLFxuICBNb3ZlTW91c2VQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmV4cG9ydCB7IHJlZ2lzdGVyTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBQb3B1bGF0ZUZpbGVDb250ZW50LFxuICBQb3B1bGF0ZUZpbGVzUGFyYW1zXG59IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuZXhwb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEFwcGl1bVNlc3Npb25JbmZvLFxuICBBcHBpdW1UcmFuc3BvcnRDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUFzYXIsXG4gIE93bmVkSW5zdGFuY2VDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5leHBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUEsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxpQkFBaUI7QUFLMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFXUCxTQUFTLHNCQUFzQjtBQUUvQixTQUFTLDJCQUEyQjtBQUtwQyxTQUFTLGlCQUFpQjtBQUsxQixTQUFTLHVCQUF1QjtBQU1oQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtDQUFrQztBQVUzQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSzsiLAogICJuYW1lcyI6IFtdCn0K
39
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5tanMnO1xuZXhwb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTGliLFxuICBNb3ZlTW91c2VQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgdHlwZSB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmV4cG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVBhcmFtcyxcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSxcbiAgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVRpZXJcbn0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHsgY2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5leHBvcnQgeyByZWdpc3RlckxpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmV4cG9ydCB0eXBlIHsgT2JzaWRpYW5WZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQgeyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIH0gZnJvbSAnLi9yZW5kZXJlci1mYWlsZWQtdG8taW5pdGlhbGl6ZS1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBQb3B1bGF0ZUZpbGVDb250ZW50LFxuICBQb3B1bGF0ZUZpbGVzUGFyYW1zXG59IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuZXhwb3J0IHsgVGVtcFZhdWx0IH0gZnJvbSAnLi90ZW1wLXZhdWx0Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEFwcGl1bVNlc3Npb25JbmZvLFxuICBBcHBpdW1UcmFuc3BvcnRDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUFzYXIsXG4gIE93bmVkSW5zdGFuY2VDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5leHBvcnQge1xuICByZWdpc3RlclZhdWx0LFxuICB1bnJlZ2lzdGVyVmF1bHRcbn0gZnJvbSAnLi92YXVsdC1yZWdpc3RyeS5tanMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBVUEsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyxpQkFBaUI7QUFLMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFXUCxTQUFTLHNCQUFzQjtBQUUvQixTQUFTLHlDQUF5QztBQU1sRCxTQUFTLG1DQUFtQztBQUU1QyxTQUFTLDJCQUEyQjtBQUVwQyxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHVDQUF1QztBQUtoRCxTQUFTLGlCQUFpQjtBQUsxQixTQUFTLHVCQUF1QjtBQU1oQyxTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLGtDQUFrQztBQVUzQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSzsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,75 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Pure verdict on whether a resolved (Obsidian app, installer) version pair is
5
+ * compatible, computed offline from the `metadata.json` thresholds. Kept separate
6
+ * from the integration-only `transport-factory` (which drives real
7
+ * downloads/launches and is excluded from unit tests) so the tier logic stays
8
+ * unit-testable — mirroring the `renderer-boot-detection` split.
9
+ *
10
+ * Two thresholds drive the verdict, both installer versions directly comparable
11
+ * to the resolved installer/shell version:
12
+ *
13
+ * - `minRunnableInstallerVersion` — the run floor. Below it the app cannot boot
14
+ * (`'unrunnable'`); the caller turns this into a proactive
15
+ * `IncompatibleInstallerVersionError` before any download/launch.
16
+ * - `minRecommendedInstallerVersion` — the recommended floor (older versions
17
+ * only). At/above the run floor but below this, the app runs but is below
18
+ * Obsidian's recommendation (`'nagged'`), surfaced as a warning.
19
+ *
20
+ * When the installer version is unknown (e.g. an undetectable Linux shell) or the
21
+ * app version is absent from the table, the verdict is `'unknown'` and nothing is
22
+ * thrown or warned — the reactive dead-boot fast-fail remains the safety net.
23
+ */
24
+ import type { ObsidianVersionMetadata } from './obsidian-metadata.mjs';
25
+ /**
26
+ * Parameters for {@link checkInstallerCompatibility}.
27
+ */
28
+ export interface CheckInstallerCompatibilityParams {
29
+ /** The resolved Obsidian app (asar) version. */
30
+ readonly appVersion: string;
31
+ /** The resolved installer/Electron shell version, or `undefined` when unknown. */
32
+ readonly installerVersion: string | undefined;
33
+ /** The `metadata.json` entry for {@link appVersion}, or `undefined` when absent. */
34
+ readonly metadata: ObsidianVersionMetadata | undefined;
35
+ }
36
+ /**
37
+ * The compatibility verdict for a resolved (app, installer) version pair, carried
38
+ * as data on the transport / connection result so consumers can assert on it.
39
+ */
40
+ export interface InstallerCompatibility {
41
+ /** The resolved Obsidian app (asar) version. */
42
+ readonly appVersion: string;
43
+ /** The resolved installer/Electron shell version, or `null` when unknown. */
44
+ readonly installerVersion: null | string;
45
+ /** A human-readable explanation, present for the `'nagged'` tier. */
46
+ readonly message?: string;
47
+ /** The recommended installer floor, when the table carries one. */
48
+ readonly minRecommendedInstallerVersion?: string;
49
+ /** The run floor, when the table carries one. */
50
+ readonly minRunnableInstallerVersion?: string;
51
+ /** The resolved compatibility tier. */
52
+ readonly tier: InstallerCompatibilityTier;
53
+ }
54
+ /**
55
+ * The compatibility tier of a resolved (app, installer) version pair.
56
+ *
57
+ * - `'ok'` — the installer is at or above the recommended floor (or no
58
+ * recommended floor is known); runs with full compatibility.
59
+ * - `'nagged'` — at/above the run floor but below the recommended floor; runs but
60
+ * Obsidian would show its "installer too old" recommendation.
61
+ * - `'unrunnable'` — below the run floor; the app cannot boot on this installer.
62
+ * - `'unknown'` — cannot be determined (installer version unknown, or the app
63
+ * version is absent from the table).
64
+ */
65
+ export type InstallerCompatibilityTier = 'nagged' | 'ok' | 'unknown' | 'unrunnable';
66
+ /**
67
+ * Computes the compatibility verdict for a resolved (app, installer) version pair.
68
+ *
69
+ * Only `'unrunnable'` warrants an error; `'nagged'` warrants a warning; `'ok'` and
70
+ * `'unknown'` are silent. Comparisons are pure `x.y.z` version compares — no I/O.
71
+ *
72
+ * @param params - The resolved versions and the app version's metadata entry.
73
+ * @returns The compatibility verdict.
74
+ */
75
+ export declare function checkInstallerCompatibility(params: CheckInstallerCompatibilityParams): InstallerCompatibility;
@@ -0,0 +1,40 @@
1
+ import { compareVersions } from "./obsidian-version.mjs";
2
+ function checkInstallerCompatibility(params) {
3
+ const { appVersion, installerVersion, metadata } = params;
4
+ const minRunnableInstallerVersion = metadata?.minRunnableInstallerVersion;
5
+ const minRecommendedInstallerVersion = metadata?.minRecommendedInstallerVersion;
6
+ if (installerVersion === void 0 || minRunnableInstallerVersion === void 0) {
7
+ return { appVersion, installerVersion: installerVersion ?? null, tier: "unknown" };
8
+ }
9
+ const recommendedFloor = minRecommendedInstallerVersion !== void 0 && { minRecommendedInstallerVersion };
10
+ if (compareVersions(installerVersion, minRunnableInstallerVersion) < 0) {
11
+ return {
12
+ appVersion,
13
+ installerVersion,
14
+ minRunnableInstallerVersion,
15
+ tier: "unrunnable",
16
+ ...recommendedFloor
17
+ };
18
+ }
19
+ if (minRecommendedInstallerVersion !== void 0 && compareVersions(installerVersion, minRecommendedInstallerVersion) < 0) {
20
+ return {
21
+ appVersion,
22
+ installerVersion,
23
+ message: `Obsidian installer ${installerVersion} runs Obsidian ${appVersion} but is older than the recommended installer ${minRecommendedInstallerVersion}; update the installer for full compatibility.`,
24
+ minRecommendedInstallerVersion,
25
+ minRunnableInstallerVersion,
26
+ tier: "nagged"
27
+ };
28
+ }
29
+ return {
30
+ appVersion,
31
+ installerVersion,
32
+ minRunnableInstallerVersion,
33
+ tier: "ok",
34
+ ...recommendedFloor
35
+ };
36
+ }
37
+ export {
38
+ checkInstallerCompatibility
39
+ };
40
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSB2ZXJkaWN0IG9uIHdoZXRoZXIgYSByZXNvbHZlZCAoT2JzaWRpYW4gYXBwLCBpbnN0YWxsZXIpIHZlcnNpb24gcGFpciBpc1xuICogY29tcGF0aWJsZSwgY29tcHV0ZWQgb2ZmbGluZSBmcm9tIHRoZSBgbWV0YWRhdGEuanNvbmAgdGhyZXNob2xkcy4gS2VwdCBzZXBhcmF0ZVxuICogZnJvbSB0aGUgaW50ZWdyYXRpb24tb25seSBgdHJhbnNwb3J0LWZhY3RvcnlgICh3aGljaCBkcml2ZXMgcmVhbFxuICogZG93bmxvYWRzL2xhdW5jaGVzIGFuZCBpcyBleGNsdWRlZCBmcm9tIHVuaXQgdGVzdHMpIHNvIHRoZSB0aWVyIGxvZ2ljIHN0YXlzXG4gKiB1bml0LXRlc3RhYmxlIFx1MjAxNCBtaXJyb3JpbmcgdGhlIGByZW5kZXJlci1ib290LWRldGVjdGlvbmAgc3BsaXQuXG4gKlxuICogVHdvIHRocmVzaG9sZHMgZHJpdmUgdGhlIHZlcmRpY3QsIGJvdGggaW5zdGFsbGVyIHZlcnNpb25zIGRpcmVjdGx5IGNvbXBhcmFibGVcbiAqIHRvIHRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbjpcbiAqXG4gKiAtIGBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb25gIFx1MjAxNCB0aGUgcnVuIGZsb29yLiBCZWxvdyBpdCB0aGUgYXBwIGNhbm5vdCBib290XG4gKiAgIChgJ3VucnVubmFibGUnYCk7IHRoZSBjYWxsZXIgdHVybnMgdGhpcyBpbnRvIGEgcHJvYWN0aXZlXG4gKiAgIGBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JgIGJlZm9yZSBhbnkgZG93bmxvYWQvbGF1bmNoLlxuICogLSBgbWluUmVjb21tZW5kZWRJbnN0YWxsZXJWZXJzaW9uYCBcdTIwMTQgdGhlIHJlY29tbWVuZGVkIGZsb29yIChvbGRlciB2ZXJzaW9uc1xuICogICBvbmx5KS4gQXQvYWJvdmUgdGhlIHJ1biBmbG9vciBidXQgYmVsb3cgdGhpcywgdGhlIGFwcCBydW5zIGJ1dCBpcyBiZWxvd1xuICogICBPYnNpZGlhbidzIHJlY29tbWVuZGF0aW9uIChgJ25hZ2dlZCdgKSwgc3VyZmFjZWQgYXMgYSB3YXJuaW5nLlxuICpcbiAqIFdoZW4gdGhlIGluc3RhbGxlciB2ZXJzaW9uIGlzIHVua25vd24gKGUuZy4gYW4gdW5kZXRlY3RhYmxlIExpbnV4IHNoZWxsKSBvciB0aGVcbiAqIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZSB0YWJsZSwgdGhlIHZlcmRpY3QgaXMgYCd1bmtub3duJ2AgYW5kIG5vdGhpbmcgaXNcbiAqIHRocm93biBvciB3YXJuZWQgXHUyMDE0IHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsIHJlbWFpbnMgdGhlIHNhZmV0eSBuZXQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblZlcnNpb25NZXRhZGF0YSB9IGZyb20gJy4vb2JzaWRpYW4tbWV0YWRhdGEubWpzJztcblxuaW1wb3J0IHsgY29tcGFyZVZlcnNpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNoZWNrSW5zdGFsbGVyQ29tcGF0aWJpbGl0eX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tJbnN0YWxsZXJDb21wYXRpYmlsaXR5UGFyYW1zIHtcbiAgLyoqIFRoZSByZXNvbHZlZCBPYnNpZGlhbiBhcHAgKGFzYXIpIHZlcnNpb24uICovXG4gIHJlYWRvbmx5IGFwcFZlcnNpb246IHN0cmluZztcblxuICAvKiogVGhlIHJlc29sdmVkIGluc3RhbGxlci9FbGVjdHJvbiBzaGVsbCB2ZXJzaW9uLCBvciBgdW5kZWZpbmVkYCB3aGVuIHVua25vd24uICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogVGhlIGBtZXRhZGF0YS5qc29uYCBlbnRyeSBmb3Ige0BsaW5rIGFwcFZlcnNpb259LCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC4gKi9cbiAgcmVhZG9ubHkgbWV0YWRhdGE6IE9ic2lkaWFuVmVyc2lvbk1ldGFkYXRhIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIGEgcmVzb2x2ZWQgKGFwcCwgaW5zdGFsbGVyKSB2ZXJzaW9uIHBhaXIsIGNhcnJpZWRcbiAqIGFzIGRhdGEgb24gdGhlIHRyYW5zcG9ydCAvIGNvbm5lY3Rpb24gcmVzdWx0IHNvIGNvbnN1bWVycyBjYW4gYXNzZXJ0IG9uIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RhbGxlckNvbXBhdGliaWxpdHkge1xuICAvKiogVGhlIHJlc29sdmVkIE9ic2lkaWFuIGFwcCAoYXNhcikgdmVyc2lvbi4gKi9cbiAgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKiBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL0VsZWN0cm9uIHNoZWxsIHZlcnNpb24sIG9yIGBudWxsYCB3aGVuIHVua25vd24uICovXG4gIHJlYWRvbmx5IGluc3RhbGxlclZlcnNpb246IG51bGwgfCBzdHJpbmc7XG5cbiAgLyoqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24sIHByZXNlbnQgZm9yIHRoZSBgJ25hZ2dlZCdgIHRpZXIuICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSByZWNvbW1lbmRlZCBpbnN0YWxsZXIgZmxvb3IsIHdoZW4gdGhlIHRhYmxlIGNhcnJpZXMgb25lLiAqL1xuICByZWFkb25seSBtaW5SZWNvbW1lbmRlZEluc3RhbGxlclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBydW4gZmxvb3IsIHdoZW4gdGhlIHRhYmxlIGNhcnJpZXMgb25lLiAqL1xuICByZWFkb25seSBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqIFRoZSByZXNvbHZlZCBjb21wYXRpYmlsaXR5IHRpZXIuICovXG4gIHJlYWRvbmx5IHRpZXI6IEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyO1xufVxuXG4vKipcbiAqIFRoZSBjb21wYXRpYmlsaXR5IHRpZXIgb2YgYSByZXNvbHZlZCAoYXBwLCBpbnN0YWxsZXIpIHZlcnNpb24gcGFpci5cbiAqXG4gKiAtIGAnb2snYCBcdTIwMTQgdGhlIGluc3RhbGxlciBpcyBhdCBvciBhYm92ZSB0aGUgcmVjb21tZW5kZWQgZmxvb3IgKG9yIG5vXG4gKiAgIHJlY29tbWVuZGVkIGZsb29yIGlzIGtub3duKTsgcnVucyB3aXRoIGZ1bGwgY29tcGF0aWJpbGl0eS5cbiAqIC0gYCduYWdnZWQnYCBcdTIwMTQgYXQvYWJvdmUgdGhlIHJ1biBmbG9vciBidXQgYmVsb3cgdGhlIHJlY29tbWVuZGVkIGZsb29yOyBydW5zIGJ1dFxuICogICBPYnNpZGlhbiB3b3VsZCBzaG93IGl0cyBcImluc3RhbGxlciB0b28gb2xkXCIgcmVjb21tZW5kYXRpb24uXG4gKiAtIGAndW5ydW5uYWJsZSdgIFx1MjAxNCBiZWxvdyB0aGUgcnVuIGZsb29yOyB0aGUgYXBwIGNhbm5vdCBib290IG9uIHRoaXMgaW5zdGFsbGVyLlxuICogLSBgJ3Vua25vd24nYCBcdTIwMTQgY2Fubm90IGJlIGRldGVybWluZWQgKGluc3RhbGxlciB2ZXJzaW9uIHVua25vd24sIG9yIHRoZSBhcHBcbiAqICAgdmVyc2lvbiBpcyBhYnNlbnQgZnJvbSB0aGUgdGFibGUpLlxuICovXG5leHBvcnQgdHlwZSBJbnN0YWxsZXJDb21wYXRpYmlsaXR5VGllciA9ICduYWdnZWQnIHwgJ29rJyB8ICd1bmtub3duJyB8ICd1bnJ1bm5hYmxlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciBhIHJlc29sdmVkIChhcHAsIGluc3RhbGxlcikgdmVyc2lvbiBwYWlyLlxuICpcbiAqIE9ubHkgYCd1bnJ1bm5hYmxlJ2Agd2FycmFudHMgYW4gZXJyb3I7IGAnbmFnZ2VkJ2Agd2FycmFudHMgYSB3YXJuaW5nOyBgJ29rJ2AgYW5kXG4gKiBgJ3Vua25vd24nYCBhcmUgc2lsZW50LiBDb21wYXJpc29ucyBhcmUgcHVyZSBgeC55LnpgIHZlcnNpb24gY29tcGFyZXMgXHUyMDE0IG5vIEkvTy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlc29sdmVkIHZlcnNpb25zIGFuZCB0aGUgYXBwIHZlcnNpb24ncyBtZXRhZGF0YSBlbnRyeS5cbiAqIEByZXR1cm5zIFRoZSBjb21wYXRpYmlsaXR5IHZlcmRpY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHkocGFyYW1zOiBDaGVja0luc3RhbGxlckNvbXBhdGliaWxpdHlQYXJhbXMpOiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHtcbiAgY29uc3QgeyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uLCBtZXRhZGF0YSB9ID0gcGFyYW1zO1xuICBjb25zdCBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24gPSBtZXRhZGF0YT8ubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uO1xuICBjb25zdCBtaW5SZWNvbW1lbmRlZEluc3RhbGxlclZlcnNpb24gPSBtZXRhZGF0YT8ubWluUmVjb21tZW5kZWRJbnN0YWxsZXJWZXJzaW9uO1xuXG4gIGlmIChpbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgbWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBhcHBWZXJzaW9uLCBpbnN0YWxsZXJWZXJzaW9uOiBpbnN0YWxsZXJWZXJzaW9uID8/IG51bGwsIHRpZXI6ICd1bmtub3duJyB9O1xuICB9XG5cbiAgY29uc3QgcmVjb21tZW5kZWRGbG9vciA9IG1pblJlY29tbWVuZGVkSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHsgbWluUmVjb21tZW5kZWRJbnN0YWxsZXJWZXJzaW9uIH07XG5cbiAgaWYgKGNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZXJWZXJzaW9uLCBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pIDwgMCkge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbixcbiAgICAgIHRpZXI6ICd1bnJ1bm5hYmxlJyxcbiAgICAgIC4uLnJlY29tbWVuZGVkRmxvb3JcbiAgICB9O1xuICB9XG5cbiAgaWYgKG1pblJlY29tbWVuZGVkSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZXJWZXJzaW9uLCBtaW5SZWNvbW1lbmRlZEluc3RhbGxlclZlcnNpb24pIDwgMCkge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICAgIG1lc3NhZ2U6IGBPYnNpZGlhbiBpbnN0YWxsZXIgJHtpbnN0YWxsZXJWZXJzaW9ufSBydW5zIE9ic2lkaWFuICR7YXBwVmVyc2lvbn0gYnV0IGlzIG9sZGVyIHRoYW4gdGhlIGBcbiAgICAgICAgKyBgcmVjb21tZW5kZWQgaW5zdGFsbGVyICR7bWluUmVjb21tZW5kZWRJbnN0YWxsZXJWZXJzaW9ufTsgdXBkYXRlIHRoZSBpbnN0YWxsZXIgZm9yIGZ1bGwgY29tcGF0aWJpbGl0eS5gLFxuICAgICAgbWluUmVjb21tZW5kZWRJbnN0YWxsZXJWZXJzaW9uLFxuICAgICAgbWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uLFxuICAgICAgdGllcjogJ25hZ2dlZCdcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb24sXG4gICAgbWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uLFxuICAgIHRpZXI6ICdvaycsXG4gICAgLi4ucmVjb21tZW5kZWRGbG9vclxuICB9O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBMEJBLFNBQVMsdUJBQXVCO0FBOER6QixTQUFTLDRCQUE0QixRQUFtRTtBQUM3RyxRQUFNLEVBQUUsWUFBWSxrQkFBa0IsU0FBUyxJQUFJO0FBQ25ELFFBQU0sOEJBQThCLFVBQVU7QUFDOUMsUUFBTSxpQ0FBaUMsVUFBVTtBQUVqRCxNQUFJLHFCQUFxQixVQUFhLGdDQUFnQyxRQUFXO0FBQy9FLFdBQU8sRUFBRSxZQUFZLGtCQUFrQixvQkFBb0IsTUFBTSxNQUFNLFVBQVU7QUFBQSxFQUNuRjtBQUVBLFFBQU0sbUJBQW1CLG1DQUFtQyxVQUFhLEVBQUUsK0JBQStCO0FBRTFHLE1BQUksZ0JBQWdCLGtCQUFrQiwyQkFBMkIsSUFBSSxHQUFHO0FBQ3RFLFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU07QUFBQSxNQUNOLEdBQUc7QUFBQSxJQUNMO0FBQUEsRUFDRjtBQUVBLE1BQUksbUNBQW1DLFVBQWEsZ0JBQWdCLGtCQUFrQiw4QkFBOEIsSUFBSSxHQUFHO0FBQ3pILFdBQU87QUFBQSxNQUNMO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUyxzQkFBc0IsZ0JBQWdCLGtCQUFrQixVQUFVLGdEQUM5Qyw4QkFBOEI7QUFBQSxNQUMzRDtBQUFBLE1BQ0E7QUFBQSxNQUNBLE1BQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLE1BQU07QUFBQSxJQUNOLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "8.0.0";
1
+ const LIBRARY_VERSION = false ? "dev" : "8.1.0";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };