@mnaoumov/obsidian-lib 10.5.0 → 10.6.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 (160) hide show
  1. package/README.md +6 -0
  2. package/codemirror/inline-token-widgets/package.json +6 -0
  3. package/codemirror/settings-facet/package.json +6 -0
  4. package/components/settings-facet-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +104 -1
  6. package/dist/lib/cjs/__merged.d.cts +20 -3
  7. package/dist/lib/cjs/anchored-suggest.cjs +232 -0
  8. package/dist/lib/cjs/anchored-suggest.d.cts +116 -0
  9. package/dist/lib/cjs/backlink-index.cjs +44 -8
  10. package/dist/lib/cjs/backlink-index.d.cts +23 -0
  11. package/dist/lib/cjs/bug-report.cjs +4 -2
  12. package/dist/lib/cjs/bug-report.d.cts +1 -1
  13. package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
  14. package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
  15. package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
  16. package/dist/lib/cjs/code-block-render-handoff.cjs +272 -0
  17. package/dist/lib/cjs/code-block-render-handoff.d.cts +131 -0
  18. package/dist/lib/cjs/codemirror/index.cjs +7 -1
  19. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  20. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +250 -0
  21. package/dist/lib/cjs/codemirror/inline-token-widgets.d.cts +109 -0
  22. package/dist/lib/cjs/codemirror/settings-facet.cjs +132 -0
  23. package/dist/lib/cjs/codemirror/settings-facet.d.cts +19 -0
  24. package/dist/lib/cjs/community-plugins.cjs +19 -2
  25. package/dist/lib/cjs/community-plugins.d.cts +14 -0
  26. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
  27. package/dist/lib/cjs/components/index.cjs +4 -1
  28. package/dist/lib/cjs/components/index.d.cts +1 -0
  29. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
  30. package/dist/lib/cjs/components/settings-facet-component.cjs +136 -0
  31. package/dist/lib/cjs/components/settings-facet-component.d.cts +68 -0
  32. package/dist/lib/cjs/css-class.cjs +8 -1
  33. package/dist/lib/cjs/css-class.d.cts +28 -0
  34. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
  35. package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
  36. package/dist/lib/cjs/desktop-request-url-stream.cjs +258 -0
  37. package/dist/lib/cjs/desktop-request-url-stream.d.cts +22 -0
  38. package/dist/lib/cjs/editor-suggest-registrar.cjs +8 -2
  39. package/dist/lib/cjs/editor-suggest-registrar.d.cts +14 -2
  40. package/dist/lib/cjs/editor-suggest.cjs +198 -0
  41. package/dist/lib/cjs/editor-suggest.d.cts +103 -0
  42. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  43. package/dist/lib/cjs/hotkey.cjs +185 -0
  44. package/dist/lib/cjs/hotkey.d.cts +59 -0
  45. package/dist/lib/cjs/i18n/locales/en.cjs +14 -1
  46. package/dist/lib/cjs/i18n/locales/en.d.cts +13 -0
  47. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +13 -0
  48. package/dist/lib/cjs/index.cjs +31 -1
  49. package/dist/lib/cjs/index.d.cts +10 -0
  50. package/dist/lib/cjs/inline-token-renderer.cjs +145 -0
  51. package/dist/lib/cjs/inline-token-renderer.d.cts +88 -0
  52. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +325 -0
  53. package/dist/lib/cjs/link-and-tag-input-suggest.d.cts +229 -0
  54. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -1
  55. package/dist/lib/cjs/markdown-code-block-processor.d.cts +18 -0
  56. package/dist/lib/cjs/markdown.cjs +6 -1
  57. package/dist/lib/cjs/markdown.d.cts +10 -1
  58. package/dist/lib/cjs/modals/modal.cjs +8 -5
  59. package/dist/lib/cjs/modals/modal.d.cts +4 -0
  60. package/dist/lib/cjs/plugin/plugin.cjs +5 -2
  61. package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
  62. package/dist/lib/cjs/rendered-markdown.cjs +306 -0
  63. package/dist/lib/cjs/rendered-markdown.d.cts +77 -0
  64. package/dist/lib/cjs/request-url.cjs +523 -0
  65. package/dist/lib/cjs/request-url.d.cts +233 -0
  66. package/dist/lib/cjs/setting-components/folder-list-component.cjs +216 -0
  67. package/dist/lib/cjs/setting-components/folder-list-component.d.cts +73 -0
  68. package/dist/lib/cjs/setting-components/hotkey-component.cjs +260 -0
  69. package/dist/lib/cjs/setting-components/hotkey-component.d.cts +85 -0
  70. package/dist/lib/cjs/setting-components/index.cjs +13 -1
  71. package/dist/lib/cjs/setting-components/index.d.cts +4 -0
  72. package/dist/lib/cjs/setting-components/list-component.cjs +291 -0
  73. package/dist/lib/cjs/setting-components/list-component.d.cts +106 -0
  74. package/dist/lib/cjs/setting-components/tag-list-component.cjs +220 -0
  75. package/dist/lib/cjs/setting-components/tag-list-component.d.cts +82 -0
  76. package/dist/lib/cjs/setting-ex.cjs +51 -1
  77. package/dist/lib/cjs/setting-ex.d.cts +35 -1
  78. package/dist/lib/cjs/settings-tabs.cjs +258 -0
  79. package/dist/lib/cjs/settings-tabs.d.cts +101 -0
  80. package/dist/lib/esm/__merged.d.mts +20 -3
  81. package/dist/lib/esm/__merged.mjs +110 -2
  82. package/dist/lib/esm/anchored-suggest.d.mts +116 -0
  83. package/dist/lib/esm/anchored-suggest.mjs +144 -0
  84. package/dist/lib/esm/backlink-index.d.mts +23 -0
  85. package/dist/lib/esm/backlink-index.mjs +42 -7
  86. package/dist/lib/esm/bug-report.d.mts +1 -1
  87. package/dist/lib/esm/bug-report.mjs +4 -2
  88. package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
  89. package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
  90. package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
  91. package/dist/lib/esm/code-block-render-handoff.d.mts +131 -0
  92. package/dist/lib/esm/code-block-render-handoff.mjs +183 -0
  93. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  94. package/dist/lib/esm/codemirror/index.mjs +5 -1
  95. package/dist/lib/esm/codemirror/inline-token-widgets.d.mts +109 -0
  96. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +167 -0
  97. package/dist/lib/esm/codemirror/settings-facet.d.mts +19 -0
  98. package/dist/lib/esm/codemirror/settings-facet.mjs +44 -0
  99. package/dist/lib/esm/community-plugins.d.mts +14 -0
  100. package/dist/lib/esm/community-plugins.mjs +18 -2
  101. package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
  102. package/dist/lib/esm/components/index.d.mts +1 -0
  103. package/dist/lib/esm/components/index.mjs +3 -1
  104. package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
  105. package/dist/lib/esm/components/settings-facet-component.d.mts +68 -0
  106. package/dist/lib/esm/components/settings-facet-component.mjs +48 -0
  107. package/dist/lib/esm/css-class.d.mts +28 -0
  108. package/dist/lib/esm/css-class.mjs +8 -1
  109. package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
  110. package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
  111. package/dist/lib/esm/desktop-request-url-stream.d.mts +22 -0
  112. package/dist/lib/esm/desktop-request-url-stream.mjs +170 -0
  113. package/dist/lib/esm/editor-suggest-registrar.d.mts +14 -2
  114. package/dist/lib/esm/editor-suggest-registrar.mjs +8 -2
  115. package/dist/lib/esm/editor-suggest.d.mts +103 -0
  116. package/dist/lib/esm/editor-suggest.mjs +109 -0
  117. package/dist/lib/esm/generated-during-build.mjs +2 -2
  118. package/dist/lib/esm/hotkey.d.mts +59 -0
  119. package/dist/lib/esm/hotkey.mjs +95 -0
  120. package/dist/lib/esm/i18n/locales/en.d.mts +13 -0
  121. package/dist/lib/esm/i18n/locales/en.mjs +14 -1
  122. package/dist/lib/esm/i18n/locales/translations-map.d.mts +13 -0
  123. package/dist/lib/esm/index.d.mts +10 -0
  124. package/dist/lib/esm/index.mjs +21 -1
  125. package/dist/lib/esm/inline-token-renderer.d.mts +88 -0
  126. package/dist/lib/esm/inline-token-renderer.mjs +59 -0
  127. package/dist/lib/esm/link-and-tag-input-suggest.d.mts +229 -0
  128. package/dist/lib/esm/link-and-tag-input-suggest.mjs +239 -0
  129. package/dist/lib/esm/markdown-code-block-processor.d.mts +18 -0
  130. package/dist/lib/esm/markdown-code-block-processor.mjs +16 -1
  131. package/dist/lib/esm/markdown.d.mts +10 -1
  132. package/dist/lib/esm/markdown.mjs +9 -1
  133. package/dist/lib/esm/modals/modal.d.mts +4 -0
  134. package/dist/lib/esm/modals/modal.mjs +8 -5
  135. package/dist/lib/esm/plugin/plugin.d.mts +2 -0
  136. package/dist/lib/esm/plugin/plugin.mjs +5 -2
  137. package/dist/lib/esm/rendered-markdown.d.mts +77 -0
  138. package/dist/lib/esm/rendered-markdown.mjs +219 -0
  139. package/dist/lib/esm/request-url.d.mts +233 -0
  140. package/dist/lib/esm/request-url.mjs +428 -0
  141. package/dist/lib/esm/setting-components/folder-list-component.d.mts +73 -0
  142. package/dist/lib/esm/setting-components/folder-list-component.mjs +131 -0
  143. package/dist/lib/esm/setting-components/hotkey-component.d.mts +85 -0
  144. package/dist/lib/esm/setting-components/hotkey-component.mjs +178 -0
  145. package/dist/lib/esm/setting-components/index.d.mts +4 -0
  146. package/dist/lib/esm/setting-components/index.mjs +9 -1
  147. package/dist/lib/esm/setting-components/list-component.d.mts +106 -0
  148. package/dist/lib/esm/setting-components/list-component.mjs +206 -0
  149. package/dist/lib/esm/setting-components/tag-list-component.d.mts +82 -0
  150. package/dist/lib/esm/setting-components/tag-list-component.mjs +131 -0
  151. package/dist/lib/esm/setting-ex.d.mts +35 -1
  152. package/dist/lib/esm/setting-ex.mjs +51 -1
  153. package/dist/lib/esm/settings-tabs.d.mts +101 -0
  154. package/dist/lib/esm/settings-tabs.mjs +170 -0
  155. package/dist/styles.css +83 -1
  156. package/package.json +3 -3
  157. package/setting-components/folder-list-component/package.json +6 -0
  158. package/setting-components/hotkey-component/package.json +6 -0
  159. package/setting-components/list-component/package.json +6 -0
  160. package/setting-components/tag-list-component/package.json +6 -0
@@ -0,0 +1,68 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Contains class {@link SettingsFacetComponent}: a plugin's settings provided to a settings facet in every editor,
6
+ * swapped at runtime.
7
+ */
8
+ import type { Facet } from '@codemirror/state';
9
+ import type { ReconfigurableEditorExtensionComponentConstructorParams } from './reconfigurable-editor-extension-component.mjs';
10
+ import { ReconfigurableEditorExtensionComponent } from './reconfigurable-editor-extension-component.mjs';
11
+ /**
12
+ * Parameters for the {@link SettingsFacetComponent} constructor.
13
+ *
14
+ * @typeParam T - The settings type.
15
+ */
16
+ export interface SettingsFacetComponentConstructorParams<T> extends Pick<ReconfigurableEditorExtensionComponentConstructorParams, 'app' | 'editorExtensionRegistrar'> {
17
+ /**
18
+ * The facet the settings are provided to, usually made by `createSettingsFacet`.
19
+ */
20
+ readonly facet: Facet<T, T>;
21
+ /**
22
+ * The settings the editors start with.
23
+ */
24
+ readonly settings: T;
25
+ }
26
+ /**
27
+ * Provides a plugin's settings to a settings facet in every open editor and in every editor opened later.
28
+ *
29
+ * @typeParam T - The settings type.
30
+ *
31
+ * @example
32
+ * ```ts
33
+ * const settingsFacet = createSettingsFacet<MySettings>(DEFAULT_SETTINGS);
34
+ * const settingsFacetComponent = this.addChild(new SettingsFacetComponent({
35
+ * app: this.app,
36
+ * editorExtensionRegistrar: new PluginEditorExtensionRegistrar(this),
37
+ * facet: settingsFacet,
38
+ * settings: this.settings
39
+ * }));
40
+ * // After the settings change:
41
+ * settingsFacetComponent.setSettings(this.settings);
42
+ * ```
43
+ */
44
+ export declare class SettingsFacetComponent<T> extends ReconfigurableEditorExtensionComponent {
45
+ /**
46
+ * The settings the editors currently read.
47
+ *
48
+ * @returns The current settings.
49
+ */
50
+ get settings(): T;
51
+ /**
52
+ * The facet the settings are provided to.
53
+ */
54
+ protected readonly facet: Facet<T, T>;
55
+ private _settings;
56
+ /**
57
+ * Creates a new instance of the {@link SettingsFacetComponent} class.
58
+ *
59
+ * @param params - The constructor parameters.
60
+ */
61
+ constructor(params: SettingsFacetComponentConstructorParams<T>);
62
+ /**
63
+ * Provides new settings to every open editor and to every editor opened later.
64
+ *
65
+ * @param settings - The new settings.
66
+ */
67
+ setSettings(settings: T): void;
68
+ }
@@ -0,0 +1,48 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ import { ReconfigurableEditorExtensionComponent } from "./reconfigurable-editor-extension-component.mjs";
7
+ class SettingsFacetComponent extends ReconfigurableEditorExtensionComponent {
8
+ /**
9
+ * The settings the editors currently read.
10
+ *
11
+ * @returns The current settings.
12
+ */
13
+ get settings() {
14
+ return this._settings;
15
+ }
16
+ /**
17
+ * The facet the settings are provided to.
18
+ */
19
+ facet;
20
+ _settings;
21
+ /**
22
+ * Creates a new instance of the {@link SettingsFacetComponent} class.
23
+ *
24
+ * @param params - The constructor parameters.
25
+ */
26
+ constructor(params) {
27
+ super({
28
+ app: params.app,
29
+ editorExtensionRegistrar: params.editorExtensionRegistrar,
30
+ extension: params.facet.of(params.settings)
31
+ });
32
+ this.facet = params.facet;
33
+ this._settings = params.settings;
34
+ }
35
+ /**
36
+ * Provides new settings to every open editor and to every editor opened later.
37
+ *
38
+ * @param settings - The new settings.
39
+ */
40
+ setSettings(settings) {
41
+ this._settings = settings;
42
+ this.reconfigure(this.facet.of(settings));
43
+ }
44
+ }
45
+ export {
46
+ SettingsFacetComponent
47
+ };
48
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2V0dGluZ3MtZmFjZXQtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgY2xhc3Mge0BsaW5rIFNldHRpbmdzRmFjZXRDb21wb25lbnR9OiBhIHBsdWdpbidzIHNldHRpbmdzIHByb3ZpZGVkIHRvIGEgc2V0dGluZ3MgZmFjZXQgaW4gZXZlcnkgZWRpdG9yLFxuICogc3dhcHBlZCBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRmFjZXQgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5cbmltcG9ydCB0eXBlIHsgUmVjb25maWd1cmFibGVFZGl0b3JFeHRlbnNpb25Db21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vcmVjb25maWd1cmFibGUtZWRpdG9yLWV4dGVuc2lvbi1jb21wb25lbnQudHMnO1xuXG5pbXBvcnQgeyBSZWNvbmZpZ3VyYWJsZUVkaXRvckV4dGVuc2lvbkNvbXBvbmVudCB9IGZyb20gJy4vcmVjb25maWd1cmFibGUtZWRpdG9yLWV4dGVuc2lvbi1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgU2V0dGluZ3NGYWNldENvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHNldHRpbmdzIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NGYWNldENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFQ+IGV4dGVuZHMgUGljazxSZWNvbmZpZ3VyYWJsZUVkaXRvckV4dGVuc2lvbkNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zLCAnYXBwJyB8ICdlZGl0b3JFeHRlbnNpb25SZWdpc3RyYXInPiB7XG4gIC8qKlxuICAgKiBUaGUgZmFjZXQgdGhlIHNldHRpbmdzIGFyZSBwcm92aWRlZCB0bywgdXN1YWxseSBtYWRlIGJ5IGBjcmVhdGVTZXR0aW5nc0ZhY2V0YC5cbiAgICovXG4gIHJlYWRvbmx5IGZhY2V0OiBGYWNldDxULCBUPjtcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHRoZSBlZGl0b3JzIHN0YXJ0IHdpdGguXG4gICAqL1xuICByZWFkb25seSBzZXR0aW5nczogVDtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIHBsdWdpbidzIHNldHRpbmdzIHRvIGEgc2V0dGluZ3MgZmFjZXQgaW4gZXZlcnkgb3BlbiBlZGl0b3IgYW5kIGluIGV2ZXJ5IGVkaXRvciBvcGVuZWQgbGF0ZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHNldHRpbmdzIHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBzZXR0aW5nc0ZhY2V0ID0gY3JlYXRlU2V0dGluZ3NGYWNldDxNeVNldHRpbmdzPihERUZBVUxUX1NFVFRJTkdTKTtcbiAqIGNvbnN0IHNldHRpbmdzRmFjZXRDb21wb25lbnQgPSB0aGlzLmFkZENoaWxkKG5ldyBTZXR0aW5nc0ZhY2V0Q29tcG9uZW50KHtcbiAqICAgYXBwOiB0aGlzLmFwcCxcbiAqICAgZWRpdG9yRXh0ZW5zaW9uUmVnaXN0cmFyOiBuZXcgUGx1Z2luRWRpdG9yRXh0ZW5zaW9uUmVnaXN0cmFyKHRoaXMpLFxuICogICBmYWNldDogc2V0dGluZ3NGYWNldCxcbiAqICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3NcbiAqIH0pKTtcbiAqIC8vIEFmdGVyIHRoZSBzZXR0aW5ncyBjaGFuZ2U6XG4gKiBzZXR0aW5nc0ZhY2V0Q29tcG9uZW50LnNldFNldHRpbmdzKHRoaXMuc2V0dGluZ3MpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ZhY2V0Q29tcG9uZW50PFQ+IGV4dGVuZHMgUmVjb25maWd1cmFibGVFZGl0b3JFeHRlbnNpb25Db21wb25lbnQge1xuICAvKipcbiAgICogVGhlIHNldHRpbmdzIHRoZSBlZGl0b3JzIGN1cnJlbnRseSByZWFkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmYWNldCB0aGUgc2V0dGluZ3MgYXJlIHByb3ZpZGVkIHRvLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhY2V0OiBGYWNldDxULCBUPjtcblxuICBwcml2YXRlIF9zZXR0aW5nczogVDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUge0BsaW5rIFNldHRpbmdzRmFjZXRDb21wb25lbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBTZXR0aW5nc0ZhY2V0Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXM8VD4pIHtcbiAgICBzdXBlcih7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBlZGl0b3JFeHRlbnNpb25SZWdpc3RyYXI6IHBhcmFtcy5lZGl0b3JFeHRlbnNpb25SZWdpc3RyYXIsXG4gICAgICBleHRlbnNpb246IHBhcmFtcy5mYWNldC5vZihwYXJhbXMuc2V0dGluZ3MpXG4gICAgfSk7XG4gICAgdGhpcy5mYWNldCA9IHBhcmFtcy5mYWNldDtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHBhcmFtcy5zZXR0aW5ncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBuZXcgc2V0dGluZ3MgdG8gZXZlcnkgb3BlbiBlZGl0b3IgYW5kIHRvIGV2ZXJ5IGVkaXRvciBvcGVuZWQgbGF0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBuZXcgc2V0dGluZ3MuXG4gICAqL1xuICBwdWJsaWMgc2V0U2V0dGluZ3Moc2V0dGluZ3M6IFQpOiB2b2lkIHtcbiAgICB0aGlzLl9zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMucmVjb25maWd1cmUodGhpcy5mYWNldC5vZihzZXR0aW5ncykpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQVdBLFNBQVMsOENBQThDO0FBcUNoRCxNQUFNLCtCQUFrQyx1Q0FBdUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNcEYsSUFBVyxXQUFjO0FBQ3ZCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUttQjtBQUFBLEVBRVg7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPRCxZQUFZLFFBQW9EO0FBQ3JFLFVBQU07QUFBQSxNQUNKLEtBQUssT0FBTztBQUFBLE1BQ1osMEJBQTBCLE9BQU87QUFBQSxNQUNqQyxXQUFXLE9BQU8sTUFBTSxHQUFHLE9BQU8sUUFBUTtBQUFBLElBQzVDLENBQUM7QUFDRCxTQUFLLFFBQVEsT0FBTztBQUNwQixTQUFLLFlBQVksT0FBTztBQUFBLEVBQzFCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sWUFBWSxVQUFtQjtBQUNwQyxTQUFLLFlBQVk7QUFDakIsU0FBSyxZQUFZLEtBQUssTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUFBLEVBQzFDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -52,6 +52,22 @@ export declare enum CssClass {
52
52
  * A CSS class for the file component.
53
53
  */
54
54
  FileComponent = "file-component",
55
+ /**
56
+ * A CSS class for rendered markdown whose headings and lists `registerFoldHandlers` made foldable.
57
+ */
58
+ FoldableMarkdown = "foldable-markdown",
59
+ /**
60
+ * A CSS class for the folder list component.
61
+ */
62
+ FolderListComponent = "folder-list-component",
63
+ /**
64
+ * A CSS class for the hotkey component.
65
+ */
66
+ HotkeyComponent = "hotkey-component",
67
+ /**
68
+ * A CSS class for the element an inline token renders into, in Reading view and in Live Preview.
69
+ */
70
+ InlineToken = "inline-token",
55
71
  /**
56
72
  * Obsidian's class for a control that is currently ON, reused so a pressed command button matches the
57
73
  * app's own toggled controls.
@@ -65,6 +81,10 @@ export declare enum CssClass {
65
81
  * A CSS class for the library name, set on every element the library builds.
66
82
  */
67
83
  LibraryName = "obsidian-lib",
84
+ /**
85
+ * A CSS class for the reorderable list component.
86
+ */
87
+ ListComponent = "list-component",
68
88
  /**
69
89
  * Obsidian's class marking rendered-markdown content (used by `appendCodeBlock`).
70
90
  */
@@ -231,6 +251,14 @@ export declare enum CssClass {
231
251
  * A CSS class for the setting component wrapper.
232
252
  */
233
253
  SettingComponentWrapper = "setting-component-wrapper",
254
+ /**
255
+ * A CSS class for the settings tabs.
256
+ */
257
+ SettingsTabs = "settings-tabs",
258
+ /**
259
+ * A CSS class for the tag list component.
260
+ */
261
+ TagListComponent = "tag-list-component",
234
262
  /**
235
263
  * A CSS class for the telephone component.
236
264
  */
@@ -15,9 +15,14 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
15
15
  CssClass2["DateTimeComponent"] = "datetime-component";
16
16
  CssClass2["EmailComponent"] = "email-component";
17
17
  CssClass2["FileComponent"] = "file-component";
18
+ CssClass2["FoldableMarkdown"] = "foldable-markdown";
19
+ CssClass2["FolderListComponent"] = "folder-list-component";
20
+ CssClass2["HotkeyComponent"] = "hotkey-component";
21
+ CssClass2["InlineToken"] = "inline-token";
18
22
  CssClass2["IsActive"] = "is-active";
19
23
  CssClass2["IsPlaceholder"] = "is-placeholder";
20
24
  CssClass2["LibraryName"] = "obsidian-lib";
25
+ CssClass2["ListComponent"] = "list-component";
21
26
  CssClass2["MarkdownRendered"] = "markdown-rendered";
22
27
  CssClass2["MinimizableModal"] = "minimizable-modal";
23
28
  CssClass2["MinimizeButton"] = "minimize-button";
@@ -56,6 +61,8 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
56
61
  CssClass2["SelectItemModal"] = "select-item-modal";
57
62
  CssClass2["SelectOptionModal"] = "select-option-modal";
58
63
  CssClass2["SettingComponentWrapper"] = "setting-component-wrapper";
64
+ CssClass2["SettingsTabs"] = "settings-tabs";
65
+ CssClass2["TagListComponent"] = "tag-list-component";
59
66
  CssClass2["TelephoneComponent"] = "telephone-component";
60
67
  CssClass2["TextBox"] = "text-box";
61
68
  CssClass2["TimeComponent"] = "time-component";
@@ -73,4 +80,4 @@ var CssClass = /* @__PURE__ */ ((CssClass2) => {
73
80
  export {
74
81
  CssClass
75
82
  };
76
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nzcy1jbGFzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENTUyBjbGFzc2VzIHVzZWQgYnkgdGhlIGBAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliYCBsaWJyYXJ5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzZXMgdXNlZCBieSB0aGUgYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBlbnVtIENzc0NsYXNzIHtcbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgYWxlcnQgbW9kYWwuXG4gICAqL1xuICBBbGVydE1vZGFsID0gJ2FsZXJ0LW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKi9cbiAgQ2FuY2VsQnV0dG9uID0gJ2NhbmNlbC1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICovXG4gIENoZWNrYm94Q29tcG9uZW50ID0gJ2NoZWNrYm94LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGEgY2xpY2thYmxlIGljb24gYnV0dG9uLCBnaXZpbmcgaXQgdGhlIGhvdmVyIGJhY2tncm91bmQgYW5kIGljb24tY29sb3IgdHJlYXRtZW50LlxuICAgKi9cbiAgQ2xpY2thYmxlSWNvbiA9ICdjbGlja2FibGUtaWNvbicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGFuIGlubGluZSBjb2RlIGVsZW1lbnQgKHVzZWQgYnkgYGFwcGVuZENvZGVCbG9ja2ApLlxuICAgKi9cbiAgQ29kZSA9ICdjb2RlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjb2RlIGhpZ2hsaWdodGVyIGNvbXBvbmVudC5cbiAgICovXG4gIENvZGVIaWdobGlnaHRlckNvbXBvbmVudCA9ICdjb2RlLWhpZ2hsaWdodGVyLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29uZmlybSBtb2RhbC5cbiAgICovXG4gIENvbmZpcm1Nb2RhbCA9ICdjb25maXJtLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBkYXRlIGNvbXBvbmVudC5cbiAgICovXG4gIERhdGVDb21wb25lbnQgPSAnZGF0ZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGRhdGUgYW5kIHRpbWUgY29tcG9uZW50LlxuICAgKi9cbiAgRGF0ZVRpbWVDb21wb25lbnQgPSAnZGF0ZXRpbWUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBlbWFpbCBjb21wb25lbnQuXG4gICAqL1xuICBFbWFpbENvbXBvbmVudCA9ICdlbWFpbC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGZpbGUgY29tcG9uZW50LlxuICAgKi9cbiAgRmlsZUNvbXBvbmVudCA9ICdmaWxlLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGEgY29udHJvbCB0aGF0IGlzIGN1cnJlbnRseSBPTiwgcmV1c2VkIHNvIGEgcHJlc3NlZCBjb21tYW5kIGJ1dHRvbiBtYXRjaGVzIHRoZVxuICAgKiBhcHAncyBvd24gdG9nZ2xlZCBjb250cm9scy5cbiAgICovXG4gIElzQWN0aXZlID0gJ2lzLWFjdGl2ZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGxhY2Vob2xkZXIuXG4gICAqL1xuICBJc1BsYWNlaG9sZGVyID0gJ2lzLXBsYWNlaG9sZGVyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBsaWJyYXJ5IG5hbWUsIHNldCBvbiBldmVyeSBlbGVtZW50IHRoZSBsaWJyYXJ5IGJ1aWxkcy5cbiAgICovXG4gIExpYnJhcnlOYW1lID0gJ29ic2lkaWFuLWxpYicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgbWFya2luZyByZW5kZXJlZC1tYXJrZG93biBjb250ZW50ICh1c2VkIGJ5IGBhcHBlbmRDb2RlQmxvY2tgKS5cbiAgICovXG4gIE1hcmtkb3duUmVuZGVyZWQgPSAnbWFya2Rvd24tcmVuZGVyZWQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemFibGVNb2RhbCA9ICdtaW5pbWl6YWJsZS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbWluaW1pemUgYnV0dG9uIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplQnV0dG9uID0gJ21pbmltaXplLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbWluaW1pemVkIGJhciBvZiB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6ZWRNb2RhbEJhciA9ICdtaW5pbWl6ZWQtbW9kYWwtYmFyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBvbmUtc2hvdCBhdHRlbnRpb24gZmxhc2ggb2YgdGhlIG1pbmltaXplZCBiYXIsIHBsYXllZCB3aGVuIHRoZSB1c2VyIGF0dGVtcHRzIGFcbiAgICogYmxvY2tlZCBhY3Rpb24gKGEga2V5c3Ryb2tlLCByaWdodC1jbGljaywgb3Igb3BlbmluZyBhbm90aGVyIG1vZGFsKSB3aGlsZSB0aGUgbW9kYWwgaXMgbWluaW1pemVkLlxuICAgKi9cbiAgTWluaW1pemVkTW9kYWxCYXJBdHRlbnRpb24gPSAnbWluaW1pemVkLW1vZGFsLWJhci1hdHRlbnRpb24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRpdGxlIG9mIHRoZSBtaW5pbWl6ZWQgYmFyIG9mIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyVGl0bGUgPSAnbWluaW1pemVkLW1vZGFsLWJhci10aXRsZScsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciBvbmUgYnV0dG9uIGluIGEgbW9kYWwncyBjb21tYW5kIHN0cmlwLlxuICAgKi9cbiAgTW9kYWxDb21tYW5kID0gJ21vZGFsLWNvbW1hbmQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgYSBjb250cm9sIGluamVjdGVkIGludG8gYW4gaW5zdHJ1Y3Rpb24ncyBwdXJwb3NlIHRleHQgXHUyMDE0IGEgY2hlY2tib3gsIGEgZHJvcGRvd24uXG4gICAqIE9ic2lkaWFuJ3Mgb3duIGluc3RydWN0aW9uIGJhciBuZXZlciBjb250YWlucyBvbmUsIHNvIG5vdGhpbmcgdXBzdHJlYW0gc2VwYXJhdGVzIGl0IGZyb20gdGhlIGxhYmVsXG4gICAqIGl0IGJlbG9uZ3MgdG8uXG4gICAqL1xuICBNb2RhbENvbW1hbmRDb250cm9sID0gJ21vZGFsLWNvbW1hbmQtY29udHJvbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgaG90a2V5IGhpbnQgaW5zaWRlIGEgbW9kYWwgY29tbWFuZCBidXR0b24uXG4gICAqL1xuICBNb2RhbENvbW1hbmRIb3RrZXkgPSAnbW9kYWwtY29tbWFuZC1ob3RrZXknLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHN0cmlwIG9mIGNvbW1hbmRzIGEgbW9kYWwgcmVuZGVycyBhbG9uZyBpdHMgYm90dG9tIGVkZ2UuXG4gICAqL1xuICBNb2RhbENvbW1hbmRzID0gJ21vZGFsLWNvbW1hbmRzJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBmb3IgYSBtb2RhbCBoZWFkZXIgYnV0dG9uIChlLmcuIHRoZSBtb2RhbCBjbG9zZSBidXR0b24pLCByZXVzZWQgdG8gbWF0Y2ggdGhlXG4gICAqIG5hdGl2ZSBtb2RhbCBjbG9zZSBidXR0b24ncyBib3ggYW5kIGhvdmVyLlxuICAgKi9cbiAgTW9kYWxIZWFkZXJCdXR0b24gPSAnbW9kYWwtaGVhZGVyLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbW9udGggY29tcG9uZW50LlxuICAgKi9cbiAgTW9udGhDb21wb25lbnQgPSAnbW9udGgtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ211bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgZW1haWwgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVFbWFpbENvbXBvbmVudCA9ICdtdWx0aXBsZS1lbWFpbC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIGZpbGUgY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVGaWxlQ29tcG9uZW50ID0gJ211bHRpcGxlLWZpbGUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSB0ZXh0IGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlVGV4dENvbXBvbmVudCA9ICdtdWx0aXBsZS10ZXh0LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbnVtYmVyIGNvbXBvbmVudC5cbiAgICovXG4gIE51bWJlckNvbXBvbmVudCA9ICdudW1iZXItY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBvayBidXR0b24uXG4gICAqL1xuICBPa0J1dHRvbiA9ICdvay1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG92ZXJsYXkgdmFsaWRhdG9yLlxuICAgKi9cbiAgT3ZlcmxheVZhbGlkYXRvciA9ICdvdmVybGF5LXZhbGlkYXRvcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGFzc3dvcmQgY29tcG9uZW50LlxuICAgKi9cbiAgUGFzc3dvcmRDb21wb25lbnQgPSAncGFzc3dvcmQtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBiYW5uZXIgbmFtaW5nIGEgcGx1Z2luIHRoaXMgb25lIHJlZnVzZXMsIG9yIHdhcm5zIGFib3V0LCBydW5uaW5nIGJlc2lkZS5cbiAgICovXG4gIFBsdWdpbkNvbmZsaWN0QmFubmVyID0gJ3BsdWdpbi1jb25mbGljdC1iYW5uZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGJhbm5lciBhIGJsb2NrZWQgcGx1Z2luIHJlbmRlcnMgaW4gcGxhY2Ugb2YgaXRzIHNldHRpbmdzLCBuYW1pbmcgdGhlIG1hbmRhdG9yeVxuICAgKiBkZXBlbmRlbmN5IGl0IGlzIHdhaXRpbmcgZm9yLlxuICAgKi9cbiAgUGx1Z2luRGVwZW5kZW5jeUJhbm5lciA9ICdwbHVnaW4tZGVwZW5kZW5jeS1iYW5uZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNsb3NlIGJ1dHRvbiBvZiBhIG5vdGljZSB0aGF0IHJlcXVpcmVzIGNsb3NlIGNvbmZpcm1hdGlvbi5cbiAgICovXG4gIFBsdWdpbk5vdGljZUNsb3NlQnV0dG9uID0gJ3BsdWdpbi1ub3RpY2UtY2xvc2UtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjb250YWluZXIgd3JhcHBpbmcgYSBub3RpY2UncyBjb250ZW50LCB1c2VkIHRvIGtlZXAgdGhlIG5vdGljZSBvcGVuIHdoZW4gYW5cbiAgICogaW50ZXJhY3RpdmUgZWxlbWVudCBpbnNpZGUgaXQgaXMgY2xpY2tlZC5cbiAgICovXG4gIFBsdWdpbk5vdGljZUNvbnRlbnQgPSAncGx1Z2luLW5vdGljZS1jb250ZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwbHVnaW4gbmFtZSBzaG93biBhcyB0aGUgcHJlZml4IG9mIGEgbm90aWNlLlxuICAgKi9cbiAgUGx1Z2luTm90aWNlTmFtZSA9ICdwbHVnaW4tbm90aWNlLW5hbWUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBub3RpY2UgZWxlbWVudCBvZiBhIG5vdGljZSB0aGF0IHJlcXVpcmVzIGFuIGV4cGxpY2l0IGNsb3NlLCB1c2VkIHRvIG1ha2VcbiAgICogaXRzIHdob2xlIGFyZWEgbm9uLWRpc21pc3NpYmxlLlxuICAgKi9cbiAgUGx1Z2luTm90aWNlUmVxdWlyZXNFeHBsaWNpdENsb3NlID0gJ3BsdWdpbi1ub3RpY2UtcmVxdWlyZXMtZXhwbGljaXQtY2xvc2UnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBQbHVnaW5TZXR0aW5nc1RhYiA9ICdwbHVnaW4tc2V0dGluZ3MtdGFiJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBiYW5uZXIgYSBwbHVnaW4tc3VnZ2VzdGlvbiByZW5kZXJzIGludG8gYSBzZXR0aW5ncyB0YWIuXG4gICAqL1xuICBQbHVnaW5TdWdnZXN0aW9uQmFubmVyID0gJ3BsdWdpbi1zdWdnZXN0aW9uLWJhbm5lcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcm93IG9mIGJ1dHRvbnMgaW4gYSBwbHVnaW4tc3VnZ2VzdGlvbiBub3RpY2UsIHdoaWNoIHNwYWNlcyB0aGUgYWN0aW9uIGJ1dHRvbiBhcGFydCBmcm9tXG4gICAqIHRoZSBkZWNsaW5lIGJ1dHRvbi5cbiAgICovXG4gIFBsdWdpblN1Z2dlc3Rpb25Ob3RpY2VCdXR0b25zID0gJ3BsdWdpbi1zdWdnZXN0aW9uLW5vdGljZS1idXR0b25zJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwb3BvdmVyLlxuICAgKi9cbiAgUG9wb3ZlciA9ICdwb3BvdmVyJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBmb3Igb25lIHJvdyBvZiBpdHMgbW9kYWwgaW5zdHJ1Y3Rpb24gYmFyLCByZXVzZWQgc28gYSBzZWxmLWNyZWF0ZWQgYmFyIGluaGVyaXRzIHRoZVxuICAgKiBhcHAncyBvd24gaW5zdHJ1Y3Rpb24gc3R5bGluZy5cbiAgICovXG4gIFByb21wdEluc3RydWN0aW9uID0gJ3Byb21wdC1pbnN0cnVjdGlvbicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIHRoZSBrZXktaGludCBoYWxmIG9mIG9uZSBpbnN0cnVjdGlvbiByb3cuIEl0IGlzIHRoZSBvbmx5IHRoaW5nIGNhcnJ5aW5nIHRoYXRcbiAgICogaGludCdzIGJvbGQgd2VpZ2h0IGFuZCB0aGUgYG1hcmdpbi1pbmxpbmUtZW5kYCB0aGF0IHNlcGFyYXRlcyBpdCBmcm9tIHRoZSBwdXJwb3NlIHRleHQsIHNvIGFcbiAgICogc2VsZi1jcmVhdGVkIGJhciB0aGF0IG9taXRzIGl0IHJlbmRlcnMgYGFsdCAxS2VlcCB0aGUgb2xkIHRpdGxlYCB3ZWxkZWQgdG9nZXRoZXIuIFJldXNlZCByYXRoZXJcbiAgICogdGhhbiByZS1pbXBsZW1lbnRlZDogdGhlIGFwcCdzIHJ1bGUgZm9yIGl0IGlzIHVuc2NvcGVkLCBzbyBpdCByZWFjaGVzIGEgcGxhaW4gYE1vZGFsYCB0b28sIGFuZFxuICAgKiBzaGFyaW5nIHRoZSBjbGFzcyBrZWVwcyB0aGUgc2VsZi1jcmVhdGVkIGJhciBhbmQgYHNldEluc3RydWN0aW9uc2AgZnJvbSBldmVyIGRyaWZ0aW5nIGFwYXJ0LlxuICAgKi9cbiAgUHJvbXB0SW5zdHJ1Y3Rpb25Db21tYW5kID0gJ3Byb21wdC1pbnN0cnVjdGlvbi1jb21tYW5kJyxcblxuICAvKipcbiAgICogT2JzaWRpYW4ncyBjbGFzcyBmb3IgaXRzIG1vZGFsIGluc3RydWN0aW9uIGJhciwgcmV1c2VkIHNvIGEgc2VsZi1jcmVhdGVkIGJhciBpbmhlcml0cyB0aGUgYXBwJ3Mgb3duXG4gICAqIGluc3RydWN0aW9uIHN0eWxpbmcuXG4gICAqL1xuICBQcm9tcHRJbnN0cnVjdGlvbnMgPSAncHJvbXB0LWluc3RydWN0aW9ucycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcHJvbXB0IG1vZGFsLlxuICAgKi9cbiAgUHJvbXB0TW9kYWwgPSAncHJvbXB0LW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSByZXN0b3JlIGJ1dHRvbiBvZiB0aGUgbWluaW1pemVkIG1vZGFsIGJhci5cbiAgICovXG4gIFJlc3RvcmVCdXR0b24gPSAncmVzdG9yZS1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHNlbGVjdCBpdGVtIG1vZGFsLlxuICAgKi9cbiAgU2VsZWN0SXRlbU1vZGFsID0gJ3NlbGVjdC1pdGVtLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZWxlY3Qgb3B0aW9uIG1vZGFsLlxuICAgKi9cbiAgU2VsZWN0T3B0aW9uTW9kYWwgPSAnc2VsZWN0LW9wdGlvbi1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgc2V0dGluZyBjb21wb25lbnQgd3JhcHBlci5cbiAgICovXG4gIFNldHRpbmdDb21wb25lbnRXcmFwcGVyID0gJ3NldHRpbmctY29tcG9uZW50LXdyYXBwZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRlbGVwaG9uZSBjb21wb25lbnQuXG4gICAqL1xuICBUZWxlcGhvbmVDb21wb25lbnQgPSAndGVsZXBob25lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGV4dCBib3guXG4gICAqL1xuICBUZXh0Qm94ID0gJ3RleHQtYm94JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIFRpbWVDb21wb25lbnQgPSAndGltZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAuXG4gICAqL1xuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAgYXJyb3cuXG4gICAqL1xuICBUb29sdGlwQXJyb3cgPSAndG9vbHRpcC1hcnJvdycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdG9vbHRpcCB2YWxpZGF0b3IuXG4gICAqL1xuICBUb29sdGlwVmFsaWRhdG9yID0gJ3Rvb2x0aXAtdmFsaWRhdG9yJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0cmktc3RhdGUgY2hlY2tib3ggY29tcG9uZW50LlxuICAgKi9cbiAgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCA9ICd0cmktc3RhdGUtY2hlY2tib3gtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0eXBlZCBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBUeXBlZERyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdHlwZWQgbXVsdGlwbGUgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLW11bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciBhbiBpbnB1dCB0aGUgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB5ZXQsIHVzZWQgdG8gZGVmZXIgdGhlIGludmFsaWQgc3R5bGluZyB1bnRpbFxuICAgKiB0aGUgaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIFVudG91Y2hlZCA9ICd1bnRvdWNoZWQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHVybCBjb21wb25lbnQuXG4gICAqL1xuICBVcmxDb21wb25lbnQgPSAndXJsLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgd2VlayBjb21wb25lbnQuXG4gICAqL1xuICBXZWVrQ29tcG9uZW50ID0gJ3dlZWstY29tcG9uZW50J1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTTyxJQUFLLFdBQUwsa0JBQUtBLGNBQUw7QUFJTCxFQUFBQSxVQUFBLGdCQUFhO0FBS2IsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsVUFBTztBQUtQLEVBQUFBLFVBQUEsOEJBQTJCO0FBSzNCLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLG1CQUFnQjtBQU1oQixFQUFBQSxVQUFBLGNBQVc7QUFLWCxFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLGlCQUFjO0FBS2QsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSxvQkFBaUI7QUFLakIsRUFBQUEsVUFBQSx1QkFBb0I7QUFNcEIsRUFBQUEsVUFBQSxnQ0FBNkI7QUFLN0IsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSxrQkFBZTtBQU9mLEVBQUFBLFVBQUEseUJBQXNCO0FBS3RCLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsbUJBQWdCO0FBTWhCLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsb0JBQWlCO0FBS2pCLEVBQUFBLFVBQUEsK0JBQTRCO0FBSzVCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsMkJBQXdCO0FBS3hCLEVBQUFBLFVBQUEsMkJBQXdCO0FBS3hCLEVBQUFBLFVBQUEscUJBQWtCO0FBS2xCLEVBQUFBLFVBQUEsY0FBVztBQUtYLEVBQUFBLFVBQUEsc0JBQW1CO0FBS25CLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsMEJBQXVCO0FBTXZCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsNkJBQTBCO0FBTTFCLEVBQUFBLFVBQUEseUJBQXNCO0FBS3RCLEVBQUFBLFVBQUEsc0JBQW1CO0FBTW5CLEVBQUFBLFVBQUEsdUNBQW9DO0FBS3BDLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsNEJBQXlCO0FBTXpCLEVBQUFBLFVBQUEsbUNBQWdDO0FBS2hDLEVBQUFBLFVBQUEsYUFBVTtBQU1WLEVBQUFBLFVBQUEsdUJBQW9CO0FBU3BCLEVBQUFBLFVBQUEsOEJBQTJCO0FBTTNCLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsaUJBQWM7QUFLZCxFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHFCQUFrQjtBQUtsQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLDZCQUEwQjtBQUsxQixFQUFBQSxVQUFBLHdCQUFxQjtBQUtyQixFQUFBQSxVQUFBLGFBQVU7QUFLVixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLGFBQVU7QUFLVixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSxzQkFBbUI7QUFLbkIsRUFBQUEsVUFBQSwrQkFBNEI7QUFLNUIsRUFBQUEsVUFBQSw0QkFBeUI7QUFLekIsRUFBQUEsVUFBQSxvQ0FBaUM7QUFNakMsRUFBQUEsVUFBQSxlQUFZO0FBS1osRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsbUJBQWdCO0FBL1VOLFNBQUFBO0FBQUEsR0FBQTsiLAogICJuYW1lcyI6IFsiQ3NzQ2xhc3MiXQp9Cg==
83
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nzcy1jbGFzcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENTUyBjbGFzc2VzIHVzZWQgYnkgdGhlIGBAbW5hb3Vtb3Yvb2JzaWRpYW4tbGliYCBsaWJyYXJ5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzZXMgdXNlZCBieSB0aGUgYEBtbmFvdW1vdi9vYnNpZGlhbi1saWJgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBlbnVtIENzc0NsYXNzIHtcbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgYWxlcnQgbW9kYWwuXG4gICAqL1xuICBBbGVydE1vZGFsID0gJ2FsZXJ0LW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKi9cbiAgQ2FuY2VsQnV0dG9uID0gJ2NhbmNlbC1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGNoZWNrYm94IGNvbXBvbmVudC5cbiAgICovXG4gIENoZWNrYm94Q29tcG9uZW50ID0gJ2NoZWNrYm94LWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGEgY2xpY2thYmxlIGljb24gYnV0dG9uLCBnaXZpbmcgaXQgdGhlIGhvdmVyIGJhY2tncm91bmQgYW5kIGljb24tY29sb3IgdHJlYXRtZW50LlxuICAgKi9cbiAgQ2xpY2thYmxlSWNvbiA9ICdjbGlja2FibGUtaWNvbicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGFuIGlubGluZSBjb2RlIGVsZW1lbnQgKHVzZWQgYnkgYGFwcGVuZENvZGVCbG9ja2ApLlxuICAgKi9cbiAgQ29kZSA9ICdjb2RlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjb2RlIGhpZ2hsaWdodGVyIGNvbXBvbmVudC5cbiAgICovXG4gIENvZGVIaWdobGlnaHRlckNvbXBvbmVudCA9ICdjb2RlLWhpZ2hsaWdodGVyLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29uZmlybSBtb2RhbC5cbiAgICovXG4gIENvbmZpcm1Nb2RhbCA9ICdjb25maXJtLW1vZGFsJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBkYXRlIGNvbXBvbmVudC5cbiAgICovXG4gIERhdGVDb21wb25lbnQgPSAnZGF0ZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGRhdGUgYW5kIHRpbWUgY29tcG9uZW50LlxuICAgKi9cbiAgRGF0ZVRpbWVDb21wb25lbnQgPSAnZGF0ZXRpbWUtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBlbWFpbCBjb21wb25lbnQuXG4gICAqL1xuICBFbWFpbENvbXBvbmVudCA9ICdlbWFpbC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGZpbGUgY29tcG9uZW50LlxuICAgKi9cbiAgRmlsZUNvbXBvbmVudCA9ICdmaWxlLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciByZW5kZXJlZCBtYXJrZG93biB3aG9zZSBoZWFkaW5ncyBhbmQgbGlzdHMgYHJlZ2lzdGVyRm9sZEhhbmRsZXJzYCBtYWRlIGZvbGRhYmxlLlxuICAgKi9cbiAgRm9sZGFibGVNYXJrZG93biA9ICdmb2xkYWJsZS1tYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgZm9sZGVyIGxpc3QgY29tcG9uZW50LlxuICAgKi9cbiAgRm9sZGVyTGlzdENvbXBvbmVudCA9ICdmb2xkZXItbGlzdC1jb21wb25lbnQnLFxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBob3RrZXkgY29tcG9uZW50LlxuICAgKi9cbiAgSG90a2V5Q29tcG9uZW50ID0gJ2hvdGtleS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGVsZW1lbnQgYW4gaW5saW5lIHRva2VuIHJlbmRlcnMgaW50bywgaW4gUmVhZGluZyB2aWV3IGFuZCBpbiBMaXZlIFByZXZpZXcuXG4gICAqL1xuICBJbmxpbmVUb2tlbiA9ICdpbmxpbmUtdG9rZW4nLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciBhIGNvbnRyb2wgdGhhdCBpcyBjdXJyZW50bHkgT04sIHJldXNlZCBzbyBhIHByZXNzZWQgY29tbWFuZCBidXR0b24gbWF0Y2hlcyB0aGVcbiAgICogYXBwJ3Mgb3duIHRvZ2dsZWQgY29udHJvbHMuXG4gICAqL1xuICBJc0FjdGl2ZSA9ICdpcy1hY3RpdmUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgSXNQbGFjZWhvbGRlciA9ICdpcy1wbGFjZWhvbGRlcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbGlicmFyeSBuYW1lLCBzZXQgb24gZXZlcnkgZWxlbWVudCB0aGUgbGlicmFyeSBidWlsZHMuXG4gICAqL1xuICBMaWJyYXJ5TmFtZSA9ICdvYnNpZGlhbi1saWInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHJlb3JkZXJhYmxlIGxpc3QgY29tcG9uZW50LlxuICAgKi9cbiAgTGlzdENvbXBvbmVudCA9ICdsaXN0LWNvbXBvbmVudCcsXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIG1hcmtpbmcgcmVuZGVyZWQtbWFya2Rvd24gY29udGVudCAodXNlZCBieSBgYXBwZW5kQ29kZUJsb2NrYCkuXG4gICAqL1xuICBNYXJrZG93blJlbmRlcmVkID0gJ21hcmtkb3duLXJlbmRlcmVkJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtaW5pbWl6YWJsZSBtb2RhbC5cbiAgICovXG4gIE1pbmltaXphYmxlTW9kYWwgPSAnbWluaW1pemFibGUtbW9kYWwnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG1pbmltaXplIGJ1dHRvbiBvZiB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6ZUJ1dHRvbiA9ICdtaW5pbWl6ZS1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG1pbmltaXplZCBiYXIgb2YgdGhlIG1pbmltaXphYmxlIG1vZGFsLlxuICAgKi9cbiAgTWluaW1pemVkTW9kYWxCYXIgPSAnbWluaW1pemVkLW1vZGFsLWJhcicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgb25lLXNob3QgYXR0ZW50aW9uIGZsYXNoIG9mIHRoZSBtaW5pbWl6ZWQgYmFyLCBwbGF5ZWQgd2hlbiB0aGUgdXNlciBhdHRlbXB0cyBhXG4gICAqIGJsb2NrZWQgYWN0aW9uIChhIGtleXN0cm9rZSwgcmlnaHQtY2xpY2ssIG9yIG9wZW5pbmcgYW5vdGhlciBtb2RhbCkgd2hpbGUgdGhlIG1vZGFsIGlzIG1pbmltaXplZC5cbiAgICovXG4gIE1pbmltaXplZE1vZGFsQmFyQXR0ZW50aW9uID0gJ21pbmltaXplZC1tb2RhbC1iYXItYXR0ZW50aW9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0aXRsZSBvZiB0aGUgbWluaW1pemVkIGJhciBvZiB0aGUgbWluaW1pemFibGUgbW9kYWwuXG4gICAqL1xuICBNaW5pbWl6ZWRNb2RhbEJhclRpdGxlID0gJ21pbmltaXplZC1tb2RhbC1iYXItdGl0bGUnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3Igb25lIGJ1dHRvbiBpbiBhIG1vZGFsJ3MgY29tbWFuZCBzdHJpcC5cbiAgICovXG4gIE1vZGFsQ29tbWFuZCA9ICdtb2RhbC1jb21tYW5kJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIGEgY29udHJvbCBpbmplY3RlZCBpbnRvIGFuIGluc3RydWN0aW9uJ3MgcHVycG9zZSB0ZXh0IFx1MjAxNCBhIGNoZWNrYm94LCBhIGRyb3Bkb3duLlxuICAgKiBPYnNpZGlhbidzIG93biBpbnN0cnVjdGlvbiBiYXIgbmV2ZXIgY29udGFpbnMgb25lLCBzbyBub3RoaW5nIHVwc3RyZWFtIHNlcGFyYXRlcyBpdCBmcm9tIHRoZSBsYWJlbFxuICAgKiBpdCBiZWxvbmdzIHRvLlxuICAgKi9cbiAgTW9kYWxDb21tYW5kQ29udHJvbCA9ICdtb2RhbC1jb21tYW5kLWNvbnRyb2wnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIGhvdGtleSBoaW50IGluc2lkZSBhIG1vZGFsIGNvbW1hbmQgYnV0dG9uLlxuICAgKi9cbiAgTW9kYWxDb21tYW5kSG90a2V5ID0gJ21vZGFsLWNvbW1hbmQtaG90a2V5JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzdHJpcCBvZiBjb21tYW5kcyBhIG1vZGFsIHJlbmRlcnMgYWxvbmcgaXRzIGJvdHRvbSBlZGdlLlxuICAgKi9cbiAgTW9kYWxDb21tYW5kcyA9ICdtb2RhbC1jb21tYW5kcycsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGEgbW9kYWwgaGVhZGVyIGJ1dHRvbiAoZS5nLiB0aGUgbW9kYWwgY2xvc2UgYnV0dG9uKSwgcmV1c2VkIHRvIG1hdGNoIHRoZVxuICAgKiBuYXRpdmUgbW9kYWwgY2xvc2UgYnV0dG9uJ3MgYm94IGFuZCBob3Zlci5cbiAgICovXG4gIE1vZGFsSGVhZGVyQnV0dG9uID0gJ21vZGFsLWhlYWRlci1idXR0b24nLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG1vbnRoIGNvbXBvbmVudC5cbiAgICovXG4gIE1vbnRoQ29tcG9uZW50ID0gJ21vbnRoLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgTXVsdGlwbGVEcm9wZG93bkNvbXBvbmVudCA9ICdtdWx0aXBsZS1kcm9wZG93bi1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG11bHRpcGxlIGVtYWlsIGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlRW1haWxDb21wb25lbnQgPSAnbXVsdGlwbGUtZW1haWwtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBtdWx0aXBsZSBmaWxlIGNvbXBvbmVudC5cbiAgICovXG4gIE11bHRpcGxlRmlsZUNvbXBvbmVudCA9ICdtdWx0aXBsZS1maWxlLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgbXVsdGlwbGUgdGV4dCBjb21wb25lbnQuXG4gICAqL1xuICBNdWx0aXBsZVRleHRDb21wb25lbnQgPSAnbXVsdGlwbGUtdGV4dC1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIG51bWJlciBjb21wb25lbnQuXG4gICAqL1xuICBOdW1iZXJDb21wb25lbnQgPSAnbnVtYmVyLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgb2sgYnV0dG9uLlxuICAgKi9cbiAgT2tCdXR0b24gPSAnb2stYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBvdmVybGF5IHZhbGlkYXRvci5cbiAgICovXG4gIE92ZXJsYXlWYWxpZGF0b3IgPSAnb3ZlcmxheS12YWxpZGF0b3InLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHBhc3N3b3JkIGNvbXBvbmVudC5cbiAgICovXG4gIFBhc3N3b3JkQ29tcG9uZW50ID0gJ3Bhc3N3b3JkLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgYmFubmVyIG5hbWluZyBhIHBsdWdpbiB0aGlzIG9uZSByZWZ1c2VzLCBvciB3YXJucyBhYm91dCwgcnVubmluZyBiZXNpZGUuXG4gICAqL1xuICBQbHVnaW5Db25mbGljdEJhbm5lciA9ICdwbHVnaW4tY29uZmxpY3QtYmFubmVyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBiYW5uZXIgYSBibG9ja2VkIHBsdWdpbiByZW5kZXJzIGluIHBsYWNlIG9mIGl0cyBzZXR0aW5ncywgbmFtaW5nIHRoZSBtYW5kYXRvcnlcbiAgICogZGVwZW5kZW5jeSBpdCBpcyB3YWl0aW5nIGZvci5cbiAgICovXG4gIFBsdWdpbkRlcGVuZGVuY3lCYW5uZXIgPSAncGx1Z2luLWRlcGVuZGVuY3ktYmFubmVyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBjbG9zZSBidXR0b24gb2YgYSBub3RpY2UgdGhhdCByZXF1aXJlcyBjbG9zZSBjb25maXJtYXRpb24uXG4gICAqL1xuICBQbHVnaW5Ob3RpY2VDbG9zZUJ1dHRvbiA9ICdwbHVnaW4tbm90aWNlLWNsb3NlLWJ1dHRvbicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgY29udGFpbmVyIHdyYXBwaW5nIGEgbm90aWNlJ3MgY29udGVudCwgdXNlZCB0byBrZWVwIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuXG4gICAqIGludGVyYWN0aXZlIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuXG4gICAqL1xuICBQbHVnaW5Ob3RpY2VDb250ZW50ID0gJ3BsdWdpbi1ub3RpY2UtY29udGVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcGx1Z2luIG5hbWUgc2hvd24gYXMgdGhlIHByZWZpeCBvZiBhIG5vdGljZS5cbiAgICovXG4gIFBsdWdpbk5vdGljZU5hbWUgPSAncGx1Z2luLW5vdGljZS1uYW1lJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgbm90aWNlIGVsZW1lbnQgb2YgYSBub3RpY2UgdGhhdCByZXF1aXJlcyBhbiBleHBsaWNpdCBjbG9zZSwgdXNlZCB0byBtYWtlXG4gICAqIGl0cyB3aG9sZSBhcmVhIG5vbi1kaXNtaXNzaWJsZS5cbiAgICovXG4gIFBsdWdpbk5vdGljZVJlcXVpcmVzRXhwbGljaXRDbG9zZSA9ICdwbHVnaW4tbm90aWNlLXJlcXVpcmVzLWV4cGxpY2l0LWNsb3NlJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBwbHVnaW4gc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgUGx1Z2luU2V0dGluZ3NUYWIgPSAncGx1Z2luLXNldHRpbmdzLXRhYicsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgYmFubmVyIGEgcGx1Z2luLXN1Z2dlc3Rpb24gcmVuZGVycyBpbnRvIGEgc2V0dGluZ3MgdGFiLlxuICAgKi9cbiAgUGx1Z2luU3VnZ2VzdGlvbkJhbm5lciA9ICdwbHVnaW4tc3VnZ2VzdGlvbi1iYW5uZXInLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHJvdyBvZiBidXR0b25zIGluIGEgcGx1Z2luLXN1Z2dlc3Rpb24gbm90aWNlLCB3aGljaCBzcGFjZXMgdGhlIGFjdGlvbiBidXR0b24gYXBhcnQgZnJvbVxuICAgKiB0aGUgZGVjbGluZSBidXR0b24uXG4gICAqL1xuICBQbHVnaW5TdWdnZXN0aW9uTm90aWNlQnV0dG9ucyA9ICdwbHVnaW4tc3VnZ2VzdGlvbi1ub3RpY2UtYnV0dG9ucycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcG9wb3Zlci5cbiAgICovXG4gIFBvcG92ZXIgPSAncG9wb3ZlcicsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIG9uZSByb3cgb2YgaXRzIG1vZGFsIGluc3RydWN0aW9uIGJhciwgcmV1c2VkIHNvIGEgc2VsZi1jcmVhdGVkIGJhciBpbmhlcml0cyB0aGVcbiAgICogYXBwJ3Mgb3duIGluc3RydWN0aW9uIHN0eWxpbmcuXG4gICAqL1xuICBQcm9tcHRJbnN0cnVjdGlvbiA9ICdwcm9tcHQtaW5zdHJ1Y3Rpb24nLFxuXG4gIC8qKlxuICAgKiBPYnNpZGlhbidzIGNsYXNzIGZvciB0aGUga2V5LWhpbnQgaGFsZiBvZiBvbmUgaW5zdHJ1Y3Rpb24gcm93LiBJdCBpcyB0aGUgb25seSB0aGluZyBjYXJyeWluZyB0aGF0XG4gICAqIGhpbnQncyBib2xkIHdlaWdodCBhbmQgdGhlIGBtYXJnaW4taW5saW5lLWVuZGAgdGhhdCBzZXBhcmF0ZXMgaXQgZnJvbSB0aGUgcHVycG9zZSB0ZXh0LCBzbyBhXG4gICAqIHNlbGYtY3JlYXRlZCBiYXIgdGhhdCBvbWl0cyBpdCByZW5kZXJzIGBhbHQgMUtlZXAgdGhlIG9sZCB0aXRsZWAgd2VsZGVkIHRvZ2V0aGVyLiBSZXVzZWQgcmF0aGVyXG4gICAqIHRoYW4gcmUtaW1wbGVtZW50ZWQ6IHRoZSBhcHAncyBydWxlIGZvciBpdCBpcyB1bnNjb3BlZCwgc28gaXQgcmVhY2hlcyBhIHBsYWluIGBNb2RhbGAgdG9vLCBhbmRcbiAgICogc2hhcmluZyB0aGUgY2xhc3Mga2VlcHMgdGhlIHNlbGYtY3JlYXRlZCBiYXIgYW5kIGBzZXRJbnN0cnVjdGlvbnNgIGZyb20gZXZlciBkcmlmdGluZyBhcGFydC5cbiAgICovXG4gIFByb21wdEluc3RydWN0aW9uQ29tbWFuZCA9ICdwcm9tcHQtaW5zdHJ1Y3Rpb24tY29tbWFuZCcsXG5cbiAgLyoqXG4gICAqIE9ic2lkaWFuJ3MgY2xhc3MgZm9yIGl0cyBtb2RhbCBpbnN0cnVjdGlvbiBiYXIsIHJldXNlZCBzbyBhIHNlbGYtY3JlYXRlZCBiYXIgaW5oZXJpdHMgdGhlIGFwcCdzIG93blxuICAgKiBpbnN0cnVjdGlvbiBzdHlsaW5nLlxuICAgKi9cbiAgUHJvbXB0SW5zdHJ1Y3Rpb25zID0gJ3Byb21wdC1pbnN0cnVjdGlvbnMnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHByb21wdCBtb2RhbC5cbiAgICovXG4gIFByb21wdE1vZGFsID0gJ3Byb21wdC1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgcmVzdG9yZSBidXR0b24gb2YgdGhlIG1pbmltaXplZCBtb2RhbCBiYXIuXG4gICAqL1xuICBSZXN0b3JlQnV0dG9uID0gJ3Jlc3RvcmUtYnV0dG9uJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZWxlY3QgaXRlbSBtb2RhbC5cbiAgICovXG4gIFNlbGVjdEl0ZW1Nb2RhbCA9ICdzZWxlY3QtaXRlbS1tb2RhbCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgc2VsZWN0IG9wdGlvbiBtb2RhbC5cbiAgICovXG4gIFNlbGVjdE9wdGlvbk1vZGFsID0gJ3NlbGVjdC1vcHRpb24tbW9kYWwnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHNldHRpbmcgY29tcG9uZW50IHdyYXBwZXIuXG4gICAqL1xuICBTZXR0aW5nQ29tcG9uZW50V3JhcHBlciA9ICdzZXR0aW5nLWNvbXBvbmVudC13cmFwcGVyJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSBzZXR0aW5ncyB0YWJzLlxuICAgKi9cbiAgU2V0dGluZ3NUYWJzID0gJ3NldHRpbmdzLXRhYnMnLFxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0YWcgbGlzdCBjb21wb25lbnQuXG4gICAqL1xuICBUYWdMaXN0Q29tcG9uZW50ID0gJ3RhZy1saXN0LWNvbXBvbmVudCcsXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRlbGVwaG9uZSBjb21wb25lbnQuXG4gICAqL1xuICBUZWxlcGhvbmVDb21wb25lbnQgPSAndGVsZXBob25lLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdGV4dCBib3guXG4gICAqL1xuICBUZXh0Qm94ID0gJ3RleHQtYm94JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0aW1lIGNvbXBvbmVudC5cbiAgICovXG4gIFRpbWVDb21wb25lbnQgPSAndGltZS1jb21wb25lbnQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAuXG4gICAqL1xuICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHRvb2x0aXAgYXJyb3cuXG4gICAqL1xuICBUb29sdGlwQXJyb3cgPSAndG9vbHRpcC1hcnJvdycsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdG9vbHRpcCB2YWxpZGF0b3IuXG4gICAqL1xuICBUb29sdGlwVmFsaWRhdG9yID0gJ3Rvb2x0aXAtdmFsaWRhdG9yJyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0cmktc3RhdGUgY2hlY2tib3ggY29tcG9uZW50LlxuICAgKi9cbiAgVHJpU3RhdGVDaGVja2JveENvbXBvbmVudCA9ICd0cmktc3RhdGUtY2hlY2tib3gtY29tcG9uZW50JyxcblxuICAvKipcbiAgICogQSBDU1MgY2xhc3MgZm9yIHRoZSB0eXBlZCBkcm9wZG93biBjb21wb25lbnQuXG4gICAqL1xuICBUeXBlZERyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgdHlwZWQgbXVsdGlwbGUgZHJvcGRvd24gY29tcG9uZW50LlxuICAgKi9cbiAgVHlwZWRNdWx0aXBsZURyb3Bkb3duQ29tcG9uZW50ID0gJ3R5cGVkLW11bHRpcGxlLWRyb3Bkb3duLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciBhbiBpbnB1dCB0aGUgdXNlciBoYXMgbm90IGludGVyYWN0ZWQgd2l0aCB5ZXQsIHVzZWQgdG8gZGVmZXIgdGhlIGludmFsaWQgc3R5bGluZyB1bnRpbFxuICAgKiB0aGUgaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIFVudG91Y2hlZCA9ICd1bnRvdWNoZWQnLFxuXG4gIC8qKlxuICAgKiBBIENTUyBjbGFzcyBmb3IgdGhlIHVybCBjb21wb25lbnQuXG4gICAqL1xuICBVcmxDb21wb25lbnQgPSAndXJsLWNvbXBvbmVudCcsXG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIGZvciB0aGUgd2VlayBjb21wb25lbnQuXG4gICAqL1xuICBXZWVrQ29tcG9uZW50ID0gJ3dlZWstY29tcG9uZW50J1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUFTTyxJQUFLLFdBQUwsa0JBQUtBLGNBQUw7QUFJTCxFQUFBQSxVQUFBLGdCQUFhO0FBS2IsRUFBQUEsVUFBQSxrQkFBZTtBQUtmLEVBQUFBLFVBQUEsdUJBQW9CO0FBS3BCLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsVUFBTztBQUtQLEVBQUFBLFVBQUEsOEJBQTJCO0FBSzNCLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLG1CQUFnQjtBQUtoQixFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLHlCQUFzQjtBQUl0QixFQUFBQSxVQUFBLHFCQUFrQjtBQUtsQixFQUFBQSxVQUFBLGlCQUFjO0FBTWQsRUFBQUEsVUFBQSxjQUFXO0FBS1gsRUFBQUEsVUFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEsVUFBQSxpQkFBYztBQUtkLEVBQUFBLFVBQUEsbUJBQWdCO0FBSWhCLEVBQUFBLFVBQUEsc0JBQW1CO0FBS25CLEVBQUFBLFVBQUEsc0JBQW1CO0FBS25CLEVBQUFBLFVBQUEsb0JBQWlCO0FBS2pCLEVBQUFBLFVBQUEsdUJBQW9CO0FBTXBCLEVBQUFBLFVBQUEsZ0NBQTZCO0FBSzdCLEVBQUFBLFVBQUEsNEJBQXlCO0FBS3pCLEVBQUFBLFVBQUEsa0JBQWU7QUFPZixFQUFBQSxVQUFBLHlCQUFzQjtBQUt0QixFQUFBQSxVQUFBLHdCQUFxQjtBQUtyQixFQUFBQSxVQUFBLG1CQUFnQjtBQU1oQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxVQUFBLCtCQUE0QjtBQUs1QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLDJCQUF3QjtBQUt4QixFQUFBQSxVQUFBLDJCQUF3QjtBQUt4QixFQUFBQSxVQUFBLHFCQUFrQjtBQUtsQixFQUFBQSxVQUFBLGNBQVc7QUFLWCxFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLDBCQUF1QjtBQU12QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLDZCQUEwQjtBQU0xQixFQUFBQSxVQUFBLHlCQUFzQjtBQUt0QixFQUFBQSxVQUFBLHNCQUFtQjtBQU1uQixFQUFBQSxVQUFBLHVDQUFvQztBQUtwQyxFQUFBQSxVQUFBLHVCQUFvQjtBQUtwQixFQUFBQSxVQUFBLDRCQUF5QjtBQU16QixFQUFBQSxVQUFBLG1DQUFnQztBQUtoQyxFQUFBQSxVQUFBLGFBQVU7QUFNVixFQUFBQSxVQUFBLHVCQUFvQjtBQVNwQixFQUFBQSxVQUFBLDhCQUEyQjtBQU0zQixFQUFBQSxVQUFBLHdCQUFxQjtBQUtyQixFQUFBQSxVQUFBLGlCQUFjO0FBS2QsRUFBQUEsVUFBQSxtQkFBZ0I7QUFLaEIsRUFBQUEsVUFBQSxxQkFBa0I7QUFLbEIsRUFBQUEsVUFBQSx1QkFBb0I7QUFLcEIsRUFBQUEsVUFBQSw2QkFBMEI7QUFLMUIsRUFBQUEsVUFBQSxrQkFBZTtBQUlmLEVBQUFBLFVBQUEsc0JBQW1CO0FBSW5CLEVBQUFBLFVBQUEsd0JBQXFCO0FBS3JCLEVBQUFBLFVBQUEsYUFBVTtBQUtWLEVBQUFBLFVBQUEsbUJBQWdCO0FBS2hCLEVBQUFBLFVBQUEsYUFBVTtBQUtWLEVBQUFBLFVBQUEsa0JBQWU7QUFLZixFQUFBQSxVQUFBLHNCQUFtQjtBQUtuQixFQUFBQSxVQUFBLCtCQUE0QjtBQUs1QixFQUFBQSxVQUFBLDRCQUF5QjtBQUt6QixFQUFBQSxVQUFBLG9DQUFpQztBQU1qQyxFQUFBQSxVQUFBLGVBQVk7QUFLWixFQUFBQSxVQUFBLGtCQUFlO0FBS2YsRUFBQUEsVUFBQSxtQkFBZ0I7QUE5V04sU0FBQUE7QUFBQSxHQUFBOyIsCiAgIm5hbWVzIjogWyJDc3NDbGFzcyJdCn0K
@@ -74,6 +74,13 @@ export interface GitBulkOperationResult<T> {
74
74
  * The operation id, such as `OP12`.
75
75
  */
76
76
  readonly operationId: string;
77
+ /**
78
+ * The id the operation started under, when its lock was recovered as stale while it ran, or `null` otherwise.
79
+ *
80
+ * The changes made before the recovery are in the `<recoveredOperationId> interrupted` commit, and the rest went into
81
+ * a fresh {@link operationId}, so undoing the whole operation takes reverting both.
82
+ */
83
+ readonly recoveredOperationId: null | string;
77
84
  /**
78
85
  * The operation's result.
79
86
  */
@@ -155,9 +162,13 @@ export declare class BulkOperationGitRepo {
155
162
  * follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
156
163
  * still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
157
164
  *
165
+ * When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
166
+ * a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
167
+ * lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
168
+ *
158
169
  * @typeParam T - The type of the operation's result.
159
170
  * @param params - The parameters.
160
- * @returns The operation's result, its id and the hash of its commit.
171
+ * @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
161
172
  */
162
173
  runBulkOperation<T>(params: BulkOperationGitRepoRunBulkOperationParams<T>): Promise<GitBulkOperationResult<T>>;
163
174
  private acquireLock;
@@ -171,6 +182,15 @@ export declare class BulkOperationGitRepo {
171
182
  private isOwnLock;
172
183
  private isStale;
173
184
  private readLock;
185
+ /**
186
+ * Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
187
+ * operation.
188
+ *
189
+ * @param operationId - The id the operation started under.
190
+ * @param pluginId - The id of the plugin running the operation.
191
+ * @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
192
+ */
193
+ private reclaimLockIfRecovered;
174
194
  private recover;
175
195
  private releaseLock;
176
196
  private runGit;
@@ -188,30 +188,36 @@ class BulkOperationGitRepo {
188
188
  * follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
189
189
  * still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
190
190
  *
191
+ * When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
192
+ * a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
193
+ * lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
194
+ *
191
195
  * @typeParam T - The type of the operation's result.
192
196
  * @param params - The parameters.
193
- * @returns The operation's result, its id and the hash of its commit.
197
+ * @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
194
198
  */
195
199
  async runBulkOperation(params) {
196
200
  await this.assertCanCommitLargeFiles();
197
201
  await this.acquireLock();
198
202
  let unregisterProgressListener = null;
199
203
  try {
200
- const operationId = await this.allocateOperationId(params.pluginId);
201
- await this.commitPending({ body: "", subject: buildBeforeOperationCommitSubject(operationId) });
204
+ const startOperationId = await this.allocateOperationId(params.pluginId);
205
+ await this.commitPending({ body: "", subject: buildBeforeOperationCommitSubject(startOperationId) });
202
206
  unregisterProgressListener = registerBulkOperationProgressListener(this.createThrottledHeartbeat());
203
207
  let result;
204
208
  try {
205
209
  result = await params.operation();
206
210
  await params.settle();
207
211
  } catch (error) {
208
- await this.heartbeat();
209
- await this.commitOperation({ isInterrupted: true, operationId, pluginId: params.pluginId });
212
+ const operationId2 = await this.reclaimLockIfRecovered(startOperationId, params.pluginId) ?? startOperationId;
213
+ await this.commitOperation({ isInterrupted: true, operationId: operationId2, pluginId: params.pluginId });
210
214
  throw error;
211
215
  }
212
- await this.heartbeat();
213
- const commitSha = await this.commitOperation({ operationId, pluginId: params.pluginId, summary: params.summary });
214
- return { commitSha, operationId, result };
216
+ const resumedOperationId = await this.reclaimLockIfRecovered(startOperationId, params.pluginId);
217
+ const operationId = resumedOperationId ?? startOperationId;
218
+ const summary = resumedOperationId === null ? params.summary : `${params.summary} (resumed after ${startOperationId} was recovered)`;
219
+ const commitSha = await this.commitOperation({ operationId, pluginId: params.pluginId, summary });
220
+ return { commitSha, operationId, recoveredOperationId: resumedOperationId === null ? null : startOperationId, result };
215
221
  } finally {
216
222
  unregisterProgressListener?.();
217
223
  await this.releaseLock();
@@ -239,8 +245,8 @@ class BulkOperationGitRepo {
239
245
  await setTimeoutAsync(LOCK_POLL_INTERVAL_IN_MILLISECONDS);
240
246
  }
241
247
  }
242
- async allocateOperationId(pluginId) {
243
- const operationId = await this.findNextOperationId();
248
+ async allocateOperationId(pluginId, usedOperationId) {
249
+ const operationId = await this.findNextOperationId(usedOperationId);
244
250
  const ownLock = ensureNonNullable(this.ownLock);
245
251
  this.ownLock = { ...ownLock, heartbeatAt: Date.now(), operationId, pluginId };
246
252
  await this.writeLock(this.ownLock);
@@ -284,11 +290,11 @@ class BulkOperationGitRepo {
284
290
  });
285
291
  };
286
292
  }
287
- async findNextOperationId() {
293
+ async findNextOperationId(usedOperationId) {
288
294
  const result = await this.runGit({
289
295
  gitArguments: ["log", "--all", "--format=%s", "--extended-regexp", "--grep=^(chore: before )?OP[0-9]+"]
290
296
  });
291
- return getNextOperationId(result.stdout.split(/\r?\n/));
297
+ return getNextOperationId([...result.stdout.split(/\r?\n/), usedOperationId ?? ""]);
292
298
  }
293
299
  async heartbeat() {
294
300
  const lock = await this.readLock();
@@ -336,6 +342,25 @@ class BulkOperationGitRepo {
336
342
  startedAt: 0
337
343
  };
338
344
  }
345
+ /**
346
+ * Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
347
+ * operation.
348
+ *
349
+ * @param operationId - The id the operation started under.
350
+ * @param pluginId - The id of the plugin running the operation.
351
+ * @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
352
+ */
353
+ async reclaimLockIfRecovered(operationId, pluginId) {
354
+ const lock = await this.readLock();
355
+ if (lock !== null && this.isOwnLock(lock)) {
356
+ await this.writeLock({ ...lock, heartbeatAt: Date.now() });
357
+ return null;
358
+ }
359
+ console.warn(`The bulk operation lock of ${operationId} was recovered while it ran; committing the rest under a fresh operation id.`);
360
+ this.ownLock = null;
361
+ await this.acquireLock();
362
+ return await this.allocateOperationId(pluginId, operationId);
363
+ }
339
364
  async recover(lock) {
340
365
  const operationId = lock.operationId || await this.findNextOperationId();
341
366
  await this.commitOperation({ isInterrupted: true, operationId, pluginId: lock.pluginId || "unknown" });
@@ -460,4 +485,4 @@ export {
460
485
  BulkOperationGitRepo,
461
486
  GitCommandError
462
487
  };
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IFQ7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmV2ZXJ0UmVzdWx0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJldmVydCBzdG9wcGVkIG9uIGEgY29uZmxpY3QsIGxlYXZpbmcgdGhlIHJlcG8gbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29uZmxpY3Q6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zIHtcbiAgcmVhZG9ubHkgYWxsb3dlZEV4aXRDb2Rlcz86IHJlYWRvbmx5IG51bWJlcltdO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgR2l0Q29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDBfMDAwO1xuY29uc3QgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0NPVU5UID0gMjA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgTUFYX0JVRkZFUl9JTl9CWVRFUyA9IDI2OF80MzVfNDU2O1xuY29uc3QgTUlMTElTRUNPTkRTX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBHSVRfRkFUQUxfRVhJVF9DT0RFID0gMTI4O1xuY29uc3QgUkVWX1BBUlNFX09VVFBVVF9MSU5FX0NPVU5UID0gMjtcbmNvbnN0IFVOSVRfU0VQQVJBVE9SID0gJ1xcdXsxRn0nO1xuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMge1xuICByZWFkb25seSBpc0ludGVycnVwdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbW1pdE1lc3NhZ2Uge1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4ZWNHaXRQYXJhbXMge1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGdpdCByZXBvIGhvbGRpbmcgYSB2YXVsdCwgZHJpdmVuIHRvIHdyYXAgYnVsayBvcGVyYXRpb25zIGluIGNvbW1pdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVwbydzIGdpdCBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2l0RGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tGaWxlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgb3duTG9jazogQnVsa09wZXJhdGlvbkxvY2sgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4gVXNlIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5vcGVufSB0byBmaW5kIHRoZSByZXBvIG9mIGEgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5naXREaXJlY3RvcnkgPSBwYXJhbXMuZ2l0RGlyZWN0b3J5O1xuICAgIHRoaXMud29ya2luZ0RpcmVjdG9yeSA9IHBhcmFtcy53b3JraW5nRGlyZWN0b3J5O1xuICAgIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5sb2NrRmlsZVBhdGggPSBqb2luKHRoaXMuZ2l0RGlyZWN0b3J5LCBCVUxLX09QRVJBVElPTl9MT0NLX0ZJTEVfTkFNRSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGdpdCByZXBvIGEgZm9sZGVyIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB3b3JraW5nRGlyZWN0b3J5IC0gVGhlIGZvbGRlciwgbm9ybWFsbHkgdGhlIHZhdWx0IHJvb3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXBvLCBvciBgbnVsbGAgd2hlbiB0aGUgZm9sZGVyIGlzIG5vdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlIG9yIGBnaXRgIGNhbm5vdCBiZSBydW4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4od29ya2luZ0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBsZXQgcmVzdWx0OiBHaXRDb21tYW5kUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB3b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IFsncmV2LXBhcnNlJywgJy0taXMtaW5zaWRlLXdvcmstdHJlZScsICctLWFic29sdXRlLWdpdC1kaXInXSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbaXNJbnNpZGVXb3JrVHJlZSwgZ2l0RGlyZWN0b3J5XSA9IHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vLCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQpO1xuICAgIHJldHVybiByZXN1bHQuZXhpdENvZGUgIT09IDAgfHwgaXNJbnNpZGVXb3JrVHJlZSAhPT0gJ3RydWUnIHx8ICFnaXREaXJlY3RvcnkgPyBudWxsIDogbmV3IEJ1bGtPcGVyYXRpb25HaXRSZXBvKHsgZ2l0RGlyZWN0b3J5LCB3b3JraW5nRGlyZWN0b3J5IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZXMgdG8gZ28gb24gd2hlbiB0aGUgcmVwbyByb3V0ZXMgZmlsZXMgdGhyb3VnaCBnaXQtYW5uZXggYnV0IGBnaXQtYW5uZXhgIGNhbm5vdCBiZSBydW4sIHNpbmNlIGFcbiAgICogcGxhaW4gYGdpdCBhZGRgIHdvdWxkIHRoZW4gcHV0IHRoZSBsYXJnZSBmaWxlcyBpbnRvIGdpdCBpdHNlbGYuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbm5leEZpbHRlcnMgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ2NvbmZpZycsICctLWdldC1yZWdleHAnLCBTdHJpbmcucmF3YF5maWx0ZXJcXC5hbm5leFxcLmBdIH0pO1xuICAgIGlmICghYW5uZXhGaWx0ZXJzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYW5uZXhWZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnYW5uZXgnLCAndmVyc2lvbicsICctLXJhdyddIH0pLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIGlmIChhbm5leFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB2YXVsdCByZXBvc2l0b3J5IHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCwgYnV0IGdpdC1hbm5leCBpcyBub3Qgb24gUEFUSC4gQnVsayBvcGVyYXRpb24gY29tbWl0cyBhcmUgcmVmdXNlZCwgYmVjYXVzZSB0aGV5IHdvdWxkIGFkZCBsYXJnZSBmaWxlcyB0byBnaXQgaXRzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBidWxrLW9wZXJhdGlvbiBjb21taXRzIGEgcGx1Z2luIG1hZGUgb24gdGhlIGN1cnJlbnQgYnJhbmNoLCBuZXdlc3QgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21taXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3RCdWxrT3BlcmF0aW9uQ29tbWl0cyhwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uQ29tbWl0W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7XG4gICAgICBhbGxvd2VkRXhpdENvZGVzOiBbMCwgR0lUX0ZBVEFMX0VYSVRfQ09ERV0sXG4gICAgICBnaXRBcmd1bWVudHM6IFtcbiAgICAgICAgJ2xvZycsXG4gICAgICAgIGAtLWZvcm1hdD0lSCR7VU5JVF9TRVBBUkFUT1J9JWFJJHtVTklUX1NFUEFSQVRPUn0lc2AsXG4gICAgICAgICctLWV4dGVuZGVkLXJlZ2V4cCcsXG4gICAgICAgIGAtLWdyZXA9XiR7UExVR0lOX1RSQUlMRVJfS0VZfTogJHtlc2NhcGVSZWdFeHAocGx1Z2luSWQpfSRgXG4gICAgICBdXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjb21taXRzOiBCdWxrT3BlcmF0aW9uQ29tbWl0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgICBjb25zdCBbc2hhID0gJycsIGRhdGUgPSAnJywgLi4uc3ViamVjdFBhcnRzXSA9IGxpbmUuc3BsaXQoVU5JVF9TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgY29tbWl0ID0gcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0KHsgZGF0ZSwgc2hhLCBzdWJqZWN0OiBzdWJqZWN0UGFydHMuam9pbihVTklUX1NFUEFSQVRPUikgfSk7XG4gICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgIGNvbW1pdHMucHVzaChjb21taXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWl0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXRzIHdoYXRldmVyIGEgc3RhbGUgbG9jaydzIG9wZXJhdGlvbiBsZWZ0IGJlaGluZCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgIGFuZCByZW1vdmVzIHRoZSBsb2NrLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIHJlY292ZXJlZCBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZXJlIHdhcyBubyBzdGFsZSBsb2NrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXJTdGFsZUxvY2soKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICByZXR1cm4gIWxvY2sgfHwgIXRoaXMuaXNTdGFsZShsb2NrKSA/IG51bGwgOiAoYXdhaXQgdGhpcy5yZWNvdmVyKGxvY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIGEgYnVsay1vcGVyYXRpb24gY29tbWl0IHdpdGggYGdpdCByZXZlcnQgLS1uby1lZGl0YC5cbiAgICpcbiAgICogV2hhdGV2ZXIgaXMgcGVuZGluZyBpcyBjb21taXR0ZWQgZmlyc3QsIHNvIHRoZSByZXZlcnQgc3RhcnRzIGZyb20gYSBjbGVhbiB0cmVlLiBBIGNvbmZsaWN0IGlzIE5PVCBhYm9ydGVkOiB0aGVcbiAgICogcmVwbyBpcyBsZWZ0IG1pZC1yZXZlcnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb21taXQgLSBUaGUgY29tbWl0IHRvIHJldmVydC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgYW5kIHdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdChjb21taXQ6IEJ1bGtPcGVyYXRpb25Db21taXQpOiBQcm9taXNlPEdpdFJldmVydFJlc3VsdD4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21taXRQZW5kaW5nKHsgYm9keTogJycsIHN1YmplY3Q6IGBjaG9yZTogYmVmb3JlIHJldmVydCBvZiAke2NvbW1pdC5vcGVyYXRpb25JZH1gIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBhbGxvd2VkRXhpdENvZGVzOiBbMCwgMV0sIGdpdEFyZ3VtZW50czogWydyZXZlcnQnLCAnLS1uby1lZGl0JywgY29tbWl0LnNoYV0gfSk7XG4gICAgICByZXR1cm4geyBpc0NvbmZsaWN0OiByZXN1bHQuZXhpdENvZGUgIT09IDAsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YC50cmltKCkgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTG9jaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24gYmV0d2VlbiB0d28gY29tbWl0cy5cbiAgICpcbiAgICogVGFrZXMgdGhlIGxlYXNlIGxvY2ssIGNvbW1pdHMgd2hhdGV2ZXIgaXMgcGVuZGluZyBhcyBgY2hvcmU6IGJlZm9yZSBPUDxuPmAsIHJ1bnMgdGhlIG9wZXJhdGlvbiwgd2FpdHMgZm9yIGl0c1xuICAgKiBmb2xsb3ctdXBzIHRvIHNldHRsZSwgY29tbWl0cyB0aGUgcmVzdWx0IGFzIGBPUDxuPjogPHN1bW1hcnk+YCBhbmQgcmVsZWFzZXMgdGhlIGxvY2suIEFuIG9wZXJhdGlvbiB0aGF0IHRocm93c1xuICAgKiBzdGlsbCBnZXRzIGl0cyBwYXJ0aWFsIGNoYW5nZXMgY29tbWl0dGVkLCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgLCBiZWZvcmUgdGhlIGVycm9yIGlzIHJldGhyb3duLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQsIGl0cyBpZCBhbmQgdGhlIGhhc2ggb2YgaXRzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5CdWxrT3BlcmF0aW9uUGFyYW1zPFQ+KTogUHJvbWlzZTxHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIGxldCB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KG9wZXJhdGlvbklkKSB9KTtcblxuICAgICAgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXIgPSByZWdpc3RlckJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyKHRoaXMuY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCkpO1xuXG4gICAgICBsZXQgcmVzdWx0OiBUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgICAgICBhd2FpdCBwYXJhbXMuc2V0dGxlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBhd2FpdCB0aGlzLmhlYXJ0YmVhdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogcGFyYW1zLnBsdWdpbklkIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5oZWFydGJlYXQoKTtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5IH0pO1xuICAgICAgcmV0dXJuIHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVucmVnaXN0ZXJQcm9ncmVzc0xpc3RlbmVyPy4oKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZUxvY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFjcXVpcmVMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5Q3JlYXRlTG9jaygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICAgIGlmICghbG9jaykge1xuICAgICAgICAvLyBSZWxlYXNlZCBiZXR3ZWVuIHRoZSB0d28gY2FsbHM6IHRyeSB0byB0YWtlIGl0IGFnYWluIGF0IG9uY2UuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGxvY2spKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb3Zlcihsb2NrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yICR7bG9jay5vcGVyYXRpb25JZCB8fCAnYW4gb3BlcmF0aW9uJ30gb2YgJHtsb2NrLnBsdWdpbklkfSBvbiAke2xvY2suaG9zdH0gdG8gcmVsZWFzZSB0aGUgYnVsayBvcGVyYXRpb24gbG9jayAke3RoaXMubG9ja0ZpbGVQYXRofS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhMT0NLX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG9jYXRlT3BlcmF0aW9uSWQocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0TmV4dE9wZXJhdGlvbklkKHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVyKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcGVyYXRpb25JZCA9IGxvY2sub3BlcmF0aW9uSWQgfHwgYXdhaXQgdGhpcy5maW5kTmV4dE9wZXJhdGlvbklkKCk7XG4gICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IGxvY2sucGx1Z2luSWQgfHwgJ3Vua25vd24nIH0pO1xuICAgIGF3YWl0IHVubGluayh0aGlzLmxvY2tGaWxlUGF0aCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VOT0VOVCcpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVsZWFzZUxvY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICBjb25zdCBpc093bkxvY2sgPSBsb2NrICE9PSBudWxsICYmIHRoaXMuaXNPd25Mb2NrKGxvY2spO1xuICAgIHRoaXMub3duTG9jayA9IG51bGw7XG4gICAgaWYgKCFpc093bkxvY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkdpdChwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gICAgY29uc3QgYWxsb3dlZEV4aXRDb2RlcyA9IHBhcmFtcy5hbGxvd2VkRXhpdENvZGVzID8/IFswXTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTs7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0dpdCh7IGN3ZDogdGhpcy53b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IHBhcmFtcy5naXRBcmd1bWVudHMgfSk7XG4gICAgICBpZiAoYWxsb3dlZEV4aXRDb2Rlcy5pbmNsdWRlcyhyZXN1bHQuZXhpdENvZGUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA8IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgJiYgcmVzdWx0LnN0ZGVyci5pbmNsdWRlcygnaW5kZXgubG9jaycpKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEdpdENvbW1hbmRFcnJvcihwYXJhbXMuZ2l0QXJndW1lbnRzLCByZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5zdGRlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhZ2VBbGwoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhZGQnLCAnLS1hbGwnLCAnLS0nLCAnLiddIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLXonLCAnLS0nLCAnLiddIH0pO1xuICAgIHJldHVybiByZXN1bHQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlDcmVhdGVMb2NrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvY2sgPSBjcmVhdGVMb2NrUmVjb3JkKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jayksIHsgZmxhZzogJ3d4JyB9KTtcbiAgICAgIHRoaXMub3duTG9jayA9IGxvY2s7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VFWElTVCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVMb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV3JpdHRlbiBiZXNpZGUgdGhlIGxvY2sgYW5kIHJlbmFtZWQgb3ZlciBpdCwgc28gYSByZWFkZXIgbmV2ZXIgc2VlcyBhIGhhbGYtd3JpdHRlbiBoZWFydGJlYXQuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke3RoaXMubG9ja0ZpbGVQYXRofS4ke1N0cmluZyhsb2NrLnByb2Nlc3NJZCl9LnRtcGA7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeVBhdGgsIEpTT04uc3RyaW5naWZ5KGxvY2spKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5UGF0aCwgdGhpcy5sb2NrRmlsZVBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gYSBgZ2l0YCBjb21tYW5kIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgR2l0Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGdpdEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgYGdpdGAgd2FzIHJ1biB3aXRoLlxuICAgKiBAcGFyYW0gZXhpdENvZGUgLSBUaGUgZXhpdCBjb2RlLlxuICAgKiBAcGFyYW0gc3RkZXJyIC0gV2hhdCBgZ2l0YCBwcmludGVkIHRvIHN0ZGVyci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSwgcHVibGljIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBzdGRlcnI6IHN0cmluZykge1xuICAgIHN1cGVyKGBnaXQgJHtnaXRBcmd1bWVudHMuam9pbignICcpfSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtTdHJpbmcoZXhpdENvZGUpfTogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgIHRoaXMubmFtZSA9ICdHaXRDb21tYW5kRXJyb3InO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2tSZWNvcmQoKTogQnVsa09wZXJhdGlvbkxvY2sge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4ge1xuICAgIGhlYXJ0YmVhdEF0OiBub3csXG4gICAgaG9zdDogaG9zdG5hbWUoKSxcbiAgICBvcGVyYXRpb25JZDogJycsXG4gICAgcGx1Z2luSWQ6ICcnLFxuICAgIHByb2Nlc3NJZDogcHJvY2Vzcy5waWQsXG4gICAgcHJvY2Vzc1N0YXJ0ZWRBdDogZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpLFxuICAgIHN0YXJ0ZWRBdDogbm93XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNHaXQocGFyYW1zOiBFeGVjR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2dpdCcsIFsuLi5wYXJhbXMuZ2l0QXJndW1lbnRzXSwgeyBjd2Q6IHBhcmFtcy5jd2QsIG1heEJ1ZmZlcjogTUFYX0JVRkZFUl9JTl9CWVRFUywgd2luZG93c0hpZGU6IHRydWUgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGdpdCAke3BhcmFtcy5naXRBcmd1bWVudHMuam9pbignICcpfWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh7IGV4aXRDb2RlOiB0eXBlb2YgZXJyb3I/LmNvZGUgPT09ICdudW1iZXInID8gZXJyb3IuY29kZSA6IDAsIHN0ZGVyciwgc3Rkb3V0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcldpdGhDb2RlKGVycm9yOiB1bmtub3duLCBjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IGNvZGU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0FsaXZlKHByb2Nlc3NJZDogbnVtYmVyKTogYm9vbGVhbiB8IG51bGwge1xuICBpZiAocHJvY2Vzc0lkIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocHJvY2Vzc0lkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VTUkNIJykgJiYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VQRVJNJykgfHwgbnVsbCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnQkEsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUIsU0FBUyxvQkFBb0I7QUFDN0IsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxnQkFBZ0I7QUFDekI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQU9yQixTQUFTLDZDQUE2QztBQUN0RDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXNHUCxN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
488
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIsIHdoZW4gaXRzIGxvY2sgd2FzIHJlY292ZXJlZCBhcyBzdGFsZSB3aGlsZSBpdCByYW4sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSByZWNvdmVyeSBhcmUgaW4gdGhlIGA8cmVjb3ZlcmVkT3BlcmF0aW9uSWQ+IGludGVycnVwdGVkYCBjb21taXQsIGFuZCB0aGUgcmVzdCB3ZW50IGludG9cbiAgICogYSBmcmVzaCB7QGxpbmsgb3BlcmF0aW9uSWR9LCBzbyB1bmRvaW5nIHRoZSB3aG9sZSBvcGVyYXRpb24gdGFrZXMgcmV2ZXJ0aW5nIGJvdGguXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyZWRPcGVyYXRpb25JZDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogVDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5yZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRSZXZlcnRSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgbGVhdmluZyB0aGUgcmVwbyBtaWQtcmV2ZXJ0IGZvciB0aGUgdXNlciB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDb25mbGljdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMge1xuICByZWFkb25seSBhbGxvd2VkRXhpdENvZGVzPzogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBHaXRDb21tYW5kUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5jb25zdCBIRUFSVEJFQVRfVEhST1RUTEVfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgPSAyMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBNQVhfQlVGRkVSX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IEdJVF9GQVRBTF9FWElUX0NPREUgPSAxMjg7XG5jb25zdCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQgPSAyO1xuY29uc3QgVU5JVF9TRVBBUkFUT1IgPSAnXFx1ezFGfSc7XG5cbmludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbW1pdE9wZXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXhlY0dpdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ2l0IHJlcG8gaG9sZGluZyBhIHZhdWx0LCBkcml2ZW4gdG8gd3JhcCBidWxrIG9wZXJhdGlvbnMgaW4gY29tbWl0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25HaXRSZXBvIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB3aG9zZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0ZpbGVQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBvd25Mb2NrOiBCdWxrT3BlcmF0aW9uTG9jayB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2Uge0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvLm9wZW59IHRvIGZpbmQgdGhlIHJlcG8gb2YgYSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmdpdERpcmVjdG9yeSA9IHBhcmFtcy5naXREaXJlY3Rvcnk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcGFyYW1zLndvcmtpbmdEaXJlY3Rvcnk7XG4gICAgdGhpcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmxvY2tGaWxlUGF0aCA9IGpvaW4odGhpcy5naXREaXJlY3RvcnksIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZ2l0IHJlcG8gYSBmb2xkZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkgLSBUaGUgZm9sZGVyLCBub3JtYWxseSB0aGUgdmF1bHQgcm9vdC5cbiAgICogQHJldHVybnMgVGhlIHJlcG8sIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaXMgbm90IGluc2lkZSBhIGdpdCB3b3JrIHRyZWUgb3IgYGdpdGAgY2Fubm90IGJlIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3Blbih3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGxldCByZXN1bHQ6IEdpdENvbW1hbmRSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJywgJy0tYWJzb2x1dGUtZ2l0LWRpciddIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtpc0luc2lkZVdvcmtUcmVlLCBnaXREaXJlY3RvcnldID0gcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8sIFJFVl9QQVJTRV9PVVRQVVRfTElORV9DT1VOVCk7XG4gICAgcmV0dXJuIHJlc3VsdC5leGl0Q29kZSAhPT0gMCB8fCBpc0luc2lkZVdvcmtUcmVlICE9PSAndHJ1ZScgfHwgIWdpdERpcmVjdG9yeSA/IG51bGwgOiBuZXcgQnVsa09wZXJhdGlvbkdpdFJlcG8oeyBnaXREaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlcyB0byBnbyBvbiB3aGVuIHRoZSByZXBvIHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCBidXQgYGdpdC1hbm5leGAgY2Fubm90IGJlIHJ1biwgc2luY2UgYVxuICAgKiBwbGFpbiBgZ2l0IGFkZGAgd291bGQgdGhlbiBwdXQgdGhlIGxhcmdlIGZpbGVzIGludG8gZ2l0IGl0c2VsZi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFubmV4RmlsdGVycyA9IGF3YWl0IHRoaXMucnVuR2l0KHsgYWxsb3dlZEV4aXRDb2RlczogWzAsIDFdLCBnaXRBcmd1bWVudHM6IFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsIFN0cmluZy5yYXdgXmZpbHRlclxcLmFubmV4XFwuYF0gfSk7XG4gICAgaWYgKCFhbm5leEZpbHRlcnMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbm5leFZlcnNpb24gPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhbm5leCcsICd2ZXJzaW9uJywgJy0tcmF3J10gfSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKGFubmV4VmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHZhdWx0IHJlcG9zaXRvcnkgcm91dGVzIGZpbGVzIHRocm91Z2ggZ2l0LWFubmV4LCBidXQgZ2l0LWFubmV4IGlzIG5vdCBvbiBQQVRILiBCdWxrIG9wZXJhdGlvbiBjb21taXRzIGFyZSByZWZ1c2VkLCBiZWNhdXNlIHRoZXkgd291bGQgYWRkIGxhcmdlIGZpbGVzIHRvIGdpdCBpdHNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgYSBwbHVnaW4gbWFkZSBvbiB0aGUgY3VycmVudCBicmFuY2gsIG5ld2VzdCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZC5cbiAgICogQHJldHVybnMgVGhlIGNvbW1pdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEJ1bGtPcGVyYXRpb25Db21taXRzKHBsdWdpbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Db21taXRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGFsbG93ZWRFeGl0Q29kZXM6IFswLCBHSVRfRkFUQUxfRVhJVF9DT0RFXSxcbiAgICAgIGdpdEFyZ3VtZW50czogW1xuICAgICAgICAnbG9nJyxcbiAgICAgICAgYC0tZm9ybWF0PSVIJHtVTklUX1NFUEFSQVRPUn0lYUkke1VOSVRfU0VQQVJBVE9SfSVzYCxcbiAgICAgICAgJy0tZXh0ZW5kZWQtcmVnZXhwJyxcbiAgICAgICAgYC0tZ3JlcD1eJHtQTFVHSU5fVFJBSUxFUl9LRVl9OiAke2VzY2FwZVJlZ0V4cChwbHVnaW5JZCl9JGBcbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbW1pdHM6IEJ1bGtPcGVyYXRpb25Db21taXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQuc3Rkb3V0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgIGNvbnN0IFtzaGEgPSAnJywgZGF0ZSA9ICcnLCAuLi5zdWJqZWN0UGFydHNdID0gbGluZS5zcGxpdChVTklUX1NFUEFSQVRPUik7XG4gICAgICBjb25zdCBjb21taXQgPSBwYXJzZUJ1bGtPcGVyYXRpb25Db21taXQoeyBkYXRlLCBzaGEsIHN1YmplY3Q6IHN1YmplY3RQYXJ0cy5qb2luKFVOSVRfU0VQQVJBVE9SKSB9KTtcbiAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgY29tbWl0cy5wdXNoKGNvbW1pdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgd2hhdGV2ZXIgYSBzdGFsZSBsb2NrJ3Mgb3BlcmF0aW9uIGxlZnQgYmVoaW5kIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAgYW5kIHJlbW92ZXMgdGhlIGxvY2suXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgcmVjb3ZlcmVkIG9wZXJhdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlcmUgd2FzIG5vIHN0YWxlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIHJldHVybiAhbG9jayB8fCAhdGhpcy5pc1N0YWxlKGxvY2spID8gbnVsbCA6IChhd2FpdCB0aGlzLnJlY292ZXIobG9jaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgd2l0aCBgZ2l0IHJldmVydCAtLW5vLWVkaXRgLlxuICAgKlxuICAgKiBXaGF0ZXZlciBpcyBwZW5kaW5nIGlzIGNvbW1pdHRlZCBmaXJzdCwgc28gdGhlIHJldmVydCBzdGFydHMgZnJvbSBhIGNsZWFuIHRyZWUuIEEgY29uZmxpY3QgaXMgTk9UIGFib3J0ZWQ6IHRoZVxuICAgKiByZXBvIGlzIGxlZnQgbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1pdCAtIFRoZSBjb21taXQgdG8gcmV2ZXJ0LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZlcnQgc3RvcHBlZCBvbiBhIGNvbmZsaWN0LCBhbmQgd2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0KGNvbW1pdDogQnVsa09wZXJhdGlvbkNvbW1pdCk6IFByb21pc2U8R2l0UmV2ZXJ0UmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYGNob3JlOiBiZWZvcmUgcmV2ZXJ0IG9mICR7Y29tbWl0Lm9wZXJhdGlvbklkfWAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ3JldmVydCcsICctLW5vLWVkaXQnLCBjb21taXQuc2hhXSB9KTtcbiAgICAgIHJldHVybiB7IGlzQ29uZmxpY3Q6IHJlc3VsdC5leGl0Q29kZSAhPT0gMCwgb3V0cHV0OiBgJHtyZXN1bHQuc3Rkb3V0fSR7cmVzdWx0LnN0ZGVycn1gLnRyaW0oKSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBjb21taXRzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgbGVhc2UgbG9jaywgY29tbWl0cyB3aGF0ZXZlciBpcyBwZW5kaW5nIGFzIGBjaG9yZTogYmVmb3JlIE9QPG4+YCwgcnVucyB0aGUgb3BlcmF0aW9uLCB3YWl0cyBmb3IgaXRzXG4gICAqIGZvbGxvdy11cHMgdG8gc2V0dGxlLCBjb21taXRzIHRoZSByZXN1bHQgYXMgYE9QPG4+OiA8c3VtbWFyeT5gIGFuZCByZWxlYXNlcyB0aGUgbG9jay4gQW4gb3BlcmF0aW9uIHRoYXQgdGhyb3dzXG4gICAqIHN0aWxsIGdldHMgaXRzIHBhcnRpYWwgY2hhbmdlcyBjb21taXR0ZWQsIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAsIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmV0aHJvd24uXG4gICAqXG4gICAqIFdoZW4gdGhlIGxvY2sgd2FzIHJlY292ZXJlZCB1bmRlciB0aGUgb3BlcmF0aW9uIChpdCB3ZW50IHN0YWxlLCBhbmQgYW5vdGhlciBvcGVyYXRpb24sIHRoZSBzY2hlZHVsZWQgYXV0b2NvbW1pdCBvclxuICAgKiBhIHJlbG9hZCBjb21taXR0ZWQgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlZCBpdCksIHRoZSByZXN0IGlzIG5ldmVyIGNvbW1pdHRlZCB1bmRlciB0aGUgcmVjb3ZlcmVkIGlkOiB0aGVcbiAgICogbG9jayBpcyB0YWtlbiBhZ2FpbiBhbmQgdGhlIHJlc3QgaXMgY29tbWl0dGVkIGFzIGEgZnJlc2ggYE9QPG0+YCB3aG9zZSBzdW1tYXJ5IG5hbWVzIGBPUDxuPmAuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdCwgaXRzIGlkLCB0aGUgaGFzaCBvZiBpdHMgY29tbWl0IGFuZCB0aGUgaWQgaXQgbG9zdCB0byBhIHJlY292ZXJ5LCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuQnVsa09wZXJhdGlvbjxUPihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuQnVsa09wZXJhdGlvblBhcmFtczxUPik6IFByb21pc2U8R2l0QnVsa09wZXJhdGlvblJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICBsZXQgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydE9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KHN0YXJ0T3BlcmF0aW9uSWQpIH0pO1xuXG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lciA9IHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIodGhpcy5jcmVhdGVUaHJvdHRsZWRIZWFydGJlYXQoKSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCk7XG4gICAgICAgIGF3YWl0IHBhcmFtcy5zZXR0bGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5yZWNsYWltTG9ja0lmUmVjb3ZlcmVkKHN0YXJ0T3BlcmF0aW9uSWQsIHBhcmFtcy5wbHVnaW5JZCkgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VtZWRPcGVyYXRpb25JZCA9IGF3YWl0IHRoaXMucmVjbGFpbUxvY2tJZlJlY292ZXJlZChzdGFydE9wZXJhdGlvbklkLCBwYXJhbXMucGx1Z2luSWQpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSByZXN1bWVkT3BlcmF0aW9uSWQgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSByZXN1bWVkT3BlcmF0aW9uSWQgPT09IG51bGwgPyBwYXJhbXMuc3VtbWFyeSA6IGAke3BhcmFtcy5zdW1tYXJ5fSAocmVzdW1lZCBhZnRlciAke3N0YXJ0T3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQpYDtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnkgfSk7XG4gICAgICByZXR1cm4geyBjb21taXRTaGEsIG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZDogcmVzdW1lZE9wZXJhdGlvbklkID09PSBudWxsID8gbnVsbCA6IHN0YXJ0T3BlcmF0aW9uSWQsIHJlc3VsdCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcj8uKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3F1aXJlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLmxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUNyZWF0ZUxvY2soKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgICBpZiAoIWxvY2spIHtcbiAgICAgICAgLy8gUmVsZWFzZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzOiB0cnkgdG8gdGFrZSBpdCBhZ2FpbiBhdCBvbmNlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdGFsZShsb2NrKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlY292ZXIobG9jayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke2xvY2sub3BlcmF0aW9uSWQgfHwgJ2FuIG9wZXJhdGlvbid9IG9mICR7bG9jay5wbHVnaW5JZH0gb24gJHtsb2NrLmhvc3R9IHRvIHJlbGVhc2UgdGhlIGJ1bGsgb3BlcmF0aW9uIGxvY2sgJHt0aGlzLmxvY2tGaWxlUGF0aH0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkOiBzdHJpbmcsIHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQodXNlZE9wZXJhdGlvbklkKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICAvLyBBIHJlY292ZXJlZCBvcGVyYXRpb24gdGhhdCBjaGFuZ2VkIG5vdGhpbmcgeWV0IGxlZnQgbm8gY29tbWl0IG5hbWluZyBpdHMgaWQsIHNvIGl0IGlzIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICAgIHJldHVybiBnZXROZXh0T3BlcmF0aW9uSWQoWy4uLnJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSwgdXNlZE9wZXJhdGlvbklkID8/ICcnXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgb3BlcmF0aW9uJ3MgbG9jayBiZWZvcmUgaXRzIGNvbW1pdCwgb3IgdGFrZXMgdGhlIGxvY2sgYWdhaW4gd2hlbiBpdCB3YXMgcmVjb3ZlcmVkIHVuZGVyIHRoZVxuICAgKiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZCAtIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGxvY2sgaXMgc3RpbGwgdGhlIG9wZXJhdGlvbidzIG93biwgb3RoZXJ3aXNlIHRoZSBmcmVzaCBpZCB0aGUgcmVzdCBpcyBjb21taXR0ZWQgdW5kZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY2xhaW1Mb2NrSWZSZWNvdmVyZWQob3BlcmF0aW9uSWQ6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgaWYgKGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVMb2NrKHsgLi4ubG9jaywgaGVhcnRiZWF0QXQ6IERhdGUubm93KCkgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGBUaGUgYnVsayBvcGVyYXRpb24gbG9jayBvZiAke29wZXJhdGlvbklkfSB3YXMgcmVjb3ZlcmVkIHdoaWxlIGl0IHJhbjsgY29tbWl0dGluZyB0aGUgcmVzdCB1bmRlciBhIGZyZXNoIG9wZXJhdGlvbiBpZC5gKTtcbiAgICB0aGlzLm93bkxvY2sgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkLCBvcGVyYXRpb25JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXIobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gbG9jay5vcGVyYXRpb25JZCB8fCBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogbG9jay5wbHVnaW5JZCB8fCAndW5rbm93bicgfSk7XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWxlYXNlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGNvbnN0IGlzT3duTG9jayA9IGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jayk7XG4gICAgdGhpcy5vd25Mb2NrID0gbnVsbDtcbiAgICBpZiAoIWlzT3duTG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB1bmxpbmsodGhpcy5sb2NrRmlsZVBhdGgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuR2l0KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxvd2VkRXhpdENvZGVzID0gcGFyYW1zLmFsbG93ZWRFeGl0Q29kZXMgPz8gWzBdO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOzsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogcGFyYW1zLmdpdEFyZ3VtZW50cyB9KTtcbiAgICAgIGlmIChhbGxvd2VkRXhpdENvZGVzLmluY2x1ZGVzKHJlc3VsdC5leGl0Q29kZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgSU5ERVhfTE9DS19SRVRSWV9DT1VOVCAmJiByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCdpbmRleC5sb2NrJykpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgR2l0Q29tbWFuZEVycm9yKHBhcmFtcy5naXRBcmd1bWVudHMsIHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0LnN0ZGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFnZUFsbCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2FkZCcsICctLWFsbCcsICctLScsICcuJ10gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnZGlmZicsICctLWNhY2hlZCcsICctLW5hbWUtb25seScsICcteicsICctLScsICcuJ10gfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUNyZWF0ZUxvY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9jayA9IGNyZWF0ZUxvY2tSZWNvcmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRoaXMubG9ja0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShsb2NrKSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGhpcy5vd25Mb2NrID0gbG9jaztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRUVYSVNUJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUxvY2sobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXcml0dGVuIGJlc2lkZSB0aGUgbG9jayBhbmQgcmVuYW1lZCBvdmVyIGl0LCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIGEgaGFsZi13cml0dGVuIGhlYXJ0YmVhdC5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7dGhpcy5sb2NrRmlsZVBhdGh9LiR7U3RyaW5nKGxvY2sucHJvY2Vzc0lkKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcG9yYXJ5UGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jaykpO1xuICAgIGF3YWl0IHJlbmFtZSh0ZW1wb3JhcnlQYXRoLCB0aGlzLmxvY2tGaWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGBnaXRgIGNvbW1hbmQgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRDb21tYW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZ2l0QXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBgZ2l0YCB3YXMgcnVuIHdpdGguXG4gICAqIEBwYXJhbSBleGl0Q29kZSAtIFRoZSBleGl0IGNvZGUuXG4gICAqIEBwYXJhbSBzdGRlcnIgLSBXaGF0IGBnaXRgIHByaW50ZWQgdG8gc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlciwgcHVibGljIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGdpdCAke2dpdEFyZ3VtZW50cy5qb2luKCcgJyl9IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke1N0cmluZyhleGl0Q29kZSl9OiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0dpdENvbW1hbmRFcnJvcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9ja1JlY29yZCgpOiBCdWxrT3BlcmF0aW9uTG9jayB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgaGVhcnRiZWF0QXQ6IG5vdyxcbiAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICBwbHVnaW5JZDogJycsXG4gICAgcHJvY2Vzc0lkOiBwcm9jZXNzLnBpZCxcbiAgICBwcm9jZXNzU3RhcnRlZEF0OiBnZXRQcm9jZXNzU3RhcnRlZEF0KCksXG4gICAgc3RhcnRlZEF0OiBub3dcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY0dpdChwYXJhbXM6IEV4ZWNHaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnZ2l0JywgWy4uLnBhcmFtcy5naXRBcmd1bWVudHNdLCB7IGN3ZDogcGFyYW1zLmN3ZCwgbWF4QnVmZmVyOiBNQVhfQlVGRkVSX0lOX0JZVEVTLCB3aW5kb3dzSGlkZTogdHJ1ZSB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gZ2l0ICR7cGFyYW1zLmdpdEFyZ3VtZW50cy5qb2luKCcgJyl9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgZXhpdENvZGU6IHR5cGVvZiBlcnJvcj8uY29kZSA9PT0gJ251bWJlcicgPyBlcnJvci5jb2RlIDogMCwgc3RkZXJyLCBzdGRvdXQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9jZXNzU3RhcnRlZEF0KCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocHJvY2Vzc0lkOiBudW1iZXIpOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChwcm9jZXNzSWQgPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzSWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAhaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVNSQ0gnKSAmJiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVBFUk0nKSB8fCBudWxsKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWdCQSxTQUFTLHVCQUF1QjtBQUNoQyxTQUFTLGlCQUFpQjtBQUMxQixTQUFTLG9CQUFvQjtBQUM3QixTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBT3JCLFNBQVMsNkNBQTZDO0FBQ3REO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBOEdQLE1BQU0sNENBQTRDO0FBQ2xELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0seUNBQXlDO0FBQy9DLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sOEJBQThCO0FBQ3BDLE1BQU0saUJBQWlCO0FBc0JoQixNQUFNLHFCQUFxQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSWhCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQTtBQUFBLEVBRUM7QUFBQSxFQUNBO0FBQUEsRUFDVCxVQUFvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9yQyxZ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
@@ -0,0 +1,22 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The desktop arm of {@link ./request-url.ts | requestUrlStream}: requests a URL through `node:http` /
6
+ * `node:https`, so the response body streams as it arrives and an abort really cancels the request.
7
+ *
8
+ * Desktop only: it reads `node:http` and `node:https`. Reach it through `requestUrlStream`, which imports it
9
+ * dynamically on desktop.
10
+ *
11
+ * Unlike Chromium's network stack, Node does not read the system proxy settings or certificate store, so a machine
12
+ * that reaches the internet only through a proxy, or that intercepts TLS with its own root certificate, needs the
13
+ * buffered `requestUrlEx` instead.
14
+ */
15
+ import type { EncodedRequestUrlRequest, RequestUrlStreamResponse } from './request-url.mjs';
16
+ /**
17
+ * Requests a URL through `node:http` / `node:https` and returns its body as a stream, following redirects.
18
+ *
19
+ * @param request - The encoded request.
20
+ * @returns The response, with a streamed body.
21
+ */
22
+ export declare function openDesktopRequestUrlStream(request: EncodedRequestUrlRequest): Promise<RequestUrlStreamResponse>;