@mnaoumov/obsidian-lib 10.8.0 → 10.10.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 (102) hide show
  1. package/README.md +4 -0
  2. package/codemirror/editor-mode-extension/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +42 -1
  4. package/dist/lib/cjs/__merged.d.cts +7 -2
  5. package/dist/lib/cjs/code-block-render-handoff.cjs +2 -5
  6. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +180 -0
  7. package/dist/lib/cjs/codemirror/editor-mode-extension.d.cts +50 -0
  8. package/dist/lib/cjs/codemirror/index.cjs +4 -1
  9. package/dist/lib/cjs/codemirror/index.d.cts +1 -0
  10. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +4 -7
  11. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +2 -2
  12. package/dist/lib/cjs/community-plugins.cjs +2 -2
  13. package/dist/lib/cjs/components/all-windows-event-component.cjs +86 -14
  14. package/dist/lib/cjs/components/all-windows-event-component.d.cts +54 -3
  15. package/dist/lib/cjs/components/monkey-around-component.cjs +1 -1
  16. package/dist/lib/cjs/components/plugin-notice-component.cjs +2 -6
  17. package/dist/lib/cjs/components/plugin-settings-component.cjs +4 -3
  18. package/dist/lib/cjs/components/plugin-settings-component.d.cts +2 -1
  19. package/dist/lib/cjs/components/style-sheet-component.cjs +1 -4
  20. package/dist/lib/cjs/css-class.cjs +7 -1
  21. package/dist/lib/cjs/css-class.d.cts +24 -0
  22. package/dist/lib/cjs/data-stores/shared-data-store.cjs +15 -4
  23. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +5 -5
  24. package/dist/lib/cjs/folder-note.cjs +5 -5
  25. package/dist/lib/cjs/formula-function.cjs +152 -0
  26. package/dist/lib/cjs/formula-function.d.cts +98 -0
  27. package/dist/lib/cjs/frontmatter-formatting.cjs +2 -2
  28. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  29. package/dist/lib/cjs/i18n/i18n.cjs +38 -10
  30. package/dist/lib/cjs/i18n/i18n.d.cts +29 -2
  31. package/dist/lib/cjs/i18n/locales/en.cjs +13 -1
  32. package/dist/lib/cjs/i18n/locales/en.d.cts +12 -0
  33. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +12 -0
  34. package/dist/lib/cjs/index.cjs +7 -1
  35. package/dist/lib/cjs/index.d.cts +2 -0
  36. package/dist/lib/cjs/link.cjs +12 -12
  37. package/dist/lib/cjs/markdown.cjs +7 -7
  38. package/dist/lib/cjs/modals/code-block-builder.cjs +486 -0
  39. package/dist/lib/cjs/modals/code-block-builder.d.cts +321 -0
  40. package/dist/lib/cjs/modals/index.cjs +4 -1
  41. package/dist/lib/cjs/modals/index.d.cts +1 -0
  42. package/dist/lib/cjs/plugin/index.cjs +4 -1
  43. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  44. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +189 -0
  45. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +111 -0
  46. package/dist/lib/cjs/plugin/plugin.cjs +47 -2
  47. package/dist/lib/cjs/plugin/plugin.d.cts +25 -1
  48. package/dist/lib/cjs/vault.cjs +2 -2
  49. package/dist/lib/cjs/virtual-file.cjs +340 -0
  50. package/dist/lib/cjs/virtual-file.d.cts +48 -0
  51. package/dist/lib/esm/__merged.d.mts +7 -2
  52. package/dist/lib/esm/__merged.mjs +48 -2
  53. package/dist/lib/esm/code-block-render-handoff.mjs +2 -5
  54. package/dist/lib/esm/codemirror/editor-mode-extension.d.mts +50 -0
  55. package/dist/lib/esm/codemirror/editor-mode-extension.mjs +93 -0
  56. package/dist/lib/esm/codemirror/index.d.mts +1 -0
  57. package/dist/lib/esm/codemirror/index.mjs +3 -1
  58. package/dist/lib/esm/codemirror/inline-token-widgets.mjs +3 -9
  59. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +2 -2
  60. package/dist/lib/esm/community-plugins.mjs +2 -2
  61. package/dist/lib/esm/components/all-windows-event-component.d.mts +54 -3
  62. package/dist/lib/esm/components/all-windows-event-component.mjs +87 -14
  63. package/dist/lib/esm/components/monkey-around-component.mjs +1 -1
  64. package/dist/lib/esm/components/plugin-notice-component.mjs +2 -6
  65. package/dist/lib/esm/components/plugin-settings-component.d.mts +2 -1
  66. package/dist/lib/esm/components/plugin-settings-component.mjs +4 -3
  67. package/dist/lib/esm/components/style-sheet-component.mjs +1 -4
  68. package/dist/lib/esm/css-class.d.mts +24 -0
  69. package/dist/lib/esm/css-class.mjs +7 -1
  70. package/dist/lib/esm/data-stores/shared-data-store.mjs +15 -4
  71. package/dist/lib/esm/desktop-bulk-operation-git.mjs +5 -5
  72. package/dist/lib/esm/folder-note.mjs +5 -5
  73. package/dist/lib/esm/formula-function.d.mts +98 -0
  74. package/dist/lib/esm/formula-function.mjs +62 -0
  75. package/dist/lib/esm/frontmatter-formatting.mjs +2 -2
  76. package/dist/lib/esm/generated-during-build.mjs +2 -2
  77. package/dist/lib/esm/i18n/i18n.d.mts +29 -2
  78. package/dist/lib/esm/i18n/i18n.mjs +40 -10
  79. package/dist/lib/esm/i18n/locales/en.d.mts +12 -0
  80. package/dist/lib/esm/i18n/locales/en.mjs +13 -1
  81. package/dist/lib/esm/i18n/locales/translations-map.d.mts +12 -0
  82. package/dist/lib/esm/index.d.mts +2 -0
  83. package/dist/lib/esm/index.mjs +5 -1
  84. package/dist/lib/esm/link.mjs +12 -12
  85. package/dist/lib/esm/markdown.mjs +7 -7
  86. package/dist/lib/esm/modals/code-block-builder.d.mts +321 -0
  87. package/dist/lib/esm/modals/code-block-builder.mjs +408 -0
  88. package/dist/lib/esm/modals/index.d.mts +1 -0
  89. package/dist/lib/esm/modals/index.mjs +3 -1
  90. package/dist/lib/esm/plugin/index.d.mts +1 -0
  91. package/dist/lib/esm/plugin/index.mjs +3 -1
  92. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +111 -0
  93. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +96 -0
  94. package/dist/lib/esm/plugin/plugin.d.mts +25 -1
  95. package/dist/lib/esm/plugin/plugin.mjs +52 -2
  96. package/dist/lib/esm/vault.mjs +2 -2
  97. package/dist/lib/esm/virtual-file.d.mts +48 -0
  98. package/dist/lib/esm/virtual-file.mjs +264 -0
  99. package/dist/styles.css +31 -1
  100. package/modals/code-block-builder/package.json +6 -0
  101. package/package.json +5 -5
  102. package/plugin/plugin-async-cleanup/package.json +6 -0
@@ -277,12 +277,12 @@ async function markdownToHtml(params) {
277
277
  const {
278
278
  app,
279
279
  markdown,
280
- sourcePath
280
+ sourcePath = ""
281
281
  } = params;
282
282
  const component = new Component();
283
283
  component.load();
284
284
  const renderDiv = createDiv();
285
- await MarkdownRenderer.render(app, markdown, renderDiv, sourcePath ?? "", component);
285
+ await MarkdownRenderer.render(app, markdown, renderDiv, sourcePath, component);
286
286
  const html = renderDiv.innerHTML;
287
287
  component.unload();
288
288
  return html;
@@ -291,7 +291,7 @@ function registerLinkHandlers(params) {
291
291
  const {
292
292
  app,
293
293
  el,
294
- sourcePath
294
+ sourcePath = ""
295
295
  } = params;
296
296
  MarkdownPreviewRenderer.registerDomEvents(
297
297
  el,
@@ -299,7 +299,7 @@ function registerLinkHandlers(params) {
299
299
  new FixedZIndexDomEventsHandlersInfo({
300
300
  app,
301
301
  el,
302
- path: sourcePath ?? ""
302
+ path: sourcePath
303
303
  })
304
304
  )
305
305
  );
@@ -330,7 +330,7 @@ async function renderInternalLink(params) {
330
330
  app,
331
331
  folderNote,
332
332
  pathOrAbstractFile,
333
- shouldRevealFile
333
+ shouldRevealFile = false
334
334
  } = params;
335
335
  function reveal(abstractFileToReveal) {
336
336
  invokeAsyncSafely(async () => {
@@ -365,7 +365,7 @@ async function renderInternalLink(params) {
365
365
  app,
366
366
  el: aEl
367
367
  });
368
- if (shouldRevealFile ?? false) {
368
+ if (shouldRevealFile) {
369
369
  aEl.addEventListener("click", () => {
370
370
  const file = getAbstractFileOrNull({ app, pathOrFile: pathOrAbstractFile });
371
371
  if (isFile(file)) {
@@ -393,4 +393,4 @@ export {
393
393
  renderExternalLink,
394
394
  renderInternalLink
395
395
  };
396
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgTWFya2Rvd24gY29udGVudCBpbiBPYnNpZGlhbi5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIERvbUV2ZW50c0hhbmRsZXJzLFxuICBEb21FdmVudHNIYW5kbGVyc0luZm8sXG4gIEVtYmVkUmVnaXN0cnlFbWJlZEJ5RXh0ZW5zaW9uUmVjb3JkXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHNsZWVwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBnZXRaSW5kZXgsXG4gIHdhaXRVbnRpbENvbm5lY3RlZFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdXJsJztcbmltcG9ydCB7IEludGVybmFsUGx1Z2luTmFtZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG92ZXJQb3BvdmVyLFxuICBLZXltYXAsXG4gIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLFxuICBNYXJrZG93blJlbmRlcmVyLFxuICBNZW51LFxuICBOb3RpY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGb2xkZXJOb3RlTG9jYXRpb24gfSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJldmVhbEluRmlsZUV4cGxvcmVyIH0gZnJvbSAnLi9maWxlLWV4cGxvcmVyLnRzJztcbmltcG9ydCB7XG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc0ZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHJlc29sdmVGb2xkZXJOb3RlLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIHJlZ2lzdGVyRm9sZEhhbmRsZXJzLFxuICByZWdpc3RlckZvb3Rub3RlTGlua0hhbmRsZXJcbn0gZnJvbSAnLi9yZW5kZXJlZC1tYXJrZG93bi50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgdG8gbGV0IE9ic2lkaWFuIHNldHRsZSBiZWZvcmUgb3BlbmluZyBhIGZvbGRlciBub3RlLiBUaGUgY2xpY2sgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYW5cbiAqIG9wZXJhdGlvbiB0aGF0IGNyZWF0ZWQsIHJld3JvdGUgYW5kIHRyYXNoZWQgbm90ZXMsIGFuZCBvcGVuaW5nIGludG8gdGhlIG1pZGRsZSBvZiBPYnNpZGlhbidzIG93blxuICogcmVhY3Rpb24gdG8gdGhhdCBzaG93cyB0aGUgbm90ZSBiZWZvcmUgaXRzIG1ldGFkYXRhIGhhcyBjYXVnaHQgdXAuXG4gKi9cbmNvbnN0IERFTEFZX0JFRk9SRV9PUEVOX0lOX01JTExJU0VDT05EUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMgYW4gZXh0ZXJuYWwgbGluaydzIGNvbnRleHQgbWVudSBkZWNsYXJlcywgaW4gT2JzaWRpYW4ncyBvd24gb3JkZXIuIFRoZSBvcmRlciBpcyB3aGF0XG4gKiB7QGxpbmsgTWVudS5zb3J0fSBncm91cHMgdGhlIGl0ZW1zIGJ5LCBzbyBpdCBoYXMgdG8gbWF0Y2ggd2hhdFxuICoge0BsaW5rIFdvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudX0gYW5kIGV2ZXJ5IGB1cmwtbWVudWAgbGlzdGVuZXIgZXhwZWN0IHRvIGZpbGwuXG4gKi9cbmNvbnN0IEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnc2VsZWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICdpbmZvJyxcbiAgJ2FjdGlvbicsXG4gICd2aWV3JyxcbiAgJycsXG4gICdkYW5nZXInXG5dO1xuXG4vKipcbiAqIFRoZSBzZWN0aW9ucyBhbiBpbnRlcm5hbCBsaW5rJ3MgY29udGV4dCBtZW51IGRlY2xhcmVzLCBpbiBPYnNpZGlhbidzIG93biBvcmRlci4gU2VlXG4gKiB7QGxpbmsgRVhURVJOQUxfTElOS19NRU5VX1NFQ1RJT05TfSDigJQgdGhlIGNvdW50ZXJwYXJ0IGZvciBgZmlsZS1tZW51YCBsaXN0ZW5lcnMuXG4gKi9cbmNvbnN0IElOVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnYWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICd2aWV3JyxcbiAgJ2luZm8nLFxuICAnJyxcbiAgJ2Rhbmdlcidcbl07XG5cbi8qKlxuICogVGhlIHBhcmFtcyBmb3IgdGhlIGZ1bGwgcmVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxSZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29tcG9uZW50IGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudD86IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIEhUTUxFbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG1ha2UgdGhlIHJlbmRlcmVkIGhlYWRpbmdzIGFuZCBuZXN0ZWQgbGlzdHMgZm9sZGFibGUsIGFzIGluIGEgUmVhZGluZyB2aWV3LiBTZWVcbiAgICoge0BsaW5rIHJlZ2lzdGVyRm9sZEhhbmRsZXJzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlZ2lzdGVyIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckxpbmtIYW5kbGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCB0byByZXNvbHZlIHJlbGF0aXZlIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy8nYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbWFya2Rvd25Ub0h0bWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duVG9IdG1sUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyTGlua0hhbmRsZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckxpbmtIYW5kbGVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MRWxlbWVudCB0byByZWdpc3RlciBsaW5rIGhhbmRsZXJzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVuZGVyRXh0ZXJuYWxMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgZXh0ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIHJlbmRlciB0aGUgZXh0ZXJuYWwgbGluayBmb3IuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9sZGVyLW5vdGUgc2V0dXAge0BsaW5rIHJlbmRlckludGVybmFsTGlua30gcmVzb2x2ZXMgYSBmb2xkZXIgbGluaydzIG5vdGUgd2l0aCDigJQgZXZlcnl0aGluZ1xuICoge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfSB0YWtlcyBleGNlcHQgdGhlIGFwcCwgd2hpY2ggdGhlIGxpbmsgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua0ZvbGRlck5vdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LiBTZWUge0BsaW5rIFJlc29sdmVGb2xkZXJOb3RlQ29uZmlnUGFyYW1zLmV4dGVuc2lvbnN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIFNlZVxuICAgKiB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMuaXNIaWRkZW59LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci4gU2VlIHtAbGluayBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcy5sb2NhdGlvbn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIuIFNlZSB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMucmVzb2x2ZU5hbWV9LlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5kZXJJbnRlcm5hbExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBjbGljayBoYXMgcmV2ZWFsZWQgdGhlIGxpbmsncyBkZXN0aW5hdGlvbiBpbiB0aGUgZmlsZSBleHBsb3Jlciwgb25jZSB0aGUgZXhwbG9yZXIgaGFzXG4gICAqIGZpbmlzaGVkIHRha2luZyB0aGUgZm9jdXMgZm9yIGl0IOKAlCBzbyB0aGlzIGlzIHdoZXJlIGEgY2FsbGVyIG1vdmVzIHRoZSBmb2N1cyBzb21ld2hlcmUgZWxzZS5cbiAgICpcbiAgICogQXdhaXRlZCwgYW5kIGNhbGxlZCBvbmx5IGZvciBhIGNsaWNrIHRoYXQgcmV2ZWFsczogYWx3YXlzIGZvciBhIGZvbGRlciBsaW5rLCBhbmQgZm9yIGEgZmlsZSBsaW5rIG9ubHlcbiAgICogd2l0aCB7QGxpbmsgUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zLnNob3VsZFJldmVhbEZpbGV9IGFuZCBhIGRlc3RpbmF0aW9uIHRoYXQgZXhpc3RzLiBXaXRoIHRoZSBmaWxlXG4gICAqIGV4cGxvcmVyIGRpc2FibGVkIGl0IGlzIHN0aWxsIGNhbGxlZCwgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgaXMgdGhlbiBub3RoaW5nIHRvIHdhaXQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgYWZ0ZXJSZXZlYWw/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaW50ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoaWNoIG5vdGUgaXMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSwgd2hlbiB0aGUgbGluayBuYW1lcyBhIEZPTERFUi5cbiAgICpcbiAgICogT21pdHRlZCBtZWFucyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99OiB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbidzIGxpdmVcbiAgICogY29uZmlndXJhdGlvbiwgb3IgYSBub3RlIG5hbWVkIGFmdGVyIGl0cyBmb2xkZXIsIGluc2lkZSBpdCwgd2hlbiB0aGF0IHBsdWdpbiBpcyBhYnNlbnQuIFBhc3NcbiAgICogYHsgbG9jYXRpb246IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lIH1gIGZvciBhIGZvbGRlciBsaW5rIHRoYXQgbXVzdCBvbmx5IGV2ZXIgcmV2ZWFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICByZWFkb25seSBmb2xkZXJOb3RlPzogUmVuZGVySW50ZXJuYWxMaW5rRm9sZGVyTm90ZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuZGVyIHRoZSBpbnRlcm5hbCBsaW5rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIGEgRklMRSBsaW5rIGFsc28gaGlnaGxpZ2h0cyB0aGF0IGZpbGUgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIG9uIHRvcCBvZiB0aGUgb3BlblxuICAgKiBPYnNpZGlhbidzIG93biBsaW5rIGhhbmRsZXIgcGVyZm9ybXMuXG4gICAqXG4gICAqIE9wdC1pbiwgdW5saWtlIHRoZSBmb2xkZXIgYnJhbmNoOiBhIGZvbGRlciBsaW5rIGhhcyBhbHdheXMgcmV2ZWFsZWQgKHJldmVhbGluZyB3YXMgYWxsIGl0cyBjbGlja1xuICAgKiBjb3VsZCBtZWFuKSwgd2hlcmVhcyBhIGZpbGUgbGluayBoYXMgYWx3YXlzIG9ubHkgb3BlbmVkIOKAlCBzbyB0dXJuaW5nIHRoaXMgb24gYnkgZGVmYXVsdCB3b3VsZCBjaGFuZ2VcbiAgICogd2hhdCBldmVyeSBleGlzdGluZyBjYWxsZXIncyBsaW5rIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldmVhbEZpbGU/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRml4ZWRaSW5kZXhEb21FdmVudHNIYW5kbGVyc0luZm9Db25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY2xhc3MgRW1iZWRCeUV4dGVuc2lvbk1kUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbWJlZEJ5RXh0ZW5zaW9uOiBFbWJlZFJlZ2lzdHJ5RW1iZWRCeUV4dGVuc2lvblJlY29yZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiB0aGlzLmVtYmVkQnlFeHRlbnNpb24sXG4gICAgICBtZXRob2ROYW1lOiAnbWQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtjb250ZXh0XVxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb250ZXh0LmRpc3BsYXlNb2RlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvIGltcGxlbWVudHMgRG9tRXZlbnRzSGFuZGxlcnNJbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGhvdmVyUG9wb3ZlcigpOiBIb3ZlclBvcG92ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faG92ZXJQb3BvdmVyO1xuICB9XG5cbiAgcHVibGljIHNldCBob3ZlclBvcG92ZXIoaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faG92ZXJQb3BvdmVyID0gaG92ZXJQb3BvdmVyO1xuICAgIGlmIChob3ZlclBvcG92ZXIgJiYgdGhpcy56SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaG92ZXJQb3BvdmVyLmhvdmVyRWwuc2V0Q3NzU3R5bGVzKHtcbiAgICAgICAgekluZGV4OiBTdHJpbmcodGhpcy56SW5kZXgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgekluZGV4PzogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5lbCA9IHBhcmFtcy5lbDtcblxuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbENvbm5lY3RlZCh0aGlzLmVsKTtcbiAgICAgIHRoaXMudXBkYXRlWkluZGV4KHRoaXMuZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVaSW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnpJbmRleCA9IGdldFpJbmRleChlbGVtZW50KSArIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyZWQgbGluayBET0VTIHdoZW4gaXQgaXMgY2xpY2tlZCwgaG92ZXJlZCwgZHJhZ2dlZCBvciByaWdodC1jbGlja2VkLlxuICpcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gb25seSBwZXJmb3JtcyB0aGUgREVMRUdBVElPTiBoYWxmIOKAlCB3aGljaCBlbGVtZW50IGFuXG4gKiBldmVudCBsYW5kZWQgb24sIHdoaWNoIGxpbmsgdGV4dCBpdCBjYXJyaWVzLCBhbmQgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyB0byBjYWxsLiBUaGUgaGFsZiBpdCBkb2VzIG5vdFxuICogcHJvdmlkZSBpcyB0aGlzIG9uZSwgYW5kIE9ic2lkaWFuIGtlZXBzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gcHJpdmF0ZTogdGhlIG9ubHkgaGFuZGxlIG9uIGl0IGlzIHRoZVxuICogaW5zdGFuY2UgYSBsaXZlIHByZXZpZXcgdmlldyBwYXNzZXMgaW4uIHtAbGluayBnZXREb21FdmVudHNIYW5kbGVyc0NvbnN0cnVjdG9yfSB1c2VkIHRvIG9idGFpbiBpdCBieVxuICogb3BlbmluZyBhIHJlYWwgbGVhZiBvbiBhbiBhcmJpdHJhcnkgbm90ZSBhbmQgaW50ZXJjZXB0aW5nIHRoYXQgY2FsbCDigJQgd2hpY2ggbXV0YXRlZCB0aGUgdXNlcidzXG4gKiB3b3Jrc3BhY2Ugb24gRVZFUlkgY29uc3VtZXIncyBsb2FkIChhIHRhYiBvcGVuaW5nIGFuZCBjbG9zaW5nLCB0d28gYGZpbGUtb3BlbmAgYW5kIHR3b1xuICogYGFjdGl2ZS1sZWFmLWNoYW5nZWAgZXZlbnRzLCBhbiB1bnJlbGF0ZWQgbm90ZSByZW5kZXJlZCBpbiBwcmV2aWV3KS5cbiAqXG4gKiBUaGVzZSBib2RpZXMgYXJlIGEgcG9ydCBvZiB0aGF0IGNsYXNzLCBzbyBub3RoaW5nIGhhcyB0byBiZSBvcGVuZWQuIEtlZXBpbmdcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gZm9yIHRoZSBkZWxlZ2F0aW9uIGlzIHdoYXQga2VlcHMgZm9vdG5vdGUgbGlua3MsXG4gKiB0YWdzLCBleHRlcm5hbCBsaW5rcywgbW9kLWNsaWNrIGFuZCBkcmFnIGJlaGF2aW5nIGV4YWN0bHkgYXMgdGhleSBkbyBpbnNpZGUgYSByZWFsIHByZXZpZXcuXG4gKi9cbmNsYXNzIExpbmtEb21FdmVudHNIYW5kbGVycyBpbXBsZW1lbnRzIERvbUV2ZW50c0hhbmRsZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5mbzogRG9tRXZlbnRzSGFuZGxlcnNJbmZvKSB7fVxuXG4gIHB1YmxpYyBvbkV4dGVybmFsTGlua0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCFpc1VybChsaW5rVGV4dCkpIHtcbiAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmZhaWxlZFRvT3BlblVybCwgeyB1cmw6IGxpbmtUZXh0IH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllclBhbmVUeXBlID0gS2V5bWFwLmlzTW9kRXZlbnQoJGV2ZW50KTtcbiAgICB0YXJnZXRFbC53aW4ub3BlbihsaW5rVGV4dCwgdHlwZW9mIG1vZGlmaWVyUGFuZVR5cGUgPT09ICdib29sZWFuJyA/ICcnIDogbW9kaWZpZXJQYW5lVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25FeHRlcm5hbExpbmtSaWdodENsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IE1lbnUuZm9yRXZlbnQoJGV2ZW50KTtcbiAgICBtZW51LmFkZFNlY3Rpb25zKEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyk7XG4gICAgYWRkQ29weU1lbnVJdGVtKG1lbnUsIHRhcmdldEVsKTtcbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudShtZW51LCBsaW5rVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIF90YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCBLZXltYXAuaXNNb2RFdmVudCgkZXZlbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtEcmFnKCRldmVudDogRHJhZ0V2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdNYW5hZ2VyID0gdGhpcy5pbmZvLmFwcC5kcmFnTWFuYWdlcjtcbiAgICBkcmFnTWFuYWdlci5vbkRyYWdTdGFydCgkZXZlbnQsIGRyYWdNYW5hZ2VyLmRyYWdMaW5rKCRldmVudCwgbGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCB0aXRsZSkpO1xuICB9XG5cbiAgcHVibGljIG9uSW50ZXJuYWxMaW5rTW91c2VvdmVyKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gYGhvdmVyUGFyZW50YCBpcyB0aGUgaW5mbyBvYmplY3QgaXRzZWxmLCBleGFjdGx5IGFzIE9ic2lkaWFuIHBhc3NlcyBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IGtlZXBzXG4gICAgLy8gYEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvYCdzIHBvcG92ZXIgei1pbmRleCBmaXggaW4gcGxheS5cbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS50cmlnZ2VyKCdob3Zlci1saW5rJywge1xuICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgIGhvdmVyUGFyZW50OiB0aGlzLmluZm8sXG4gICAgICBsaW5rdGV4dDogbGlua1RleHQsXG4gICAgICBzb3VyY2U6ICdwcmV2aWV3JyxcbiAgICAgIHNvdXJjZVBhdGg6IHRoaXMuaW5mby5wYXRoLFxuICAgICAgdGFyZ2V0RWxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVybmFsTGlua1JpZ2h0Q2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gTWVudS5mb3JFdmVudCgkZXZlbnQpO1xuICAgIG1lbnUuc2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbCk7XG4gICAgbWVudS5hZGRTZWN0aW9ucyhJTlRFUk5BTF9MSU5LX01FTlVfU0VDVElPTlMpO1xuICAgIGFkZENvcHlNZW51SXRlbShtZW51LCB0YXJnZXRFbCk7XG4gICAgdGhpcy5pbmZvLmFwcC53b3Jrc3BhY2UuaGFuZGxlTGlua0NvbnRleHRNZW51KG1lbnUsIGxpbmtUZXh0LCB0aGlzLmluZm8ucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWdDbGljayhfJGV2ZW50OiBNb3VzZUV2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFzIGFscmVhZHkgY2FsbGVkIGBwcmV2ZW50RGVmYXVsdCgpYCBmb3IgYSB0YWcgY2xpY2suXG4gICAgdGhpcy5pbmZvLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkdsb2JhbFNlYXJjaCk/Lm9wZW5HbG9iYWxTZWFyY2goYHRhZzoke3RhZ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgbWFya2Rvd24gYW5kIGVtYmVkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdWxsIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdWxsIHJlbmRlciBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZ1bGxSZW5kZXIocGFyYW1zOiBGdWxsUmVuZGVyUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnLyc7XG4gIGxldCBzaG91bGRVbmxvYWRDb21wb25lbnQgPSBmYWxzZTtcbiAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50O1xuICBpZiAocGFyYW1zLmNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudCA9IHBhcmFtcy5jb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICAgIGNvbXBvbmVudC5sb2FkKCk7XG4gICAgc2hvdWxkVW5sb2FkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHVzaW5nIF8gPSBjb21wb25lbnQuYWRkQ2hpbGQobmV3IEVtYmVkQnlFeHRlbnNpb25NZFBhdGNoQ29tcG9uZW50KHBhcmFtcy5hcHAuZW1iZWRSZWdpc3RyeS5lbWJlZEJ5RXh0ZW5zaW9uKSk7XG5cbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIocGFyYW1zLmFwcCwgcGFyYW1zLm1hcmtkb3duLCBwYXJhbXMuZWwsIHNvdXJjZVBhdGgsIGNvbXBvbmVudCk7XG5cbiAgaWYgKHNob3VsZFVubG9hZENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJMaW5rSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckxpbmtIYW5kbGVycyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXM+KHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIGVsOiBwYXJhbXMuZWwsXG4gICAgICBzb3VyY2VQYXRoOiBwYXJhbXMuc291cmNlUGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckZvbGRIYW5kbGVycyh7IGVsOiBwYXJhbXMuZWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBNYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgSFRNTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChwYXJhbXM6IE1hcmtkb3duVG9IdG1sUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBtYXJrZG93bixcbiAgICBzb3VyY2VQYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTtcbiAgY29tcG9uZW50LmxvYWQoKTtcbiAgY29uc3QgcmVuZGVyRGl2ID0gY3JlYXRlRGl2KCk7XG4gIGF3YWl0IE1hcmtkb3duUmVuZGVyZXIucmVuZGVyKGFwcCwgbWFya2Rvd24sIHJlbmRlckRpdiwgc291cmNlUGF0aCA/PyAnJywgY29tcG9uZW50KTtcbiAgY29uc3QgaHRtbCA9IHJlbmRlckRpdi5pbm5lckhUTUw7XG4gIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgcmV0dXJuIGh0bWw7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBlbGVtZW50LCBzbyBpdHMgbGlua3MgYWN0IGFzIHRoZXkgZG8gaW4gYSBSZWFkaW5nIHZpZXc6IGNsaWNrLFxuICogbW9kLWNsaWNrLCBtaWRkbGUtY2xpY2ssIGRyYWcsIGhvdmVyIHByZXZpZXcsIHRoZSBjb250ZXh0IG1lbnUsIHRhZ3MsIGFuZCBmb290bm90ZSBsaW5rcywgd2hpY2ggc2Nyb2xsXG4gKiB0byB0aGVpciBmb290bm90ZSBhbmQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlZ2lzdGVyaW5nIGxpbmsgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckxpbmtIYW5kbGVycyhwYXJhbXM6IFJlZ2lzdGVyTGlua0hhbmRsZXJzUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgZWwsXG4gICAgc291cmNlUGF0aFxuICB9ID0gcGFyYW1zO1xuICBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50cyhcbiAgICBlbCxcbiAgICBuZXcgTGlua0RvbUV2ZW50c0hhbmRsZXJzKFxuICAgICAgbmV3IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvKHtcbiAgICAgICAgYXBwLFxuICAgICAgICBlbCxcbiAgICAgICAgcGF0aDogc291cmNlUGF0aCA/PyAnJ1xuICAgICAgfSlcbiAgICApXG4gICk7XG4gIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFuZGxlcyBhIGZvb3Rub3RlIGxpbmsncyBob3ZlciwgYnV0IGl0cyBjbGljayBvbmx5IGluc2lkZSBhIFJlYWRpbmcgdmlldy5cbiAgcmVnaXN0ZXJGb290bm90ZUxpbmtIYW5kbGVyKHsgZWwgfSk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBleHRlcm5hbCBsaW5rLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVuZGVyaW5nIHRoZSBleHRlcm5hbCBsaW5rLlxuICogQHJldHVybnMgVGhlIEhUTUxBbmNob3JFbGVtZW50IGNvbnRhaW5pbmcgdGhlIHJlbmRlcmVkIGV4dGVybmFsIGxpbmsuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5kZXJFeHRlcm5hbExpbmsocGFyYW1zOiBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMpOiBQcm9taXNlPEhUTUxBbmNob3JFbGVtZW50PiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgdXJsXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHVybDtcbiAgY29uc3Qgd3JhcHBlckVsID0gY3JlYXRlU3BhbigpO1xuICBhd2FpdCBmdWxsUmVuZGVyKHtcbiAgICBhcHAsXG4gICAgZWw6IHdyYXBwZXJFbCxcbiAgICBtYXJrZG93bjogYFske2Rpc3BsYXlUZXh0fV0oJHt1cmx9KWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGFuIGludGVybmFsIGxpbmsuXG4gKlxuICogV2hhdCBjbGlja2luZyB0aGUgcmVuZGVyZWQgbGluayBkb2VzIGRlcGVuZHMgb24gd2hhdCBpdCBuYW1lczpcbiAqXG4gKiAtIEEgRklMRSBpcyBvcGVuZWQgYnkgT2JzaWRpYW4ncyBvd24gbGluayBoYW5kbGVyIOKAlCBhbmQsIHdpdGhcbiAqICAge0BsaW5rIFJlbmRlckludGVybmFsTGlua1BhcmFtcy5zaG91bGRSZXZlYWxGaWxlfSwgYWRkaXRpb25hbGx5IHJldmVhbGVkIGluIHRoZSBmaWxlIGV4cGxvcmVyLlxuICogLSBBIEZPTERFUiBjYW5ub3QgYmUgb3BlbmVkLCBzbyBpdHMgRk9MREVSIE5PVEUgaXMg4oCUIHRoZSBub3RlIHdob3NlIHByb3BlcnRpZXMgZGVzY3JpYmUgdGhlIGZvbGRlclxuICogICBpdHNlbGYsIHJlc29sdmVkIHRocm91Z2gge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlfSAoYnkgZGVmYXVsdCBmcm9tIHRoZSBpbnN0YWxsZWQgYGZvbGRlci1ub3Rlc2BcbiAqICAgcGx1Z2luJ3MgbGl2ZSBjb25maWd1cmF0aW9uKS4gVGhlIHJldmVhbCBsYW5kcyBvbiB0aGF0IG5vdGUsIHVubGVzcyB0aGUgbm90ZSBpcyBoaWRkZW4gaW4gdGhlXG4gKiAgIGV4cGxvcmVyLCBpbiB3aGljaCBjYXNlIGl0IGxhbmRzIG9uIHRoZSBmb2xkZXIg4oCUIHJldmVhbGluZyBhIGhpZGRlbiBub3RlIHdvdWxkIGhpZ2hsaWdodCBub3RoaW5nLlxuICogICBBIGZvbGRlciB3aXRoIE5PIGZvbGRlciBub3RlIHJldmVhbHMgdGhlIGZvbGRlciBhbmQgb3BlbnMgbm90aGluZzogbm90aGluZyBoZXJlIGV2ZXIgY3JlYXRlcyBhIG5vdGUuXG4gKlxuICogRXZlcnl0aGluZyBpcyByZXNvbHZlZCBhdCBDTElDSyB0aW1lIHJhdGhlciB0aGFuIGF0IHJlbmRlciB0aW1lLCBkZWxpYmVyYXRlbHk6IGEgcmVuZGVyZWQgbGluayBvdXRsaXZlc1xuICogdGhlIG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VkIGl0LCBzbyBhIGRlc3RpbmF0aW9uIHJlbmFtZWQgaW4gYmV0d2VlbiBzdGlsbCByZXZlYWxzIHRoZSByaWdodCBpdGVtLCBhbmQgYVxuICogZm9sZGVyIG5vdGUgd3JpdHRlbiBhZnRlciB0aGUgbGluayBhcHBlYXJlZCBpcyBzdGlsbCBmb3VuZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgaW50ZXJuYWwgbGluay5cbiAqIEByZXR1cm5zIFRoZSBIVE1MQW5jaG9yRWxlbWVudCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBpbnRlcm5hbCBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVySW50ZXJuYWxMaW5rKHBhcmFtczogUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zKTogUHJvbWlzZTxIVE1MQW5jaG9yRWxlbWVudD4ge1xuICBjb25zdCB7XG4gICAgYWZ0ZXJSZXZlYWwsXG4gICAgYXBwLFxuICAgIGZvbGRlck5vdGUsXG4gICAgcGF0aE9yQWJzdHJhY3RGaWxlLFxuICAgIHNob3VsZFJldmVhbEZpbGVcbiAgfSA9IHBhcmFtcztcblxuICAvLyBBIERPTSBsaXN0ZW5lciBjYW5ub3QgYXdhaXQsIHNvIHRoZSByZXZlYWwsIGFuZCB0aGUgaG9vayBvcmRlcmVkIGFmdGVyIGl0LCBydW4gZGV0YWNoZWQuXG4gIGZ1bmN0aW9uIHJldmVhbChhYnN0cmFjdEZpbGVUb1JldmVhbDogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHJldmVhbEluRmlsZUV4cGxvcmVyKHsgYWJzdHJhY3RGaWxlOiBhYnN0cmFjdEZpbGVUb1JldmVhbCwgYXBwIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJSZXZlYWw/LigpO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckFic3RyYWN0RmlsZSk7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHBhdGg7XG4gIGlmIChpc0ZvbGRlcihhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdhJywgeyB0ZXh0OiBkaXNwbGF5VGV4dCB9LCAoYUVsKSA9PiB7XG4gICAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCwgLi4uZm9sZGVyTm90ZSB9KTtcbiAgICAgICAgY29uc3QgZm9sZGVyTm90ZUZpbGUgPSByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXI6IGFic3RyYWN0RmlsZSB9KTtcbiAgICAgICAgcmV2ZWFsKGZvbGRlck5vdGVGaWxlICYmICFjb25maWcuaXNIaWRkZW4gPyBmb2xkZXJOb3RlRmlsZSA6IGFic3RyYWN0RmlsZSk7XG4gICAgICAgIGlmIChmb2xkZXJOb3RlRmlsZSkge1xuICAgICAgICAgIC8vIEEgRE9NIGxpc3RlbmVyIGNhbm5vdCBhd2FpdCwgYW5kIHRoZSBvcGVuIGhhcyB0byBvdXRsaXZlIHRoaXMgaGFuZGxlcjogaXQgc2V0dGxlcyBmaXJzdCwgZm9yXG4gICAgICAgICAgLy8gdGhlIGNsaWNrIHRoYXQgbGFuZHMgcmlnaHQgYXMgYW4gb3BlcmF0aW9uIGZpbmlzaGVzIHdyaXRpbmcuXG4gICAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gb3BlbkFmdGVyU2V0dGxpbmcoYXBwLCBmb2xkZXJOb3RlRmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbWyR7cGF0aH18JHtkaXNwbGF5VGV4dH1dXWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgaWYgKHNob3VsZFJldmVhbEZpbGUgPz8gZmFsc2UpIHtcbiAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBMYXllcmVkIE9OIFRPUCBvZiBPYnNpZGlhbidzIG93biBoYW5kbGVyIOKAlCBubyBgcHJldmVudERlZmF1bHRgLCBzbyB0aGUgb3BlbiBpcyB1bnRvdWNoZWQuIEEgcGF0aFxuICAgICAgLy8gdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGdldHMgbm8gcmV2ZWFsOiBhbiB1bnJlc29sdmVkIGxpbmsgaGFzIG5vdGhpbmcgdG8gcmV2ZWFsLCBhbmQgY2xpY2tpbmdcbiAgICAgIC8vIG9uZSBDUkVBVEVTIHRoZSBub3RlIGl0IG5hbWVzLlxuICAgICAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICByZXZlYWwoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBgY2xpcGJvYXJkYC1zZWN0aW9uIENvcHkgaXRlbSBldmVyeSBsaW5rIGNvbnRleHQgbWVudSBjYXJyaWVzLCBjb3B5aW5nIHRoZSBsaW5rJ3MgRElTUExBWVxuICogdGV4dCDigJQgd2hpY2ggaXMgd2hhdCBPYnNpZGlhbidzIG93biBtZW51IGNvcGllcywgbm90IHRoZSB0YXJnZXQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gbWVudSAtIFRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0by5cbiAqIEBwYXJhbSB0YXJnZXRFbCAtIFRoZSBsaW5rIGVsZW1lbnQgdGhlIG1lbnUgd2FzIG9wZW5lZCBvbi5cbiAqL1xuZnVuY3Rpb24gYWRkQ29weU1lbnVJdGVtKG1lbnU6IE1lbnUsIHRhcmdldEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICBpdGVtXG4gICAgICAuc2V0U2VjdGlvbignY2xpcGJvYXJkJylcbiAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm1lbnUuY29weSkpXG4gICAgICAuc2V0SWNvbignbHVjaWRlLWNvcHknKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0YXJnZXRFbC53aW4ubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGFyZ2V0RWwuZ2V0VGV4dCgpKSk7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBmaWxlIGluIHRoZSBhY3RpdmUgbGVhZiwgb25jZSB0aGUgdmF1bHQgaGFzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpbGUgaXMgb3Blbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbkFmdGVyU2V0dGxpbmcoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERUxBWV9CRUZPUkVfT1BFTl9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGZpbGUsIHsgYWN0aXZlOiB0cnVlIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7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
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHByb2Nlc3NpbmcgTWFya2Rvd24gY29udGVudCBpbiBPYnNpZGlhbi5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gRGVlcGx5IGNvdXBsZWQgdG8gT2JzaWRpYW4gcnVudGltZTsgcmVxdWlyZXMgcnVubmluZyB2YXVsdCBmb3IgbWVhbmluZ2Z1bCB0ZXN0aW5nLiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIERvbUV2ZW50c0hhbmRsZXJzLFxuICBEb21FdmVudHNIYW5kbGVyc0luZm8sXG4gIEVtYmVkUmVnaXN0cnlFbWJlZEJ5RXh0ZW5zaW9uUmVjb3JkXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIFRBYnN0cmFjdEZpbGUsXG4gIFRGaWxlLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHNsZWVwXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBnZXRaSW5kZXgsXG4gIHdhaXRVbnRpbENvbm5lY3RlZFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvaHRtbC1lbGVtZW50JztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdXJsJztcbmltcG9ydCB7IEludGVybmFsUGx1Z2luTmFtZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7IHQgfSBmcm9tICdpMThuZXh0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSG92ZXJQb3BvdmVyLFxuICBLZXltYXAsXG4gIE1hcmtkb3duUHJldmlld1JlbmRlcmVyLFxuICBNYXJrZG93blJlbmRlcmVyLFxuICBNZW51LFxuICBOb3RpY2Vcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckFic3RyYWN0RmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBGb2xkZXJOb3RlTG9jYXRpb24gfSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcblxuaW1wb3J0IHsgTW9ua2V5QXJvdW5kQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL21vbmtleS1hcm91bmQtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IHJldmVhbEluRmlsZUV4cGxvcmVyIH0gZnJvbSAnLi9maWxlLWV4cGxvcmVyLnRzJztcbmltcG9ydCB7XG4gIGdldEFic3RyYWN0RmlsZU9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNGaWxlLFxuICBpc0ZvbGRlclxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIHJlc29sdmVGb2xkZXJOb3RlLFxuICByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1xufSBmcm9tICcuL2ZvbGRlci1ub3RlLnRzJztcbmltcG9ydCB7XG4gIHJlZ2lzdGVyRm9sZEhhbmRsZXJzLFxuICByZWdpc3RlckZvb3Rub3RlTGlua0hhbmRsZXJcbn0gZnJvbSAnLi9yZW5kZXJlZC1tYXJrZG93bi50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgdG8gbGV0IE9ic2lkaWFuIHNldHRsZSBiZWZvcmUgb3BlbmluZyBhIGZvbGRlciBub3RlLiBUaGUgY2xpY2sgY2FuIGxhbmQgcmlnaHQgYWZ0ZXIgYW5cbiAqIG9wZXJhdGlvbiB0aGF0IGNyZWF0ZWQsIHJld3JvdGUgYW5kIHRyYXNoZWQgbm90ZXMsIGFuZCBvcGVuaW5nIGludG8gdGhlIG1pZGRsZSBvZiBPYnNpZGlhbidzIG93blxuICogcmVhY3Rpb24gdG8gdGhhdCBzaG93cyB0aGUgbm90ZSBiZWZvcmUgaXRzIG1ldGFkYXRhIGhhcyBjYXVnaHQgdXAuXG4gKi9cbmNvbnN0IERFTEFZX0JFRk9SRV9PUEVOX0lOX01JTExJU0VDT05EUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUgc2VjdGlvbnMgYW4gZXh0ZXJuYWwgbGluaydzIGNvbnRleHQgbWVudSBkZWNsYXJlcywgaW4gT2JzaWRpYW4ncyBvd24gb3JkZXIuIFRoZSBvcmRlciBpcyB3aGF0XG4gKiB7QGxpbmsgTWVudS5zb3J0fSBncm91cHMgdGhlIGl0ZW1zIGJ5LCBzbyBpdCBoYXMgdG8gbWF0Y2ggd2hhdFxuICoge0BsaW5rIFdvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudX0gYW5kIGV2ZXJ5IGB1cmwtbWVudWAgbGlzdGVuZXIgZXhwZWN0IHRvIGZpbGwuXG4gKi9cbmNvbnN0IEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnc2VsZWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICdpbmZvJyxcbiAgJ2FjdGlvbicsXG4gICd2aWV3JyxcbiAgJycsXG4gICdkYW5nZXInXG5dO1xuXG4vKipcbiAqIFRoZSBzZWN0aW9ucyBhbiBpbnRlcm5hbCBsaW5rJ3MgY29udGV4dCBtZW51IGRlY2xhcmVzLCBpbiBPYnNpZGlhbidzIG93biBvcmRlci4gU2VlXG4gKiB7QGxpbmsgRVhURVJOQUxfTElOS19NRU5VX1NFQ1RJT05TfSDigJQgdGhlIGNvdW50ZXJwYXJ0IGZvciBgZmlsZS1tZW51YCBsaXN0ZW5lcnMuXG4gKi9cbmNvbnN0IElOVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyA9IFtcbiAgJ3RpdGxlJyxcbiAgJ29wZW4nLFxuICAnYWN0aW9uJyxcbiAgJ2NsaXBib2FyZCcsXG4gICd2aWV3JyxcbiAgJ2luZm8nLFxuICAnJyxcbiAgJ2Rhbmdlcidcbl07XG5cbi8qKlxuICogVGhlIHBhcmFtcyBmb3IgdGhlIGZ1bGwgcmVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZ1bGxSZW5kZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgQ29tcG9uZW50IGluc3RhbmNlIHRvIHVzZSBmb3IgdGhlIHJlbmRlci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudD86IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIEhUTUxFbGVtZW50IHRvIHJlbmRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byByZW5kZXIuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG1ha2UgdGhlIHJlbmRlcmVkIGhlYWRpbmdzIGFuZCBuZXN0ZWQgbGlzdHMgZm9sZGFibGUsIGFzIGluIGEgUmVhZGluZyB2aWV3LiBTZWVcbiAgICoge0BsaW5rIHJlZ2lzdGVyRm9sZEhhbmRsZXJzfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlZ2lzdGVyIGxpbmsgaGFuZGxlcnMgZm9yIHRoZSByZW5kZXJlZCBlbGVtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWdpc3RlckxpbmtIYW5kbGVycz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0aCB0byByZXNvbHZlIHJlbGF0aXZlIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJy8nYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgbWFya2Rvd25Ub0h0bWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtkb3duVG9IdG1sUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIE1hcmtkb3duIHN0cmluZyB0byBjb252ZXJ0LlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya2Rvd246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlZ2lzdGVyTGlua0hhbmRsZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlckxpbmtIYW5kbGVyc1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MRWxlbWVudCB0byByZWdpc3RlciBsaW5rIGhhbmRsZXJzIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGVsOiBIVE1MRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwYXRoIHRvIHJlc29sdmUgcmVsYXRpdmUgbGlua3MgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcnYFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVuZGVyRXh0ZXJuYWxMaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJFeHRlcm5hbExpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgZXh0ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgVVJMIHRvIHJlbmRlciB0aGUgZXh0ZXJuYWwgbGluayBmb3IuXG4gICAqL1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZm9sZGVyLW5vdGUgc2V0dXAge0BsaW5rIHJlbmRlckludGVybmFsTGlua30gcmVzb2x2ZXMgYSBmb2xkZXIgbGluaydzIG5vdGUgd2l0aCDigJQgZXZlcnl0aGluZ1xuICoge0BsaW5rIHJlc29sdmVGb2xkZXJOb3RlQ29uZmlnfSB0YWtlcyBleGNlcHQgdGhlIGFwcCwgd2hpY2ggdGhlIGxpbmsgYWxyZWFkeSBjYXJyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua0ZvbGRlck5vdGVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBleHRlbnNpb25zIGEgZm9sZGVyIG5vdGUgbWF5IGNhcnJ5LiBTZWUge0BsaW5rIFJlc29sdmVGb2xkZXJOb3RlQ29uZmlnUGFyYW1zLmV4dGVuc2lvbnN9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWydtZCddYFxuICAgKi9cbiAgcmVhZG9ubHkgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBmb2xkZXIgbm90ZSBpcyBoaWRkZW4gaW4gdGhlIGZpbGUgZXhwbG9yZXIuIFNlZVxuICAgKiB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMuaXNIaWRkZW59LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc0hpZGRlbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBub3RlIHNpdHMgcmVsYXRpdmUgdG8gaXRzIGZvbGRlci4gU2VlIHtAbGluayBSZXNvbHZlRm9sZGVyTm90ZUNvbmZpZ1BhcmFtcy5sb2NhdGlvbn0uXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBGb2xkZXJOb3RlTG9jYXRpb24uQXV0b31cbiAgICovXG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogRm9sZGVyTm90ZUxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBOYW1lcyB0aGUgZm9sZGVyIG5vdGUgb2YgYSBmb2xkZXIuIFNlZSB7QGxpbmsgUmVzb2x2ZUZvbGRlck5vdGVDb25maWdQYXJhbXMucmVzb2x2ZU5hbWV9LlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZvbGRlciB3aG9zZSBub3RlIGlzIGJlaW5nIG5hbWVkLlxuICAgKiBAcmV0dXJucyBUaGUgbm90ZSdzIG5hbWUuXG4gICAqIEBkZWZhdWx0IGAoZm9sZGVyKSA9PiBmb2xkZXIubmFtZWBcbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVOYW1lPzogKGZvbGRlcjogVEZvbGRlcikgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZW5kZXJJbnRlcm5hbExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckludGVybmFsTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgYWZ0ZXIgYSBjbGljayBoYXMgcmV2ZWFsZWQgdGhlIGxpbmsncyBkZXN0aW5hdGlvbiBpbiB0aGUgZmlsZSBleHBsb3Jlciwgb25jZSB0aGUgZXhwbG9yZXIgaGFzXG4gICAqIGZpbmlzaGVkIHRha2luZyB0aGUgZm9jdXMgZm9yIGl0IOKAlCBzbyB0aGlzIGlzIHdoZXJlIGEgY2FsbGVyIG1vdmVzIHRoZSBmb2N1cyBzb21ld2hlcmUgZWxzZS5cbiAgICpcbiAgICogQXdhaXRlZCwgYW5kIGNhbGxlZCBvbmx5IGZvciBhIGNsaWNrIHRoYXQgcmV2ZWFsczogYWx3YXlzIGZvciBhIGZvbGRlciBsaW5rLCBhbmQgZm9yIGEgZmlsZSBsaW5rIG9ubHlcbiAgICogd2l0aCB7QGxpbmsgUmVuZGVySW50ZXJuYWxMaW5rUGFyYW1zLnNob3VsZFJldmVhbEZpbGV9IGFuZCBhIGRlc3RpbmF0aW9uIHRoYXQgZXhpc3RzLiBXaXRoIHRoZSBmaWxlXG4gICAqIGV4cGxvcmVyIGRpc2FibGVkIGl0IGlzIHN0aWxsIGNhbGxlZCwgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgaXMgdGhlbiBub3RoaW5nIHRvIHdhaXQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgYWZ0ZXJSZXZlYWw/OiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGZvciB0aGUgaW50ZXJuYWwgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3BsYXlUZXh0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgdG8gYW5zd2VyIHdoaWNoIG5vdGUgaXMgYSBmb2xkZXIncyBmb2xkZXIgbm90ZSwgd2hlbiB0aGUgbGluayBuYW1lcyBhIEZPTERFUi5cbiAgICpcbiAgICogT21pdHRlZCBtZWFucyB7QGxpbmsgRm9sZGVyTm90ZUxvY2F0aW9uLkF1dG99OiB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgIHBsdWdpbidzIGxpdmVcbiAgICogY29uZmlndXJhdGlvbiwgb3IgYSBub3RlIG5hbWVkIGFmdGVyIGl0cyBmb2xkZXIsIGluc2lkZSBpdCwgd2hlbiB0aGF0IHBsdWdpbiBpcyBhYnNlbnQuIFBhc3NcbiAgICogYHsgbG9jYXRpb246IEZvbGRlck5vdGVMb2NhdGlvbi5Ob25lIH1gIGZvciBhIGZvbGRlciBsaW5rIHRoYXQgbXVzdCBvbmx5IGV2ZXIgcmV2ZWFsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBge31gXG4gICAqL1xuICByZWFkb25seSBmb2xkZXJOb3RlPzogUmVuZGVySW50ZXJuYWxMaW5rRm9sZGVyTm90ZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGFic3RyYWN0IGZpbGUgdG8gcmVuZGVyIHRoZSBpbnRlcm5hbCBsaW5rIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckFic3RyYWN0RmlsZTogUGF0aE9yQWJzdHJhY3RGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGNsaWNraW5nIGEgRklMRSBsaW5rIGFsc28gaGlnaGxpZ2h0cyB0aGF0IGZpbGUgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIG9uIHRvcCBvZiB0aGUgb3BlblxuICAgKiBPYnNpZGlhbidzIG93biBsaW5rIGhhbmRsZXIgcGVyZm9ybXMuXG4gICAqXG4gICAqIE9wdC1pbiwgdW5saWtlIHRoZSBmb2xkZXIgYnJhbmNoOiBhIGZvbGRlciBsaW5rIGhhcyBhbHdheXMgcmV2ZWFsZWQgKHJldmVhbGluZyB3YXMgYWxsIGl0cyBjbGlja1xuICAgKiBjb3VsZCBtZWFuKSwgd2hlcmVhcyBhIGZpbGUgbGluayBoYXMgYWx3YXlzIG9ubHkgb3BlbmVkIOKAlCBzbyB0dXJuaW5nIHRoaXMgb24gYnkgZGVmYXVsdCB3b3VsZCBjaGFuZ2VcbiAgICogd2hhdCBldmVyeSBleGlzdGluZyBjYWxsZXIncyBsaW5rIGRvZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJldmVhbEZpbGU/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRml4ZWRaSW5kZXhEb21FdmVudHNIYW5kbGVyc0luZm9Db25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuY2xhc3MgRW1iZWRCeUV4dGVuc2lvbk1kUGF0Y2hDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbWJlZEJ5RXh0ZW5zaW9uOiBFbWJlZFJlZ2lzdHJ5RW1iZWRCeUV4dGVuc2lvblJlY29yZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaCh7XG4gICAgICAkb2JqZWN0OiB0aGlzLmVtYmVkQnlFeHRlbnNpb24sXG4gICAgICBtZXRob2ROYW1lOiAnbWQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoe1xuICAgICAgICBmYWxsYmFjayxcbiAgICAgICAgb3JpZ2luYWxBcmd1bWVudHM6IFtjb250ZXh0XVxuICAgICAgfSkgPT4ge1xuICAgICAgICBjb250ZXh0LmRpc3BsYXlNb2RlID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvIGltcGxlbWVudHMgRG9tRXZlbnRzSGFuZGxlcnNJbmZvIHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuICBwdWJsaWMgZ2V0IGhvdmVyUG9wb3ZlcigpOiBIb3ZlclBvcG92ZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faG92ZXJQb3BvdmVyO1xuICB9XG5cbiAgcHVibGljIHNldCBob3ZlclBvcG92ZXIoaG92ZXJQb3BvdmVyOiBIb3ZlclBvcG92ZXIgfCBudWxsKSB7XG4gICAgdGhpcy5faG92ZXJQb3BvdmVyID0gaG92ZXJQb3BvdmVyO1xuICAgIGlmIChob3ZlclBvcG92ZXIgJiYgdGhpcy56SW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaG92ZXJQb3BvdmVyLmhvdmVyRWwuc2V0Q3NzU3R5bGVzKHtcbiAgICAgICAgekluZGV4OiBTdHJpbmcodGhpcy56SW5kZXgpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9ob3ZlclBvcG92ZXI6IEhvdmVyUG9wb3ZlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50O1xuXG4gIHByaXZhdGUgekluZGV4PzogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wYXRoID0gcGFyYW1zLnBhdGg7XG4gICAgdGhpcy5lbCA9IHBhcmFtcy5lbDtcblxuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHdhaXRVbnRpbENvbm5lY3RlZCh0aGlzLmVsKTtcbiAgICAgIHRoaXMudXBkYXRlWkluZGV4KHRoaXMuZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVaSW5kZXgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICB0aGlzLnpJbmRleCA9IGdldFpJbmRleChlbGVtZW50KSArIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGF0IGEgcmVuZGVyZWQgbGluayBET0VTIHdoZW4gaXQgaXMgY2xpY2tlZCwgaG92ZXJlZCwgZHJhZ2dlZCBvciByaWdodC1jbGlja2VkLlxuICpcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gb25seSBwZXJmb3JtcyB0aGUgREVMRUdBVElPTiBoYWxmIOKAlCB3aGljaCBlbGVtZW50IGFuXG4gKiBldmVudCBsYW5kZWQgb24sIHdoaWNoIGxpbmsgdGV4dCBpdCBjYXJyaWVzLCBhbmQgd2hpY2ggb2YgdGhlc2UgbWV0aG9kcyB0byBjYWxsLiBUaGUgaGFsZiBpdCBkb2VzIG5vdFxuICogcHJvdmlkZSBpcyB0aGlzIG9uZSwgYW5kIE9ic2lkaWFuIGtlZXBzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gcHJpdmF0ZTogdGhlIG9ubHkgaGFuZGxlIG9uIGl0IGlzIHRoZVxuICogaW5zdGFuY2UgYSBsaXZlIHByZXZpZXcgdmlldyBwYXNzZXMgaW4uIHtAbGluayBnZXREb21FdmVudHNIYW5kbGVyc0NvbnN0cnVjdG9yfSB1c2VkIHRvIG9idGFpbiBpdCBieVxuICogb3BlbmluZyBhIHJlYWwgbGVhZiBvbiBhbiBhcmJpdHJhcnkgbm90ZSBhbmQgaW50ZXJjZXB0aW5nIHRoYXQgY2FsbCDigJQgd2hpY2ggbXV0YXRlZCB0aGUgdXNlcidzXG4gKiB3b3Jrc3BhY2Ugb24gRVZFUlkgY29uc3VtZXIncyBsb2FkIChhIHRhYiBvcGVuaW5nIGFuZCBjbG9zaW5nLCB0d28gYGZpbGUtb3BlbmAgYW5kIHR3b1xuICogYGFjdGl2ZS1sZWFmLWNoYW5nZWAgZXZlbnRzLCBhbiB1bnJlbGF0ZWQgbm90ZSByZW5kZXJlZCBpbiBwcmV2aWV3KS5cbiAqXG4gKiBUaGVzZSBib2RpZXMgYXJlIGEgcG9ydCBvZiB0aGF0IGNsYXNzLCBzbyBub3RoaW5nIGhhcyB0byBiZSBvcGVuZWQuIEtlZXBpbmdcbiAqIHtAbGluayBNYXJrZG93blByZXZpZXdSZW5kZXJlci5yZWdpc3RlckRvbUV2ZW50c30gZm9yIHRoZSBkZWxlZ2F0aW9uIGlzIHdoYXQga2VlcHMgZm9vdG5vdGUgbGlua3MsXG4gKiB0YWdzLCBleHRlcm5hbCBsaW5rcywgbW9kLWNsaWNrIGFuZCBkcmFnIGJlaGF2aW5nIGV4YWN0bHkgYXMgdGhleSBkbyBpbnNpZGUgYSByZWFsIHByZXZpZXcuXG4gKi9cbmNsYXNzIExpbmtEb21FdmVudHNIYW5kbGVycyBpbXBsZW1lbnRzIERvbUV2ZW50c0hhbmRsZXJzIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgaW5mbzogRG9tRXZlbnRzSGFuZGxlcnNJbmZvKSB7fVxuXG4gIHB1YmxpYyBvbkV4dGVybmFsTGlua0NsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKCFpc1VybChsaW5rVGV4dCkpIHtcbiAgICAgIG5ldyBOb3RpY2UodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5ub3RpY2VzLmZhaWxlZFRvT3BlblVybCwgeyB1cmw6IGxpbmtUZXh0IH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBtb2RpZmllclBhbmVUeXBlID0gS2V5bWFwLmlzTW9kRXZlbnQoJGV2ZW50KTtcbiAgICB0YXJnZXRFbC53aW4ub3BlbihsaW5rVGV4dCwgdHlwZW9mIG1vZGlmaWVyUGFuZVR5cGUgPT09ICdib29sZWFuJyA/ICcnIDogbW9kaWZpZXJQYW5lVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgb25FeHRlcm5hbExpbmtSaWdodENsaWNrKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWVudSA9IE1lbnUuZm9yRXZlbnQoJGV2ZW50KTtcbiAgICBtZW51LmFkZFNlY3Rpb25zKEVYVEVSTkFMX0xJTktfTUVOVV9TRUNUSU9OUyk7XG4gICAgYWRkQ29weU1lbnVJdGVtKG1lbnUsIHRhcmdldEVsKTtcbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5oYW5kbGVFeHRlcm5hbExpbmtDb250ZXh0TWVudShtZW51LCBsaW5rVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtDbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQsIF90YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQobGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCBLZXltYXAuaXNNb2RFdmVudCgkZXZlbnQpKSk7XG4gIH1cblxuICBwdWJsaWMgb25JbnRlcm5hbExpbmtEcmFnKCRldmVudDogRHJhZ0V2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGRyYWdNYW5hZ2VyID0gdGhpcy5pbmZvLmFwcC5kcmFnTWFuYWdlcjtcbiAgICBkcmFnTWFuYWdlci5vbkRyYWdTdGFydCgkZXZlbnQsIGRyYWdNYW5hZ2VyLmRyYWdMaW5rKCRldmVudCwgbGlua1RleHQsIHRoaXMuaW5mby5wYXRoLCB0aXRsZSkpO1xuICB9XG5cbiAgcHVibGljIG9uSW50ZXJuYWxMaW5rTW91c2VvdmVyKCRldmVudDogTW91c2VFdmVudCwgdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCBsaW5rVGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gYGhvdmVyUGFyZW50YCBpcyB0aGUgaW5mbyBvYmplY3QgaXRzZWxmLCBleGFjdGx5IGFzIE9ic2lkaWFuIHBhc3NlcyBpdHMgb3duIOKAlCB3aGljaCBpcyB3aGF0IGtlZXBzXG4gICAgLy8gYEZpeGVkWkluZGV4RG9tRXZlbnRzSGFuZGxlcnNJbmZvYCdzIHBvcG92ZXIgei1pbmRleCBmaXggaW4gcGxheS5cbiAgICB0aGlzLmluZm8uYXBwLndvcmtzcGFjZS50cmlnZ2VyKCdob3Zlci1saW5rJywge1xuICAgICAgZXZlbnQ6ICRldmVudCxcbiAgICAgIGhvdmVyUGFyZW50OiB0aGlzLmluZm8sXG4gICAgICBsaW5rdGV4dDogbGlua1RleHQsXG4gICAgICBzb3VyY2U6ICdwcmV2aWV3JyxcbiAgICAgIHNvdXJjZVBhdGg6IHRoaXMuaW5mby5wYXRoLFxuICAgICAgdGFyZ2V0RWxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkludGVybmFsTGlua1JpZ2h0Q2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXRFbDogSFRNTEVsZW1lbnQsIGxpbmtUZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtZW51ID0gTWVudS5mb3JFdmVudCgkZXZlbnQpO1xuICAgIG1lbnUuc2V0UGFyZW50RWxlbWVudCh0YXJnZXRFbCk7XG4gICAgbWVudS5hZGRTZWN0aW9ucyhJTlRFUk5BTF9MSU5LX01FTlVfU0VDVElPTlMpO1xuICAgIGFkZENvcHlNZW51SXRlbShtZW51LCB0YXJnZXRFbCk7XG4gICAgdGhpcy5pbmZvLmFwcC53b3Jrc3BhY2UuaGFuZGxlTGlua0NvbnRleHRNZW51KG1lbnUsIGxpbmtUZXh0LCB0aGlzLmluZm8ucGF0aCk7XG4gIH1cblxuICBwdWJsaWMgb25UYWdDbGljayhfJGV2ZW50OiBNb3VzZUV2ZW50LCBfdGFyZ2V0RWw6IEhUTUxFbGVtZW50LCB0YWc6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIGByZWdpc3RlckRvbUV2ZW50c2AgaGFzIGFscmVhZHkgY2FsbGVkIGBwcmV2ZW50RGVmYXVsdCgpYCBmb3IgYSB0YWcgY2xpY2suXG4gICAgdGhpcy5pbmZvLmFwcC5pbnRlcm5hbFBsdWdpbnMuZ2V0RW5hYmxlZFBsdWdpbkJ5SWQoSW50ZXJuYWxQbHVnaW5OYW1lLkdsb2JhbFNlYXJjaCk/Lm9wZW5HbG9iYWxTZWFyY2goYHRhZzoke3RhZ31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlbmRlciB0aGUgbWFya2Rvd24gYW5kIGVtYmVkcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdWxsIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdWxsIHJlbmRlciBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZ1bGxSZW5kZXIocGFyYW1zOiBGdWxsUmVuZGVyUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBwYXJhbXMuc291cmNlUGF0aCA/PyAnLyc7XG4gIGxldCBzaG91bGRVbmxvYWRDb21wb25lbnQgPSBmYWxzZTtcbiAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50O1xuICBpZiAocGFyYW1zLmNvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudCA9IHBhcmFtcy5jb21wb25lbnQ7XG4gIH0gZWxzZSB7XG4gICAgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICAgIGNvbXBvbmVudC5sb2FkKCk7XG4gICAgc2hvdWxkVW5sb2FkQ29tcG9uZW50ID0gdHJ1ZTtcbiAgfVxuXG4gIHVzaW5nIF8gPSBjb21wb25lbnQuYWRkQ2hpbGQobmV3IEVtYmVkQnlFeHRlbnNpb25NZFBhdGNoQ29tcG9uZW50KHBhcmFtcy5hcHAuZW1iZWRSZWdpc3RyeS5lbWJlZEJ5RXh0ZW5zaW9uKSk7XG5cbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIocGFyYW1zLmFwcCwgcGFyYW1zLm1hcmtkb3duLCBwYXJhbXMuZWwsIHNvdXJjZVBhdGgsIGNvbXBvbmVudCk7XG5cbiAgaWYgKHNob3VsZFVubG9hZENvbXBvbmVudCkge1xuICAgIGNvbXBvbmVudC51bmxvYWQoKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJMaW5rSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckxpbmtIYW5kbGVycyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8UmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXM+KHtcbiAgICAgIGFwcDogcGFyYW1zLmFwcCxcbiAgICAgIGVsOiBwYXJhbXMuZWwsXG4gICAgICBzb3VyY2VQYXRoOiBwYXJhbXMuc291cmNlUGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIGlmIChwYXJhbXMuc2hvdWxkUmVnaXN0ZXJGb2xkSGFuZGxlcnMpIHtcbiAgICByZWdpc3RlckZvbGRIYW5kbGVycyh7IGVsOiBwYXJhbXMuZWwgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBNYXJrZG93biB0byBIVE1MLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbnZlcnNpb24uXG4gKiBAcmV0dXJucyBUaGUgSFRNTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtYXJrZG93blRvSHRtbChwYXJhbXM6IE1hcmtkb3duVG9IdG1sUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBtYXJrZG93bixcbiAgICBzb3VyY2VQYXRoID0gJydcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpO1xuICBjb21wb25lbnQubG9hZCgpO1xuICBjb25zdCByZW5kZXJEaXYgPSBjcmVhdGVEaXYoKTtcbiAgYXdhaXQgTWFya2Rvd25SZW5kZXJlci5yZW5kZXIoYXBwLCBtYXJrZG93biwgcmVuZGVyRGl2LCBzb3VyY2VQYXRoLCBjb21wb25lbnQpO1xuICBjb25zdCBodG1sID0gcmVuZGVyRGl2LmlubmVySFRNTDtcbiAgY29tcG9uZW50LnVubG9hZCgpO1xuICByZXR1cm4gaHRtbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgbGluayBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGVsZW1lbnQsIHNvIGl0cyBsaW5rcyBhY3QgYXMgdGhleSBkbyBpbiBhIFJlYWRpbmcgdmlldzogY2xpY2ssXG4gKiBtb2QtY2xpY2ssIG1pZGRsZS1jbGljaywgZHJhZywgaG92ZXIgcHJldmlldywgdGhlIGNvbnRleHQgbWVudSwgdGFncywgYW5kIGZvb3Rub3RlIGxpbmtzLCB3aGljaCBzY3JvbGxcbiAqIHRvIHRoZWlyIGZvb3Rub3RlIGFuZCBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcmVnaXN0ZXJpbmcgbGluayBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHBhcmFtczogUmVnaXN0ZXJMaW5rSGFuZGxlcnNQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBlbCxcbiAgICBzb3VyY2VQYXRoID0gJydcbiAgfSA9IHBhcmFtcztcbiAgTWFya2Rvd25QcmV2aWV3UmVuZGVyZXIucmVnaXN0ZXJEb21FdmVudHMoXG4gICAgZWwsXG4gICAgbmV3IExpbmtEb21FdmVudHNIYW5kbGVycyhcbiAgICAgIG5ldyBGaXhlZFpJbmRleERvbUV2ZW50c0hhbmRsZXJzSW5mbyh7XG4gICAgICAgIGFwcCxcbiAgICAgICAgZWwsXG4gICAgICAgIHBhdGg6IHNvdXJjZVBhdGhcbiAgICAgIH0pXG4gICAgKVxuICApO1xuICAvLyBgcmVnaXN0ZXJEb21FdmVudHNgIGhhbmRsZXMgYSBmb290bm90ZSBsaW5rJ3MgaG92ZXIsIGJ1dCBpdHMgY2xpY2sgb25seSBpbnNpZGUgYSBSZWFkaW5nIHZpZXcuXG4gIHJlZ2lzdGVyRm9vdG5vdGVMaW5rSGFuZGxlcih7IGVsIH0pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYW4gZXh0ZXJuYWwgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgZXh0ZXJuYWwgbGluay5cbiAqIEByZXR1cm5zIFRoZSBIVE1MQW5jaG9yRWxlbWVudCBjb250YWluaW5nIHRoZSByZW5kZXJlZCBleHRlcm5hbCBsaW5rLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyRXh0ZXJuYWxMaW5rKHBhcmFtczogUmVuZGVyRXh0ZXJuYWxMaW5rUGFyYW1zKTogUHJvbWlzZTxIVE1MQW5jaG9yRWxlbWVudD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHVybFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBkaXNwbGF5VGV4dCA9IHBhcmFtcy5kaXNwbGF5VGV4dCA/PyB1cmw7XG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbJHtkaXNwbGF5VGV4dH1dKCR7dXJsfSlgXG4gIH0pO1xuICBjb25zdCBhRWwgPSB3cmFwcGVyRWwuZmluZCgnYScpIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICByZWdpc3RlckxpbmtIYW5kbGVycyh7XG4gICAgYXBwLFxuICAgIGVsOiBhRWxcbiAgfSk7XG4gIHJldHVybiBhRWw7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpbnRlcm5hbCBsaW5rLlxuICpcbiAqIFdoYXQgY2xpY2tpbmcgdGhlIHJlbmRlcmVkIGxpbmsgZG9lcyBkZXBlbmRzIG9uIHdoYXQgaXQgbmFtZXM6XG4gKlxuICogLSBBIEZJTEUgaXMgb3BlbmVkIGJ5IE9ic2lkaWFuJ3Mgb3duIGxpbmsgaGFuZGxlciDigJQgYW5kLCB3aXRoXG4gKiAgIHtAbGluayBSZW5kZXJJbnRlcm5hbExpbmtQYXJhbXMuc2hvdWxkUmV2ZWFsRmlsZX0sIGFkZGl0aW9uYWxseSByZXZlYWxlZCBpbiB0aGUgZmlsZSBleHBsb3Jlci5cbiAqIC0gQSBGT0xERVIgY2Fubm90IGJlIG9wZW5lZCwgc28gaXRzIEZPTERFUiBOT1RFIGlzIOKAlCB0aGUgbm90ZSB3aG9zZSBwcm9wZXJ0aWVzIGRlc2NyaWJlIHRoZSBmb2xkZXJcbiAqICAgaXRzZWxmLCByZXNvbHZlZCB0aHJvdWdoIHtAbGluayByZXNvbHZlRm9sZGVyTm90ZX0gKGJ5IGRlZmF1bHQgZnJvbSB0aGUgaW5zdGFsbGVkIGBmb2xkZXItbm90ZXNgXG4gKiAgIHBsdWdpbidzIGxpdmUgY29uZmlndXJhdGlvbikuIFRoZSByZXZlYWwgbGFuZHMgb24gdGhhdCBub3RlLCB1bmxlc3MgdGhlIG5vdGUgaXMgaGlkZGVuIGluIHRoZVxuICogICBleHBsb3JlciwgaW4gd2hpY2ggY2FzZSBpdCBsYW5kcyBvbiB0aGUgZm9sZGVyIOKAlCByZXZlYWxpbmcgYSBoaWRkZW4gbm90ZSB3b3VsZCBoaWdobGlnaHQgbm90aGluZy5cbiAqICAgQSBmb2xkZXIgd2l0aCBOTyBmb2xkZXIgbm90ZSByZXZlYWxzIHRoZSBmb2xkZXIgYW5kIG9wZW5zIG5vdGhpbmc6IG5vdGhpbmcgaGVyZSBldmVyIGNyZWF0ZXMgYSBub3RlLlxuICpcbiAqIEV2ZXJ5dGhpbmcgaXMgcmVzb2x2ZWQgYXQgQ0xJQ0sgdGltZSByYXRoZXIgdGhhbiBhdCByZW5kZXIgdGltZSwgZGVsaWJlcmF0ZWx5OiBhIHJlbmRlcmVkIGxpbmsgb3V0bGl2ZXNcbiAqIHRoZSBvcGVyYXRpb24gdGhhdCBwcm9kdWNlZCBpdCwgc28gYSBkZXN0aW5hdGlvbiByZW5hbWVkIGluIGJldHdlZW4gc3RpbGwgcmV2ZWFscyB0aGUgcmlnaHQgaXRlbSwgYW5kIGFcbiAqIGZvbGRlciBub3RlIHdyaXR0ZW4gYWZ0ZXIgdGhlIGxpbmsgYXBwZWFyZWQgaXMgc3RpbGwgZm91bmQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIGludGVybmFsIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgSFRNTEFuY2hvckVsZW1lbnQgY29udGFpbmluZyB0aGUgcmVuZGVyZWQgaW50ZXJuYWwgbGluay5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckludGVybmFsTGluayhwYXJhbXM6IFJlbmRlckludGVybmFsTGlua1BhcmFtcyk6IFByb21pc2U8SFRNTEFuY2hvckVsZW1lbnQ+IHtcbiAgY29uc3Qge1xuICAgIGFmdGVyUmV2ZWFsLFxuICAgIGFwcCxcbiAgICBmb2xkZXJOb3RlLFxuICAgIHBhdGhPckFic3RyYWN0RmlsZSxcbiAgICBzaG91bGRSZXZlYWxGaWxlID0gZmFsc2VcbiAgfSA9IHBhcmFtcztcblxuICAvLyBBIERPTSBsaXN0ZW5lciBjYW5ub3QgYXdhaXQsIHNvIHRoZSByZXZlYWwsIGFuZCB0aGUgaG9vayBvcmRlcmVkIGFmdGVyIGl0LCBydW4gZGV0YWNoZWQuXG4gIGZ1bmN0aW9uIHJldmVhbChhYnN0cmFjdEZpbGVUb1JldmVhbDogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHJldmVhbEluRmlsZUV4cGxvcmVyKHsgYWJzdHJhY3RGaWxlOiBhYnN0cmFjdEZpbGVUb1JldmVhbCwgYXBwIH0pO1xuICAgICAgYXdhaXQgYWZ0ZXJSZXZlYWw/LigpO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IGFic3RyYWN0RmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckFic3RyYWN0RmlsZSk7XG4gIGNvbnN0IGRpc3BsYXlUZXh0ID0gcGFyYW1zLmRpc3BsYXlUZXh0ID8/IHBhdGg7XG4gIGlmIChpc0ZvbGRlcihhYnN0cmFjdEZpbGUpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVsKCdhJywgeyB0ZXh0OiBkaXNwbGF5VGV4dCB9LCAoYUVsKSA9PiB7XG4gICAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBjb25zdCBjb25maWcgPSByZXNvbHZlRm9sZGVyTm90ZUNvbmZpZyh7IGFwcCwgLi4uZm9sZGVyTm90ZSB9KTtcbiAgICAgICAgY29uc3QgZm9sZGVyTm90ZUZpbGUgPSByZXNvbHZlRm9sZGVyTm90ZSh7IGFwcCwgY29uZmlnLCBmb2xkZXI6IGFic3RyYWN0RmlsZSB9KTtcbiAgICAgICAgcmV2ZWFsKGZvbGRlck5vdGVGaWxlICYmICFjb25maWcuaXNIaWRkZW4gPyBmb2xkZXJOb3RlRmlsZSA6IGFic3RyYWN0RmlsZSk7XG4gICAgICAgIGlmIChmb2xkZXJOb3RlRmlsZSkge1xuICAgICAgICAgIC8vIEEgRE9NIGxpc3RlbmVyIGNhbm5vdCBhd2FpdCwgYW5kIHRoZSBvcGVuIGhhcyB0byBvdXRsaXZlIHRoaXMgaGFuZGxlcjogaXQgc2V0dGxlcyBmaXJzdCwgZm9yXG4gICAgICAgICAgLy8gdGhlIGNsaWNrIHRoYXQgbGFuZHMgcmlnaHQgYXMgYW4gb3BlcmF0aW9uIGZpbmlzaGVzIHdyaXRpbmcuXG4gICAgICAgICAgaW52b2tlQXN5bmNTYWZlbHkoKCkgPT4gb3BlbkFmdGVyU2V0dGxpbmcoYXBwLCBmb2xkZXJOb3RlRmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IHdyYXBwZXJFbCA9IGNyZWF0ZVNwYW4oKTtcbiAgYXdhaXQgZnVsbFJlbmRlcih7XG4gICAgYXBwLFxuICAgIGVsOiB3cmFwcGVyRWwsXG4gICAgbWFya2Rvd246IGBbWyR7cGF0aH18JHtkaXNwbGF5VGV4dH1dXWBcbiAgfSk7XG4gIGNvbnN0IGFFbCA9IHdyYXBwZXJFbC5maW5kKCdhJykgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHJlZ2lzdGVyTGlua0hhbmRsZXJzKHtcbiAgICBhcHAsXG4gICAgZWw6IGFFbFxuICB9KTtcbiAgaWYgKHNob3VsZFJldmVhbEZpbGUpIHtcbiAgICBhRWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAvLyBMYXllcmVkIE9OIFRPUCBvZiBPYnNpZGlhbidzIG93biBoYW5kbGVyIOKAlCBubyBgcHJldmVudERlZmF1bHRgLCBzbyB0aGUgb3BlbiBpcyB1bnRvdWNoZWQuIEEgcGF0aFxuICAgICAgLy8gdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGdldHMgbm8gcmV2ZWFsOiBhbiB1bnJlc29sdmVkIGxpbmsgaGFzIG5vdGhpbmcgdG8gcmV2ZWFsLCBhbmQgY2xpY2tpbmdcbiAgICAgIC8vIG9uZSBDUkVBVEVTIHRoZSBub3RlIGl0IG5hbWVzLlxuICAgICAgY29uc3QgZmlsZSA9IGdldEFic3RyYWN0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogcGF0aE9yQWJzdHJhY3RGaWxlIH0pO1xuICAgICAgaWYgKGlzRmlsZShmaWxlKSkge1xuICAgICAgICByZXZlYWwoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFFbDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBgY2xpcGJvYXJkYC1zZWN0aW9uIENvcHkgaXRlbSBldmVyeSBsaW5rIGNvbnRleHQgbWVudSBjYXJyaWVzLCBjb3B5aW5nIHRoZSBsaW5rJ3MgRElTUExBWVxuICogdGV4dCDigJQgd2hpY2ggaXMgd2hhdCBPYnNpZGlhbidzIG93biBtZW51IGNvcGllcywgbm90IHRoZSB0YXJnZXQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gbWVudSAtIFRoZSBtZW51IHRvIGFkZCB0aGUgaXRlbSB0by5cbiAqIEBwYXJhbSB0YXJnZXRFbCAtIFRoZSBsaW5rIGVsZW1lbnQgdGhlIG1lbnUgd2FzIG9wZW5lZCBvbi5cbiAqL1xuZnVuY3Rpb24gYWRkQ29weU1lbnVJdGVtKG1lbnU6IE1lbnUsIHRhcmdldEVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICBtZW51LmFkZEl0ZW0oKGl0ZW0pID0+IHtcbiAgICBpdGVtXG4gICAgICAuc2V0U2VjdGlvbignY2xpcGJvYXJkJylcbiAgICAgIC5zZXRUaXRsZSh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLm1lbnUuY29weSkpXG4gICAgICAuc2V0SWNvbignbHVjaWRlLWNvcHknKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0YXJnZXRFbC53aW4ubmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGFyZ2V0RWwuZ2V0VGV4dCgpKSk7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbnMgYSBmaWxlIGluIHRoZSBhY3RpdmUgbGVhZiwgb25jZSB0aGUgdmF1bHQgaGFzIHNldHRsZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpbGUgaXMgb3Blbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlbkFmdGVyU2V0dGxpbmcoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHNsZWVwKHsgbWlsbGlzZWNvbmRzOiBERUxBWV9CRUZPUkVfT1BFTl9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gIGF3YWl0IGFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLm9wZW5GaWxlKGZpbGUsIHsgYWN0aXZlOiB0cnVlIH0pO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxhQUFhO0FBQ3RCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyw2QkFBNkI7QUFDdEMsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFB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
@@ -0,0 +1,321 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /// <reference lib="dom" />
3
+ /**
4
+ * @file
5
+ *
6
+ * Contains {@link showCodeBlockBuilder}, a modal that builds a plugin's code block from a declarative list of fields, and
7
+ * {@link formatCodeBlock}, the pure formatter behind it.
8
+ *
9
+ * Every field renders as one settings row. A field whose value differs from its default writes one `key: value` line
10
+ * into the block (a required field always does), the block is shown live with an optional preview the plugin draws, and
11
+ * the user copies it or inserts it into the note being edited.
12
+ *
13
+ * Adapted from the code block creator modal of altarok's `obsidian-dev-utils`
14
+ * (https://github.com/altarok/obsidian-dev-utils, `src/code-block-creator/`), under the MIT license below. The port
15
+ * takes the app from the caller, moves the styles into the library stylesheet, reuses this library's setting
16
+ * components, and picks a fence longer than any backtick run in the values.
17
+ *
18
+ * Copyright (c) 2026 Altarok
19
+ *
20
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
21
+ * documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
22
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
23
+ * permit persons to whom the Software is furnished to do so, subject to the following conditions:
24
+ *
25
+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
26
+ * Software.
27
+ *
28
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
29
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
30
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
31
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32
+ */
33
+ import type { Editor } from 'obsidian';
34
+ import type { ModalParamsBase } from './modal.mjs';
35
+ /**
36
+ * A boolean field, rendered as a toggle.
37
+ */
38
+ export interface CodeBlockBuilderBooleanField extends CodeBlockBuilderFieldBase<boolean> {
39
+ /**
40
+ * The kind of the field.
41
+ */
42
+ readonly type: 'boolean';
43
+ }
44
+ /**
45
+ * A color field, rendered as a color picker. The value is the color as `#rrggbb`.
46
+ */
47
+ export interface CodeBlockBuilderColorField extends CodeBlockBuilderFieldBase<string> {
48
+ /**
49
+ * The kind of the field.
50
+ */
51
+ readonly type: 'color';
52
+ }
53
+ /**
54
+ * A pair of cascading dropdowns: the first picks a group, the second one of that group's options. Only the second
55
+ * dropdown's value is written into the code block.
56
+ */
57
+ export interface CodeBlockBuilderConditionalDropdownField extends CodeBlockBuilderFieldBase<string> {
58
+ /**
59
+ * The groups of options. The group containing {@link CodeBlockBuilderFieldBase.defaultValue} is selected first, else
60
+ * the first group.
61
+ */
62
+ readonly groups: readonly CodeBlockBuilderOptionGroup[];
63
+ /**
64
+ * The kind of the field.
65
+ */
66
+ readonly type: 'conditionalDropdown';
67
+ }
68
+ /**
69
+ * A single-choice dropdown field.
70
+ */
71
+ export interface CodeBlockBuilderDropdownField extends CodeBlockBuilderFieldBase<string> {
72
+ /**
73
+ * The options of the dropdown.
74
+ */
75
+ readonly options: CodeBlockBuilderOptions;
76
+ /**
77
+ * The kind of the field.
78
+ */
79
+ readonly type: 'dropdown';
80
+ }
81
+ /**
82
+ * A field of the code block builder, other than a {@link CodeBlockBuilderGroup}.
83
+ */
84
+ export type CodeBlockBuilderField = CodeBlockBuilderBooleanField | CodeBlockBuilderColorField | CodeBlockBuilderConditionalDropdownField | CodeBlockBuilderDropdownField | CodeBlockBuilderFolderField | CodeBlockBuilderMultipleDropdownField | CodeBlockBuilderSliderField | CodeBlockBuilderTextField;
85
+ /**
86
+ * The members every {@link CodeBlockBuilderField} has.
87
+ *
88
+ * @typeParam Value - The type of the field's value.
89
+ */
90
+ export interface CodeBlockBuilderFieldBase<Value extends CodeBlockBuilderValue> {
91
+ /**
92
+ * The value the field starts with. While the field holds it, the field writes nothing into the code block, unless it
93
+ * is {@link CodeBlockBuilderFieldBase.isRequired}.
94
+ */
95
+ readonly defaultValue: Value;
96
+ /**
97
+ * A description shown under the field's name.
98
+ */
99
+ readonly description?: string;
100
+ /**
101
+ * Whether the field is always written into the code block. A required field is shown above the optional ones and has
102
+ * no reset button.
103
+ *
104
+ * @default `false`
105
+ */
106
+ readonly isRequired?: boolean;
107
+ /**
108
+ * The key the field's line is written with, and the key of its value in the values the preview receives. Unique across
109
+ * all fields.
110
+ */
111
+ readonly key: string;
112
+ /**
113
+ * The name of the field, shown to the user.
114
+ */
115
+ readonly name: string;
116
+ /**
117
+ * Whether the field's line holds its value alone, without the `key: ` prefix.
118
+ *
119
+ * @default `false`
120
+ */
121
+ readonly shouldOmitKey?: boolean;
122
+ }
123
+ /**
124
+ * A folder field: a dropdown of every folder of the vault. The value is the folder path, `/` for the vault root.
125
+ */
126
+ export interface CodeBlockBuilderFolderField extends CodeBlockBuilderFieldBase<string> {
127
+ /**
128
+ * The kind of the field.
129
+ */
130
+ readonly type: 'folder';
131
+ }
132
+ /**
133
+ * A collapsible group of fields. One group is expanded at a time: expanding a group collapses the others.
134
+ */
135
+ export interface CodeBlockBuilderGroup {
136
+ /**
137
+ * The fields of the group. A required field inside a group is still written into the code block.
138
+ */
139
+ readonly fields: readonly CodeBlockBuilderField[];
140
+ /**
141
+ * Whether the group starts expanded.
142
+ *
143
+ * @default `false`
144
+ */
145
+ readonly isInitiallyExpanded?: boolean;
146
+ /**
147
+ * The heading of the group.
148
+ */
149
+ readonly name: string;
150
+ /**
151
+ * The kind of the entry.
152
+ */
153
+ readonly type: 'group';
154
+ }
155
+ /**
156
+ * An entry of {@link ShowCodeBlockBuilderParams.fields}: a field, or a group of fields.
157
+ */
158
+ export type CodeBlockBuilderInput = CodeBlockBuilderField | CodeBlockBuilderGroup;
159
+ /**
160
+ * A multiple-choice dropdown field. Its line holds the selected options joined by
161
+ * {@link CodeBlockBuilderMultipleDropdownField.separator}.
162
+ */
163
+ export interface CodeBlockBuilderMultipleDropdownField extends CodeBlockBuilderFieldBase<readonly string[]> {
164
+ /**
165
+ * The options of the dropdown.
166
+ */
167
+ readonly options: CodeBlockBuilderOptions;
168
+ /**
169
+ * The text the selected options are joined with.
170
+ *
171
+ * @default `','`
172
+ */
173
+ readonly separator?: string;
174
+ /**
175
+ * The kind of the field.
176
+ */
177
+ readonly type: 'multipleDropdown';
178
+ }
179
+ /**
180
+ * A named group of options of a {@link CodeBlockBuilderConditionalDropdownField}.
181
+ */
182
+ export interface CodeBlockBuilderOptionGroup {
183
+ /**
184
+ * The name of the group, shown in the first dropdown.
185
+ */
186
+ readonly name: string;
187
+ /**
188
+ * The options of the group, shown in the second dropdown.
189
+ */
190
+ readonly options: CodeBlockBuilderOptions;
191
+ }
192
+ /**
193
+ * The options of a dropdown: a list of values shown as they are, or a map from each value to its display text.
194
+ */
195
+ export type CodeBlockBuilderOptions = Readonly<Record<string, string>> | readonly string[];
196
+ /**
197
+ * The parameters of {@link ShowCodeBlockBuilderParams.onUpdatePreview}.
198
+ */
199
+ export interface CodeBlockBuilderPreviewParams {
200
+ /**
201
+ * The code block as it stands.
202
+ */
203
+ readonly codeBlock: string;
204
+ /**
205
+ * The element to draw the preview into. The modal never clears it.
206
+ */
207
+ readonly previewEl: HTMLElement;
208
+ /**
209
+ * The current value of every field, by its key.
210
+ */
211
+ readonly values: ReadonlyMap<string, CodeBlockBuilderValue>;
212
+ }
213
+ /**
214
+ * A slider field. A {@link CodeBlockBuilderFieldBase.defaultValue} outside the bounds widens them.
215
+ */
216
+ export interface CodeBlockBuilderSliderField extends CodeBlockBuilderFieldBase<number> {
217
+ /**
218
+ * The upper bound.
219
+ */
220
+ readonly max: number;
221
+ /**
222
+ * The lower bound.
223
+ */
224
+ readonly min: number;
225
+ /**
226
+ * The step.
227
+ */
228
+ readonly step: number;
229
+ /**
230
+ * The kind of the field.
231
+ */
232
+ readonly type: 'slider';
233
+ }
234
+ /**
235
+ * A text field.
236
+ */
237
+ export interface CodeBlockBuilderTextField extends CodeBlockBuilderFieldBase<string> {
238
+ /**
239
+ * A placeholder shown while the field is empty.
240
+ */
241
+ readonly placeholder?: string;
242
+ /**
243
+ * The kind of the field.
244
+ */
245
+ readonly type: 'text';
246
+ /**
247
+ * A pattern the value must match. While it does not, the field is marked invalid and keeps its last valid value.
248
+ */
249
+ readonly validationPattern?: RegExp;
250
+ }
251
+ /**
252
+ * The value of a {@link CodeBlockBuilderField}.
253
+ */
254
+ export type CodeBlockBuilderValue = boolean | number | readonly string[] | string;
255
+ /**
256
+ * The parameters of {@link formatCodeBlock}.
257
+ */
258
+ export interface FormatCodeBlockParams {
259
+ /**
260
+ * The fields of the code block.
261
+ */
262
+ readonly fields: readonly CodeBlockBuilderInput[];
263
+ /**
264
+ * The language of the code block.
265
+ */
266
+ readonly language: string;
267
+ /**
268
+ * The value of each field, by its key. A field missing from it holds its default value.
269
+ */
270
+ readonly values: ReadonlyMap<string, CodeBlockBuilderValue>;
271
+ }
272
+ /**
273
+ * The parameters of {@link showCodeBlockBuilder}.
274
+ */
275
+ export interface ShowCodeBlockBuilderParams extends ModalParamsBase {
276
+ /**
277
+ * The editor the Insert button writes into.
278
+ *
279
+ * @default The active editor when the modal opens.
280
+ */
281
+ readonly editor?: Editor | null;
282
+ /**
283
+ * The fields of the code block, in the order they are written into it. Required fields are shown first.
284
+ */
285
+ readonly fields: readonly CodeBlockBuilderInput[];
286
+ /**
287
+ * The language of the code block: the text after its opening fence.
288
+ */
289
+ readonly language: string;
290
+ /**
291
+ * Draws a live preview of the code block. Called once when the modal opens and again after every change.
292
+ *
293
+ * @param params - The preview element, the code block and the current values.
294
+ */
295
+ readonly onUpdatePreview?: (params: CodeBlockBuilderPreviewParams) => void;
296
+ /**
297
+ * The title of the modal.
298
+ *
299
+ * @default `'Code block builder'`
300
+ */
301
+ readonly title?: string;
302
+ }
303
+ /**
304
+ * Formats a code block from its fields and their values.
305
+ *
306
+ * Each field holding a value other than its default, or marked {@link CodeBlockBuilderFieldBase.isRequired}, writes one
307
+ * line, in the order of the fields; an empty value writes nothing. The fence is one backtick longer than the longest
308
+ * backtick run in the lines, and never shorter than three.
309
+ *
310
+ * @param params - The fields, the language and the values.
311
+ * @returns The code block, without a trailing newline.
312
+ */
313
+ export declare function formatCodeBlock(params: FormatCodeBlockParams): string;
314
+ /**
315
+ * Opens the code block builder modal.
316
+ *
317
+ * @param params - The fields of the code block and how to present them.
318
+ * @returns A {@link Promise} that resolves with the code block when the user inserted it into the note, or with `null`
319
+ * when the modal was closed otherwise.
320
+ */
321
+ export declare function showCodeBlockBuilder(params: ShowCodeBlockBuilderParams): Promise<null | string>;