obsidian-dev-utils 67.0.0 → 68.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/dev/main.js +487 -267
  3. package/dist/lib/cjs/async-events.cjs +178 -18
  4. package/dist/lib/cjs/async-events.d.cts +260 -9
  5. package/dist/lib/cjs/error.cjs +6 -7
  6. package/dist/lib/cjs/function.cjs +6 -2
  7. package/dist/lib/cjs/function.d.cts +6 -0
  8. package/dist/lib/cjs/library.cjs +1 -1
  9. package/dist/lib/cjs/object-utils.cjs +1 -1
  10. package/dist/lib/cjs/object-utils.d.cts +2 -0
  11. package/dist/lib/cjs/obsidian/active-file-provider.cjs +1 -1
  12. package/dist/lib/cjs/obsidian/active-file-provider.d.cts +0 -1
  13. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +4 -4
  14. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +3 -3
  15. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +3 -7
  16. package/dist/lib/cjs/obsidian/components/abort-signal-component.d.cts +2 -6
  17. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +3 -3
  18. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +2 -2
  19. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +3 -7
  20. package/dist/lib/cjs/obsidian/components/async-error-handler-component.d.cts +2 -6
  21. package/dist/lib/cjs/obsidian/components/async-events-component.cjs +2 -20
  22. package/dist/lib/cjs/obsidian/components/async-events-component.d.cts +1 -18
  23. package/dist/lib/cjs/obsidian/components/component-ex.cjs +235 -0
  24. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +55 -0
  25. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +3 -7
  26. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -6
  27. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +1 -9
  28. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +0 -10
  29. package/dist/lib/cjs/obsidian/components/i18n-component.cjs +4 -8
  30. package/dist/lib/cjs/obsidian/components/i18n-component.d.cts +3 -7
  31. package/dist/lib/cjs/obsidian/components/index.cjs +9 -6
  32. package/dist/lib/cjs/obsidian/components/index.d.cts +2 -1
  33. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +3 -3
  34. package/dist/lib/cjs/obsidian/components/layout-ready-component.d.cts +2 -2
  35. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +3 -3
  36. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.d.cts +2 -3
  37. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +4 -4
  38. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +3 -3
  39. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +3 -7
  40. package/dist/lib/cjs/obsidian/components/plugin-context-component.d.cts +2 -6
  41. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -7
  42. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +2 -6
  43. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +53 -12
  44. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +53 -18
  45. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +3 -3
  46. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.d.cts +2 -2
  47. package/dist/lib/cjs/obsidian/components/registry-component.cjs +180 -0
  48. package/dist/lib/cjs/obsidian/components/registry-component.d.cts +36 -0
  49. package/dist/lib/cjs/obsidian/markdown.cjs +2 -3
  50. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +1 -1
  51. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +0 -1
  52. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +21 -20
  53. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +7 -3
  54. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +35 -76
  55. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +35 -36
  56. package/dist/lib/cjs/obsidian/rename-delete-handler.cjs +1 -2
  57. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +3 -1
  58. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -0
  59. package/dist/lib/cjs/obsidian/setting-ex.cjs +3 -1
  60. package/dist/lib/cjs/obsidian/setting-ex.d.cts +2 -0
  61. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
  62. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +4 -1
  63. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
  64. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +3 -1
  65. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +2 -2
  66. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +222 -0
  67. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +4 -0
  68. package/dist/lib/esm/async-events.d.mts +260 -9
  69. package/dist/lib/esm/async-events.mjs +175 -17
  70. package/dist/lib/esm/error.mjs +6 -7
  71. package/dist/lib/esm/function.d.mts +6 -0
  72. package/dist/lib/esm/function.mjs +5 -2
  73. package/dist/lib/esm/library.mjs +1 -1
  74. package/dist/lib/esm/object-utils.d.mts +2 -0
  75. package/dist/lib/esm/object-utils.mjs +1 -1
  76. package/dist/lib/esm/obsidian/active-file-provider.d.mts +0 -1
  77. package/dist/lib/esm/obsidian/active-file-provider.mjs +1 -1
  78. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +3 -3
  79. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +4 -4
  80. package/dist/lib/esm/obsidian/components/abort-signal-component.d.mts +2 -6
  81. package/dist/lib/esm/obsidian/components/abort-signal-component.mjs +3 -7
  82. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +2 -2
  83. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +3 -3
  84. package/dist/lib/esm/obsidian/components/async-error-handler-component.d.mts +2 -6
  85. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -7
  86. package/dist/lib/esm/obsidian/components/async-events-component.d.mts +1 -18
  87. package/dist/lib/esm/obsidian/components/async-events-component.mjs +2 -19
  88. package/dist/lib/esm/obsidian/components/component-ex.d.mts +55 -0
  89. package/dist/lib/esm/obsidian/components/component-ex.mjs +130 -0
  90. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -6
  91. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +3 -7
  92. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +0 -10
  93. package/dist/lib/esm/obsidian/components/disposable-component.mjs +1 -8
  94. package/dist/lib/esm/obsidian/components/i18n-component.d.mts +3 -7
  95. package/dist/lib/esm/obsidian/components/i18n-component.mjs +4 -8
  96. package/dist/lib/esm/obsidian/components/index.d.mts +2 -1
  97. package/dist/lib/esm/obsidian/components/index.mjs +6 -4
  98. package/dist/lib/esm/obsidian/components/layout-ready-component.d.mts +2 -2
  99. package/dist/lib/esm/obsidian/components/layout-ready-component.mjs +3 -3
  100. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.d.mts +2 -3
  101. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +3 -3
  102. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +3 -3
  103. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +4 -4
  104. package/dist/lib/esm/obsidian/components/plugin-context-component.d.mts +2 -6
  105. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +3 -7
  106. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +2 -6
  107. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -7
  108. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +53 -18
  109. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +53 -12
  110. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.d.mts +2 -2
  111. package/dist/lib/esm/obsidian/components/plugin-settings-tab-component.mjs +3 -3
  112. package/dist/lib/esm/obsidian/components/registry-component.d.mts +36 -0
  113. package/dist/lib/esm/obsidian/components/registry-component.mjs +72 -0
  114. package/dist/lib/esm/obsidian/markdown.mjs +2 -3
  115. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +0 -1
  116. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +7 -3
  117. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +22 -21
  118. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +35 -36
  119. package/dist/lib/esm/obsidian/plugin/plugin.mjs +35 -77
  120. package/dist/lib/esm/obsidian/rename-delete-handler.mjs +1 -2
  121. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -0
  122. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +3 -1
  123. package/dist/lib/esm/obsidian/setting-ex.d.mts +2 -0
  124. package/dist/lib/esm/obsidian/setting-ex.mjs +3 -1
  125. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
  126. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
  127. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +3 -1
  128. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +3 -1
  129. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +2 -2
  130. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +4 -0
  131. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +112 -0
  132. package/obsidian/Components/component-ex/package.json +6 -0
  133. package/obsidian/Components/registry-component/package.json +6 -0
  134. package/package.json +21 -20
  135. package/script-utils/linters/eslint-rules/require-method-template/package.json +6 -0
  136. package/dist/lib/cjs/obsidian/components/async-component.cjs +0 -183
  137. package/dist/lib/cjs/obsidian/components/async-component.d.cts +0 -43
  138. package/dist/lib/esm/obsidian/components/async-component.d.mts +0 -43
  139. package/dist/lib/esm/obsidian/components/async-component.mjs +0 -73
  140. package/obsidian/Components/async-component/package.json +0 -6
@@ -3,16 +3,12 @@
3
3
  *
4
4
  * Component that manages displaying notices to the user.
5
5
  */
6
- import { DisposableComponent } from './disposable-component.mjs';
6
+ import { ComponentEx } from './component-ex.mjs';
7
7
  /**
8
8
  * Manages showing plugin notices. Automatically hides the previous notice when a new one is shown.
9
9
  */
10
- export declare class PluginNoticeComponent extends DisposableComponent {
10
+ export declare class PluginNoticeComponent extends ComponentEx {
11
11
  private readonly pluginName;
12
- /**
13
- * The singleton key for the {@link PluginNoticeComponent} class.
14
- */
15
- static readonly COMPONENT_KEY: unique symbol;
16
12
  private notice?;
17
13
  /**
18
14
  * Creates a new plugin notice component.
@@ -22,8 +22,8 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { Notice } from "obsidian";
25
- import { DisposableComponent } from "./disposable-component.mjs";
26
- class PluginNoticeComponent extends DisposableComponent {
25
+ import { ComponentEx } from "./component-ex.mjs";
26
+ class PluginNoticeComponent extends ComponentEx {
27
27
  /**
28
28
  * Creates a new plugin notice component.
29
29
  *
@@ -34,10 +34,6 @@ class PluginNoticeComponent extends DisposableComponent {
34
34
  this.pluginName = pluginName;
35
35
  }
36
36
  pluginName;
37
- /**
38
- * The singleton key for the {@link PluginNoticeComponent} class.
39
- */
40
- static COMPONENT_KEY = Symbol(PluginNoticeComponent.name);
41
37
  notice;
42
38
  /**
43
39
  * Displays a notice message to the user.
@@ -55,4 +51,4 @@ ${message}`);
55
51
  export {
56
52
  PluginNoticeComponent
57
53
  };
58
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IERpc3Bvc2FibGVDb21wb25lbnQgfSBmcm9tICcuL2Rpc3Bvc2FibGUtY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEF1dG9tYXRpY2FsbHkgaGlkZXMgdGhlIHByZXZpb3VzIG5vdGljZSB3aGVuIGEgbmV3IG9uZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIERpc3Bvc2FibGVDb21wb25lbnQge1xuICAvKipcbiAgICogVGhlIHNpbmdsZXRvbiBrZXkgZm9yIHRoZSB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50fSBjbGFzcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09NUE9ORU5UX0tFWSA9IFN5bWJvbChQbHVnaW5Ob3RpY2VDb21wb25lbnQubmFtZSk7XG5cbiAgcHJpdmF0ZSBub3RpY2U/OiBOb3RpY2U7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIG5vdGljZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5OYW1lIC0gVGhlIHBsdWdpbiBuYW1lIChzaG93biBhcyBwcmVmaXggaW4gbm90aWNlcykuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2UuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlID0gbmV3IE5vdGljZShgJHt0aGlzLnBsdWdpbk5hbWV9XFxuJHttZXNzYWdlfWApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMsY0FBYztBQUV2QixTQUFTLDJCQUEyQjtBQUs3QixNQUFNLDhCQUE4QixvQkFBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhdEQsWUFBNkIsWUFBb0I7QUFDdEQsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUEsRUFGb0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVRwQyxPQUF1QixnQkFBZ0IsT0FBTyxzQkFBc0IsSUFBSTtBQUFBLEVBRWhFO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZ0JELFdBQVcsU0FBdUI7QUFDdkMsUUFBSSxLQUFLLFFBQVE7QUFDZixXQUFLLE9BQU8sS0FBSztBQUFBLElBQ25CO0FBRUEsU0FBSyxTQUFTLElBQUksT0FBTyxHQUFHLEtBQUssVUFBVTtBQUFBLEVBQUssT0FBTyxFQUFFO0FBQUEsRUFDM0Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
54
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQXV0b21hdGljYWxseSBoaWRlcyB0aGUgcHJldmlvdXMgbm90aWNlIHdoZW4gYSBuZXcgb25lIGlzIHNob3duLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luTm90aWNlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIG5vdGljZT86IE5vdGljZTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbk5hbWUgLSBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2UobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubm90aWNlKSB7XG4gICAgICB0aGlzLm5vdGljZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpY2UgPSBuZXcgTm90aWNlKGAke3RoaXMucGx1Z2luTmFtZX1cXG4ke21lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTUEsU0FBUyxjQUFjO0FBRXZCLFNBQVMsbUJBQW1CO0FBS3JCLE1BQU0sOEJBQThCLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFROUMsWUFBNkIsWUFBb0I7QUFDdEQsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUEsRUFGb0M7QUFBQSxFQVA1QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCRCxXQUFXLFNBQXVCO0FBQ3ZDLFFBQUksS0FBSyxRQUFRO0FBQ2YsV0FBSyxPQUFPLEtBQUs7QUFBQSxJQUNuQjtBQUVBLFNBQUssU0FBUyxJQUFJLE9BQU8sR0FBRyxLQUFLLFVBQVU7QUFBQSxFQUFLLE9BQU8sRUFBRTtBQUFBLEVBQzNEO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -8,12 +8,13 @@
8
8
  * by this component — no separate manager class is needed.
9
9
  */
10
10
  import type { Constructor, Promisable, ReadonlyDeep } from 'type-fest';
11
- import type { AsyncEventRef } from '../../async-events.mjs';
11
+ import type { AsyncEventRef, AsyncEventSource } from '../../async-events.mjs';
12
12
  import type { Transformer } from '../../transformers/transformer.mjs';
13
13
  import type { GenericObject } from '../../type-guards.mjs';
14
14
  import type { MaybeReturn, StringKeys } from '../../type.mjs';
15
15
  import type { DataHandler } from '../data-handler.mjs';
16
- import { AsyncComponent } from './async-component.mjs';
16
+ import type { PluginEventSource } from '../plugin/plugin.mjs';
17
+ import { ComponentEx } from './component-ex.mjs';
17
18
  /**
18
19
  * Constructor parameters for {@link PluginSettingsComponentBase}.
19
20
  *
@@ -24,6 +25,10 @@ export interface PluginSettingsComponentBaseConstructorParams<PluginSettings> {
24
25
  * The data handler for the plugin.
25
26
  */
26
27
  readonly dataHandler: DataHandler;
28
+ /**
29
+ * The plugin events.
30
+ */
31
+ readonly pluginEventSource: PluginEventSource;
27
32
  /**
28
33
  * The plugin settings class.
29
34
  */
@@ -68,6 +73,17 @@ export type ReadonlyPluginSettingsState<PluginSettings extends object> = Readonl
68
73
  * @typeParam PropertyName - The property name.
69
74
  */
70
75
  export type SettingsValidator<PluginSettings extends object, PropertyName extends StringKeys<PluginSettings> = StringKeys<PluginSettings>> = (value: PluginSettings[PropertyName], settings: PluginSettings) => Promisable<MaybeReturn<string>>;
76
+ interface PluginSettingsComponentBaseEventMap<PluginSettings extends object> {
77
+ loadSettings: [
78
+ loadedState: ReadonlyPluginSettingsState<PluginSettings>,
79
+ isInitialLoad: boolean
80
+ ];
81
+ saveSettings: [
82
+ newState: ReadonlyPluginSettingsState<PluginSettings>,
83
+ oldState: ReadonlyPluginSettingsState<PluginSettings>,
84
+ context: unknown
85
+ ];
86
+ }
71
87
  type PropertyNames<PluginSettings extends object> = StringKeys<PluginSettings>;
72
88
  type ValidationResult<PluginSettings extends object> = Partial<Record<StringKeys<PluginSettings>, string>>;
73
89
  /**
@@ -78,11 +94,7 @@ type ValidationResult<PluginSettings extends object> = Partial<Record<StringKeys
78
94
  *
79
95
  * @typeParam PluginSettings - The plugin settings type.
80
96
  */
81
- export declare class PluginSettingsComponentBase<PluginSettings extends object> extends AsyncComponent {
82
- /**
83
- * Component key for singleton replacement via {@link PluginBase.addChild}.
84
- */
85
- static readonly COMPONENT_KEY: unique symbol;
97
+ export declare class PluginSettingsComponentBase<PluginSettings extends object> extends ComponentEx implements AsyncEventSource<PluginSettingsComponentBaseEventMap<PluginSettings>> {
86
98
  /**
87
99
  * Gets the readonly default settings.
88
100
  *
@@ -106,6 +118,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
106
118
  private readonly dataHandler;
107
119
  private lastSavedState;
108
120
  private readonly legacySettingsConverters;
121
+ private readonly pluginEventSource;
109
122
  private readonly pluginSettingsClass;
110
123
  private readonly propertyNames;
111
124
  private readonly validators;
@@ -147,23 +160,44 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
147
160
  */
148
161
  loadFromFile(isInitialLoad: boolean): Promise<void>;
149
162
  /**
150
- * Subscribes to the `loadSettings` event.
163
+ * Remove an event listener.
164
+ *
165
+ * @typeParam EventName - The name of the event.
166
+ * @typeParam Args - The types of the arguments the event callback accepts.
167
+ * @param name - The name of the event.
168
+ * @param callback - The callback to remove.
169
+ */
170
+ off<EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings>, Args extends EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings> ? PluginSettingsComponentBaseEventMap<PluginSettings>[EventName] : unknown[]>(name: EventName, callback: (...args: Args) => Promisable<void>): void;
171
+ /**
172
+ * Remove an event listener by reference.
173
+ *
174
+ * @param eventRef - The reference to the event listener.
175
+ */
176
+ offref(eventRef: AsyncEventRef): void;
177
+ /**
178
+ * Add an event listener.
151
179
  *
152
- * @param name - Always `loadSettings`.
153
- * @param callback - The callback.
154
- * @param thisArg - The `this` context.
180
+ * @typeParam EventName - The name of the event.
181
+ * @typeParam Args - The types of the arguments the event callback accepts.
182
+ * @param name - The name of the event.
183
+ * @param callback - The callback to call when the event is triggered.
184
+ * @param thisArg - The context passed as `this` to the `callback`.
155
185
  * @returns A reference to the event listener.
156
186
  */
157
- on(name: 'loadSettings', callback: (loadedState: ReadonlyPluginSettingsState<PluginSettings>, isInitialLoad: boolean) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
187
+ on<EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings>, Args extends EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings> ? PluginSettingsComponentBaseEventMap<PluginSettings>[EventName] : unknown[]>(name: EventName, callback: (...args: Args) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
158
188
  /**
159
- * Subscribes to the `saveSettings` event.
189
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
190
+ *
191
+ * Add an event listener that will be called only once.
160
192
  *
161
- * @param name - Always `saveSettings`.
162
- * @param callback - The callback.
163
- * @param thisArg - The `this` context.
193
+ * @typeParam EventName - The name of the event.
194
+ * @typeParam Args - The types of the arguments the event callback accepts.
195
+ * @param name - The name of the event.
196
+ * @param callback - The callback to call when the event is triggered.
197
+ * @param thisArg - The context passed as `this` to the `callback`.
164
198
  * @returns A reference to the event listener.
165
199
  */
166
- on(name: 'saveSettings', callback: (newState: ReadonlyPluginSettingsState<PluginSettings>, oldState: ReadonlyPluginSettingsState<PluginSettings>, context: unknown) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
200
+ once<EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings>, Args extends EventName extends keyof PluginSettingsComponentBaseEventMap<PluginSettings> ? PluginSettingsComponentBaseEventMap<PluginSettings>[EventName] : unknown[]>(name: EventName, callback: (...args: Args) => Promisable<void>, thisArg?: unknown): AsyncEventRef;
167
201
  /**
168
202
  * Called when the external settings change.
169
203
  *
@@ -173,7 +207,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
173
207
  /**
174
208
  * Loads settings from file and registers event handlers.
175
209
  */
176
- onload(): Promise<void>;
210
+ onloadAsync(): Promise<void>;
177
211
  /**
178
212
  * Registers a legacy settings converter.
179
213
  *
@@ -185,6 +219,7 @@ export declare class PluginSettingsComponentBase<PluginSettings extends object>
185
219
  /**
186
220
  * Registers a validator for a property.
187
221
  *
222
+ * @typeParam PropertyName - The name of the settings property.
188
223
  * @param propertyName - The name of the property.
189
224
  * @param validator - The validator.
190
225
  */
@@ -39,8 +39,8 @@ import { MapTransformer } from "../../transformers/map-transformer.mjs";
39
39
  import { SetTransformer } from "../../transformers/set-transformer.mjs";
40
40
  import { SkipPrivatePropertyTransformer } from "../../transformers/skip-private-property-transformer.mjs";
41
41
  import { TwoWayMapTransformer } from "../../transformers/two-way-map-transformer.mjs";
42
- import { AsyncComponent } from "./async-component.mjs";
43
42
  import { registerAsyncEvent } from "./async-events-component.mjs";
43
+ import { ComponentEx } from "./component-ex.mjs";
44
44
  const defaultTransformer = new GroupTransformer([
45
45
  new SkipPrivatePropertyTransformer(),
46
46
  new DateTransformer(),
@@ -49,11 +49,7 @@ const defaultTransformer = new GroupTransformer([
49
49
  new SetTransformer(),
50
50
  new TwoWayMapTransformer()
51
51
  ]);
52
- class PluginSettingsComponentBase extends AsyncComponent {
53
- /**
54
- * Component key for singleton replacement via {@link PluginBase.addChild}.
55
- */
56
- static COMPONENT_KEY = Symbol(PluginSettingsComponentBase.name);
52
+ class PluginSettingsComponentBase extends ComponentEx {
57
53
  /**
58
54
  * Gets the readonly default settings.
59
55
  *
@@ -81,6 +77,7 @@ class PluginSettingsComponentBase extends AsyncComponent {
81
77
  dataHandler;
82
78
  lastSavedState;
83
79
  legacySettingsConverters = [];
80
+ pluginEventSource;
84
81
  pluginSettingsClass;
85
82
  propertyNames;
86
83
  validators = /* @__PURE__ */ new Map();
@@ -93,6 +90,7 @@ class PluginSettingsComponentBase extends AsyncComponent {
93
90
  super();
94
91
  this.dataHandler = params.dataHandler;
95
92
  this.pluginSettingsClass = params.pluginSettingsClass;
93
+ this.pluginEventSource = params.pluginEventSource;
96
94
  this.defaultSettings = new this.pluginSettingsClass();
97
95
  this.currentState = this.createDefaultState();
98
96
  this.lastSavedState = this.createDefaultState();
@@ -173,16 +171,52 @@ class PluginSettingsComponentBase extends AsyncComponent {
173
171
  }
174
172
  }
175
173
  /**
176
- * Subscribes to an event.
174
+ * Remove an event listener.
175
+ *
176
+ * @typeParam EventName - The name of the event.
177
+ * @typeParam Args - The types of the arguments the event callback accepts.
178
+ * @param name - The name of the event.
179
+ * @param callback - The callback to remove.
180
+ */
181
+ off(name, callback) {
182
+ this.asyncEvents.off(name, callback);
183
+ }
184
+ /**
185
+ * Remove an event listener by reference.
186
+ *
187
+ * @param eventRef - The reference to the event listener.
188
+ */
189
+ offref(eventRef) {
190
+ this.asyncEvents.offref(eventRef);
191
+ }
192
+ /**
193
+ * Add an event listener.
177
194
  *
195
+ * @typeParam EventName - The name of the event.
196
+ * @typeParam Args - The types of the arguments the event callback accepts.
178
197
  * @param name - The name of the event.
179
- * @param callback - The callback.
180
- * @param thisArg - The `this` context.
198
+ * @param callback - The callback to call when the event is triggered.
199
+ * @param thisArg - The context passed as `this` to the `callback`.
181
200
  * @returns A reference to the event listener.
182
201
  */
183
202
  on(name, callback, thisArg) {
184
203
  return this.asyncEvents.on(name, callback, thisArg);
185
204
  }
205
+ /**
206
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
207
+ *
208
+ * Add an event listener that will be called only once.
209
+ *
210
+ * @typeParam EventName - The name of the event.
211
+ * @typeParam Args - The types of the arguments the event callback accepts.
212
+ * @param name - The name of the event.
213
+ * @param callback - The callback to call when the event is triggered.
214
+ * @param thisArg - The context passed as `this` to the `callback`.
215
+ * @returns A reference to the event listener.
216
+ */
217
+ once(name, callback, thisArg) {
218
+ return this.asyncEvents.once(name, callback, thisArg);
219
+ }
186
220
  /**
187
221
  * Called when the external settings change.
188
222
  *
@@ -194,9 +228,10 @@ class PluginSettingsComponentBase extends AsyncComponent {
194
228
  /**
195
229
  * Loads settings from file and registers event handlers.
196
230
  */
197
- async onload() {
231
+ async onloadAsync() {
198
232
  registerAsyncEvent(this, this.on("loadSettings", this.onLoadSettings.bind(this)));
199
233
  registerAsyncEvent(this, this.on("saveSettings", this.onSaveSettings.bind(this)));
234
+ registerAsyncEvent(this, this.pluginEventSource.on("externalSettingsChange", this.onExternalSettingsChange.bind(this)));
200
235
  await this.loadFromFile(true);
201
236
  }
202
237
  /**
@@ -228,6 +263,7 @@ class PluginSettingsComponentBase extends AsyncComponent {
228
263
  /**
229
264
  * Registers a validator for a property.
230
265
  *
266
+ * @typeParam PropertyName - The name of the settings property.
231
267
  * @param propertyName - The name of the property.
232
268
  * @param validator - The validator.
233
269
  */
@@ -254,7 +290,12 @@ class PluginSettingsComponentBase extends AsyncComponent {
254
290
  return;
255
291
  }
256
292
  await this.saveToFileImpl();
257
- await this.asyncEvents.triggerAsync("saveSettings", this.currentState, this.lastSavedState, context);
293
+ await this.asyncEvents.triggerAsync(
294
+ "saveSettings",
295
+ this.currentState,
296
+ this.lastSavedState,
297
+ context
298
+ );
258
299
  this.lastSavedState = await this.cloneState(this.currentState);
259
300
  }
260
301
  /**
@@ -431,4 +472,4 @@ class PluginSettingsComponentBase extends AsyncComponent {
431
472
  export {
432
473
  PluginSettingsComponentBase
433
474
  };
434
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQgXHUyMDE0IG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IEFzeW5jRXZlbnRSZWYgfSBmcm9tICcuLi8uLi9hc3luYy1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNYXliZVJldHVybixcbiAgU3RyaW5nS2V5c1xufSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuXG5pbXBvcnQgeyBBc3luY0V2ZW50cyB9IGZyb20gJy4uLy4uL2FzeW5jLWV2ZW50cy50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIG5vb3AsXG4gIG5vb3BBc3luY1xufSBmcm9tICcuLi8uLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQge1xuICBjYXN0VG8sXG4gIGRlZXBFcXVhbCxcbiAgZ2V0QWxsS2V5c1xufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL2RhdGUtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgRHVyYXRpb25UcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9kdXJhdGlvbi10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL2dyb3VwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IE1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL21hcC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBTZXRUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9zZXQtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL3NraXAtcHJpdmF0ZS1wcm9wZXJ0eS10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBUd29XYXlNYXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy90d28td2F5LW1hcC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBBc3luY0NvbXBvbmVudCB9IGZyb20gJy4vYXN5bmMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJlZ2lzdGVyQXN5bmNFdmVudCB9IGZyb20gJy4vYXN5bmMtZXZlbnRzLWNvbXBvbmVudC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPiB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YSBoYW5kbGVyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIGNsYXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NDbGFzczogQ29uc3RydWN0b3I8UGx1Z2luU2V0dGluZ3MsIFtdPjtcbn1cblxuLyoqXG4gKiBBIHNuYXBzaG90IG9mIHBsdWdpbiBzZXR0aW5ncyBzdGF0ZSwgaW5jbHVkaW5nIHJhdyBpbnB1dCB2YWx1ZXMsIGVmZmVjdGl2ZSAodmFsaWRhdGVkKSB2YWx1ZXMsXG4gKiBhbmQgcGVyLXByb3BlcnR5IHZhbGlkYXRpb24gbWVzc2FnZXMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIGVmZmVjdGl2ZSBzZXR0aW5ncyB2YWx1ZXMgdXNlZCBieSB0aGUgcGx1Z2luLiBJbnZhbGlkIHByb3BlcnRpZXMgYXJlIHJlcGxhY2VkIHdpdGggZGVmYXVsdHMuXG4gICAqL1xuICBlZmZlY3RpdmVWYWx1ZXM6IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBUaGUgcmF3IGlucHV0IHZhbHVlcyBhcyBlbnRlcmVkIGJ5IHRoZSB1c2VyLiBNYXkgY29udGFpbiBpbnZhbGlkIHZhbHVlcy5cbiAgICovXG4gIGlucHV0VmFsdWVzOiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogUGVyLXByb3BlcnR5IHZhbGlkYXRpb24gbWVzc2FnZXMuIEVtcHR5IHN0cmluZyBtZWFucyB2YWxpZC5cbiAgICovXG4gIHZhbGlkYXRpb25NZXNzYWdlczogUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlYWRvbmx5IHZlcnNpb24gb2Yge0BsaW5rIFBsdWdpblNldHRpbmdzfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVhZG9ubHlQbHVnaW5TZXR0aW5nczxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4vKipcbiAqIFJlYWRvbmx5IHZlcnNpb24gb2Yge0BsaW5rIFBsdWdpblNldHRpbmdzU3RhdGV9IGZvciB1c2UgaW4gZXZlbnQgY2FsbGJhY2tzIGFuZCBwdWJsaWMgZ2V0dGVycy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAqL1xuZXhwb3J0IHR5cGUgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiA9IFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPj47XG5cbi8qKlxuICogQSB2YWxpZGF0b3IgZnVuY3Rpb24gZm9yIGEgc2V0dGluZ3MgcHJvcGVydHkuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSBwbHVnaW4gc2V0dGluZ3MgdHlwZS5cbiAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUuXG4gKi9cbmV4cG9ydCB0eXBlIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LCBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiA9IFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PiA9IChcbiAgdmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0sXG4gIHNldHRpbmdzOiBQbHVnaW5TZXR0aW5nc1xuKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG50eXBlIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG5cbnR5cGUgUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5dO1xuXG50eXBlIFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGFydGlhbDxSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnRzLlxuICpcbiAqIE1hbmFnZXMgc2V0dGluZ3MgZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKiBQbHVnaW4gYXV0aG9ycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHtAbGluayBjcmVhdGVEZWZhdWx0U2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcmVxdWlyZS1jb21wb25lbnQtc3VmZml4IC0tIE5vbi1hYnN0cmFjdCBiYXNlIGNsYXNzOyBjb25zdW1lcnMgZXh0ZW5kIGl0LlxuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBBc3luY0NvbXBvbmVudCB7XG4gIC8qKlxuICAgKiBDb21wb25lbnQga2V5IGZvciBzaW5nbGV0b24gcmVwbGFjZW1lbnQgdmlhIHtAbGluayBQbHVnaW5CYXNlLmFkZENoaWxkfS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ09NUE9ORU5UX0tFWSA9IFN5bWJvbChQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2UubmFtZSk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IGRlZmF1bHQgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBkZWZhdWx0IHNldHRpbmdzIChhcyBhIHJlYWRvbmx5IG9iamVjdCkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGVmYXVsdFNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWFkb25seSBlZmZlY3RpdmUgc2V0dGluZ3MgKHZhbGlkYXRlZCwgd2l0aCBkZWZhdWx0cyBzdWJzdGl0dXRlZCBmb3IgaW52YWxpZCB2YWx1ZXMpLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVhZG9ubHkgZWZmZWN0aXZlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1N0YXRlLmVmZmVjdGl2ZVZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHNldHRpbmdzIHN0YXRlIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXR0aW5ncyBzdGF0ZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3NTdGF0ZSgpOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPjtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAgcHJpdmF0ZSBjdXJyZW50U3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcjtcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzOiAoKHJlY29yZDogR2VuZXJpY09iamVjdCkgPT4gdm9pZClbXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eU5hbWVzOiBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGFIYW5kbGVyID0gcGFyYW1zLmRhdGFIYW5kbGVyO1xuICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcyA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzO1xuXG4gICAgdGhpcy5kZWZhdWx0U2V0dGluZ3MgPSBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCkgYXMgUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG4gICAgdGhpcy5wcm9wZXJ0eU5hbWVzID0gZ2V0QWxsS2V5cyh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG4gICAgdGhpcy5yZWdpc3RlclZhbGlkYXRvcnMoKTtcbiAgICB0aGlzLnJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKCk7XG4gIH1cblxuICAvKipcbiAgICogRWRpdHMgdGhlIHBsdWdpbiBzZXR0aW5ncyBhbmQgc2F2ZXMgdGhlbS5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzRWRpdG9yIC0gVGhlIGVkaXRvci5cbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZWRpdEFuZFNhdmUoc2V0dGluZ3NFZGl0b3I6IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+IFByb21pc2FibGU8dm9pZD4sIGNvbnRleHQ/OiB1bmtub3duKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KHNldHRpbmdzRWRpdG9yKTtcbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGUoY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgc2V0dGluZ3MgYXJlIHNhZmUuXG4gICAqXG4gICAqIEl0IHJ1bnMgdmFsaWRhdGlvbiBmb3IgZWFjaCBwcm9wZXJ0eSBhbmQgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYWZlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVuc3VyZVNhZmUoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUoc2V0dGluZ3MpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICBpZiAodmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIHNldHRpbmdzW3Byb3BlcnR5TmFtZV0gPSBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgc2FmZSBjb3B5IG9mIHRoZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHNldHRpbmdzIC0gVGhlIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzYWZlIGNvcHkgb2YgdGhlIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNhZmVDb3B5KHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBjb25zdCBzYWZlU2V0dGluZ3MgPSBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc2V0dGluZ3MpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2FmZShzYWZlU2V0dGluZ3MpO1xuICAgIHJldHVybiBzYWZlU2V0dGluZ3M7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIHBsdWdpbiBzZXR0aW5ncyBmcm9tIHRoZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gaXNJbml0aWFsTG9hZCAtIFdoZXRoZXIgdGhlIHNldHRpbmdzIGFyZSBiZWluZyBsb2FkZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBsb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZEZyb21GaWxlKGlzSW5pdGlhbExvYWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5kYXRhSGFuZGxlci5sb2FkRGF0YSgpO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgc2V0dGluZ3MgZnJvbSBkYXRhLmpzb24uIEV4cGVjdGVkIE9iamVjdCwgZ290OiAke3R5cGVvZiBkYXRhfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1JlY29yZCA9IGRhdGEgYXMgR2VuZXJpY09iamVjdDtcbiAgICAgIGNvbnN0IHBhcnNlZFNldHRpbmdzID0gYXdhaXQgdGhpcy5yYXdSZWNvcmRUb1NldHRpbmdzKHJhd1JlY29yZCk7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZShwYXJzZWRTZXR0aW5ncyk7XG5cbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIHRoaXMucHJvcGVydHlOYW1lcykge1xuICAgICAgICB0aGlzLnNldFByb3BlcnR5SW1wbChwcm9wZXJ0eU5hbWUsIHBhcnNlZFNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHZhbGlkYXRpb25SZXN1bHRbcHJvcGVydHlOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuXG4gICAgICBjb25zdCBuZXdSZWNvcmQgPSBhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuXG4gICAgICBpZiAoIWRlZXBFcXVhbChuZXdSZWNvcmQsIGRhdGEpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5hc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMoJ2xvYWRTZXR0aW5ncycsIHRoaXMuY3VycmVudFN0YXRlLCBpc0luaXRpYWxMb2FkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgYGxvYWRTZXR0aW5nc2AgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWx3YXlzIGBsb2FkU2V0dGluZ3NgLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgb24oXG4gICAgbmFtZTogJ2xvYWRTZXR0aW5ncycsXG4gICAgY2FsbGJhY2s6IChcbiAgICAgIGxvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgaXNJbml0aWFsTG9hZDogYm9vbGVhblxuICAgICkgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJnPzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmO1xuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgYHNhdmVTZXR0aW5nc2AgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gQWx3YXlzIGBzYXZlU2V0dGluZ3NgLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgb24oXG4gICAgbmFtZTogJ3NhdmVTZXR0aW5ncycsXG4gICAgY2FsbGJhY2s6IChcbiAgICAgIG5ld1N0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgICBjb250ZXh0OiB1bmtub3duXG4gICAgKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWY7XG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIGFuIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBgdGhpc2AgY29udGV4dC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjYWxsYmFjazogR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248QXJncz4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBleHRlcm5hbCBzZXR0aW5ncyBjaGFuZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHJlbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmxvYWRGcm9tRmlsZShmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgc2V0dGluZ3MgZnJvbSBmaWxlIGFuZCByZWdpc3RlcnMgZXZlbnQgaGFuZGxlcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLm9uKCdsb2FkU2V0dGluZ3MnLCB0aGlzLm9uTG9hZFNldHRpbmdzLmJpbmQodGhpcykpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignc2F2ZVNldHRpbmdzJywgdGhpcy5vblNhdmVTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBMZWdhY3lTZXR0aW5ncyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBsZWdhY3lTZXR0aW5nc0NsYXNzIC0gVGhlIGxlZ2FjeSBzZXR0aW5ncyBjbGFzcy5cbiAgICogQHBhcmFtIGNvbnZlcnRlciAtIFRoZSBjb252ZXJ0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcjxMZWdhY3lTZXR0aW5ncyBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVnYWN5U2V0dGluZ3NDbGFzczogbmV3ICgpID0+IExlZ2FjeVNldHRpbmdzLFxuICAgIGNvbnZlcnRlcjogKGxlZ2FjeVNldHRpbmdzOiBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+KSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzLnB1c2gobGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIpO1xuXG4gICAgZnVuY3Rpb24gbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogdm9pZCB7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5nc0tleXMgPSBuZXcgU2V0PHN0cmluZz4oT2JqZWN0LmtleXMobmV3IGxlZ2FjeVNldHRpbmdzQ2xhc3MoKSkpO1xuICAgICAgY29uc3QgcGx1Z2luU2V0dGluZ0tleXMgPSBuZXcgU2V0PHN0cmluZz4odGhhdC5wcm9wZXJ0eU5hbWVzKTtcbiAgICAgIGNvbnN0IGxlZ2FjeVNldHRpbmdzID0gcmVjb3JkIGFzIFBhcnRpYWw8TGVnYWN5U2V0dGluZ3M+ICYgUGFydGlhbDxQbHVnaW5TZXR0aW5ncz47XG4gICAgICBjb252ZXJ0ZXIobGVnYWN5U2V0dGluZ3MpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGVnYWN5U2V0dGluZ3MpKSB7XG4gICAgICAgIGlmIChwbHVnaW5TZXR0aW5nS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsZWdhY3lTZXR0aW5nc0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIHJlY29yZFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YWxpZGF0b3IgZm9yIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB2YWxpZGF0b3IgLSBUaGUgdmFsaWRhdG9yLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyVmFsaWRhdG9yPFByb3BlcnR5TmFtZSBleHRlbmRzIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+PihcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICB2YWxpZGF0b3I6IFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzLCBQcm9wZXJ0eU5hbWU+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IgYXMgU2V0dGluZ3NWYWxpZGF0b3I8UGx1Z2luU2V0dGluZ3M+KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZhbGlkYXRlcyB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJldmFsaWRhdGUoKTogUHJvbWlzZTxSZWNvcmQ8UHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+IHtcbiAgICBhd2FpdCB0aGlzLmVkaXQobm9vcCk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRleHQgLSBUaGUgY29udGV4dCBvZiB0aGUgc2F2ZSB0byBmaWxlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzZXR0aW5ncyBhcmUgc2F2ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2F2ZVRvRmlsZShjb250ZXh0PzogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChkZWVwRXF1YWwodGhpcy5sYXN0U2F2ZWRTdGF0ZS5pbnB1dFZhbHVlcywgdGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgIGF3YWl0IHRoaXMuYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKCdzYXZlU2V0dGluZ3MnLCB0aGlzLmN1cnJlbnRTdGF0ZSwgdGhpcy5sYXN0U2F2ZWRTdGF0ZSwgY29udGV4dCk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBQcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRQcm9wZXJ0eTxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV1cbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBhd2FpdCB0aGlzLmVkaXQoKHNldHRpbmdzKSA9PiB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWRhdGlvbiByZXN1bHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGUoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxWYWxpZGF0aW9uUmVzdWx0PFBsdWdpblNldHRpbmdzPj4ge1xuICAgIGNvbnN0IHJlc3VsdDogVmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbGlkYXRvcl0gb2YgdGhpcy52YWxpZGF0b3JzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSBhd2FpdCB2YWxpZGF0b3Ioc2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgc2V0dGluZ3MpO1xuICAgICAgaWYgKHZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0cmFuc2Zvcm1lci5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFRyYW5zZm9ybWVyKCk6IFRyYW5zZm9ybWVyIHtcbiAgICByZXR1cm4gZGVmYXVsdFRyYW5zZm9ybWVyO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgcmVjb3JkIGlzIGxvYWRlZCBmcm9tIGRpc2suXG4gICAqXG4gICAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uTG9hZFJlY29yZChyZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IGNvbnZlcnRlciBvZiB0aGlzLmxlZ2FjeVNldHRpbmdzQ29udmVydGVycykge1xuICAgICAgY29udmVydGVyKHJlY29yZCk7XG4gICAgfVxuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNldHRpbmdzIGFyZSBsb2FkZWQgb3IgcmVsb2FkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfbG9hZGVkU3RhdGUgLSBUaGUgbG9hZGVkIHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX2lzSW5pdGlhbExvYWQgLSBXaGV0aGVyIHRoaXMgaXMgdGhlIGluaXRpYWwgbG9hZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRTZXR0aW5ncyhcbiAgICBfbG9hZGVkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX2lzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKlxuICAgKiBAcGFyYW0gX25ld1N0YXRlIC0gVGhlIG5ldyBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9vbGRTdGF0ZSAtIFRoZSBvbGQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfY29udGV4dCAtIFRoZSBzYXZlIGNvbnRleHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZlU2V0dGluZ3MoXG4gICAgX25ld1N0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9vbGRTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfY29udGV4dDogdW5rbm93blxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIHJlY29yZCBpcyBhYm91dCB0byBiZSBzYXZlZCB0byBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25TYXZpbmdSZWNvcmQoX3JlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlcnMuXG4gICAqIE92ZXJyaWRlIHRvIHJlZ2lzdGVyIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXJzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyTGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzKCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHZhbGlkYXRvcnMuXG4gICAqIE92ZXJyaWRlIHRvIHJlZ2lzdGVyIHZhbGlkYXRvcnMgZm9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVnaXN0ZXJWYWxpZGF0b3JzKCk6IHZvaWQge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xvbmVTZXR0aW5ncyhzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHNldHRpbmdzKTtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkocmVjb3JkKTtcbiAgICBjb25zdCBjbG9uZVJlY29yZCA9IEpTT04ucGFyc2UoanNvbikgYXMgR2VuZXJpY09iamVjdDtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5yYXdSZWNvcmRUb1NldHRpbmdzKGNsb25lUmVjb3JkKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2xvbmVTdGF0ZShcbiAgICBzdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz5cbiAgKTogUHJvbWlzZTxQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPj4ge1xuICAgIHJldHVybiB7XG4gICAgICBlZmZlY3RpdmVWYWx1ZXM6IGF3YWl0IHRoaXMuY2xvbmVTZXR0aW5ncyhzdGF0ZS5lZmZlY3RpdmVWYWx1ZXMpLFxuICAgICAgaW5wdXRWYWx1ZXM6IGF3YWl0IHRoaXMuY2xvbmVTZXR0aW5ncyhzdGF0ZS5pbnB1dFZhbHVlcyksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZXM6IHsgLi4uc3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWZhdWx0U3RhdGUoKTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiB7XG4gICAgICBlZmZlY3RpdmVWYWx1ZXM6IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSxcbiAgICAgIGlucHV0VmFsdWVzOiBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCksXG4gICAgICB2YWxpZGF0aW9uTWVzc2FnZXM6IGNhc3RUbzxSZWNvcmQ8UHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+KHt9KVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVkaXQoc2V0dGluZ3NFZGl0b3I6IChzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpID0+IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0dGluZ3NFZGl0b3IodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG4gICAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0gPz8gJyc7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLnZhbGlkYXRpb25NZXNzYWdlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlLmVmZmVjdGl2ZVZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2VcbiAgICAgICAgICA/IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV1cbiAgICAgICAgICA6IHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzW3Byb3BlcnR5TmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1ZhbGlkUHJvcGVydHlOYW1lKHByb3A6IHVua25vd24pOiBwcm9wIGlzIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLnByb3BlcnR5TmFtZXMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKHByb3ApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByYXdSZWNvcmRUb1NldHRpbmdzKHJhd1JlY29yZDogR2VuZXJpY09iamVjdCk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByYXdSZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmF3UmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLm9uTG9hZFJlY29yZChyYXdSZWNvcmQpO1xuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCk7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd1JlY29yZCkpIHtcbiAgICAgIGlmICghdGhpcy5pc1ZhbGlkUHJvcGVydHlOYW1lKHByb3BlcnR5TmFtZSkpIHtcbiAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1BsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTpyYXdSZWNvcmRUb1NldHRpbmdzJykoYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgZ2V0TGliRGVidWdnZXIoJ1BsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTpyYXdSZWNvcmRUb1NldHRpbmdzJykoXG4gICAgICAgICAgJ1Bvc3NpYmxlIGludmFsaWQgdmFsdWUgdHlwZS4gSXQgbWlnaHQgbGVhZCB0byBhbiB1bmV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBwbHVnaW4uIFRoZXJlIGlzIGFsc28gYSBjaGFuY2UgaXQgaXMgYSBmYWxzZS1uZWdhdGl2ZSB3YXJuaW5nLCBhcyB3ZSBhcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGUgZXhhY3QgdHlwZSBvZiB0aGUgdmFsdWUgaW4gcnVudGltZS4nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZGVmYXVsdHNbcHJvcGVydHlOYW1lXSxcbiAgICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWVdID0gdmFsdWUgYXMgUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3M+O1xuICAgIH1cblxuICAgIHJldHVybiBzZXR0aW5ncztcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVRvRmlsZUltcGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kYXRhSGFuZGxlci5zYXZlRGF0YShhd2FpdCB0aGlzLnNldHRpbmdzVG9SYXdSZWNvcmQodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvcGVydHlJbXBsKFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4sXG4gICAgdmFsdWU6IFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzPixcbiAgICB2YWxpZGF0aW9uTWVzc2FnZT86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlID8/ICcnO1xuICAgIHRoaXMuY3VycmVudFN0YXRlLmVmZmVjdGl2ZVZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsaWRhdGlvbk1lc3NhZ2UgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHRpbmdzVG9SYXdSZWNvcmQoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxHZW5lcmljT2JqZWN0PiB7XG4gICAgY29uc3QgcmF3UmVjb3JkOiBHZW5lcmljT2JqZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgIHJhd1JlY29yZFtwcm9wZXJ0eU5hbWVdID0gc2V0dGluZ3NbcHJvcGVydHlOYW1lXTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLm9uU2F2aW5nUmVjb3JkKHJhd1JlY29yZCk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJBLFNBQVMsbUJBQW1CO0FBQzVCLFNBQVMsc0JBQXNCO0FBQy9CO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUywyQkFBMkI7QUFDcEMsU0FBUyx3QkFBd0I7QUFDakMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUyxzQ0FBc0M7QUFDL0MsU0FBUyw0QkFBNEI7QUFDckMsU0FBUyxzQkFBc0I7QUFDL0IsU0FBUywwQkFBMEI7QUFFbkMsTUFBTSxxQkFBcUIsSUFBSSxpQkFBaUI7QUFBQSxFQUM5QyxJQUFJLCtCQUErQjtBQUFBLEVBQ25DLElBQUksZ0JBQWdCO0FBQUEsRUFDcEIsSUFBSSxvQkFBb0I7QUFBQSxFQUN4QixJQUFJLGVBQWU7QUFBQSxFQUNuQixJQUFJLGVBQWU7QUFBQSxFQUNuQixJQUFJLHFCQUFxQjtBQUMzQixDQUFDO0FB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
475
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbXBvbmVudCB0aGF0IG1hbmFnZXMgcGx1Z2luIHNldHRpbmdzOiBkYXRhLCBwZXJzaXN0ZW5jZSwgdmFsaWRhdGlvbiwgYW5kIGV2ZW50cy5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgcHVibGljLWZhY2luZyBzZXR0aW5ncyBBUEkgZm9yIHBsdWdpbiBhdXRob3JzLlxuICogQWxsIHNldHRpbmdzIGxvZ2ljIChsb2FkLCBzYXZlLCB2YWxpZGF0ZSwgdHJhbnNmb3JtLCBjbG9uZSkgaXMgaGFuZGxlZCBkaXJlY3RseVxuICogYnkgdGhpcyBjb21wb25lbnQgXHUyMDE0IG5vIHNlcGFyYXRlIG1hbmFnZXIgY2xhc3MgaXMgbmVlZGVkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uc3RydWN0b3IsXG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFzeW5jRXZlbnRSZWYsXG4gIEFzeW5jRXZlbnRTb3VyY2Vcbn0gZnJvbSAnLi4vLi4vYXN5bmMtZXZlbnRzLnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi90cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNYXliZVJldHVybixcbiAgU3RyaW5nS2V5c1xufSBmcm9tICcuLi8uLi90eXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRGF0YUhhbmRsZXIgfSBmcm9tICcuLi9kYXRhLWhhbmRsZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5FdmVudFNvdXJjZSB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4udHMnO1xuXG5pbXBvcnQgeyBBc3luY0V2ZW50cyB9IGZyb20gJy4uLy4uL2FzeW5jLWV2ZW50cy50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4uLy4uL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIG5vb3AsXG4gIG5vb3BBc3luY1xufSBmcm9tICcuLi8uLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQge1xuICBjYXN0VG8sXG4gIGRlZXBFcXVhbCxcbiAgZ2V0QWxsS2V5c1xufSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL2RhdGUtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgRHVyYXRpb25UcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9kdXJhdGlvbi10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL2dyb3VwLXRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IE1hcFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL21hcC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBTZXRUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy9zZXQtdHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtZXJzL3NraXAtcHJpdmF0ZS1wcm9wZXJ0eS10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBUd29XYXlNYXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL3RyYW5zZm9ybWVycy90d28td2F5LW1hcC10cmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKCksXG4gIG5ldyBNYXBUcmFuc2Zvcm1lcigpLFxuICBuZXcgU2V0VHJhbnNmb3JtZXIoKSxcbiAgbmV3IFR3b1dheU1hcFRyYW5zZm9ybWVyKClcbl0pO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIHBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUNvbnN0cnVjdG9yUGFyYW1zPFBsdWdpblNldHRpbmdzPiB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YSBoYW5kbGVyIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUhhbmRsZXI6IERhdGFIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIGV2ZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbkV2ZW50U291cmNlOiBQbHVnaW5FdmVudFNvdXJjZTtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBzZXR0aW5ncyBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG59XG5cbi8qKlxuICogQSBzbmFwc2hvdCBvZiBwbHVnaW4gc2V0dGluZ3Mgc3RhdGUsIGluY2x1ZGluZyByYXcgaW5wdXQgdmFsdWVzLCBlZmZlY3RpdmUgKHZhbGlkYXRlZCkgdmFsdWVzLFxuICogYW5kIHBlci1wcm9wZXJ0eSB2YWxpZGF0aW9uIG1lc3NhZ2VzLlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBlZmZlY3RpdmUgc2V0dGluZ3MgdmFsdWVzIHVzZWQgYnkgdGhlIHBsdWdpbi4gSW52YWxpZCBwcm9wZXJ0aWVzIGFyZSByZXBsYWNlZCB3aXRoIGRlZmF1bHRzLlxuICAgKi9cbiAgZWZmZWN0aXZlVmFsdWVzOiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogVGhlIHJhdyBpbnB1dCB2YWx1ZXMgYXMgZW50ZXJlZCBieSB0aGUgdXNlci4gTWF5IGNvbnRhaW4gaW52YWxpZCB2YWx1ZXMuXG4gICAqL1xuICBpbnB1dFZhbHVlczogUGx1Z2luU2V0dGluZ3M7XG5cbiAgLyoqXG4gICAqIFBlci1wcm9wZXJ0eSB2YWxpZGF0aW9uIG1lc3NhZ2VzLiBFbXB0eSBzdHJpbmcgbWVhbnMgdmFsaWQuXG4gICAqL1xuICB2YWxpZGF0aW9uTWVzc2FnZXM6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgc3RyaW5nPjtcbn1cblxuLyoqXG4gKiBSZWFkb25seSB2ZXJzaW9uIG9mIHtAbGluayBQbHVnaW5TZXR0aW5nc30uXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3M8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcblxuLyoqXG4gKiBSZWFkb25seSB2ZXJzaW9uIG9mIHtAbGluayBQbHVnaW5TZXR0aW5nc1N0YXRlfSBmb3IgdXNlIGluIGV2ZW50IGNhbGxiYWNrcyBhbmQgcHVibGljIGdldHRlcnMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCB0eXBlIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gPSBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4+O1xuXG4vKipcbiAqIEEgdmFsaWRhdG9yIGZ1bmN0aW9uIGZvciBhIHNldHRpbmdzIHByb3BlcnR5LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lLlxuICovXG5leHBvcnQgdHlwZSBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdCwgUHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4gPSBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4gPSAoXG4gIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdLFxuICBzZXR0aW5nczogUGx1Z2luU2V0dGluZ3NcbikgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0PiB7XG4gIGxvYWRTZXR0aW5nczogW1xuICAgIGxvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIGlzSW5pdGlhbExvYWQ6IGJvb2xlYW5cbiAgXTtcbiAgc2F2ZVNldHRpbmdzOiBbXG4gICAgbmV3U3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgY29udGV4dDogdW5rbm93blxuICBdO1xufVxuXG50eXBlIFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz47XG5cbnR5cGUgUHJvcGVydHlWYWx1ZXM8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5dO1xuXG50eXBlIFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+ID0gUGFydGlhbDxSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHN0cmluZz4+O1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHBsdWdpbiBzZXR0aW5ncyBjb21wb25lbnRzLlxuICpcbiAqIE1hbmFnZXMgc2V0dGluZ3MgZGF0YSwgcGVyc2lzdGVuY2UsIHZhbGlkYXRpb24sIGFuZCBldmVudHMuXG4gKiBQbHVnaW4gYXV0aG9ycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHtAbGluayBjcmVhdGVEZWZhdWx0U2V0dGluZ3N9LlxuICpcbiAqIEB0eXBlUGFyYW0gUGx1Z2luU2V0dGluZ3MgLSBUaGUgcGx1Z2luIHNldHRpbmdzIHR5cGUuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcmVxdWlyZS1jb21wb25lbnQtc3VmZml4IC0tIE5vbi1hYnN0cmFjdCBiYXNlIGNsYXNzOyBjb25zdW1lcnMgZXh0ZW5kIGl0LlxuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBDb21wb25lbnRFeFxuICBpbXBsZW1lbnRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+PiB7XG4gIC8qKlxuICAgKiBHZXRzIHRoZSByZWFkb25seSBkZWZhdWx0IHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBzZXR0aW5ncyAoYXMgYSByZWFkb25seSBvYmplY3QpLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRTZXR0aW5nczogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgZWZmZWN0aXZlIHNldHRpbmdzICh2YWxpZGF0ZWQsIHdpdGggZGVmYXVsdHMgc3Vic3RpdHV0ZWQgZm9yIGludmFsaWQgdmFsdWVzKS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlYWRvbmx5IGVmZmVjdGl2ZSBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NTdGF0ZS5lZmZlY3RpdmVWYWx1ZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBzZXR0aW5ncyBzdGF0ZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgc2V0dGluZ3Mgc3RhdGUuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNldHRpbmdzU3RhdGUoKTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFN0YXRlIGFzIFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IGFzeW5jRXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPj4oKTtcbiAgcHJpdmF0ZSBjdXJyZW50U3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+O1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFIYW5kbGVyOiBEYXRhSGFuZGxlcjtcbiAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogUGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz47XG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzOiAoKHJlY29yZDogR2VuZXJpY09iamVjdCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luRXZlbnRTb3VyY2U6IFBsdWdpbkV2ZW50U291cmNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzQ2xhc3M6IENvbnN0cnVjdG9yPFBsdWdpblNldHRpbmdzLCBbXT47XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lczogUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz5bXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcnMgPSBuZXcgTWFwPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncz4+KCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIHNldHRpbmdzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlQ29uc3RydWN0b3JQYXJhbXM8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRhdGFIYW5kbGVyID0gcGFyYW1zLmRhdGFIYW5kbGVyO1xuICAgIHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcyA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc0NsYXNzO1xuICAgIHRoaXMucGx1Z2luRXZlbnRTb3VyY2UgPSBwYXJhbXMucGx1Z2luRXZlbnRTb3VyY2U7XG5cbiAgICB0aGlzLmRlZmF1bHRTZXR0aW5ncyA9IG5ldyB0aGlzLnBsdWdpblNldHRpbmdzQ2xhc3MoKSBhcyBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuICAgIHRoaXMuY3VycmVudFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLmxhc3RTYXZlZFN0YXRlID0gdGhpcy5jcmVhdGVEZWZhdWx0U3RhdGUoKTtcbiAgICB0aGlzLnByb3BlcnR5TmFtZXMgPSBnZXRBbGxLZXlzKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB0aGlzLnJlZ2lzdGVyVmFsaWRhdG9ycygpO1xuICAgIHRoaXMucmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0cyB0aGUgcGx1Z2luIHNldHRpbmdzIGFuZCBzYXZlcyB0aGVtLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3NFZGl0b3IgLSBUaGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlZGl0QW5kU2F2ZShzZXR0aW5nc0VkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVkaXQoc2V0dGluZ3NFZGl0b3IpO1xuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZShjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmVzIHRoZSBzZXR0aW5ncyBhcmUgc2FmZS5cbiAgICpcbiAgICogSXQgcnVucyB2YWxpZGF0aW9uIGZvciBlYWNoIHByb3BlcnR5IGFuZCBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB2YWxpZGF0aW9uIGZhaWxzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhZmUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW5zdXJlU2FmZShzZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YWxpZGF0aW9uUmVzdWx0ID0gYXdhaXQgdGhpcy52YWxpZGF0ZShzZXR0aW5ncyk7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiB0aGlzLnByb3BlcnR5TmFtZXMpIHtcbiAgICAgIGlmICh2YWxpZGF0aW9uUmVzdWx0W3Byb3BlcnR5TmFtZV0pIHtcbiAgICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYSBzYWZlIGNvcHkgb2YgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHNhZmUgY29weSBvZiB0aGUgc2V0dGluZ3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U2FmZUNvcHkoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGNvbnN0IHNhZmVTZXR0aW5ncyA9IGF3YWl0IHRoaXMuY2xvbmVTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTYWZlKHNhZmVTZXR0aW5ncyk7XG4gICAgcmV0dXJuIHNhZmVTZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgcGx1Z2luIHNldHRpbmdzIGZyb20gdGhlIGZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBpc0luaXRpYWxMb2FkIC0gV2hldGhlciB0aGUgc2V0dGluZ3MgYXJlIGJlaW5nIGxvYWRlZCBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIGxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsb2FkRnJvbUZpbGUoaXNJbml0aWFsTG9hZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmRhdGFIYW5kbGVyLmxvYWREYXRhKCk7XG4gICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFN0YXRlKCk7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUgPSB0aGlzLmNyZWF0ZURlZmF1bHRTdGF0ZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBzZXR0aW5ncyBmcm9tIGRhdGEuanNvbi4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZW9mIGRhdGF9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmF3UmVjb3JkID0gZGF0YSBhcyBHZW5lcmljT2JqZWN0O1xuICAgICAgY29uc3QgcGFyc2VkU2V0dGluZ3MgPSBhd2FpdCB0aGlzLnJhd1JlY29yZFRvU2V0dGluZ3MocmF3UmVjb3JkKTtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBhd2FpdCB0aGlzLnZhbGlkYXRlKHBhcnNlZFNldHRpbmdzKTtcblxuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIHRoaXMuc2V0UHJvcGVydHlJbXBsKHByb3BlcnR5TmFtZSwgcGFyc2VkU2V0dGluZ3NbcHJvcGVydHlOYW1lXSwgdmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IGF3YWl0IHRoaXMuY2xvbmVTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7XG5cbiAgICAgIGNvbnN0IG5ld1JlY29yZCA9IGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZCh0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlcyk7XG5cbiAgICAgIGlmICghZGVlcEVxdWFsKG5ld1JlY29yZCwgZGF0YSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlSW1wbCgpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYygnbG9hZFNldHRpbmdzJywgdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPiwgaXNJbml0aWFsTG9hZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICovXG4gIHB1YmxpYyBvZmY8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3MgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudHMub2ZmKG5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICovXG4gIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICB0aGlzLmFzeW5jRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uPFxuICAgIEV2ZW50TmFtZSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzQ29tcG9uZW50QmFzZUV2ZW50TWFwPFBsdWdpblNldHRpbmdzPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICBBcmdzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+ID8gUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+W0V2ZW50TmFtZV1cbiAgICAgIDogdW5rbm93bltdXG4gID4obmFtZTogRXZlbnROYW1lLCBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sIHRoaXNBcmc/OiB1bmtub3duKTogQXN5bmNFdmVudFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKi9cbiAgcHVibGljIG9uY2U8XG4gICAgRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgUGx1Z2luU2V0dGluZ3NDb21wb25lbnRCYXNlRXZlbnRNYXA8UGx1Z2luU2V0dGluZ3M+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgIEFyZ3MgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz4gPyBQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2VFdmVudE1hcDxQbHVnaW5TZXR0aW5ncz5bRXZlbnROYW1lXVxuICAgICAgOiB1bmtub3duW11cbiAgPihuYW1lOiBFdmVudE5hbWUsIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPiwgdGhpc0FyZz86IHVua25vd24pOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5hc3luY0V2ZW50cy5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSByZWxvYWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUoZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHNldHRpbmdzIGZyb20gZmlsZSBhbmQgcmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlZ2lzdGVyQXN5bmNFdmVudCh0aGlzLCB0aGlzLm9uKCdsb2FkU2V0dGluZ3MnLCB0aGlzLm9uTG9hZFNldHRpbmdzLmJpbmQodGhpcykpKTtcbiAgICByZWdpc3RlckFzeW5jRXZlbnQodGhpcywgdGhpcy5vbignc2F2ZVNldHRpbmdzJywgdGhpcy5vblNhdmVTZXR0aW5ncy5iaW5kKHRoaXMpKSk7XG4gICAgcmVnaXN0ZXJBc3luY0V2ZW50KHRoaXMsIHRoaXMucGx1Z2luRXZlbnRTb3VyY2Uub24oJ2V4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLCB0aGlzLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZS5iaW5kKHRoaXMpKSk7XG4gICAgYXdhaXQgdGhpcy5sb2FkRnJvbUZpbGUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbGVnYWN5IHNldHRpbmdzIGNvbnZlcnRlci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBMZWdhY3lTZXR0aW5ncyAtIFRoZSBsZWdhY3kgc2V0dGluZ3MgY2xhc3MuXG4gICAqIEBwYXJhbSBsZWdhY3lTZXR0aW5nc0NsYXNzIC0gVGhlIGxlZ2FjeSBzZXR0aW5ncyBjbGFzcy5cbiAgICogQHBhcmFtIGNvbnZlcnRlciAtIFRoZSBjb252ZXJ0ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJMZWdhY3lTZXR0aW5nc0NvbnZlcnRlcjxMZWdhY3lTZXR0aW5ncyBleHRlbmRzIG9iamVjdD4oXG4gICAgbGVnYWN5U2V0dGluZ3NDbGFzczogbmV3ICgpID0+IExlZ2FjeVNldHRpbmdzLFxuICAgIGNvbnZlcnRlcjogKGxlZ2FjeVNldHRpbmdzOiBQYXJ0aWFsPExlZ2FjeVNldHRpbmdzPiAmIFBhcnRpYWw8UGx1Z2luU2V0dGluZ3M+KSA9PiB2b2lkXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgIHRoaXMubGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXJzLnB1c2gobGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIpO1xuXG4gICAgZnVuY3Rpb24gbGVnYWN5U2V0dGluZ3NDb252ZXJ0ZXIocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogdm9pZCB7XG4gICAgICBjb25zdCBsZWdhY3lTZXR0aW5nc0tleXMgPSBuZXcgU2V0PHN0cmluZz4oT2JqZWN0LmtleXMobmV3IGxlZ2FjeVNldHRpbmdzQ2xhc3MoKSkpO1xuICAgICAgY29uc3QgcGx1Z2luU2V0dGluZ0tleXMgPSBuZXcgU2V0PHN0cmluZz4odGhhdC5wcm9wZXJ0eU5hbWVzKTtcbiAgICAgIGNvbnN0IGxlZ2FjeVNldHRpbmdzID0gcmVjb3JkIGFzIFBhcnRpYWw8TGVnYWN5U2V0dGluZ3M+ICYgUGFydGlhbDxQbHVnaW5TZXR0aW5ncz47XG4gICAgICBjb252ZXJ0ZXIobGVnYWN5U2V0dGluZ3MpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobGVnYWN5U2V0dGluZ3MpKSB7XG4gICAgICAgIGlmIChwbHVnaW5TZXR0aW5nS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFsZWdhY3lTZXR0aW5nc0tleXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGUgLS0gV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8gZGVsZXRlIHRoZSBwcm9wZXJ0eS5cbiAgICAgICAgZGVsZXRlIHJlY29yZFtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSB2YWxpZGF0b3IgZm9yIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNldHRpbmdzIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsaWRhdG9yIC0gVGhlIHZhbGlkYXRvci5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclZhbGlkYXRvcjxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsaWRhdG9yOiBTZXR0aW5nc1ZhbGlkYXRvcjxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHlOYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRvcnMuc2V0KHByb3BlcnR5TmFtZSwgdmFsaWRhdG9yIGFzIFNldHRpbmdzVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzPik7XG4gIH1cblxuICAvKipcbiAgICogUmV2YWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdmFsaWRhdGlvbiBtZXNzYWdlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZhbGlkYXRlKCk6IFByb21pc2U8UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+PiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KG5vb3ApO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXM7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIHNhdmUgdG8gZmlsZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoY29udGV4dD86IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZGVlcEVxdWFsKHRoaXMubGFzdFNhdmVkU3RhdGUuaW5wdXRWYWx1ZXMsIHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICBhd2FpdCB0aGlzLmFzeW5jRXZlbnRzLnRyaWdnZXJBc3luYyhcbiAgICAgICdzYXZlU2V0dGluZ3MnLFxuICAgICAgdGhpcy5jdXJyZW50U3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgYXMgUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICAgIGNvbnRleHRcbiAgICApO1xuICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSBhd2FpdCB0aGlzLmNsb25lU3RhdGUodGhpcy5jdXJyZW50U3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgUHJvcGVydHlOYW1lczxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgYXdhaXQgdGhpcy5lZGl0KChzZXR0aW5ncykgPT4ge1xuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkYXRpb24gcmVzdWx0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdDxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQ8UGx1Z2luU2V0dGluZ3M+ID0ge307XG4gICAgZm9yIChjb25zdCBbcHJvcGVydHlOYW1lLCB2YWxpZGF0b3JdIG9mIHRoaXMudmFsaWRhdG9ycy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gYXdhaXQgdmFsaWRhdG9yKHNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHNldHRpbmdzKTtcbiAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgICByZXN1bHRbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHJhbnNmb3JtZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc2Zvcm1lci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIHJlY29yZCBpcyBsb2FkZWQgZnJvbSBkaXNrLlxuICAgKlxuICAgKiBAcGFyYW0gcmVjb3JkIC0gVGhlIHJlY29yZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBvbkxvYWRSZWNvcmQocmVjb3JkOiBHZW5lcmljT2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBjb252ZXJ0ZXIgb2YgdGhpcy5sZWdhY3lTZXR0aW5nc0NvbnZlcnRlcnMpIHtcbiAgICAgIGNvbnZlcnRlcihyZWNvcmQpO1xuICAgIH1cbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZXR0aW5ncyBhcmUgbG9hZGVkIG9yIHJlbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX2xvYWRlZFN0YXRlIC0gVGhlIGxvYWRlZCBzZXR0aW5ncyBzdGF0ZS5cbiAgICogQHBhcmFtIF9pc0luaXRpYWxMb2FkIC0gV2hldGhlciB0aGlzIGlzIHRoZSBpbml0aWFsIGxvYWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgb25Mb2FkU2V0dGluZ3MoXG4gICAgX2xvYWRlZFN0YXRlOiBSZWFkb25seVBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+LFxuICAgIF9pc0luaXRpYWxMb2FkOiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5vb3BBc3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICpcbiAgICogQHBhcmFtIF9uZXdTdGF0ZSAtIFRoZSBuZXcgc2V0dGluZ3Mgc3RhdGUuXG4gICAqIEBwYXJhbSBfb2xkU3RhdGUgLSBUaGUgb2xkIHNldHRpbmdzIHN0YXRlLlxuICAgKiBAcGFyYW0gX2NvbnRleHQgLSBUaGUgc2F2ZSBjb250ZXh0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2F2ZVNldHRpbmdzKFxuICAgIF9uZXdTdGF0ZTogUmVhZG9ubHlQbHVnaW5TZXR0aW5nc1N0YXRlPFBsdWdpblNldHRpbmdzPixcbiAgICBfb2xkU3RhdGU6IFJlYWRvbmx5UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgX2NvbnRleHQ6IHVua25vd25cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyByZWNvcmQgaXMgYWJvdXQgdG8gYmUgc2F2ZWQgdG8gZGlzay5cbiAgICpcbiAgICogQHBhcmFtIF9yZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU2F2aW5nUmVjb3JkKF9yZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBub29wQXN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGxlZ2FjeSBzZXR0aW5ncyBjb252ZXJ0ZXJzLlxuICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBsZWdhY3kgc2V0dGluZ3MgY29udmVydGVycy5cbiAgICovXG4gIHByb3RlY3RlZCByZWdpc3RlckxlZ2FjeVNldHRpbmdzQ29udmVydGVycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSB2YWxpZGF0b3JzLlxuICAgKiBPdmVycmlkZSB0byByZWdpc3RlciB2YWxpZGF0b3JzIGZvciBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyVmFsaWRhdG9ycygpOiB2b2lkIHtcbiAgICBub29wKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsb25lU2V0dGluZ3Moc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKTogUHJvbWlzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHRoaXMuc2V0dGluZ3NUb1Jhd1JlY29yZChzZXR0aW5ncyk7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgY29uc3QgY2xvbmVSZWNvcmQgPSBKU09OLnBhcnNlKGpzb24pIGFzIEdlbmVyaWNPYmplY3Q7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucmF3UmVjb3JkVG9TZXR0aW5ncyhjbG9uZVJlY29yZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsb25lU3RhdGUoXG4gICAgc3RhdGU6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+XG4gICk6IFByb21pc2U8UGx1Z2luU2V0dGluZ3NTdGF0ZTxQbHVnaW5TZXR0aW5ncz4+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWZmZWN0aXZlVmFsdWVzOiBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc3RhdGUuZWZmZWN0aXZlVmFsdWVzKSxcbiAgICAgIGlucHV0VmFsdWVzOiBhd2FpdCB0aGlzLmNsb25lU2V0dGluZ3Moc3RhdGUuaW5wdXRWYWx1ZXMpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiB7IC4uLnN0YXRlLnZhbGlkYXRpb25NZXNzYWdlcyB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVmYXVsdFN0YXRlKCk6IFBsdWdpblNldHRpbmdzU3RhdGU8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4ge1xuICAgICAgZWZmZWN0aXZlVmFsdWVzOiBuZXcgdGhpcy5wbHVnaW5TZXR0aW5nc0NsYXNzKCksXG4gICAgICBpbnB1dFZhbHVlczogbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2VzOiBjYXN0VG88UmVjb3JkPFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LCBzdHJpbmc+Pih7fSlcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlZGl0KHNldHRpbmdzRWRpdG9yOiAoc2V0dGluZ3M6IFBsdWdpblNldHRpbmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldHRpbmdzRWRpdG9yKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IGF3YWl0IHRoaXMudmFsaWRhdGUodGhpcy5jdXJyZW50U3RhdGUuaW5wdXRWYWx1ZXMpO1xuICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdFtwcm9wZXJ0eU5hbWVdID8/ICcnO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS52YWxpZGF0aW9uTWVzc2FnZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgICBjb25zdCBkZWZhdWx0cyA9IHRoaXMuZGVmYXVsdFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlXG4gICAgICAgICAgPyBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdXG4gICAgICAgICAgOiB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wOiB1bmtub3duKTogcHJvcCBpcyBQcm9wZXJ0eU5hbWVzPFBsdWdpblNldHRpbmdzPiB7XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5wcm9wZXJ0eU5hbWVzIGFzIHN0cmluZ1tdKS5pbmNsdWRlcyhwcm9wKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmF3UmVjb3JkVG9TZXR0aW5ncyhyYXdSZWNvcmQ6IEdlbmVyaWNPYmplY3QpOiBQcm9taXNlPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmF3UmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJhd1JlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmF3UmVjb3JkKTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0gbmV3IHRoaXMucGx1Z2luU2V0dGluZ3NDbGFzcygpO1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5kZWZhdWx0U2V0dGluZ3MgYXMgUGx1Z2luU2V0dGluZ3M7XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyYXdSZWNvcmQpKSB7XG4gICAgICBpZiAoIXRoaXMuaXNWYWxpZFByb3BlcnR5TmFtZShwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIGdldExpYkRlYnVnZ2VyKCdQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U6cmF3UmVjb3JkVG9TZXR0aW5ncycpKGBVbmtub3duIHByb3BlcnR5OiAke3Byb3BlcnR5TmFtZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IHR5cGVvZiBkZWZhdWx0c1twcm9wZXJ0eU5hbWVdKSB7XG4gICAgICAgIGdldExpYkRlYnVnZ2VyKCdQbHVnaW5TZXR0aW5nc0NvbXBvbmVudEJhc2U6cmF3UmVjb3JkVG9TZXR0aW5ncycpKFxuICAgICAgICAgICdQb3NzaWJsZSBpbnZhbGlkIHZhbHVlIHR5cGUuIEl0IG1pZ2h0IGxlYWQgdG8gYW4gdW5leHBlY3RlZCBiZWhhdmlvciBvZiB0aGUgcGx1Z2luLiBUaGVyZSBpcyBhbHNvIGEgY2hhbmNlIGl0IGlzIGEgZmFsc2UtbmVnYXRpdmUgd2FybmluZywgYXMgd2UgYXJlIHVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGV4YWN0IHR5cGUgb2YgdGhlIHZhbHVlIGluIHJ1bnRpbWUuJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRzW3Byb3BlcnR5TmFtZV0sXG4gICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc2V0dGluZ3NbcHJvcGVydHlOYW1lXSA9IHZhbHVlIGFzIFByb3BlcnR5VmFsdWVzPFBsdWdpblNldHRpbmdzPjtcbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNhdmVUb0ZpbGVJbXBsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGF0YUhhbmRsZXIuc2F2ZURhdGEoYXdhaXQgdGhpcy5zZXR0aW5nc1RvUmF3UmVjb3JkKHRoaXMuY3VycmVudFN0YXRlLmlucHV0VmFsdWVzKSk7XG4gIH1cblxuICBwcml2YXRlIHNldFByb3BlcnR5SW1wbChcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZXM8UGx1Z2luU2V0dGluZ3M+LFxuICAgIHZhbHVlOiBQcm9wZXJ0eVZhbHVlczxQbHVnaW5TZXR0aW5ncz4sXG4gICAgdmFsaWRhdGlvbk1lc3NhZ2U/OiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRTZXR0aW5ncyBhcyBQbHVnaW5TZXR0aW5ncztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5pbnB1dFZhbHVlc1twcm9wZXJ0eU5hbWVdID0gdmFsdWU7XG4gICAgdGhpcy5jdXJyZW50U3RhdGUudmFsaWRhdGlvbk1lc3NhZ2VzW3Byb3BlcnR5TmFtZV0gPSB2YWxpZGF0aW9uTWVzc2FnZSA/PyAnJztcbiAgICB0aGlzLmN1cnJlbnRTdGF0ZS5lZmZlY3RpdmVWYWx1ZXNbcHJvcGVydHlOYW1lXSA9IHZhbGlkYXRpb25NZXNzYWdlID8gZGVmYXVsdHNbcHJvcGVydHlOYW1lXSA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR0aW5nc1RvUmF3UmVjb3JkKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2U8R2VuZXJpY09iamVjdD4ge1xuICAgIGNvbnN0IHJhd1JlY29yZDogR2VuZXJpY09iamVjdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgb2YgdGhpcy5wcm9wZXJ0eU5hbWVzKSB7XG4gICAgICByYXdSZWNvcmRbcHJvcGVydHlOYW1lXSA9IHNldHRpbmdzW3Byb3BlcnR5TmFtZV07XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChyYXdSZWNvcmQpO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm1PYmplY3RSZWN1cnNpdmVseShyYXdSZWNvcmQpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZCQSxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsdUJBQXVCO0FBQ2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsc0NBQXNDO0FBQy9DLFNBQVMsNEJBQTRCO0FBQ3JDLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsbUJBQW1CO0FBRTVCLE1BQU0scUJBQXFCLElBQUksaUJBQWlCO0FBQUEsRUFDOUMsSUFBSSwrQkFBK0I7QUFBQSxFQUNuQyxJQUFJLGdCQUFnQjtBQUFBLEVBQ3BCLElBQUksb0JBQW9CO0FBQUEsRUFDeEIsSUFBSSxlQUFlO0FBQUEsRUFDbkIsSUFBSSxlQUFlO0FBQUEsRUFDbkIsSUFBSSxxQkFBcUI7QUFDM0IsQ0FBQztBQW1HTSxNQUFNLG9DQUFtRSxZQUNH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
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import type { Plugin } from 'obsidian';
8
8
  import { PluginSettingTab } from 'obsidian';
9
- import { DisposableComponent } from './disposable-component.mjs';
9
+ import { ComponentEx } from './component-ex.mjs';
10
10
  interface PluginSettingsTabComponentConstructorParams {
11
11
  readonly plugin: Plugin;
12
12
  readonly pluginSettingsTab: PluginSettingTab;
@@ -15,7 +15,7 @@ interface PluginSettingsTabComponentConstructorParams {
15
15
  * Wraps a {@link PluginSettingTab} and registers it with Obsidian on load.
16
16
  * Also registers an "Open Settings" command to open the settings tab from the command palette.
17
17
  */
18
- export declare class PluginSettingsTabComponent extends DisposableComponent {
18
+ export declare class PluginSettingsTabComponent extends ComponentEx {
19
19
  private readonly plugin;
20
20
  private readonly pluginSettingsTab;
21
21
  /**
@@ -22,8 +22,8 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { PluginSettingTab } from "obsidian";
25
- import { DisposableComponent } from "./disposable-component.mjs";
26
- class PluginSettingsTabComponent extends DisposableComponent {
25
+ import { ComponentEx } from "./component-ex.mjs";
26
+ class PluginSettingsTabComponent extends ComponentEx {
27
27
  plugin;
28
28
  pluginSettingsTab;
29
29
  /**
@@ -46,4 +46,4 @@ class PluginSettingsTabComponent extends DisposableComponent {
46
46
  export {
47
47
  PluginSettingsTabComponent
48
48
  };
49
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCByZWdpc3RlcnMgYSBwbHVnaW4gc2V0dGluZ3MgdGFiIHdpdGggT2JzaWRpYW4uXG4gKiBBbHNvIHJlZ2lzdGVycyBhbiBcIk9wZW4gU2V0dGluZ3NcIiBjb21tYW5kIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IERpc3Bvc2FibGVDb21wb25lbnQgfSBmcm9tICcuL2Rpc3Bvc2FibGUtY29tcG9uZW50LnRzJztcblxuaW50ZXJmYWNlIFBsdWdpblNldHRpbmdzVGFiQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbiAgcmVhZG9ubHkgcGx1Z2luU2V0dGluZ3NUYWI6IFBsdWdpblNldHRpbmdUYWI7XG59XG5cbi8qKlxuICogV3JhcHMgYSB7QGxpbmsgUGx1Z2luU2V0dGluZ1RhYn0gYW5kIHJlZ2lzdGVycyBpdCB3aXRoIE9ic2lkaWFuIG9uIGxvYWQuXG4gKiBBbHNvIHJlZ2lzdGVycyBhbiBcIk9wZW4gU2V0dGluZ3NcIiBjb21tYW5kIHRvIG9wZW4gdGhlIHNldHRpbmdzIHRhYiBmcm9tIHRoZSBjb21tYW5kIHBhbGV0dGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkNvbXBvbmVudCBleHRlbmRzIERpc3Bvc2FibGVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzVGFiOiBQbHVnaW5TZXR0aW5nVGFiO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBzZXR0aW5ncyB0YWIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgY29tcG9uZW50IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc1RhYiA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc1RhYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHNldHRpbmdzIHRhYiBhbmQgYW4gXCJPcGVuIFNldHRpbmdzXCIgY29tbWFuZCB3aXRoIE9ic2lkaWFuLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsdWdpbi5hZGRTZXR0aW5nVGFiKHRoaXMucGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsd0JBQXdCO0FBRWpDLFNBQVMsMkJBQTJCO0FBVzdCLE1BQU0sbUNBQW1DLG9CQUFvQjtBQUFBLEVBQ2pEO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBcUQ7QUFDdEUsVUFBTTtBQUNOLFNBQUssU0FBUyxPQUFPO0FBQ3JCLFNBQUssb0JBQW9CLE9BQU87QUFBQSxFQUNsQztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFNBQWU7QUFDN0IsU0FBSyxPQUFPLGNBQWMsS0FBSyxpQkFBaUI7QUFBQSxFQUNsRDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
49
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCByZWdpc3RlcnMgYSBwbHVnaW4gc2V0dGluZ3MgdGFiIHdpdGggT2JzaWRpYW4uXG4gKiBBbHNvIHJlZ2lzdGVycyBhbiBcIk9wZW4gU2V0dGluZ3NcIiBjb21tYW5kIGF1dG9tYXRpY2FsbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG5pbnRlcmZhY2UgUGx1Z2luU2V0dGluZ3NUYWJDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICByZWFkb25seSBwbHVnaW5TZXR0aW5nc1RhYjogUGx1Z2luU2V0dGluZ1RhYjtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHtAbGluayBQbHVnaW5TZXR0aW5nVGFifSBhbmQgcmVnaXN0ZXJzIGl0IHdpdGggT2JzaWRpYW4gb24gbG9hZC5cbiAqIEFsc28gcmVnaXN0ZXJzIGFuIFwiT3BlbiBTZXR0aW5nc1wiIGNvbW1hbmQgdG8gb3BlbiB0aGUgc2V0dGluZ3MgdGFiIGZyb20gdGhlIGNvbW1hbmQgcGFsZXR0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpblNldHRpbmdzVGFiOiBQbHVnaW5TZXR0aW5nVGFiO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBzZXR0aW5ncyB0YWIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIgY29tcG9uZW50IGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5TZXR0aW5nc1RhYkNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5TZXR0aW5nc1RhYiA9IHBhcmFtcy5wbHVnaW5TZXR0aW5nc1RhYjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIHNldHRpbmdzIHRhYiBhbmQgYW4gXCJPcGVuIFNldHRpbmdzXCIgY29tbWFuZCB3aXRoIE9ic2lkaWFuLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsdWdpbi5hZGRTZXR0aW5nVGFiKHRoaXMucGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVNBLFNBQVMsd0JBQXdCO0FBRWpDLFNBQVMsbUJBQW1CO0FBV3JCLE1BQU0sbUNBQW1DLFlBQVk7QUFBQSxFQUN6QztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQXFEO0FBQ3RFLFVBQU07QUFDTixTQUFLLFNBQVMsT0FBTztBQUNyQixTQUFLLG9CQUFvQixPQUFPO0FBQUEsRUFDbEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLFNBQUssT0FBTyxjQUFjLEtBQUssaUJBQWlCO0FBQUEsRUFDbEQ7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * {@link RegistryComponent}.
5
+ */
6
+ import type { Constructor } from 'type-fest';
7
+ import { ComponentEx } from './component-ex.mjs';
8
+ /**
9
+ * A component that keeps registry of its children.
10
+ */
11
+ export declare class RegistryComponent extends ComponentEx {
12
+ /**
13
+ * Get the single child of the given type.
14
+ *
15
+ * @typeParam TComponent - The type of component to get.
16
+ * @param componentClass - The class of the component to get.
17
+ * @returns The single registered child of the given type.
18
+ */
19
+ getChild<TComponent>(componentClass: Constructor<TComponent>): TComponent;
20
+ /**
21
+ * Get the single child of the given type.
22
+ *
23
+ * @typeParam TComponent - The type of component to get.
24
+ * @param componentClass - The class of the component to get.
25
+ * @returns The single registered child of the given type, or `null` if none are registered.
26
+ */
27
+ getChildOrNull<TComponent>(componentClass: Constructor<TComponent>): null | TComponent;
28
+ /**
29
+ * Get all children of the given type.
30
+ *
31
+ * @typeParam TComponent - The type of component to get.
32
+ * @param componentClass - The class of the component to get.
33
+ * @returns All registered children of the given type.
34
+ */
35
+ getChildren<TComponent>(componentClass: Constructor<TComponent>): TComponent[];
36
+ }