obsidian-dev-utils 101.6.0 → 101.7.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 (64) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/dist/integration-test-plugin/main.js +4410 -3705
  3. package/dist/lib/cjs/__merged.cjs +26 -1
  4. package/dist/lib/cjs/__merged.d.cts +4 -1
  5. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  6. package/dist/lib/cjs/obsidian/components/component-ex.cjs +14 -1
  7. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +11 -0
  8. package/dist/lib/cjs/obsidian/components/index.cjs +4 -1
  9. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  10. package/dist/lib/cjs/obsidian/components/plugin-gate-component.cjs +520 -0
  11. package/dist/lib/cjs/obsidian/components/plugin-gate-component.d.cts +299 -0
  12. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.cjs +17 -38
  13. package/dist/lib/cjs/obsidian/components/plugin-suggestion-component.d.cts +25 -18
  14. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +7 -2
  15. package/dist/lib/cjs/obsidian/css-class.cjs +3 -1
  16. package/dist/lib/cjs/obsidian/css-class.d.cts +9 -0
  17. package/dist/lib/cjs/obsidian/html-element.cjs +27 -3
  18. package/dist/lib/cjs/obsidian/html-element.d.cts +36 -0
  19. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +15 -1
  20. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +14 -0
  21. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +14 -0
  22. package/dist/lib/cjs/obsidian/plugin/index.cjs +7 -1
  23. package/dist/lib/cjs/obsidian/plugin/index.d.cts +2 -0
  24. package/dist/lib/cjs/obsidian/plugin/plugin-api.cjs +2 -2
  25. package/dist/lib/cjs/obsidian/plugin/plugin-api.d.cts +34 -15
  26. package/dist/lib/cjs/obsidian/plugin/plugin-install-state.cjs +208 -0
  27. package/dist/lib/cjs/obsidian/plugin/plugin-install-state.d.cts +113 -0
  28. package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.cjs +161 -0
  29. package/dist/lib/cjs/obsidian/plugin/plugin-lifecycle-events.d.cts +119 -0
  30. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +241 -21
  31. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +133 -4
  32. package/dist/lib/esm/__merged.d.mts +4 -1
  33. package/dist/lib/esm/__merged.mjs +30 -2
  34. package/dist/lib/esm/generated-during-build.mjs +1 -1
  35. package/dist/lib/esm/obsidian/components/component-ex.d.mts +11 -0
  36. package/dist/lib/esm/obsidian/components/component-ex.mjs +14 -1
  37. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  38. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  39. package/dist/lib/esm/obsidian/components/plugin-gate-component.d.mts +299 -0
  40. package/dist/lib/esm/obsidian/components/plugin-gate-component.mjs +428 -0
  41. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.d.mts +25 -18
  42. package/dist/lib/esm/obsidian/components/plugin-suggestion-component.mjs +21 -41
  43. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +7 -2
  44. package/dist/lib/esm/obsidian/css-class.d.mts +9 -0
  45. package/dist/lib/esm/obsidian/css-class.mjs +3 -1
  46. package/dist/lib/esm/obsidian/html-element.d.mts +36 -0
  47. package/dist/lib/esm/obsidian/html-element.mjs +24 -2
  48. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +14 -0
  49. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +15 -1
  50. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +14 -0
  51. package/dist/lib/esm/obsidian/plugin/index.d.mts +2 -0
  52. package/dist/lib/esm/obsidian/plugin/index.mjs +5 -1
  53. package/dist/lib/esm/obsidian/plugin/plugin-api.d.mts +34 -15
  54. package/dist/lib/esm/obsidian/plugin/plugin-api.mjs +2 -2
  55. package/dist/lib/esm/obsidian/plugin/plugin-install-state.d.mts +113 -0
  56. package/dist/lib/esm/obsidian/plugin/plugin-install-state.mjs +106 -0
  57. package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.d.mts +119 -0
  58. package/dist/lib/esm/obsidian/plugin/plugin-lifecycle-events.mjs +54 -0
  59. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +133 -4
  60. package/dist/lib/esm/obsidian/plugin/plugin.mjs +245 -21
  61. package/obsidian/components/plugin-gate-component/package.json +6 -0
  62. package/obsidian/plugin/plugin-install-state/package.json +6 -0
  63. package/obsidian/plugin/plugin-lifecycle-events/package.json +6 -0
  64. package/package.json +1 -1
@@ -232,7 +232,7 @@ function publishPluginApi(params) {
232
232
  };
233
233
  records.push(record);
234
234
  notifySubscribers();
235
- params.plugin.register(() => {
235
+ (params.component ?? params.plugin).register(() => {
236
236
  revokeRecord(record);
237
237
  });
238
238
  }
@@ -423,4 +423,4 @@ export {
423
423
  publishPluginApi,
424
424
  watchPluginApi
425
425
  };
426
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpTWV0aG9kQ29udHJhY3Qge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSBcdTIwMTQgb3IsIHdoZW4gdGhlIG1ldGhvZCByZXR1cm5zIGEgdGhlbmFibGUsIHRoZSB2YWx1ZSBpdCByZXNvbHZlcyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IFN0YW5kYXJkU2NoZW1hVjE7XG59XG5cbi8qKlxuICogQSBsaXZlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBsdWdpbidzIEFQSS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSByZWYgaXMgdGhlIFdIT0xFIGNvbnN1bWVyIHN1cmZhY2UsIGRlbGliZXJhdGVseS4gQSBwbGFpbiB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IG1vZGVsIHRoaXMgYmVjYXVzZSBpdFxuICogc2V0dGxlcyBvbmNlLCB3aGVyZWFzIGF2YWlsYWJpbGl0eSBpcyBhIHJlcGVhdGluZyBzaWduYWwgKGF2YWlsYWJsZSBcdTIxOTIgZ29uZSBcdTIxOTIgYXZhaWxhYmxlIGFnYWluIGFjcm9zcyBhXG4gKiBkaXNhYmxlL2VuYWJsZSBjeWNsZSkgXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGlzIGEgbWV0aG9kIE9OIHRoZSByZWYgcmF0aGVyIHRoYW5cbiAqIHRoZSB0aGluZyBoYW5kZWQgYmFjay4gVGhlIGBjaGFuZ2VgIGV2ZW50IGV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgbXVzdCByZWFjdCByYXRoZXIgdGhhbiByZWFkLCBhbmQgaXNcbiAqIHNlY29uZGFyeTogaXQgaW1wb3NlcyBubyBjZXJlbW9ueSBvbiB0aGUgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHJlYWRpbmcge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5BcGlSZWZFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEFsd2F5cyBjdXJyZW50LCBzeW5jaHJvbm91cywgYW5kIGZyZWUgXHUyMDE0IHRoZSByZWYgbWFpbnRhaW5zIGl0LCBzbyB0aGVyZSBpcyBubyByZWdpc3RyeSBsb29rdXAgcGVyIHJlYWQuXG4gICAqIGBudWxsYCBoZXJlIG1lYW5zIFwibm90IGF2YWlsYWJsZSByaWdodCBub3dcIiwgTk9UIFwibm90IGluc3RhbGxlZFwiOiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIHRoZVxuICAgKiBwcm92aWRlciBtYXkgc2ltcGx5IG5vdCBoYXZlIGxvYWRlZCB5ZXQsIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBub24tYG51bGxgIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogbnVsbCB8IFRBcGk7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3YWl0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEFQSS5cbiAgICogQHRocm93cyBBIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvci5yZWFzb259IHNheXMgd2hpY2ggb2ZcbiAgICogdGhlIGZpdmUgZmFpbHVyZXMgb2NjdXJyZWQsIGlmIHRoZSBBUEkgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy5cbiAgICovXG4gIHdoZW5BdmFpbGFibGUob3B0aW9ucz86IFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zKTogUHJvbWlzZTxUQXBpPjtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEge0BsaW5rIFBsdWdpbkFwaVJlZn0gZmlyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gY2hhbmdlcyBcdTIwMTQgaW5jbHVkaW5nIHdoZW4gaXQgYmVjb21lcyBgbnVsbGAgYmVjYXVzZSB0aGUgcHJvdmlkZXJcbiAgICogdW5sb2FkZWQuXG4gICAqL1xuICBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGV4cGxpY2l0IG1lc3NhZ2UuIFdoZW4gb21pdHRlZCwgb25lIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgcmVhc29uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHVibGlzaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEkgb2JqZWN0IHRvIHB1Ymxpc2guIEl0cyBtZXRob2RzIGFyZSBoYW5kZWQgdG8gY29uc3VtZXJzIHRocm91Z2ggYSByZXZvY2FibGUgaGFuZGxlLCBhbmQgdGhleSBhcmVcbiAgICogYWx3YXlzIGludm9rZWQgd2l0aCB0aGlzIG9iamVjdCBhcyB0aGVpciBgdGhpc2AsIHNvIGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHByaXZhdGUgY2xhc3MgZmllbGRzIGtlZXBzXG4gICAqIHdvcmtpbmcuXG4gICAqL1xuICByZWFkb25seSBhcGk6IFRBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBDT05UUkFDVCB2ZXJzaW9uLCBpbiBzZW12ZXIgZm9ybSBcdTIwMTQgaW5kZXBlbmRlbnQgb2YgdGhlIHBsdWdpbidzIG93biB2ZXJzaW9uLiBQbHVnaW4gYDEuNC43YCBtYXlcbiAgICogcGVyZmVjdGx5IHdlbGwgZXhwb3NlIEFQSSBgMi4wLjBgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhpcyB2ZXJzaW9uIG9mIHRoZSBBUEkgc2F0aXNmaWVzLiBPcHRpb25hbDogd2hlbiBvbWl0dGVkLCBubyBzaGFwZSBjaGVjayBpcyBwZXJmb3JtZWQgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgYmVoYWxmIGFuZCB0aGUgY29uc3VtZXIncyBvd24gY29udHJhY3QgKGlmIGFueSkgaXMgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIHB1Ymxpc2hpbmcgcGx1Z2luLiBUaGUgcmVjb3JkIGlzIGtleWVkIGJ5IGl0cyBgbWFuaWZlc3QuaWRgIGFuZCByZXZva2VkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luXG4gICAqIHVubG9hZHMsIHZpYSBgcGx1Z2luLnJlZ2lzdGVyKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHdhdGNoUGx1Z2luQXBpfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaFBsdWdpbkFwaVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC4gVGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gICAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCB3aW5zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmFuZ2UgaXMgZXZhbHVhdGVkIGJ5IGBjb21wYXJlLXZlcnNpb25zYCwgd2hpY2ggYWNjZXB0cyBgXmAsIGB+YCwgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGFuZCBgeGBcbiAgICogd2lsZGNhcmRzIFx1MjAxNCBidXQgTk9UIGEgYmFyZSBgKmAuIFNwZWxsIFwiYW55IHZlcnNpb25cIiBhcyBgJz49MC4wLjAnYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLCB1c2VkIHRvIGNsYXNzaWZ5IGEgZmFpbHVyZSBhcyBub3QtaW5zdGFsbGVkIHZzIG5vdC1lbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgb3duaW5nIHRoZSBzdWJzY3JpcHRpb24uIFRoZSB3YXRjaCBpcyB0b3JuIGRvd24gd2hlbiBpdCB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gT3B0aW9uYWwsIGFuZCBpdCB3aW5zIG92ZXIgdGhlIHByb3ZpZGVyJ3MgcHVibGlzaGVkIGNvbnRyYWN0IHdoZW5cbiAgICogc3VwcGxpZWQgXHUyMDE0IGl0IGlzIHRoZSBjb25zdW1lcidzIG93biBjb21waWxlZC1hZ2FpbnN0IGV4cGVjdGF0aW9uLCBzbyBpdCBpcyB0aGUgb25lIHdob3NlIHZpb2xhdGlvbiBpc1xuICAgKiB0aGUgY29uc3VtZXIncyBwcm9ibGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBQbHVnaW5BcGlDb250cmFjdDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTWV0aG9kV3JhcHBlcn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kQ29udHJhY3Q6IFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZyBvdXRwdXQuIE5PVCBhIGtleSBcdTIwMTQgc2VlIHtAbGluayBwcm9wZXJ0eUtleX0uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IHJlYWQgYnksIHdoaWNoIG1heSBiZSBhIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5S2V5OiBQcm9wZXJ0eUtleTtcblxuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbG0tZ2xvYmFsIHJlZ2lzdHJ5IHNoYXJlZCBieSBldmVyeSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3B5IGluIHRoZSByZW5kZXJlci5cbiAqL1xuaW50ZXJmYWNlIFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10+O1xuICBzdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG59XG5cbi8qKlxuICogQSByZWNvcmQgYXMgaXQgc2l0cyBpbiB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHRoZSBXSVJFIEZPUk1BVCBiZXR3ZWVuIGRpZmZlcmVudCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBjb3BpZXMsIHNvIGl0IGhvbGRzIG5vdGhpbmcgYnV0IHBsYWluIGRhdGFcbiAqIGFuZCBwbGFpbiBmdW5jdGlvbnMsIGFuZCBldmVyeSByZWFkIG9mIGl0IGVsc2V3aGVyZSBpbiB0aGlzIGZpbGUgaXMgc3RydWN0dXJhbC5cbiAqL1xuaW50ZXJmYWNlIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCB7XG4gIGFwaTogb2JqZWN0O1xuICBhcGlWZXJzaW9uOiBzdHJpbmc7XG4gIGNvbnRyYWN0OiBQbHVnaW5BcGlDb250cmFjdDtcbiAgaXNSZXZva2VkOiBib29sZWFuO1xuICBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB2YWxpZGF0ZVBheWxvYWR9LlxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVQYXlsb2FkUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSG9sZHMgd2hhdCBhIHdhdGNoIG5lZWRzIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0eXBlIGl0IGlzIHR5cGVkIGFnYWluc3QsIHNvIHRoZSB7QGxpbmsgbWl4aW5Bc3luY0V2ZW50c31cbiAqIG1peGluIGhhcyBhIHJlYWwgYmFzZSB0byBleHRlbmQuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFBsdWdpbkFwaVdhdGNoQmFzZSB7XG4gIHByb3RlY3RlZCBoYW5kbGU6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWNvcmQ6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSBudWxsO1xuXG4gIC8vIEEgYHByb3RlY3RlZGAgY29uc3RydWN0b3IgaXMgbm90IGFzc2lnbmFibGUgdG8gYEFic3RyYWN0Q29uc3RydWN0b3I8b2JqZWN0PmAsIHdoaWNoIGlzIHdoYXRcbiAgLy8gYG1peGluQXN5bmNFdmVudHNgIGFjY2VwdHMsIHNvIHRoaXMgc3RheXMgcHVibGljIGV2ZW4gdGhvdWdoIG9ubHkgdGhlIHN1YmNsYXNzIGJlbG93IGNhbGxzIGl0LlxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZGVzY3JpYmluZyB3aHkgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNsYXNzaWZpZWQgZXJyb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpOiBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgcGx1Z2luSWQ6IHRoaXMucGFyYW1zLnBsdWdpbklkLFxuICAgICAgcmVhc29uOiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUGx1Z2luQXBpUmVmSW1wbDxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luQXBpUmVmRXZlbnRNYXA+KCkoUGx1Z2luQXBpV2F0Y2hCYXNlKSBpbXBsZW1lbnRzIFBsdWdpbkFwaVJlZjxUQXBpPiB7XG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVsbCB8IFRBcGkge1xuICAgIHJldHVybiBjYXN0VG88bnVsbCB8IFRBcGk+KHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGVzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5LCBmaXJpbmcgYGNoYW5nZWAgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQodGhpcy5wYXJhbXMpO1xuICAgIGlmIChyZWNvcmQgPT09IHRoaXMucmVjb3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5oYW5kbGUgPSByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgdGhpcy5wYXJhbXMuY29udHJhY3QpO1xuICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd2hlbkF2YWlsYWJsZShvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5XaXRoVGltZW91dDxUQXBpPih7XG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiA9PiBhd2FpdCB0aGlzLndhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbCksXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGB3YXRjaFBsdWdpbkFwaShcIiR7dGhpcy5wYXJhbXMucGx1Z2luSWR9XCIpLndoZW5BdmFpbGFibGVgLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dIRU5fQVZBSUxBQkxFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclZhbHVlKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxUQXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBGSVJTVCBhbmQgaW52b2tlZCB0aHJvdWdoIGEgdGh1bmssIHNvIGBldmVudFJlZmAgaXMgYWxyZWFkeSBib3VuZCBieSB0aGVcbiAgICAgIC8vIFRpbWUgYW55dGhpbmcgY2FuIHJlYWNoIGl0IFx1MjAxNCB3aGljaCBpcyB3aGF0IGxldHMgYGNsZWFuVXBgIGJlIHVuY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gbnVsbC1ndWFyZGVkLlxuICAgICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICAgIGV2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCk6IHZvaWQge1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwbHVnaW4gQVBJIGNhbm5vdCBiZSBoYW5kZWQgb3ZlciwgY2FycnlpbmcgdGhlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzXG4gKiB3aHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlID8/IGBUaGUgQVBJIG9mIHRoZSBwbHVnaW4gXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBpcyB1bmF2YWlsYWJsZTogJHtwYXJhbXMucmVhc29ufS5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHByb3BlcnR5IGlzIHJlYWQgZnJvbSBhIGhhbmRsZSB3aG9zZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9pbnQgb2YgaGFuZGluZyBvdXQgYSByZXZvY2FibGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSByYXcgb2JqZWN0OiBhIGNvbnN1bWVyIHRoYXQgY2FjaGVkIHRoZVxuICogQVBJIGluIGEgZmllbGQgYW5kIGtlcHQgdXNpbmcgaXQgYWNyb3NzIGEgZGlzYWJsZSBnZXRzIGFuIGVycm9yIG5hbWluZyB0aGUgcHJvdmlkZXIsIGluc3RlYWQgb2ZcbiAqIGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZGAgc29tZXdoZXJlIGRlZXAgaW5zaWRlIGEgdG9ybi1kb3duIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVJldm9rZWRFcnJvciBleHRlbmRzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmV2b2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGJlZW4gcmV2b2tlZCwgYmVjYXVzZSB0aGUgcGx1Z2luIHdhcyB1bmxvYWRlZC5gLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWRcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpUmV2b2tlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHVibGlzaGVkIEFQSSdzIHBheWxvYWQgZmFpbHMgdGhlIHNjaGVtYSBpdHMgY29udHJhY3QgZGVjbGFyZXMuXG4gKlxuICogT25seSBldmVyIHRocm93biB3aGlsZSB0aGUgYG9ic2lkaWFuLWRldi11dGlsczpQbHVnaW5BcGlgIGRlYnVnZ2VyIGlzIGVuYWJsZWQgXHUyMDE0IGluIHByb2R1Y3Rpb24gdGhlIG1ldGhvZHNcbiAqIGFyZSBub3Qgd3JhcHBlZCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgaXNzdWVzIHRoZSBzY2hlbWEgcmVwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZSAke3BhcmFtcy5wYXlsb2FkS2luZH0gb2YgXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBBUEkgbWV0aG9kIFwiJHtwYXJhbXMubWV0aG9kTmFtZX1cIiBmYWlsZWQgdmFsaWRhdGlvbjogJHtmb3JtYXRJc3N1ZXMocGFyYW1zLmlzc3Vlcyl9YFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkFwaVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5pc3N1ZXMgPSBwYXJhbXMuaXNzdWVzO1xuICAgIHRoaXMubWV0aG9kTmFtZSA9IHBhcmFtcy5tZXRob2ROYW1lO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBwbHVnaW4ncyBBUEkgc28gb3RoZXIgcGx1Z2lucyBjYW4gY29uc3VtZSBpdCwga2V5ZWQgYnkgdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gKlxuICogU2V2ZXJhbCBjb250cmFjdCB2ZXJzaW9ucyBtYXkgYmUgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgc28gYSBwcm92aWRlciBjYW4gbW92ZSB0byBgMi4wLjBgIHdpdGhvdXQgYnJlYWtpbmdcbiAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgcHVibGlzaGVkLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nLlxuICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoaXMgcGx1Z2luIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGlzIGV4YWN0IGBhcGlWZXJzaW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGk+KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbklkID0gcGFyYW1zLnBsdWdpbi5tYW5pZmVzdC5pZDtcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRSZWdpc3RyeSgpO1xuICBjb25zdCByZWNvcmRzID0gcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW107XG4gIHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID0gcmVjb3JkcztcblxuICBpZiAocmVjb3Jkcy5zb21lKChyZWNvcmQpID0+IHJlY29yZC5hcGlWZXJzaW9uID09PSBwYXJhbXMuYXBpVmVyc2lvbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGUgQVBJIHZlcnNpb24gXCIke3BhcmFtcy5hcGlWZXJzaW9ufVwiLmApO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSB7XG4gICAgYXBpOiBwYXJhbXMuYXBpLFxuICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgIGNvbnRyYWN0OiBwYXJhbXMuY29udHJhY3QgPz8ge30sXG4gICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICBwbHVnaW5JZFxuICB9O1xuICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcblxuICBwYXJhbXMucGx1Z2luLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3Mi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
426
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4tYXBpLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIFx1MjAxNCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IFx1MjAxNCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwgXHUyMDE0IHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUgXHUyMDE0IGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHM6UGx1Z2luQXBpYCBkZWJ1Z2dlciBpcyBlbmFibGVkLCBzbyBwcm9kdWN0aW9uIHBheXMgbm90aGluZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIGBvYnNpZGlhbi1kZXYtdXRpbHNgLCBzbyBhIHJlZ2lzdHJ5IHJlY29yZCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW5cbiAqIGRpZmZlcmVudCBsaWJyYXJ5IHZlcnNpb25zIGFuZCBtdXN0IHN0YXkgYmFja3dhcmQtY29tcGF0aWJsZSBmb3JldmVyLiBOb3RoaW5nIGNyb3NzaW5nIGl0IG1heSBiZVxuICogYGluc3RhbmNlb2ZgLWNoZWNrZWQgXHUyMDE0IHJlYWRzIGFyZSBzdHJ1Y3R1cmFsLCBhbmQgb25seSBwbGFpbiBkYXRhIG9iamVjdHMgYW5kIHBsYWluIGZ1bmN0aW9ucyBhcmUgc3RvcmVkLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgQ29tcG9uZW50LFxuICBQbHVnaW5cbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBjb21wYXJlVmVyc2lvbnMsXG4gIHNhdGlzZmllcyBhcyBzYXRpc2ZpZXNWZXJzaW9uXG59IGZyb20gJ2NvbXBhcmUtdmVyc2lvbnMnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRTb3VyY2UgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uLy4uL2FycmF5LnRzJztcbmltcG9ydCB7IG1peGluQXN5bmNFdmVudHMgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJy4uLy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi4vLi4vb2JqZWN0LXV0aWxzLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5cbmNvbnN0IFBMVUdJTl9BUElfREVCVUdHRVJfTkFNRVNQQUNFID0gJ1BsdWdpbkFwaSc7XG5jb25zdCBQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSA9ICdwbHVnaW5BcGlSZWdpc3RyeSc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSB3YWl0cyBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAqL1xuY29uc3QgREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEwXzAwMDtcblxuLyoqXG4gKiBXaGljaCBoYWxmIG9mIGEgbWV0aG9kIGNhbGwgYSB2YWxpZGF0aW9uIGZhaWx1cmUgY2FtZSBmcm9tLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlQYXlsb2FkS2luZCB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgSW5wdXQgPSAnaW5wdXQnLFxuXG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLlxuICAgKi9cbiAgT3V0cHV0ID0gJ291dHB1dCdcbn1cblxuLyoqXG4gKiBUaGUgcmVhc29uIGEgcGx1Z2luIEFQSSBjb3VsZCBub3QgYmUgaGFuZGVkIG92ZXIuXG4gKlxuICogVGhlIHdob2xlIHBvaW50IG9mIHRoZSBlbnVtIGlzIHRoYXQgdGhlc2UgYXJlIHRvbGQgYXBhcnQuIGBAdmFuYWthdC9wbHVnaW4tYXBpYCBjYW5ub3QgdGVsbCBhbnkgb2YgdGhlbVxuICogYXBhcnQsIGFuZCBub3QgdW5pZm9ybWx5OiBgTm90SW5zdGFsbGVkYCAvIGBOb3RFbmFibGVkYCAvIGBOb3RQdWJsaXNoZWRgIGFsbCByZWR1Y2UgdG8gb25lIGBOb3RpY2VgIHBsdXNcbiAqIGB1bmRlZmluZWRgLCB3aGlsZSBgVmVyc2lvbk1pc21hdGNoYCAvIGBTaGFwZU1pc21hdGNoYCBwcm9kdWNlIE5PIHNpZ25hbCBhdCBhbGwgXHUyMDE0IGl0IG5ldmVyIGV4YW1pbmVzIHdoYXQgaXRcbiAqIGZvdW5kLCBzbyBpdCBoYW5kcyB0aGUgb2JqZWN0IG92ZXIgYW5kIHRoZSBtaXNtYXRjaCBzdXJmYWNlcyBsYXRlciwgc29tZXdoZXJlIGVsc2UsIGFzIHNvbWVib2R5IGVsc2Unc1xuICogYFR5cGVFcnJvcmAuXG4gKlxuICogQHJlbWFya3NcbiAqIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gY2FuIHJlcG9ydCB0aGUgZmlyc3QgZml2ZTsge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWR9XG4gKiBpcyBub3Qgb25lIG9mIHRoZW0sIGJlY2F1c2UgaXQgZGVzY3JpYmVzIGEgaGFuZGxlIHRoYXQgV0FTIHZhbGlkIGFuZCBpcyBjYXJyaWVkIGJ5XG4gKiB7QGxpbmsgUGx1Z2luQXBpUmV2b2tlZEVycm9yfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBidXQgbm90IGVuYWJsZWQuXG4gICAqL1xuICBOb3RFbmFibGVkID0gJ25vdEVuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCBidXQgaGFzIG5vdCBwdWJsaXNoZWQgYW55IEFQSS5cbiAgICovXG4gIE5vdFB1Ymxpc2hlZCA9ICdub3RQdWJsaXNoZWQnLFxuXG4gIC8qKlxuICAgKiBUaGUgaGFuZGxlIHdhcyB2YWxpZCBidXQgdGhlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZCwgc28gaXQgaGFzIGJlZW4gcmV2b2tlZC5cbiAgICovXG4gIFJldm9rZWQgPSAncmV2b2tlZCcsXG5cbiAgLyoqXG4gICAqIEEgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gcmFuZ2UsIGJ1dCB0aGUgQVBJIG9iamVjdCBpcyBtaXNzaW5nIGEgbWV0aG9kIHRoZSBjb250cmFjdFxuICAgKiBkZWNsYXJlcyBcdTIwMTQgdGhlIHByb3ZpZGVyJ3Mgc2hpcHBlZCBzaGFwZSBhbmQgaXRzIGRlY2xhcmVkIHNoYXBlIGRpc2FncmVlLlxuICAgKi9cbiAgU2hhcGVNaXNtYXRjaCA9ICdzaGFwZU1pc21hdGNoJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwdWJsaXNoZWQgYW4gQVBJLCBidXQgbm8gcHVibGlzaGVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgcmFuZ2UuXG4gICAqL1xuICBWZXJzaW9uTWlzbWF0Y2ggPSAndmVyc2lvbk1pc21hdGNoJ1xufVxuXG4vKipcbiAqIFRoZSBjb250cmFjdCBhIHByb3ZpZGVyIGRlY2xhcmVzIGZvciBpdHMgQVBJOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBpcyBwcm9taXNpbmcgdG8gZXhwb3NlLCBhbmRcbiAqIGl0cyB2YWx1ZSBvcHRpb25hbGx5IGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVGhlIEtFWVMgYXJlIHRoZSBwYXJ0IHRoYXQgYWx3YXlzIG1hdHRlcnMgXHUyMDE0IHRoZXkgZHJpdmUgdGhlIHNoYXBlIGNoZWNrIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcHVibGlzaGVkXG4gKiByZWNvcmQgaXMgdXNhYmxlIGF0IGFsbC4gVGhlIHNjaGVtYXMgYXJlIG9wdGlvbmFsIGFuZCBvbmx5IGV2ZXIgY29uc3VsdGVkIHdoaWxlIGRlYnVnZ2luZy5cbiAqXG4gKiBAcmVtYXJrc1xuICogV2h5IHRoZSBzaGFwZSBjaGVjayBpcyBhIGB0eXBlb2ZgIHJhdGhlciB0aGFuIGEgc2NoZW1hIG92ZXIgdGhlIHdob2xlIEFQSSBvYmplY3QuIEluIHpvZCA0IGB6LmZ1bmN0aW9uKClgXG4gKiByZXR1cm5zIGEgZnVuY3Rpb24gRkFDVE9SWSwgbm90IGEgc2NoZW1hLCBzbyBpdCBjYW5ub3QgYmUgYSBgei5vYmplY3QoKWAgbWVtYmVyIGRpcmVjdGx5LiBUaGVyZSBpcyBhIGtub3duXG4gKiB3b3JrYXJvdW5kICh6b2QjNDE0MykgXHUyMDE0IGB6LmN1c3RvbSgoZm4pID0+IGZ1bmN0aW9uU2NoZW1hLmltcGxlbWVudChmbikpYCBcdTIwMTQgYW5kIGl0IGRvZXMgYnV5IGNvcnJlY3RcbiAqIGB6LmluZmVyYCB0eXBlcyBmb3IgYSBmdW5jdGlvbiBtZW1iZXIuIEl0IGRvZXMgbm90IGJ1eSBydW50aW1lIHZhbGlkYXRpb24gaGVyZSwgdGhvdWdoOiBgei5jdXN0b21gIGlzIGFcbiAqIGJvb2xlYW4gcHJlZGljYXRlIHRoYXQgcmV0dXJucyBpdHMgaW5wdXQgdW5jaGFuZ2VkLCBzbyB0aGUgdmFsaWRhdGluZyB3cmFwcGVyIGBpbXBsZW1lbnRgIGJ1aWxkcyBpc1xuICogZGlzY2FyZGVkIGFuZCB0aGUgY2hlY2sgY29sbGFwc2VzIGJhY2sgdG8gXCJpcyBpdCBjYWxsYWJsZVwiLiBLZWVwaW5nIHRoYXQgd3JhcHBlciB3b3VsZCBuZWVkIGEgZnVydGhlclxuICogYC50cmFuc2Zvcm0oKWAsIGFuZCB3b3VsZCB0aGVuIG1vdmUgdmFsaWRhdGlvbiBvbnRvIGV2ZXJ5IGNhbGwgaW5zdGVhZCBvZiBiZWhpbmQgdGhlIGRlYnVnIGdhdGUsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSBcdTIwMTQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXBpQ29udHJhY3QgPSBSZWNvcmQ8c3RyaW5nLCBQbHVnaW5BcGlNZXRob2RDb250cmFjdD47XG5cbi8qKlxuICogT25lIEFQSSBhIHBsdWdpbiBleHBvc2VzOiB0aGUgb2JqZWN0LCB0aGUgY29udHJhY3QgdmVyc2lvbiBpdCBzYXRpc2ZpZXMsIGFuZCBvcHRpb25hbGx5IHRoZSBjb250cmFjdFxuICogaXRzZWxmLiBUaGlzIGlzIHtAbGluayBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zfSB3aXRob3V0IHRoZSBwdWJsaXNoaW5nIHBsdWdpbiwgc28gYSBwbHVnaW4gY2FuIERFQ0xBUkUgd2hhdFxuICogaXQgZXhwb3NlcyB3aXRob3V0IGFsc28gc3RhdGluZyB3aG8gaXMgcHVibGlzaGluZyBpdCBcdTIwMTQgd2hpY2ggaXMgd2hhdCBsZXRzIGBQbHVnaW5CYXNlLmdldFBsdWdpbkFwaXNgIGNvbGxlY3RcbiAqIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRvIHRoZSBwdWJsaXNoaW5nIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgZGVjbGFyZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIEFQSSBvYmplY3QgdG8gcHVibGlzaC4gSXRzIG1ldGhvZHMgYXJlIGhhbmRlZCB0byBjb25zdW1lcnMgdGhyb3VnaCBhIHJldm9jYWJsZSBoYW5kbGUsIGFuZCB0aGV5IGFyZVxuICAgKiBhbHdheXMgaW52b2tlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZWlyIGB0aGlzYCwgc28gYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgcHJpdmF0ZSBjbGFzcyBmaWVsZHMga2VlcHNcbiAgICogd29ya2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaTogVEFwaTtcblxuICAvKipcbiAgICogVGhlIENPTlRSQUNUIHZlcnNpb24sIGluIHNlbXZlciBmb3JtIFx1MjAxNCBpbmRlcGVuZGVudCBvZiB0aGUgcGx1Z2luJ3Mgb3duIHZlcnNpb24uIFBsdWdpbiBgMS40LjdgIG1heVxuICAgKiBwZXJmZWN0bHkgd2VsbCBleHBvc2UgQVBJIGAyLjAuMGAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSBzYXRpc2ZpZXMuIE9wdGlvbmFsOiB3aGVuIG9taXR0ZWQsIG5vIHNoYXBlIGNoZWNrIGlzIHBlcmZvcm1lZCBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBiZWhhbGYgYW5kIHRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCAoaWYgYW55KSBpcyB1c2VkIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaU1ldGhvZENvbnRyYWN0IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUgXHUyMDE0IG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxO1xufVxuXG4vKipcbiAqIEEgbGl2ZSByZWZlcmVuY2UgdG8gYW5vdGhlciBwbHVnaW4ncyBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVmIGlzIHRoZSBXSE9MRSBjb25zdW1lciBzdXJmYWNlLCBkZWxpYmVyYXRlbHkuIEEgcGxhaW4ge0BsaW5rIFByb21pc2V9IGNhbm5vdCBtb2RlbCB0aGlzIGJlY2F1c2UgaXRcbiAqIHNldHRsZXMgb25jZSwgd2hlcmVhcyBhdmFpbGFiaWxpdHkgaXMgYSByZXBlYXRpbmcgc2lnbmFsIChhdmFpbGFibGUgXHUyMTkyIGdvbmUgXHUyMTkyIGF2YWlsYWJsZSBhZ2FpbiBhY3Jvc3MgYVxuICogZGlzYWJsZS9lbmFibGUgY3ljbGUpIFx1MjAxNCB3aGljaCBpcyB3aHkge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBpcyBhIG1ldGhvZCBPTiB0aGUgcmVmIHJhdGhlciB0aGFuXG4gKiB0aGUgdGhpbmcgaGFuZGVkIGJhY2suIFRoZSBgY2hhbmdlYCBldmVudCBleGlzdHMgZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgcmVhY3QgcmF0aGVyIHRoYW4gcmVhZCwgYW5kIGlzXG4gKiBzZWNvbmRhcnk6IGl0IGltcG9zZXMgbm8gY2VyZW1vbnkgb24gdGhlIGNvbW1vbiBjYXNlLCB3aGljaCBpcyByZWFkaW5nIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZjxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luQXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIGl0IGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBBbHdheXMgY3VycmVudCwgc3luY2hyb25vdXMsIGFuZCBmcmVlIFx1MjAxNCB0aGUgcmVmIG1haW50YWlucyBpdCwgc28gdGhlcmUgaXMgbm8gcmVnaXN0cnkgbG9va3VwIHBlciByZWFkLlxuICAgKiBgbnVsbGAgaGVyZSBtZWFucyBcIm5vdCBhdmFpbGFibGUgcmlnaHQgbm93XCIsIE5PVCBcIm5vdCBpbnN0YWxsZWRcIjogZHVyaW5nIGEgY29uc3VtZXIncyBgb25sb2FkYCB0aGVcbiAgICogcHJvdmlkZXIgbWF5IHNpbXBseSBub3QgaGF2ZSBsb2FkZWQgeWV0LCBhbmQgdGhlIHZhbHVlIGJlY29tZXMgbm9uLWBudWxsYCBvbiBpdHMgb3duLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IG51bGwgfCBUQXBpO1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIEFQSSB0byBiZWNvbWUgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd2FpdC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBBUEkuXG4gICAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IucmVhc29ufSBzYXlzIHdoaWNoIG9mXG4gICAqIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLCBpZiB0aGUgQVBJIGRvZXMgbm90IGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT47XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHtAbGluayBQbHVnaW5BcGlSZWZ9IGZpcmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZkV2ZW50TWFwIHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGNoYW5nZXMgXHUyMDE0IGluY2x1ZGluZyB3aGVuIGl0IGJlY29tZXMgYG51bGxgIGJlY2F1c2UgdGhlIHByb3ZpZGVyXG4gICAqIHVubG9hZGVkLlxuICAgKi9cbiAgY2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBtZXNzYWdlLiBXaGVuIG9taXR0ZWQsIG9uZSBpcyBkZXJpdmVkIGZyb20gdGhlIHBsdWdpbiBpZCBhbmQgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHB1Ymxpc2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFBsdWdpbkFwaURlY2xhcmF0aW9uPFRBcGk+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgd2hvc2UgdW5sb2FkIHJldm9rZXMgdGhlIHJlY29yZC4gRGVmYXVsdHMgdG8ge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXMucGx1Z2lufSwgd2hpY2ggaXNcbiAgICogdGhlIHJpZ2h0IG93bmVyIGZvciBhbiBBUEkgcHVibGlzaGVkIGZvciBhcyBsb25nIGFzIHRoZSBwbHVnaW4gcnVucy5cbiAgICpcbiAgICogUGFzcyBhIG5hcnJvd2VyIG9uZSB3aGVuIHRoZSBBUEkgaXMgb25seSB2YWxpZCBmb3IgcGFydCBvZiB0aGUgcGx1Z2luJ3MgbGlmZSBcdTIwMTQgYSBwbHVnaW4gd2hvc2UgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGlzIHRvcm4gZG93biBhbmQgcmVidWlsdCB3aGlsZSB0aGUgcGx1Z2luIGl0c2VsZiBzdGF5cyBsb2FkZWQgbXVzdCByZXZva2Ugd2l0aCB0aGUgc3VyZmFjZSwgb3IgaXRcbiAgICogbGVhdmVzIGNvbnN1bWVycyBob2xkaW5nIGhhbmRsZXMgaW50byBjb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50PzogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHVibGlzaGluZyBwbHVnaW4uIFRoZSByZWNvcmQgaXMga2V5ZWQgYnkgaXRzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW5cbiAgICogdW5sb2FkcywgdmlhIGBwbHVnaW4ucmVnaXN0ZXIoKWAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoUGx1Z2luQXBpUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgY29udHJhY3QgdmVyc2lvbnMgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLiBUaGUgaGlnaGVzdCBwdWJsaXNoZWRcbiAgICogdmVyc2lvbiBzYXRpc2Z5aW5nIGl0IHdpbnMuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoZSByYW5nZSBpcyBldmFsdWF0ZWQgYnkgYGNvbXBhcmUtdmVyc2lvbnNgLCB3aGljaCBhY2NlcHRzIGBeYCwgYH5gLCBjb21wYXJpc29uIG9wZXJhdG9ycywgYW5kIGB4YFxuICAgKiB3aWxkY2FyZHMgXHUyMDE0IGJ1dCBOT1QgYSBiYXJlIGAqYC4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UsIHVzZWQgdG8gY2xhc3NpZnkgYSBmYWlsdXJlIGFzIG5vdC1pbnN0YWxsZWQgdnMgbm90LWVuYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCBvd25pbmcgdGhlIHN1YnNjcmlwdGlvbi4gVGhlIHdhdGNoIGlzIHRvcm4gZG93biB3aGVuIGl0IHVubG9hZHMuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGNvbnRyYWN0IHRoZSBDT05TVU1FUiBleHBlY3RzLiBPcHRpb25hbCwgYW5kIGl0IHdpbnMgb3ZlciB0aGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgY29udHJhY3Qgd2hlblxuICAgKiBzdXBwbGllZCBcdTIwMTQgaXQgaXMgdGhlIGNvbnN1bWVyJ3Mgb3duIGNvbXBpbGVkLWFnYWluc3QgZXhwZWN0YXRpb24sIHNvIGl0IGlzIHRoZSBvbmUgd2hvc2UgdmlvbGF0aW9uIGlzXG4gICAqIHRoZSBjb25zdW1lcidzIHByb2JsZW0uXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAgYW5kIGNsYXNzaWZ5aW5nIHRoZSBmYWlsdXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxMDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVNZXRob2RXcmFwcGVyfS5cbiAqL1xuaW50ZXJmYWNlIENyZWF0ZU1ldGhvZFdyYXBwZXJQYXJhbXMge1xuICByZWFkb25seSBtZXRob2RDb250cmFjdDogUGx1Z2luQXBpTWV0aG9kQ29udHJhY3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBodW1hbi1yZWFkYWJsZSBuYW1lIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMgYW5kIGRlYnVnIG91dHB1dC4gTk9UIGEga2V5IFx1MjAxNCBzZWUge0BsaW5rIHByb3BlcnR5S2V5fS5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2V5IHRoZSBtZXRob2QgaXMgYWN0dWFsbHkgcmVhZCBieSwgd2hpY2ggbWF5IGJlIGEgc3ltYm9sLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5O1xuXG4gIHJlYWRvbmx5IHRhcmdldDogb2JqZWN0O1xufVxuXG4vKipcbiAqIFRoZSByZWFsbS1nbG9iYWwgcmVnaXN0cnkgc2hhcmVkIGJ5IGV2ZXJ5IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcHkgaW4gdGhlIHJlbmRlcmVyLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luQXBpUmVnaXN0cnkge1xuICByZWNvcmRzOiBSZWNvcmQ8c3RyaW5nLCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmRbXT47XG4gIHN1YnNjcmliZXJzOiAoKCkgPT4gdm9pZClbXTtcbn1cblxuLyoqXG4gKiBBIHJlY29yZCBhcyBpdCBzaXRzIGluIHRoZSBzaGFyZWQgcmVnaXN0cnkuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdGhlIFdJUkUgRk9STUFUIGJldHdlZW4gZGlmZmVyZW50IGBvYnNpZGlhbi1kZXYtdXRpbHNgIGNvcGllcywgc28gaXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gZGF0YVxuICogYW5kIHBsYWluIGZ1bmN0aW9ucywgYW5kIGV2ZXJ5IHJlYWQgb2YgaXQgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSBpcyBzdHJ1Y3R1cmFsLlxuICovXG5pbnRlcmZhY2UgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkIHtcbiAgYXBpOiBvYmplY3Q7XG4gIGFwaVZlcnNpb246IHN0cmluZztcbiAgY29udHJhY3Q6IFBsdWdpbkFwaUNvbnRyYWN0O1xuICBpc1Jldm9rZWQ6IGJvb2xlYW47XG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHZhbGlkYXRlUGF5bG9hZH0uXG4gKi9cbmludGVyZmFjZSBWYWxpZGF0ZVBheWxvYWRQYXJhbXMge1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZDtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2NoZW1hOiBTdGFuZGFyZFNjaGVtYVYxO1xuICByZWFkb25seSB2YWx1ZTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBIb2xkcyB3aGF0IGEgd2F0Y2ggbmVlZHMgcmVnYXJkbGVzcyBvZiB0aGUgQVBJIHR5cGUgaXQgaXMgdHlwZWQgYWdhaW5zdCwgc28gdGhlIHtAbGluayBtaXhpbkFzeW5jRXZlbnRzfVxuICogbWl4aW4gaGFzIGEgcmVhbCBiYXNlIHRvIGV4dGVuZC5cbiAqL1xuYWJzdHJhY3QgY2xhc3MgUGx1Z2luQXBpV2F0Y2hCYXNlIHtcbiAgcHJvdGVjdGVkIGhhbmRsZTogbnVsbCB8IG9iamVjdCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIHJlY29yZDogbnVsbCB8IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IG51bGw7XG5cbiAgLy8gQSBgcHJvdGVjdGVkYCBjb25zdHJ1Y3RvciBpcyBub3QgYXNzaWduYWJsZSB0byBgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+YCwgd2hpY2ggaXMgd2hhdFxuICAvLyBgbWl4aW5Bc3luY0V2ZW50c2AgYWNjZXB0cywgc28gdGhpcyBzdGF5cyBwdWJsaWMgZXZlbiB0aG91Z2ggb25seSB0aGUgc3ViY2xhc3MgYmVsb3cgY2FsbHMgaXQuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcykge31cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBlcnJvciBkZXNjcmliaW5nIHdoeSB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgbm93LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY2xhc3NpZmllZCBlcnJvci5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICBwbHVnaW5JZDogdGhpcy5wYXJhbXMucGx1Z2luSWQsXG4gICAgICByZWFzb246IHJlc29sdmVVbmF2YWlsYWJpbGl0eVJlYXNvbih0aGlzLnBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBQbHVnaW5BcGlSZWZJbXBsPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgbWl4aW5Bc3luY0V2ZW50czxQbHVnaW5BcGlSZWZFdmVudE1hcD4oKShQbHVnaW5BcGlXYXRjaEJhc2UpIGltcGxlbWVudHMgUGx1Z2luQXBpUmVmPFRBcGk+IHtcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBudWxsIHwgVEFwaSB7XG4gICAgcmV0dXJuIGNhc3RUbzxudWxsIHwgVEFwaT4odGhpcy5oYW5kbGUpO1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29tcHV0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSB0aGUgcmVnaXN0cnksIGZpcmluZyBgY2hhbmdlYCBvbmx5IHdoZW4gaXQgYWN0dWFsbHkgY2hhbmdlZC5cbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZCA9IHNlbGVjdFJlY29yZCh0aGlzLnBhcmFtcyk7XG4gICAgaWYgKHJlY29yZCA9PT0gdGhpcy5yZWNvcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLmhhbmRsZSA9IHJlY29yZCA9PT0gbnVsbCA/IG51bGwgOiBjcmVhdGVSZXZvY2FibGVIYW5kbGUocmVjb3JkLCB0aGlzLnBhcmFtcy5jb250cmFjdCk7XG4gICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3aGVuQXZhaWxhYmxlKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucyk6IFByb21pc2U8VEFwaT4ge1xuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJ1bldpdGhUaW1lb3V0PFRBcGk+KHtcbiAgICAgICAgb3BlcmF0aW9uRnVuY3Rpb246IGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFRBcGk+ID0+IGF3YWl0IHRoaXMud2FpdEZvclZhbHVlKGFib3J0U2lnbmFsKSxcbiAgICAgICAgb3BlcmF0aW9uTmFtZTogYHdhdGNoUGx1Z2luQXBpKFwiJHt0aGlzLnBhcmFtcy5wbHVnaW5JZH1cIikud2hlbkF2YWlsYWJsZWAsXG4gICAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8udGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgdGhpcy5jcmVhdGVVbmF2YWlsYWJsZUVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yVmFsdWUoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFRBcGk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIEZJUlNUIGFuZCBpbnZva2VkIHRocm91Z2ggYSB0aHVuaywgc28gYGV2ZW50UmVmYCBpcyBhbHJlYWR5IGJvdW5kIGJ5IHRoZVxuICAgICAgLy8gVGltZSBhbnl0aGluZyBjYW4gcmVhY2ggaXQgXHUyMDE0IHdoaWNoIGlzIHdoYXQgbGV0cyBgY2xlYW5VcGAgYmUgdW5jb25kaXRpb25hbCByYXRoZXIgdGhhbiBudWxsLWd1YXJkZWQuXG4gICAgICBjb25zdCBldmVudFJlZiA9IHRoaXMub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgICB9KTtcblxuICAgICAgZnVuY3Rpb24gY2xlYW5VcCgpOiB2b2lkIHtcbiAgICAgICAgZXZlbnRSZWYuYXN5bmNFdmVudFNvdXJjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgICBhYm9ydFNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoKTogdm9pZCB7XG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgcmVqZWN0KGFib3J0U2lnbmFsLnJlYXNvbiBhcyBFcnJvcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhbmRsZUNoYW5nZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbiBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXNcbiAqIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UgPz8gYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIHVuYXZhaWxhYmxlOiAke3BhcmFtcy5yZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHJvcGVydHkgaXMgcmVhZCBmcm9tIGEgaGFuZGxlIHdob3NlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBoYW5kaW5nIG91dCBhIHJldm9jYWJsZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIHJhdyBvYmplY3Q6IGEgY29uc3VtZXIgdGhhdCBjYWNoZWQgdGhlXG4gKiBBUEkgaW4gYSBmaWVsZCBhbmQga2VwdCB1c2luZyBpdCBhY3Jvc3MgYSBkaXNhYmxlIGdldHMgYW4gZXJyb3IgbmFtaW5nIHRoZSBwcm92aWRlciwgaW5zdGVhZCBvZlxuICogYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzb21ld2hlcmUgZGVlcCBpbnNpZGUgYSB0b3JuLWRvd24gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpUmV2b2tlZEVycm9yIGV4dGVuZHMgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXZva2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBgVGhlIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYmVlbiByZXZva2VkLCBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIHVubG9hZGVkLmAsXG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlSZXZva2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaXNoZWQgQVBJJ3MgcGF5bG9hZCBmYWlscyB0aGUgc2NoZW1hIGl0cyBjb250cmFjdCBkZWNsYXJlcy5cbiAqXG4gKiBPbmx5IGV2ZXIgdGhyb3duIHdoaWxlIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzOlBsdWdpbkFwaWAgZGVidWdnZXIgaXMgZW5hYmxlZCBcdTIwMTQgaW4gcHJvZHVjdGlvbiB0aGUgbWV0aG9kc1xuICogYXJlIG5vdCB3cmFwcGVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB3aG9zZSBwYXlsb2FkIGZhaWxlZCB2YWxpZGF0aW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoXG4gICAgICBgVGhlICR7cGFyYW1zLnBheWxvYWRLaW5kfSBvZiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIEFQSSBtZXRob2QgXCIke3BhcmFtcy5tZXRob2ROYW1lfVwiIGZhaWxlZCB2YWxpZGF0aW9uOiAke2Zvcm1hdElzc3VlcyhwYXJhbXMuaXNzdWVzKX1gXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmlzc3VlcyA9IHBhcmFtcy5pc3N1ZXM7XG4gICAgdGhpcy5tZXRob2ROYW1lID0gcGFyYW1zLm1ldGhvZE5hbWU7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHBsdWdpbidzIEFQSSBzbyBvdGhlciBwbHVnaW5zIGNhbiBjb25zdW1lIGl0LCBrZXllZCBieSB0aGUgcGx1Z2luJ3MgYG1hbmlmZXN0LmlkYCBhbmQgcmV2b2tlZFxuICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW4gdW5sb2Fkcy5cbiAqXG4gKiBTZXZlcmFsIGNvbnRyYWN0IHZlcnNpb25zIG1heSBiZSBwdWJsaXNoZWQgc2lkZSBieSBzaWRlLCBzbyBhIHByb3ZpZGVyIGNhbiBtb3ZlIHRvIGAyLjAuMGAgd2l0aG91dCBicmVha2luZ1xuICogY29uc3VtZXJzIHN0aWxsIHBpbm5lZCB0byBgXjFgLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcuXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhpcyBwbHVnaW4gaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoaXMgZXhhY3QgYGFwaVZlcnNpb25gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXM8VEFwaT4pOiB2b2lkIHtcbiAgY29uc3QgcGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuICBjb25zdCByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IHJlY29yZHMgPSByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA/PyBbXTtcbiAgcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0gPSByZWNvcmRzO1xuXG4gIGlmIChyZWNvcmRzLnNvbWUoKHJlY29yZCkgPT4gcmVjb3JkLmFwaVZlcnNpb24gPT09IHBhcmFtcy5hcGlWZXJzaW9uKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoZSBBUEkgdmVyc2lvbiBcIiR7cGFyYW1zLmFwaVZlcnNpb259XCIuYCk7XG4gIH1cblxuICBjb25zdCByZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCA9IHtcbiAgICBhcGk6IHBhcmFtcy5hcGksXG4gICAgYXBpVmVyc2lvbjogcGFyYW1zLmFwaVZlcnNpb24sXG4gICAgY29udHJhY3Q6IHBhcmFtcy5jb250cmFjdCA/PyB7fSxcbiAgICBpc1Jldm9rZWQ6IGZhbHNlLFxuICAgIHBsdWdpbklkXG4gIH07XG4gIHJlY29yZHMucHVzaChyZWNvcmQpO1xuICBub3RpZnlTdWJzY3JpYmVycygpO1xuXG4gIChwYXJhbXMuY29tcG9uZW50ID8/IHBhcmFtcy5wbHVnaW4pLnJlZ2lzdGVyKCgpID0+IHtcbiAgICByZXZva2VSZWNvcmQocmVjb3JkKTtcbiAgfSk7XG59XG5cbi8qKlxuICogV2F0Y2hlcyBhbm90aGVyIHBsdWdpbidzIEFQSSBhbmQgcmV0dXJucyBhIGxpdmUge0BsaW5rIFBsdWdpbkFwaVJlZn0gd2hvc2Uge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gc3RheXNcbiAqIGNvcnJlY3QgYWNyb3NzIHRoZSBwcm92aWRlcidzIGxvYWQsIHVubG9hZCwgYW5kIHJlLWVuYWJsZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBlbnRpcmUgY29uc3VtZXIgc3VyZmFjZS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHN5bmNocm9ub3VzIFwiZ2V0IGl0IG9yIGBudWxsYFwiIHByb2JlOiBhIHByb2JlXG4gKiBvbmx5IGFuc3dlcnMgXCJub3dcIiBhbmQgbmV2ZXIgdGVsbHMgeW91IHdoZW4gXCJub3dcIiBjaGFuZ2VkLCBzbyBjYWxsaW5nIG9uZSBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIFx1MjAxNCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSBcdTIwMTQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBjb25zdCByZWYgPSBuZXcgUGx1Z2luQXBpUmVmSW1wbDxUQXBpPihwYXJhbXMpO1xuICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmliZSgoKSA9PiB7XG4gICAgcmVmLnJlZnJlc2goKTtcbiAgfSk7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIodW5zdWJzY3JpYmUpO1xuICByZWYucmVmcmVzaCgpO1xuICByZXR1cm4gcmVmO1xufVxuXG4vKipcbiAqIFN0cnVjdHVyYWxseSBkZXRlY3RzIGEgdGhlbmFibGUuIEEgY3Jvc3MtY29weSB2YWx1ZSBtYXkgY29tZSBmcm9tIGFub3RoZXIgcmVhbG0sIHNvIGBpbnN0YW5jZW9mIFByb21pc2VgIGlzXG4gKiBub3QgdXNhYmxlIGhlcmUgXHUyMDE0IHRoZSBzYW1lIGRpc2NpcGxpbmUgdGhlIHJlZ2lzdHJ5IHJlY29yZHMgZm9sbG93LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB2YWx1ZSB0aGUgdGhlbmFibGUgcmVzb2x2ZXMgdG8uXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdGVzdC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSB2YWx1ZSBpcyB0aGVuYWJsZS5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZUxpa2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICYmIHZhbHVlICE9PSBudWxsXG4gICAgJiYgJ3RoZW4nIGluIHZhbHVlXG4gICAgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCBldmVyeSBtZXRob2QgdGhlIGVmZmVjdGl2ZSBjb250cmFjdCBkZWNsYXJlcyBpcyBhY3R1YWxseSBwcmVzZW50IG9uIHRoZSBwdWJsaXNoZWQgQVBJLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIHdoZW4gc3VwcGxpZWQuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgc2hhcGUgbWF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tNYXRjaGVzQ29udHJhY3RTaGFwZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRyYWN0ID0gY29uc3VtZXJDb250cmFjdCA/PyByZWNvcmQuY29udHJhY3Q7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cmFjdCkuZXZlcnkoKG1ldGhvZE5hbWUpID0+IHR5cGVvZiBnZXRNZW1iZXIocmVjb3JkLmFwaSwgbWV0aG9kTmFtZSkgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZnVuY3Rpb24gYSBjb25zdW1lciBhY3R1YWxseSBjYWxsczogaXQgYWx3YXlzIGludm9rZXMgdGhlIG9yaWdpbmFsIHdpdGggdGhlIHJhdyBBUEkgb2JqZWN0IGFzXG4gKiBgdGhpc2AsIGFuZCBcdTIwMTQgb25seSB3aGlsZSB0aGUgbGlicmFyeSBkZWJ1Z2dlciBpcyBlbmFibGVkIFx1MjAxNCB2YWxpZGF0ZXMgdGhlIGRlY2xhcmVkIHBheWxvYWRzIGFyb3VuZCBpdC5cbiAqXG4gKiBUaGUgZGVidWdnZXIgaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBgREVCVUdgIGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIEtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFBsdWdpbkFwaURlYnVnZ2VyKCkuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2UgXHUyMDE0IGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IFBsdWdpbkFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQgXHUyMDE0IHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBnYXRlcyBwYXlsb2FkIHZhbGlkYXRpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlYnVnZ2VyLlxuICovXG5mdW5jdGlvbiBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRMaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0TGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgYG9ic2lkaWFuLWRldi11dGlsc2AgY29weSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxQYXJ0aWFsPFBsdWdpbkFwaVJlZ2lzdHJ5Pj4oUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVksIHt9KTtcbiAgY29uc3QgcmVnaXN0cnkgPSB3cmFwcGVyLnZhbHVlO1xuICByZWdpc3RyeS5yZWNvcmRzID8/PSB7fTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMgPz89IFtdO1xuICByZXR1cm4gY2FzdFRvPFBsdWdpbkFwaVJlZ2lzdHJ5PihyZWdpc3RyeSk7XG59XG5cbi8qKlxuICogTm90aWZpZXMgZXZlcnkgc3Vic2NyaWJlciwgb3ZlciBhIFNOQVBTSE9UIG9mIHRoZSBsaXN0IFx1MjAxNCBhIGNhbGxiYWNrIGlzIGZyZWUgdG8gdW5zdWJzY3JpYmUgKG9yIHN1YnNjcmliZSlcbiAqIHdoaWxlIHRoZSBzd2VlcCBpcyBydW5uaW5nLlxuICovXG5mdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBzdWJzY3JpYmVyIG9mIHNuYXBzaG90KGdldFJlZ2lzdHJ5KCkuc3Vic2NyaWJlcnMpKSB7XG4gICAgc3Vic2NyaWJlcigpO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBhcHBsaWVzLCBwcm9iaW5nIHRoZSBjYXVzZXMgZnJvbSB0aGUgb3V0ZXJtb3N0IGlud2FyZHMgc28gdGhlIG1vc3RcbiAqIGFjdGlvbmFibGUgb25lIHdpbnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3YXRjaCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHJlYXNvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gIGlmICghT2JqZWN0Lmhhc093bihwYXJhbXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEluc3RhbGxlZDtcbiAgfVxuXG4gIGlmICghcGFyYW1zLmFwcC5wbHVnaW5zLmVuYWJsZWRQbHVnaW5zLmhhcyhwYXJhbXMucGx1Z2luSWQpKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdEVuYWJsZWQ7XG4gIH1cblxuICBjb25zdCByZWNvcmRzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKHJlY29yZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZDtcbiAgfVxuXG4gIGlmIChyZWNvcmRzLmV2ZXJ5KChyZWNvcmQpID0+ICFzYXRpc2ZpZXNWZXJzaW9uKHJlY29yZC5hcGlWZXJzaW9uLCBwYXJhbXMuYXBpVmVyc2lvblJhbmdlKSkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uVmVyc2lvbk1pc21hdGNoO1xuICB9XG5cbiAgcmV0dXJuIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCBcdTIwMTQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgd2lubmluZyByZWNvcmQsIG9yIGBudWxsYCB3aGVuIG5vbmUgcXVhbGlmaWVzLlxuICovXG5mdW5jdGlvbiBzZWxlY3RSZWNvcmQocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBcdTIwMTQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0VBO0FBQUEsRUFDRTtBQUFBLEVBQ0EsYUFBYTtBQUFBLE9BQ1I7QUFJUCxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLHdCQUF3QjtBQUNqQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsY0FBYztBQUN2QixTQUFTLGdDQUFnQztBQUV6QyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUt0QyxNQUFNLGlEQUFpRDtBQUtoRCxJQUFLLHVCQUFMLGtCQUFLQSwwQkFBTDtBQUlMLEVBQUFBLHNCQUFBLFdBQVE7QUFLUixFQUFBQSxzQkFBQSxZQUFTO0FBVEMsU0FBQUE7QUFBQSxHQUFBO0FBMEJMLElBQUssZ0NBQUwsa0JBQUtDLG1DQUFMO0FBSUwsRUFBQUEsK0JBQUEsZ0JBQWE7QUFLYixFQUFBQSwrQkFBQSxrQkFBZTtBQUtmLEVBQUFBLCtCQUFBLGtCQUFlO0FBS2YsRUFBQUEsK0JBQUEsYUFBVTtBQU1WLEVBQUFBLCtCQUFBLG1CQUFnQjtBQUtoQixFQUFBQSwrQkFBQSxxQkFBa0I7QUE5QlIsU0FBQUE7QUFBQSxHQUFBO0FBOFRaLE1BQWUsbUJBQW1CO0FBQUE7QUFBQTtBQUFBLEVBT3pCLFlBQStCLFFBQThCO0FBQTlCO0FBQUEsRUFBK0I7QUFBQSxFQUEvQjtBQUFBLEVBTjVCLFNBQXdCO0FBQUEsRUFFeEIsU0FBMEM7QUFBQTtBQUFBO0FB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O0FBQzVELFNBQU8sWUFBWTtBQUNuQixRQUFNLFdBQVcsWUFBWTtBQUM3QixRQUFNLFVBQVUsU0FBUyxRQUFRLE9BQU8sUUFBUTtBQUNoRCxNQUFJLFNBQVM7QUFDWCxhQUFTLFFBQVEsT0FBTyxRQUFRLElBQUksUUFBUSxPQUFPLENBQUMsY0FBYyxjQUFjLE1BQU07QUFBQSxFQUN4RjtBQUNBLG9CQUFrQjtBQUNwQjtBQVNBLFNBQVMsYUFBYSxRQUErRDtBQUNuRixRQUFNLGFBQWEsZUFBZSxPQUFPLFFBQVEsRUFDOUMsT0FBTyxDQUFDLFdBQVcsaUJBQWlCLE9BQU8sWUFBWSxPQUFPLGVBQWUsQ0FBQyxFQUM5RSxPQUFPLENBQUMsV0FBVywwQkFBMEIsUUFBUSxPQUFPLFFBQVEsQ0FBQyxFQUNyRSxLQUFLLENBQUMsR0FBRyxNQUFNLGdCQUFnQixFQUFFLFlBQVksRUFBRSxVQUFVLENBQUM7QUFFN0QsU0FBTyxXQUFXLENBQUMsS0FBSztBQUMxQjtBQVFBLFNBQVMsVUFBVSxZQUFvQztBQUNyRCxRQUFNLFdBQVcsWUFBWTtBQUM3QixXQUFTLFlBQVksS0FBSyxVQUFVO0FBQ3BDLFNBQU8sTUFBWTtBQUNqQixVQUFNLFFBQVEsU0FBUyxZQUFZLFFBQVEsVUFBVTtBQUNyRCxRQUFJLFVBQVUsSUFBSTtBQUNoQixlQUFTLFlBQVksT0FBTyxPQUFPLENBQUM7QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFDRjtBQWFBLFNBQVMsZ0JBQWdCLFFBQXFDO0FBQzVELFFBQU0sU0FBUyxPQUFPLE9BQU8sV0FBVyxFQUFFLFNBQVMsT0FBTyxLQUFLO0FBRS9ELE1BQUksbUJBQXFELE1BQU0sR0FBRztBQUNoRSxzQkFBa0IsWUFBWTtBQUM1QixZQUFNLGNBQWMsTUFBTTtBQUMxQixVQUFJLFlBQVksUUFBUTtBQUN0Qiw2QkFBcUI7QUFBQSxVQUNuQjtBQUFBLFVBQ0EsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYSxZQUFZLE1BQU07QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sUUFBUTtBQUNqQixVQUFNLElBQUkseUJBQXlCO0FBQUEsTUFDakMsUUFBUSxPQUFPO0FBQUEsTUFDZixZQUFZLE9BQU87QUFBQSxNQUNuQixhQUFhLE9BQU87QUFBQSxNQUNwQixVQUFVLE9BQU87QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsCiAgIm5hbWVzIjogWyJQbHVnaW5BcGlQYXlsb2FkS2luZCIsICJQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiIsICJyZWNvcmQiXQp9Cg==
@@ -0,0 +1,113 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * How another plugin is present in this vault, and the one-click path to making it present.
6
+ *
7
+ * Shared by the two components that ask a user to bring another plugin in: `PluginSuggestionComponent`,
8
+ * which OFFERS one and keeps working without it, and `PluginGateComponent`, which REQUIRES one and
9
+ * does nothing until it is there. The offer and the requirement differ in what they do about the answer,
10
+ * not in how they read the state or how they install — so that part lives here rather than in both.
11
+ */
12
+ import type { App } from 'obsidian';
13
+ import type { PluginNoticeComponent } from '../components/plugin-notice-component.mjs';
14
+ /**
15
+ * How another plugin is currently present in the vault.
16
+ */
17
+ export declare enum InstalledPluginState {
18
+ /**
19
+ * Installed and enabled — there is nothing to do.
20
+ */
21
+ Enabled = "enabled",
22
+ /**
23
+ * Installed but disabled. Only an enable is needed, so no download happens.
24
+ */
25
+ InstalledButDisabled = "installedButDisabled",
26
+ /**
27
+ * Not installed at all.
28
+ */
29
+ NotInstalled = "notInstalled"
30
+ }
31
+ /**
32
+ * Parameters for {@link getInstalledPluginState}.
33
+ */
34
+ export interface GetInstalledPluginStateParams {
35
+ /**
36
+ * The Obsidian app instance.
37
+ */
38
+ readonly app: App;
39
+ /**
40
+ * The `manifest.id` of the plugin to look for.
41
+ */
42
+ readonly pluginId: string;
43
+ }
44
+ /**
45
+ * Parameters for {@link getInstalledPluginVersion}.
46
+ */
47
+ export interface GetInstalledPluginVersionParams {
48
+ /**
49
+ * The Obsidian app instance.
50
+ */
51
+ readonly app: App;
52
+ /**
53
+ * The `manifest.id` of the plugin to look for.
54
+ */
55
+ readonly pluginId: string;
56
+ }
57
+ /**
58
+ * Parameters for {@link installAndEnablePlugin}.
59
+ */
60
+ export interface InstallAndEnablePluginParams {
61
+ /**
62
+ * The Obsidian app instance.
63
+ */
64
+ readonly app: App;
65
+ /**
66
+ * The `manifest.id` of the plugin to install and enable.
67
+ */
68
+ readonly pluginId: string;
69
+ /**
70
+ * The display name of the plugin, shown to the user.
71
+ */
72
+ readonly pluginName: string;
73
+ /**
74
+ * The notice component of the plugin doing the asking, used to report the outcome.
75
+ */
76
+ readonly pluginNoticeComponent: PluginNoticeComponent;
77
+ }
78
+ /**
79
+ * Resolves how another plugin is currently present in the vault.
80
+ *
81
+ * @param params - The {@link GetInstalledPluginStateParams}.
82
+ * @returns The {@link InstalledPluginState}.
83
+ */
84
+ export declare function getInstalledPluginState(params: GetInstalledPluginStateParams): InstalledPluginState;
85
+ /**
86
+ * Reads the version of another plugin as this vault has it installed, or `null` when it is not running.
87
+ *
88
+ * The version comes out of `app.plugins.manifests`, which is populated for every installed plugin at
89
+ * startup — so, unlike anything a plugin REGISTERS, it answers the same way no matter which plugin loaded
90
+ * first. That load-order independence is the whole reason a conflict is detected by version rather than by
91
+ * asking a registry.
92
+ *
93
+ * `null` for a plugin that is not installed OR is installed but disabled: a disabled plugin registers
94
+ * nothing, so for every question this answers the two cases are the same. An installed, enabled plugin
95
+ * whose manifest somehow carries no version reads as an empty string rather than `null`, which keeps
96
+ * "running, version unknown" distinguishable from "not running" — a caller comparing versions should fail
97
+ * closed on it rather than treat it as absent.
98
+ *
99
+ * @param params - The {@link GetInstalledPluginVersionParams}.
100
+ * @returns The installed version, or `null` when the plugin is not enabled.
101
+ */
102
+ export declare function getInstalledPluginVersion(params: GetInstalledPluginVersionParams): null | string;
103
+ /**
104
+ * Installs (when needed) and enables another plugin, reporting the outcome as a notice.
105
+ *
106
+ * A no-op when the plugin is already enabled, so a caller reacting to a click need not check first.
107
+ *
108
+ * @param params - The {@link InstallAndEnablePluginParams}.
109
+ * @returns A {@link Promise} that resolves once the plugin is enabled.
110
+ * @throws Whatever the install or enable threw, after reporting it as a notice — the caller decides
111
+ * whether a failure is worth more than the notice the user has already seen.
112
+ */
113
+ export declare function installAndEnablePlugin(params: InstallAndEnablePluginParams): Promise<void>;
@@ -0,0 +1,106 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureBrowserProcess() {
8
+ const browserProcess = {
9
+ browser: true,
10
+ cwd() {
11
+ return '/';
12
+ },
13
+ env: {},
14
+ platform: 'android'
15
+ };
16
+
17
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
18
+ const existingProcess = globalThis.process;
19
+
20
+ if (!existingProcess) {
21
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+
30
+ const existingProcessRecord = existingProcess;
31
+
32
+ for (const [key, value] of Object.entries(browserProcess)) {
33
+ existingProcessRecord[key] ??= value;
34
+ }
35
+
36
+ existingProcessRecord['browser'] = true;
37
+ }
38
+
39
+ (function initEsm() {
40
+ ensureBrowserProcess();
41
+ })();
42
+ })();
43
+
44
+ import {
45
+ enableCommunityPlugin,
46
+ installConfigureEnableCommunityPlugin
47
+ } from "../community-plugins.mjs";
48
+ import {
49
+ asCodeBlock,
50
+ createFragmentWithCodeBlocks
51
+ } from "../html-element.mjs";
52
+ import { t } from "../i18n/i18n.mjs";
53
+ var InstalledPluginState = /* @__PURE__ */ ((InstalledPluginState2) => {
54
+ InstalledPluginState2["Enabled"] = "enabled";
55
+ InstalledPluginState2["InstalledButDisabled"] = "installedButDisabled";
56
+ InstalledPluginState2["NotInstalled"] = "notInstalled";
57
+ return InstalledPluginState2;
58
+ })(InstalledPluginState || {});
59
+ function getInstalledPluginState(params) {
60
+ const { app, pluginId } = params;
61
+ if (app.plugins.enabledPlugins.has(pluginId)) {
62
+ return "enabled" /* Enabled */;
63
+ }
64
+ return Object.hasOwn(app.plugins.manifests, pluginId) ? "installedButDisabled" /* InstalledButDisabled */ : "notInstalled" /* NotInstalled */;
65
+ }
66
+ function getInstalledPluginVersion(params) {
67
+ const { app, pluginId } = params;
68
+ if (!app.plugins.enabledPlugins.has(pluginId)) {
69
+ return null;
70
+ }
71
+ return app.plugins.manifests[pluginId]?.version ?? "";
72
+ }
73
+ async function installAndEnablePlugin(params) {
74
+ const {
75
+ app,
76
+ pluginId,
77
+ pluginName,
78
+ pluginNoticeComponent
79
+ } = params;
80
+ const state = getInstalledPluginState({ app, pluginId });
81
+ if (state === "enabled" /* Enabled */) {
82
+ return;
83
+ }
84
+ try {
85
+ if (state === "installedButDisabled" /* InstalledButDisabled */) {
86
+ await enableCommunityPlugin({ app, pluginId });
87
+ } else {
88
+ await installConfigureEnableCommunityPlugin({ app, pluginId });
89
+ }
90
+ } catch (error) {
91
+ pluginNoticeComponent.showNotice(createFragmentWithCodeBlocks(
92
+ t(($) => $.obsidianDevUtils.pluginSuggestion.installFailed, { pluginName: asCodeBlock(pluginName) })
93
+ ));
94
+ throw error;
95
+ }
96
+ pluginNoticeComponent.showNotice(createFragmentWithCodeBlocks(
97
+ t(($) => $.obsidianDevUtils.pluginSuggestion.installed, { pluginName: asCodeBlock(pluginName) })
98
+ ));
99
+ }
100
+ export {
101
+ InstalledPluginState,
102
+ getInstalledPluginState,
103
+ getInstalledPluginVersion,
104
+ installAndEnablePlugin
105
+ };
106
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3BsdWdpbi9wbHVnaW4taW5zdGFsbC1zdGF0ZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEhvdyBhbm90aGVyIHBsdWdpbiBpcyBwcmVzZW50IGluIHRoaXMgdmF1bHQsIGFuZCB0aGUgb25lLWNsaWNrIHBhdGggdG8gbWFraW5nIGl0IHByZXNlbnQuXG4gKlxuICogU2hhcmVkIGJ5IHRoZSB0d28gY29tcG9uZW50cyB0aGF0IGFzayBhIHVzZXIgdG8gYnJpbmcgYW5vdGhlciBwbHVnaW4gaW46IGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50YCxcbiAqIHdoaWNoIE9GRkVSUyBvbmUgYW5kIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCwgYW5kIGBQbHVnaW5HYXRlQ29tcG9uZW50YCwgd2hpY2ggUkVRVUlSRVMgb25lIGFuZFxuICogZG9lcyBub3RoaW5nIHVudGlsIGl0IGlzIHRoZXJlLiBUaGUgb2ZmZXIgYW5kIHRoZSByZXF1aXJlbWVudCBkaWZmZXIgaW4gd2hhdCB0aGV5IGRvIGFib3V0IHRoZSBhbnN3ZXIsXG4gKiBub3QgaW4gaG93IHRoZXkgcmVhZCB0aGUgc3RhdGUgb3IgaG93IHRoZXkgaW5zdGFsbCBcdTIwMTQgc28gdGhhdCBwYXJ0IGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gYm90aC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHtcbiAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luLFxuICBpbnN0YWxsQ29uZmlndXJlRW5hYmxlQ29tbXVuaXR5UGx1Z2luXG59IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7XG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcblxuLyoqXG4gKiBIb3cgYW5vdGhlciBwbHVnaW4gaXMgY3VycmVudGx5IHByZXNlbnQgaW4gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgZW51bSBJbnN0YWxsZWRQbHVnaW5TdGF0ZSB7XG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYW5kIGVuYWJsZWQgXHUyMDE0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uXG4gICAqL1xuICBFbmFibGVkID0gJ2VuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYnV0IGRpc2FibGVkLiBPbmx5IGFuIGVuYWJsZSBpcyBuZWVkZWQsIHNvIG5vIGRvd25sb2FkIGhhcHBlbnMuXG4gICAqL1xuICBJbnN0YWxsZWRCdXREaXNhYmxlZCA9ICdpbnN0YWxsZWRCdXREaXNhYmxlZCcsXG5cbiAgLyoqXG4gICAqIE5vdCBpbnN0YWxsZWQgYXQgYWxsLlxuICAgKi9cbiAgTm90SW5zdGFsbGVkID0gJ25vdEluc3RhbGxlZCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB0byBsb29rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEluc3RhbGxlZFBsdWdpblZlcnNpb25QYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHRvIGxvb2sgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gdG8gaW5zdGFsbCBhbmQgZW5hYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb21wb25lbnQgb2YgdGhlIHBsdWdpbiBkb2luZyB0aGUgYXNraW5nLCB1c2VkIHRvIHJlcG9ydCB0aGUgb3V0Y29tZS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGhvdyBhbm90aGVyIHBsdWdpbiBpcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0SW5zdGFsbGVkUGx1Z2luU3RhdGVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIHtAbGluayBJbnN0YWxsZWRQbHVnaW5TdGF0ZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZShwYXJhbXM6IEdldEluc3RhbGxlZFBsdWdpblN0YXRlUGFyYW1zKTogSW5zdGFsbGVkUGx1Z2luU3RhdGUge1xuICBjb25zdCB7IGFwcCwgcGx1Z2luSWQgfSA9IHBhcmFtcztcblxuICBpZiAoYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwbHVnaW5JZClcbiAgICA/IEluc3RhbGxlZFBsdWdpblN0YXRlLkluc3RhbGxlZEJ1dERpc2FibGVkXG4gICAgOiBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5Ob3RJbnN0YWxsZWQ7XG59XG5cbi8qKlxuICogUmVhZHMgdGhlIHZlcnNpb24gb2YgYW5vdGhlciBwbHVnaW4gYXMgdGhpcyB2YXVsdCBoYXMgaXQgaW5zdGFsbGVkLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgcnVubmluZy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBjb21lcyBvdXQgb2YgYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AsIHdoaWNoIGlzIHBvcHVsYXRlZCBmb3IgZXZlcnkgaW5zdGFsbGVkIHBsdWdpbiBhdFxuICogc3RhcnR1cCBcdTIwMTQgc28sIHVubGlrZSBhbnl0aGluZyBhIHBsdWdpbiBSRUdJU1RFUlMsIGl0IGFuc3dlcnMgdGhlIHNhbWUgd2F5IG5vIG1hdHRlciB3aGljaCBwbHVnaW4gbG9hZGVkXG4gKiBmaXJzdC4gVGhhdCBsb2FkLW9yZGVyIGluZGVwZW5kZW5jZSBpcyB0aGUgd2hvbGUgcmVhc29uIGEgY29uZmxpY3QgaXMgZGV0ZWN0ZWQgYnkgdmVyc2lvbiByYXRoZXIgdGhhbiBieVxuICogYXNraW5nIGEgcmVnaXN0cnkuXG4gKlxuICogYG51bGxgIGZvciBhIHBsdWdpbiB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgT1IgaXMgaW5zdGFsbGVkIGJ1dCBkaXNhYmxlZDogYSBkaXNhYmxlZCBwbHVnaW4gcmVnaXN0ZXJzXG4gKiBub3RoaW5nLCBzbyBmb3IgZXZlcnkgcXVlc3Rpb24gdGhpcyBhbnN3ZXJzIHRoZSB0d28gY2FzZXMgYXJlIHRoZSBzYW1lLiBBbiBpbnN0YWxsZWQsIGVuYWJsZWQgcGx1Z2luXG4gKiB3aG9zZSBtYW5pZmVzdCBzb21laG93IGNhcnJpZXMgbm8gdmVyc2lvbiByZWFkcyBhcyBhbiBlbXB0eSBzdHJpbmcgcmF0aGVyIHRoYW4gYG51bGxgLCB3aGljaCBrZWVwc1xuICogXCJydW5uaW5nLCB2ZXJzaW9uIHVua25vd25cIiBkaXN0aW5ndWlzaGFibGUgZnJvbSBcIm5vdCBydW5uaW5nXCIgXHUyMDE0IGEgY2FsbGVyIGNvbXBhcmluZyB2ZXJzaW9ucyBzaG91bGQgZmFpbFxuICogY2xvc2VkIG9uIGl0IHJhdGhlciB0aGFuIHRyZWF0IGl0IGFzIGFic2VudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgdmVyc2lvbiwgb3IgYG51bGxgIHdoZW4gdGhlIHBsdWdpbiBpcyBub3QgZW5hYmxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24ocGFyYW1zOiBHZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uUGFyYW1zKTogbnVsbCB8IHN0cmluZyB7XG4gIGNvbnN0IHsgYXBwLCBwbHVnaW5JZCB9ID0gcGFyYW1zO1xuXG4gIGlmICghYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGFwcC5wbHVnaW5zLm1hbmlmZXN0c1twbHVnaW5JZF0/LnZlcnNpb24gPz8gJyc7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgKHdoZW4gbmVlZGVkKSBhbmQgZW5hYmxlcyBhbm90aGVyIHBsdWdpbiwgcmVwb3J0aW5nIHRoZSBvdXRjb21lIGFzIGEgbm90aWNlLlxuICpcbiAqIEEgbm8tb3Agd2hlbiB0aGUgcGx1Z2luIGlzIGFscmVhZHkgZW5hYmxlZCwgc28gYSBjYWxsZXIgcmVhY3RpbmcgdG8gYSBjbGljayBuZWVkIG5vdCBjaGVjayBmaXJzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBJbnN0YWxsQW5kRW5hYmxlUGx1Z2luUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcGx1Z2luIGlzIGVuYWJsZWQuXG4gKiBAdGhyb3dzIFdoYXRldmVyIHRoZSBpbnN0YWxsIG9yIGVuYWJsZSB0aHJldywgYWZ0ZXIgcmVwb3J0aW5nIGl0IGFzIGEgbm90aWNlIFx1MjAxNCB0aGUgY2FsbGVyIGRlY2lkZXNcbiAqIHdoZXRoZXIgYSBmYWlsdXJlIGlzIHdvcnRoIG1vcmUgdGhhbiB0aGUgbm90aWNlIHRoZSB1c2VyIGhhcyBhbHJlYWR5IHNlZW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHBhcmFtczogSW5zdGFsbEFuZEVuYWJsZVBsdWdpblBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHN0YXRlID0gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoeyBhcHAsIHBsdWdpbklkIH0pO1xuXG4gIGlmIChzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZCkge1xuICAgICAgYXdhaXQgZW5hYmxlQ29tbXVuaXR5UGx1Z2luKHsgYXBwLCBwbHVnaW5JZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgaW5zdGFsbENvbmZpZ3VyZUVuYWJsZUNvbW11bml0eVBsdWdpbih7IGFwcCwgcGx1Z2luSWQgfSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3MoXG4gICAgICB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMucGx1Z2luU3VnZ2VzdGlvbi5pbnN0YWxsRmFpbGVkLCB7IHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHBsdWdpbk5hbWUpIH0pXG4gICAgKSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKFxuICAgIHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxlZCwgeyBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhwbHVnaW5OYW1lKSB9KVxuICApKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxTQUFTO0FBS1gsSUFBSyx1QkFBTCxrQkFBS0EsMEJBQUw7QUFJTCxFQUFBQSxzQkFBQSxhQUFVO0FBS1YsRUFBQUEsc0JBQUEsMEJBQXVCO0FBS3ZCLEVBQUFBLHNCQUFBLGtCQUFlO0FBZEwsU0FBQUE7QUFBQSxHQUFBO0FBOEVMLFNBQVMsd0JBQXdCLFFBQTZEO0FBQ25HLFFBQU0sRUFBRSxLQUFLLFNBQVMsSUFBSTtBQUUxQixNQUFJLElBQUksUUFBUSxlQUFlLElBQUksUUFBUSxHQUFHO0FBQzVDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxPQUFPLE9BQU8sSUFBSSxRQUFRLFdBQVcsUUFBUSxJQUNoRCxvREFDQTtBQUNOO0FBbUJPLFNBQVMsMEJBQTBCLFFBQXdEO0FBQ2hHLFFBQU0sRUFBRSxLQUFLLFNBQVMsSUFBSTtBQUUxQixNQUFJLENBQUMsSUFBSSxRQUFRLGVBQWUsSUFBSSxRQUFRLEdBQUc7QUFDN0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLElBQUksUUFBUSxVQUFVLFFBQVEsR0FBRyxXQUFXO0FBQ3JEO0FBWUEsZUFBc0IsdUJBQXVCLFFBQXFEO0FBQ2hHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxRQUFRLHdCQUF3QixFQUFFLEtBQUssU0FBUyxDQUFDO0FBRXZELE1BQUksVUFBVSx5QkFBOEI7QUFDMUM7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLFFBQUksVUFBVSxtREFBMkM7QUFDdkQsWUFBTSxzQkFBc0IsRUFBRSxLQUFLLFNBQVMsQ0FBQztBQUFBLElBQy9DLE9BQU87QUFDTCxZQUFNLHNDQUFzQyxFQUFFLEtBQUssU0FBUyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxFQUNGLFNBQVMsT0FBTztBQUNkLDBCQUFzQixXQUFXO0FBQUEsTUFDL0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsaUJBQWlCLGVBQWUsRUFBRSxZQUFZLFlBQVksVUFBVSxFQUFFLENBQUM7QUFBQSxJQUNyRyxDQUFDO0FBQ0QsVUFBTTtBQUFBLEVBQ1I7QUFFQSx3QkFBc0IsV0FBVztBQUFBLElBQy9CLEVBQUUsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLGlCQUFpQixXQUFXLEVBQUUsWUFBWSxZQUFZLFVBQVUsRUFBRSxDQUFDO0FBQUEsRUFDakcsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJJbnN0YWxsZWRQbHVnaW5TdGF0ZSJdCn0K
@@ -0,0 +1,119 @@
1
+ /// <reference path="../../library.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The lifecycle broadcast every {@link PluginBase} makes: `obsidian-dev-utils:plugin-loaded` when it has
6
+ * finished loading and `obsidian-dev-utils:plugin-unloaded` when it goes away.
7
+ *
8
+ * Obsidian gives a plugin no way to learn that ANOTHER plugin was enabled or disabled — there is no such
9
+ * event on `app.plugins`, and a plugin's own `Events` source cannot help a listener that does not yet hold
10
+ * the instance. So the broadcast goes through `app.workspace`, which is one object every plugin in the
11
+ * vault can reach. Deliberately NOT the `globalThis.__obsidianDevUtils` bag the rest of the library shares
12
+ * its state through: a listener there needs its own copy of this library, and these events are meant to be
13
+ * consumable by any plugin at all.
14
+ *
15
+ * The names are past tense because a broadcast states something that has already happened. `loaded` in
16
+ * particular carries a guarantee: it is triggered only after every API the plugin declares has been
17
+ * published, so a listener may call them immediately.
18
+ *
19
+ * Both the event names and {@link PluginLifecycleEventPayload} are a CROSS-VERSION CONTRACT. Copies of
20
+ * this library at different versions publish and consume them side by side in one vault, so neither may
21
+ * change incompatibly: plain data only, and new payload fields only ever added.
22
+ */
23
+ import type { App } from 'obsidian';
24
+ /**
25
+ * The name of either lifecycle event.
26
+ */
27
+ export type PluginLifecycleEventName = typeof PLUGIN_LOADED_EVENT_NAME | typeof PLUGIN_UNLOADED_EVENT_NAME;
28
+ /**
29
+ * The payload of {@link PLUGIN_LOADED_EVENT_NAME} and {@link PLUGIN_UNLOADED_EVENT_NAME}.
30
+ *
31
+ * Plain data by design — no class instances and no types owned by this library — because it crosses
32
+ * between independently bundled copies of it, and between plugins that do not use it at all.
33
+ */
34
+ export interface PluginLifecycleEventPayload {
35
+ /**
36
+ * The contract versions the plugin published, empty when it publishes no API.
37
+ *
38
+ * An array rather than a single version because a provider may publish several contract versions side by
39
+ * side, so consumers pinned to an older range keep working across a breaking change.
40
+ *
41
+ * The API objects themselves are deliberately NOT here. A handle delivered by a one-shot event is a
42
+ * probe: it answers "now" and never says when "now" changed, and one that outlives the provider is
43
+ * exactly the stale handle the plugin-api registry's revocable handles exist to prevent. Reach the API
44
+ * through `watchPluginApi` instead, whose reference stays correct across unload and re-enable.
45
+ */
46
+ readonly apiVersions: readonly string[];
47
+ /**
48
+ * The ids of the plugins this one declares as mandatory dependencies, empty when it declares none.
49
+ *
50
+ * Present so the relationship can be read from the OTHER end: a provider has no way to ask who depends
51
+ * on it — the registry only answers consumer-to-provider — and "which installed plugins need this one"
52
+ * is what lets a provider's settings tab tell the user why it is in their vault at all.
53
+ */
54
+ readonly dependencyPluginIds: readonly string[];
55
+ /**
56
+ * The plugin's `manifest.id`.
57
+ */
58
+ readonly pluginId: string;
59
+ /**
60
+ * The plugin's `manifest.name`, for display.
61
+ */
62
+ readonly pluginName: string;
63
+ /**
64
+ * The plugin's `manifest.version`.
65
+ */
66
+ readonly pluginVersion: string;
67
+ }
68
+ /**
69
+ * Parameters for {@link triggerPluginLifecycleEvent}.
70
+ */
71
+ export interface TriggerPluginLifecycleEventParams {
72
+ /**
73
+ * The Obsidian app instance whose workspace carries the broadcast.
74
+ */
75
+ readonly app: App;
76
+ /**
77
+ * The event to trigger.
78
+ */
79
+ readonly name: PluginLifecycleEventName;
80
+ /**
81
+ * The payload describing the plugin.
82
+ */
83
+ readonly payload: PluginLifecycleEventPayload;
84
+ }
85
+ /**
86
+ * Triggered once a plugin has finished loading AND published every API it declares, so a listener may call
87
+ * those APIs immediately.
88
+ *
89
+ * Namespaced by the package name rather than by an abbreviation of it: the event is global to the vault
90
+ * and aimed at plugin authors who have never heard of this library, so the prefix has to identify itself.
91
+ */
92
+ export declare const PLUGIN_LOADED_EVENT_NAME = "obsidian-dev-utils:plugin-loaded";
93
+ /**
94
+ * Triggered as a plugin unloads — whether the user disabled it, uninstalled it, or Obsidian is shutting
95
+ * down. Its APIs are revoked by the time a listener runs.
96
+ */
97
+ export declare const PLUGIN_UNLOADED_EVENT_NAME = "obsidian-dev-utils:plugin-unloaded";
98
+ declare module 'obsidian' {
99
+ interface Workspace {
100
+ /**
101
+ * Subscribes to a plugin finishing its load, or to one unloading.
102
+ *
103
+ * @param name - Should be {@link PLUGIN_LOADED_EVENT_NAME} or {@link PLUGIN_UNLOADED_EVENT_NAME}.
104
+ * @param callback - The callback receiving the plugin's payload.
105
+ * @param context - The context passed as `this` to the `callback` function.
106
+ * @returns The event reference.
107
+ */
108
+ on(name: PluginLifecycleEventName, callback: (payload: PluginLifecycleEventPayload) => unknown, context?: unknown): EventRef;
109
+ }
110
+ }
111
+ /**
112
+ * Triggers one of the two lifecycle events on the app's workspace.
113
+ *
114
+ * A thin typed wrapper over `Workspace.trigger`, which accepts any event name and any arguments, so that
115
+ * the one place a payload is constructed is checked against {@link PluginLifecycleEventPayload}.
116
+ *
117
+ * @param params - The {@link TriggerPluginLifecycleEventParams}.
118
+ */
119
+ export declare function triggerPluginLifecycleEvent(params: TriggerPluginLifecycleEventParams): void;