@mnaoumov/obsidian-lib 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/components/incremental-file-index-component/package.json +6 -0
  2. package/dist/lib/cjs/__merged.cjs +20 -6
  3. package/dist/lib/cjs/__merged.d.cts +2 -0
  4. package/dist/lib/cjs/active-file-provider.cjs +6 -6
  5. package/dist/lib/cjs/active-file-provider.d.cts +1 -1
  6. package/dist/lib/cjs/app.cjs +5 -5
  7. package/dist/lib/cjs/async-with-notice.cjs +5 -5
  8. package/dist/lib/cjs/attachment-path.cjs +6 -6
  9. package/dist/lib/cjs/attachment-unit-folder.cjs +5 -5
  10. package/dist/lib/cjs/backlink-index.cjs +13 -19
  11. package/dist/lib/cjs/backlink-index.d.cts +1 -1
  12. package/dist/lib/cjs/backlink.cjs +5 -5
  13. package/dist/lib/cjs/bases-view-registrar.cjs +6 -6
  14. package/dist/lib/cjs/bases-view-registrar.d.cts +1 -1
  15. package/dist/lib/cjs/callout.cjs +5 -5
  16. package/dist/lib/cjs/canvas.cjs +5 -5
  17. package/dist/lib/cjs/case-insensitive-file-index.cjs +5 -5
  18. package/dist/lib/cjs/code-block-markdown-information.cjs +6 -6
  19. package/dist/lib/cjs/code-block-markdown-information.d.cts +9 -9
  20. package/dist/lib/cjs/code-block-reg-exp.cjs +5 -5
  21. package/dist/lib/cjs/codemirror/index.cjs +5 -5
  22. package/dist/lib/cjs/codemirror/state-field-spec.cjs +6 -6
  23. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +6 -6
  24. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +5 -5
  25. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +5 -5
  26. package/dist/lib/cjs/command-handlers/command-handler.cjs +5 -5
  27. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +5 -5
  28. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +5 -5
  29. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +5 -5
  30. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +5 -5
  31. package/dist/lib/cjs/command-handlers/index.cjs +5 -5
  32. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +5 -5
  33. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +5 -5
  34. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +5 -5
  35. package/dist/lib/cjs/command-registrar.cjs +6 -6
  36. package/dist/lib/cjs/command-registrar.d.cts +2 -2
  37. package/dist/lib/cjs/community-plugins.cjs +6 -6
  38. package/dist/lib/cjs/components/abort-signal-component.cjs +5 -5
  39. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  40. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  41. package/dist/lib/cjs/components/async-events-component.cjs +5 -5
  42. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +5 -5
  43. package/dist/lib/cjs/components/component-ex.cjs +5 -5
  44. package/dist/lib/cjs/components/console-debug-component.cjs +5 -5
  45. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +5 -5
  46. package/dist/lib/cjs/components/disposable-component.cjs +5 -5
  47. package/dist/lib/cjs/components/embed-extensions-component.cjs +5 -5
  48. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +13 -16
  49. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +5 -5
  50. package/dist/lib/cjs/components/incremental-file-index-component.cjs +340 -0
  51. package/dist/lib/cjs/components/incremental-file-index-component.d.cts +152 -0
  52. package/dist/lib/cjs/components/index.cjs +9 -6
  53. package/dist/lib/cjs/components/index.d.cts +1 -0
  54. package/dist/lib/cjs/components/layout-ready-component.cjs +5 -5
  55. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +5 -5
  56. package/dist/lib/cjs/components/monkey-around-component.cjs +5 -5
  57. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  58. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  59. package/dist/lib/cjs/components/plugin-gate-component.cjs +5 -5
  60. package/dist/lib/cjs/components/plugin-notice-component.cjs +6 -6
  61. package/dist/lib/cjs/components/plugin-notice-component.d.cts +3 -3
  62. package/dist/lib/cjs/components/plugin-settings-component.cjs +6 -6
  63. package/dist/lib/cjs/components/plugin-settings-component.d.cts +5 -5
  64. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +5 -5
  65. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +5 -5
  66. package/dist/lib/cjs/components/pointer-position-component.cjs +5 -5
  67. package/dist/lib/cjs/components/registry-component.cjs +5 -5
  68. package/dist/lib/cjs/components/release-notes-component.cjs +5 -5
  69. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +6 -6
  70. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +10 -10
  71. package/dist/lib/cjs/components/rmdir-guard-component.cjs +5 -5
  72. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  73. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +5 -5
  74. package/dist/lib/cjs/components/templates-language-component.cjs +5 -5
  75. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  76. package/dist/lib/cjs/constructors/index.cjs +5 -5
  77. package/dist/lib/cjs/css-class.cjs +5 -5
  78. package/dist/lib/cjs/data-handler.cjs +6 -6
  79. package/dist/lib/cjs/data-handler.d.cts +2 -2
  80. package/dist/lib/cjs/data-stores/data-store-replica.cjs +5 -5
  81. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  82. package/dist/lib/cjs/data-stores/data-store-transport.cjs +5 -5
  83. package/dist/lib/cjs/data-stores/index.cjs +5 -5
  84. package/dist/lib/cjs/data-stores/local-data-store.cjs +5 -5
  85. package/dist/lib/cjs/data-stores/shared-data-store.cjs +6 -6
  86. package/dist/lib/cjs/dataview-link.cjs +5 -5
  87. package/dist/lib/cjs/dataview.cjs +12 -12
  88. package/dist/lib/cjs/dataview.d.cts +6 -6
  89. package/dist/lib/cjs/debug.cjs +5 -5
  90. package/dist/lib/cjs/demo-vault-helper-settings.cjs +5 -5
  91. package/dist/lib/cjs/demo-vault-helper.cjs +5 -5
  92. package/dist/lib/cjs/demo-vault-naming.cjs +5 -5
  93. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +5 -5
  94. package/dist/lib/cjs/desktop-trusted-input.cjs +6 -6
  95. package/dist/lib/cjs/desktop-trusted-input.d.cts +1 -1
  96. package/dist/lib/cjs/editor-extension-registrar.cjs +6 -6
  97. package/dist/lib/cjs/editor-extension-registrar.d.cts +1 -1
  98. package/dist/lib/cjs/editor-suggest-registrar.cjs +6 -6
  99. package/dist/lib/cjs/editor-suggest-registrar.d.cts +1 -1
  100. package/dist/lib/cjs/editor.cjs +5 -5
  101. package/dist/lib/cjs/events.cjs +5 -5
  102. package/dist/lib/cjs/extensions-registrar.cjs +6 -6
  103. package/dist/lib/cjs/extensions-registrar.d.cts +1 -1
  104. package/dist/lib/cjs/file-change.cjs +6 -6
  105. package/dist/lib/cjs/file-change.d.cts +3 -3
  106. package/dist/lib/cjs/file-explorer.cjs +5 -5
  107. package/dist/lib/cjs/file-manager.cjs +5 -5
  108. package/dist/lib/cjs/file-system.cjs +5 -5
  109. package/dist/lib/cjs/folder-note.cjs +6 -6
  110. package/dist/lib/cjs/folder-note.d.cts +1 -1
  111. package/dist/lib/cjs/frontmatter-formatting.cjs +5 -5
  112. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +6 -6
  113. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +2 -2
  114. package/dist/lib/cjs/frontmatter.cjs +6 -6
  115. package/dist/lib/cjs/frontmatter.d.cts +7 -7
  116. package/dist/lib/cjs/generated-during-build.cjs +7 -7
  117. package/dist/lib/cjs/hover-link-source-registrar.cjs +6 -6
  118. package/dist/lib/cjs/hover-link-source-registrar.d.cts +1 -1
  119. package/dist/lib/cjs/html-element.cjs +5 -5
  120. package/dist/lib/cjs/i18n/custom-type-options.cjs +6 -6
  121. package/dist/lib/cjs/i18n/custom-type-options.d.cts +4 -4
  122. package/dist/lib/cjs/i18n/default-translations.cjs +5 -5
  123. package/dist/lib/cjs/i18n/i18n.cjs +5 -5
  124. package/dist/lib/cjs/i18n/index.cjs +5 -5
  125. package/dist/lib/cjs/i18n/locales/en.cjs +5 -5
  126. package/dist/lib/cjs/i18n/locales/index.cjs +5 -5
  127. package/dist/lib/cjs/i18n/locales/translations-map.cjs +5 -5
  128. package/dist/lib/cjs/index.cjs +9 -6
  129. package/dist/lib/cjs/index.d.cts +1 -0
  130. package/dist/lib/cjs/is-in-obsidian.cjs +5 -5
  131. package/dist/lib/cjs/library-styles.cjs +5 -5
  132. package/dist/lib/cjs/library.cjs +5 -5
  133. package/dist/lib/cjs/link-name.cjs +5 -5
  134. package/dist/lib/cjs/link-update-progress.cjs +5 -5
  135. package/dist/lib/cjs/link.cjs +7 -7
  136. package/dist/lib/cjs/link.d.cts +2 -2
  137. package/dist/lib/cjs/logger.cjs +5 -5
  138. package/dist/lib/cjs/loop.cjs +5 -5
  139. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +6 -6
  140. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +1 -1
  141. package/dist/lib/cjs/markdown-code-block-processor.cjs +5 -5
  142. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +6 -6
  143. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +1 -1
  144. package/dist/lib/cjs/markdown-view.cjs +5 -5
  145. package/dist/lib/cjs/markdown.cjs +5 -5
  146. package/dist/lib/cjs/menu-event-registrar.cjs +6 -6
  147. package/dist/lib/cjs/menu-event-registrar.d.cts +4 -4
  148. package/dist/lib/cjs/metadata-cache.cjs +6 -6
  149. package/dist/lib/cjs/mobile-trusted-input.cjs +6 -6
  150. package/dist/lib/cjs/modals/alert.cjs +5 -5
  151. package/dist/lib/cjs/modals/confirm.cjs +5 -5
  152. package/dist/lib/cjs/modals/index.cjs +5 -5
  153. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  154. package/dist/lib/cjs/modals/modal-command-builder.cjs +6 -6
  155. package/dist/lib/cjs/modals/modal-command-builder.d.cts +12 -12
  156. package/dist/lib/cjs/modals/modal.cjs +5 -5
  157. package/dist/lib/cjs/modals/prompt.cjs +14 -14
  158. package/dist/lib/cjs/modals/select-item.cjs +5 -5
  159. package/dist/lib/cjs/modals/select-option.cjs +5 -5
  160. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +5 -5
  161. package/dist/lib/cjs/note-priority.cjs +5 -5
  162. package/dist/lib/cjs/notebook-navigator.cjs +6 -6
  163. package/dist/lib/cjs/notebook-navigator.d.cts +3 -3
  164. package/dist/lib/cjs/obsidian-lib-state.cjs +6 -6
  165. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +6 -6
  166. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +1 -1
  167. package/dist/lib/cjs/obsidian-settings.cjs +5 -5
  168. package/dist/lib/cjs/obsidian-word-characters.cjs +231 -0
  169. package/dist/lib/cjs/obsidian-word-characters.d.cts +59 -0
  170. package/dist/lib/cjs/parse-link.cjs +6 -6
  171. package/dist/lib/cjs/parse-link.d.cts +2 -2
  172. package/dist/lib/cjs/path-settings.cjs +6 -6
  173. package/dist/lib/cjs/pdf.cjs +5 -5
  174. package/dist/lib/cjs/plugin/index.cjs +5 -5
  175. package/dist/lib/cjs/plugin/plugin-api.cjs +6 -6
  176. package/dist/lib/cjs/plugin/plugin-api.d.cts +2 -2
  177. package/dist/lib/cjs/plugin/plugin-context.cjs +6 -6
  178. package/dist/lib/cjs/plugin/plugin-event-source.cjs +6 -6
  179. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +1 -1
  180. package/dist/lib/cjs/plugin/plugin-install-state.cjs +5 -5
  181. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +5 -5
  182. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +6 -6
  183. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +3 -3
  184. package/dist/lib/cjs/plugin/plugin.cjs +6 -6
  185. package/dist/lib/cjs/plugin/settings-migration-api.cjs +6 -6
  186. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +1 -1
  187. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +6 -6
  188. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +1 -1
  189. package/dist/lib/cjs/popovers/field-popover.cjs +5 -5
  190. package/dist/lib/cjs/popovers/index.cjs +5 -5
  191. package/dist/lib/cjs/popovers/popover-anchor.cjs +5 -5
  192. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  193. package/dist/lib/cjs/property-entry.cjs +5 -5
  194. package/dist/lib/cjs/queue.cjs +6 -6
  195. package/dist/lib/cjs/react/app-context.cjs +5 -5
  196. package/dist/lib/cjs/react/index.cjs +5 -5
  197. package/dist/lib/cjs/reference.cjs +6 -6
  198. package/dist/lib/cjs/reference.d.cts +6 -6
  199. package/dist/lib/cjs/resource-lock.cjs +6 -6
  200. package/dist/lib/cjs/resource-url.cjs +5 -5
  201. package/dist/lib/cjs/ribbon-icon-registrar.cjs +6 -6
  202. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +1 -1
  203. package/dist/lib/cjs/setting-components/checkbox-component.cjs +5 -5
  204. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +5 -5
  205. package/dist/lib/cjs/setting-components/date-component.cjs +5 -5
  206. package/dist/lib/cjs/setting-components/date-time-component.cjs +5 -5
  207. package/dist/lib/cjs/setting-components/email-component.cjs +5 -5
  208. package/dist/lib/cjs/setting-components/file-component.cjs +5 -5
  209. package/dist/lib/cjs/setting-components/index.cjs +5 -5
  210. package/dist/lib/cjs/setting-components/month-component.cjs +6 -6
  211. package/dist/lib/cjs/setting-components/month-component.d.cts +2 -2
  212. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +5 -5
  213. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +5 -5
  214. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +5 -5
  215. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +5 -5
  216. package/dist/lib/cjs/setting-components/number-component.cjs +5 -5
  217. package/dist/lib/cjs/setting-components/password-component.cjs +5 -5
  218. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +5 -5
  219. package/dist/lib/cjs/setting-components/telephone-component.cjs +5 -5
  220. package/dist/lib/cjs/setting-components/text-based-component.cjs +6 -6
  221. package/dist/lib/cjs/setting-components/text-based-component.d.cts +3 -3
  222. package/dist/lib/cjs/setting-components/time-component.cjs +5 -5
  223. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +5 -5
  224. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +5 -5
  225. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +5 -5
  226. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +5 -5
  227. package/dist/lib/cjs/setting-components/typed-text-component.cjs +5 -5
  228. package/dist/lib/cjs/setting-components/url-component.cjs +5 -5
  229. package/dist/lib/cjs/setting-components/validator-component.cjs +5 -5
  230. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +6 -6
  231. package/dist/lib/cjs/setting-components/week-component.cjs +6 -6
  232. package/dist/lib/cjs/setting-components/week-component.d.cts +2 -2
  233. package/dist/lib/cjs/setting-ex.cjs +5 -5
  234. package/dist/lib/cjs/setting-group-ex.cjs +5 -5
  235. package/dist/lib/cjs/status-bar-item-registrar.cjs +6 -6
  236. package/dist/lib/cjs/status-bar-item-registrar.d.cts +1 -1
  237. package/dist/lib/cjs/templater.cjs +6 -6
  238. package/dist/lib/cjs/templater.d.cts +9 -9
  239. package/dist/lib/cjs/transformers/duration-transformer.cjs +5 -5
  240. package/dist/lib/cjs/transformers/index.cjs +5 -5
  241. package/dist/lib/cjs/trusted-input.cjs +5 -5
  242. package/dist/lib/cjs/validation.cjs +6 -6
  243. package/dist/lib/cjs/validation.d.cts +1 -1
  244. package/dist/lib/cjs/vault-delete.cjs +5 -5
  245. package/dist/lib/cjs/vault-transaction.cjs +6 -6
  246. package/dist/lib/cjs/vault.cjs +5 -5
  247. package/dist/lib/cjs/view-registrar.cjs +6 -6
  248. package/dist/lib/cjs/view-registrar.d.cts +1 -1
  249. package/dist/lib/cjs/workspace.cjs +5 -5
  250. package/dist/lib/esm/__merged.d.mts +2 -0
  251. package/dist/lib/esm/__merged.mjs +15 -1
  252. package/dist/lib/esm/active-file-provider.d.mts +1 -1
  253. package/dist/lib/esm/active-file-provider.mjs +1 -1
  254. package/dist/lib/esm/attachment-path.mjs +1 -1
  255. package/dist/lib/esm/backlink-index.d.mts +1 -1
  256. package/dist/lib/esm/backlink-index.mjs +8 -14
  257. package/dist/lib/esm/bases-view-registrar.d.mts +1 -1
  258. package/dist/lib/esm/bases-view-registrar.mjs +1 -1
  259. package/dist/lib/esm/code-block-markdown-information.d.mts +9 -9
  260. package/dist/lib/esm/codemirror/state-field-spec.d.mts +6 -6
  261. package/dist/lib/esm/command-registrar.d.mts +2 -2
  262. package/dist/lib/esm/command-registrar.mjs +1 -1
  263. package/dist/lib/esm/community-plugins.mjs +1 -1
  264. package/dist/lib/esm/components/file-explorer-root-menu-component.mjs +8 -11
  265. package/dist/lib/esm/components/incremental-file-index-component.d.mts +152 -0
  266. package/dist/lib/esm/components/incremental-file-index-component.mjs +260 -0
  267. package/dist/lib/esm/components/index.d.mts +1 -0
  268. package/dist/lib/esm/components/index.mjs +3 -1
  269. package/dist/lib/esm/components/plugin-notice-component.d.mts +3 -3
  270. package/dist/lib/esm/components/plugin-notice-component.mjs +1 -1
  271. package/dist/lib/esm/components/plugin-settings-component.d.mts +5 -5
  272. package/dist/lib/esm/components/plugin-settings-component.mjs +1 -1
  273. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +10 -10
  274. package/dist/lib/esm/components/rename-delete-handler-component.mjs +1 -1
  275. package/dist/lib/esm/data-handler.d.mts +2 -2
  276. package/dist/lib/esm/data-handler.mjs +1 -1
  277. package/dist/lib/esm/data-stores/data-store-seeds.mjs +1 -1
  278. package/dist/lib/esm/data-stores/shared-data-store.mjs +1 -1
  279. package/dist/lib/esm/dataview.d.mts +6 -6
  280. package/dist/lib/esm/dataview.mjs +7 -7
  281. package/dist/lib/esm/desktop-trusted-input.d.mts +1 -1
  282. package/dist/lib/esm/desktop-trusted-input.mjs +1 -1
  283. package/dist/lib/esm/editor-extension-registrar.d.mts +1 -1
  284. package/dist/lib/esm/editor-extension-registrar.mjs +1 -1
  285. package/dist/lib/esm/editor-suggest-registrar.d.mts +1 -1
  286. package/dist/lib/esm/editor-suggest-registrar.mjs +1 -1
  287. package/dist/lib/esm/extensions-registrar.d.mts +1 -1
  288. package/dist/lib/esm/extensions-registrar.mjs +1 -1
  289. package/dist/lib/esm/file-change.d.mts +3 -3
  290. package/dist/lib/esm/file-change.mjs +1 -1
  291. package/dist/lib/esm/folder-note.d.mts +1 -1
  292. package/dist/lib/esm/folder-note.mjs +1 -1
  293. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +2 -2
  294. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +1 -1
  295. package/dist/lib/esm/frontmatter.d.mts +7 -7
  296. package/dist/lib/esm/frontmatter.mjs +1 -1
  297. package/dist/lib/esm/generated-during-build.mjs +2 -2
  298. package/dist/lib/esm/hover-link-source-registrar.d.mts +1 -1
  299. package/dist/lib/esm/hover-link-source-registrar.mjs +1 -1
  300. package/dist/lib/esm/i18n/custom-type-options.d.mts +4 -4
  301. package/dist/lib/esm/i18n/custom-type-options.mjs +1 -1
  302. package/dist/lib/esm/index.d.mts +1 -0
  303. package/dist/lib/esm/index.mjs +3 -1
  304. package/dist/lib/esm/link.d.mts +2 -2
  305. package/dist/lib/esm/link.mjs +2 -2
  306. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +1 -1
  307. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +1 -1
  308. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +1 -1
  309. package/dist/lib/esm/markdown-post-processor-registrar.mjs +1 -1
  310. package/dist/lib/esm/menu-event-registrar.d.mts +4 -4
  311. package/dist/lib/esm/metadata-cache.mjs +1 -1
  312. package/dist/lib/esm/mobile-trusted-input.mjs +1 -1
  313. package/dist/lib/esm/modals/minimizable-modal.mjs +1 -1
  314. package/dist/lib/esm/modals/modal-command-builder.d.mts +12 -12
  315. package/dist/lib/esm/modals/modal-command-builder.mjs +1 -1
  316. package/dist/lib/esm/modals/prompt.mjs +9 -9
  317. package/dist/lib/esm/notebook-navigator.d.mts +3 -3
  318. package/dist/lib/esm/notebook-navigator.mjs +1 -1
  319. package/dist/lib/esm/obsidian-lib-state.mjs +1 -1
  320. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +1 -1
  321. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +1 -1
  322. package/dist/lib/esm/obsidian-word-characters.d.mts +59 -0
  323. package/dist/lib/esm/obsidian-word-characters.mjs +139 -0
  324. package/dist/lib/esm/parse-link.d.mts +2 -2
  325. package/dist/lib/esm/parse-link.mjs +1 -1
  326. package/dist/lib/esm/path-settings.mjs +1 -1
  327. package/dist/lib/esm/plugin/plugin-api.d.mts +2 -2
  328. package/dist/lib/esm/plugin/plugin-api.mjs +1 -1
  329. package/dist/lib/esm/plugin/plugin-context.mjs +1 -1
  330. package/dist/lib/esm/plugin/plugin-event-source.d.mts +1 -1
  331. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  332. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +3 -3
  333. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +1 -1
  334. package/dist/lib/esm/plugin/plugin.mjs +1 -1
  335. package/dist/lib/esm/plugin/settings-migration-api.d.mts +1 -1
  336. package/dist/lib/esm/plugin/settings-migration-api.mjs +1 -1
  337. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +1 -1
  338. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +1 -1
  339. package/dist/lib/esm/queue.mjs +1 -1
  340. package/dist/lib/esm/reference.d.mts +6 -6
  341. package/dist/lib/esm/reference.mjs +1 -1
  342. package/dist/lib/esm/resource-lock.mjs +1 -1
  343. package/dist/lib/esm/ribbon-icon-registrar.d.mts +1 -1
  344. package/dist/lib/esm/ribbon-icon-registrar.mjs +1 -1
  345. package/dist/lib/esm/setting-components/month-component.d.mts +2 -2
  346. package/dist/lib/esm/setting-components/month-component.mjs +1 -1
  347. package/dist/lib/esm/setting-components/text-based-component.d.mts +3 -3
  348. package/dist/lib/esm/setting-components/text-based-component.mjs +1 -1
  349. package/dist/lib/esm/setting-components/week-component.d.mts +2 -2
  350. package/dist/lib/esm/setting-components/week-component.mjs +1 -1
  351. package/dist/lib/esm/status-bar-item-registrar.d.mts +1 -1
  352. package/dist/lib/esm/status-bar-item-registrar.mjs +1 -1
  353. package/dist/lib/esm/templater.d.mts +9 -9
  354. package/dist/lib/esm/templater.mjs +1 -1
  355. package/dist/lib/esm/validation.d.mts +1 -1
  356. package/dist/lib/esm/validation.mjs +1 -1
  357. package/dist/lib/esm/vault-transaction.mjs +1 -1
  358. package/dist/lib/esm/view-registrar.d.mts +1 -1
  359. package/dist/lib/esm/view-registrar.mjs +1 -1
  360. package/dist/styles.css +2 -2
  361. package/package.json +6 -3
@@ -41,8 +41,8 @@ ensureBrowserProcess();
41
41
  __isPatched: true
42
42
  }
43
43
  );
44
- function extractDefault(module) {
45
- return module && module.__esModule && "default" in module ? module.default : module;
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
46
  }
47
47
  const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
48
  "@codemirror/autocomplete",
@@ -84,9 +84,9 @@ ensureBrowserProcess();
84
84
  return process;
85
85
  }
86
86
  } else {
87
- const module = originalRequire?.(id);
88
- if (module) {
89
- return extractDefault(module);
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
90
  }
91
91
  }
92
92
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
@@ -138,7 +138,7 @@ const ROOT_UNSAFE_ITEM_TITLE_KEYS = [
138
138
  "plugins.file-explorer.menu-opt-rename",
139
139
  "plugins.search.menu-opt-search-in-folder"
140
140
  ];
141
- const SHARED_STATE_KEY = "fileExplorerRootMenuByAppV1";
141
+ const SHARED_STATE_KEY = "fileExplorerRootMenuV1";
142
142
  var FileExplorerRootMenuSpot = /* @__PURE__ */ ((FileExplorerRootMenuSpot2) => {
143
143
  FileExplorerRootMenuSpot2["EmptyArea"] = "empty-area";
144
144
  FileExplorerRootMenuSpot2["VaultName"] = "vault-name";
@@ -173,7 +173,7 @@ class FileExplorerRootMenuComponent extends import_component_ex.ComponentEx {
173
173
  */
174
174
  onload() {
175
175
  super.onload();
176
- const state = getSharedState(this.app);
176
+ const state = getSharedState();
177
177
  const subscription = {
178
178
  handler: this.handler,
179
179
  install: () => installRootMenu(this.app, state),
@@ -216,14 +216,11 @@ function dispatchBeforeShow(state, params) {
216
216
  function getFileExplorerLeaf(app) {
217
217
  return app.workspace.getLeavesOfType(import_implementations.ViewType.FileExplorer)[0] ?? null;
218
218
  }
219
- function getSharedState(app) {
220
- const statesByApp = (0, import_obsidian_lib_state.getObsidianLibState)(SHARED_STATE_KEY, /* @__PURE__ */ new WeakMap()).value;
221
- let state = statesByApp.get(app);
222
- if (!state) {
223
- state = { installation: null, subscriptions: [] };
224
- statesByApp.set(app, state);
225
- }
226
- return state;
219
+ function getSharedState() {
220
+ return (0, import_obsidian_lib_state.getObsidianLibState)(SHARED_STATE_KEY, {
221
+ installation: null,
222
+ subscriptions: []
223
+ }).value;
227
224
  }
228
225
  function installRootMenu(app, state) {
229
226
  let isUninstalled = false;
@@ -340,4 +337,4 @@ function removeRootUnsafeItems(menu) {
340
337
  FileExplorerRootMenuSpot,
341
338
  VAULT_NAME_SELECTORS
342
339
  });
343
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgYW5kIGV4dGVuZHMgdGhlIGNvcmUgRmlsZSBFeHBsb3JlcidzIGNvbnRleHQgbWVudSBmb3IgdGhlIHZhdWx0IHJvb3QsIGF0IHRoZSB0d28gc3BvdHMgdGhhdCBzdGFuZCBmb3IgaXQ6IHRoZVxuICogdmF1bHQgbmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGFuZCB0aGUgZW1wdHkgYXJlYSBiZWxvdyB0aGUgZmlsZSBsaXN0LlxuICpcbiAqIE9ic2lkaWFuIGFscmVhZHkgb3BlbnMgYSBtZW51IGZvciB0aGUgZW1wdHkgYXJlYTogdGhlIHZpZXcncyBvd24gYGNvbnRleHRtZW51YCBsaXN0ZW5lciBvbiBpdHMgZmlsZXMgY29udGFpbmVyIGNhbGxzXG4gKiBgb25GaWxlQ29udGV4dE1lbnUoZXZ0LCB2YXVsdC5nZXRSb290KCkpYCwgd2hpY2ggYnVpbGRzIGEge0BsaW5rIE1lbnV9LCB0cmlnZ2VycyBgZmlsZS1tZW51YCB3aXRoIHRoZSByb290IGZvbGRlciBhbmRcbiAqIHRoZSBzb3VyY2UgYGZpbGUtZXhwbG9yZXItY29udGV4dC1tZW51YCwgYW5kIHNob3dzIGl0LiBUaGUgdmF1bHQgbmFtZSAoYC53b3Jrc3BhY2UtZHJhd2VyLXZhdWx0LXN3aXRjaGVyYCBvbiBkZXNrdG9wLFxuICogYC53b3Jrc3BhY2UtZHJhd2VyLWhlYWRlci1uYW1lYCBvbiBtb2JpbGUsIHdoZXJlIE9ic2lkaWFuIGJ1aWxkcyBubyBzd2l0Y2hlcikgb3BlbnMgYSBkaWZmZXJlbnQgbWVudTogb24gZGVza3RvcFxuICogT2JzaWRpYW4gYWRkcyBgU2hvdyBpbiBzeXN0ZW0gZXhwbG9yZXJgIGFuZCBgQ29weSBwYXRoYCB0byB0aGUgcGVyLWV2ZW50IG1lbnUgYE1lbnUuZm9yRXZlbnRgIGhhbmRzIG91dC4gVGhlIGhhbmRsZXJzXG4gKiBnZXQgdGhhdCBtZW51LCBzbyBhIHJpZ2h0LWNsaWNrIHRoZXJlIG5ldmVyIG9wZW5zIGEgc2Vjb25kIG9uZS4gQSBzdWJzY3JpYmVyIHRoYXQgcHJlc2VudHMgdGhlIHJvb3QgYXMgYSBmb2xkZXJcbiAqIHJlcGxhY2VzIGl0IHdpdGggdGhlIHJvb3QncyBmb2xkZXIgbWVudSBpbnN0ZWFkLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIG93biBjb3B5IG9mIHRoaXMgbGlicmFyeSwgYW5kIHNldmVyYWwgb2YgdGhlbSBtYXkgd2FudCB0aGlzIG1lbnUuIFR3byBjb3BpZXMgcGF0Y2hpbmcgdGhlXG4gKiBzYW1lIHByb3RvdHlwZSBhbmQgbGlzdGVuaW5nIG9uIHRoZSBzYW1lIGVsZW1lbnQgd291bGQgb3BlbiBpdCB0d2ljZSwgc28gdGhlcmUgaXMgT05FIGluc3RhbGxhdGlvbiBwZXIge0BsaW5rIEFwcH0sXG4gKiBrZXB0IGluIHRoZSBzaGFyZWQtc3RhdGUgYmFnIHVuZGVyIGEgdmVyc2lvbmVkIGtleSBhbmQgb3duZWQgYnkgb25lIHN1YnNjcmliZXIuIFdoZW4gdGhlIG93bmVyIHVubG9hZHMgd2hpbGUgb3RoZXJzXG4gKiByZW1haW4sIHRoZSBuZXh0IHN1YnNjcmliZXIgaW5zdGFsbHMgaXQgYWdhaW4gZnJvbSBpdHMgb3duIGNvcHkuIFdoYXQgY3Jvc3NlcyB0aGF0IGJvdW5kYXJ5IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlblxuICogY29waWVzIG9mIGRpZmZlcmVudCB2ZXJzaW9uczogcGxhaW4gb2JqZWN0cyBhbmQgcGxhaW4gZnVuY3Rpb25zIG9ubHksIHJlYWQgc3RydWN0dXJhbGx5LCBhbmQgYSBjaGFuZ2UgdG8gd2hhdCBhIGZpZWxkXG4gKiBtZWFucyBtb3ZlcyB0byBhIG5ldyBrZXkgcmF0aGVyIHRoYW4gcmVpbnRlcnByZXRpbmcgdGhlIG9sZCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGaWxlRXhwbG9yZXJWaWV3IH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZSxcbiAgV29ya3NwYWNlTGVhZlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldFByb3RvdHlwZU9mIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1lbnUsXG4gIE1lbnVJdGVtLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IGFyb3VuZCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50cyB0aGF0IHN0YW5kIGZvciB0aGUgdmF1bHQgcm9vdCBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGluIHByaW9yaXR5IG9yZGVyLiBPYnNpZGlhbiBidWlsZHNcbiAqIGAud29ya3NwYWNlLWRyYXdlci12YXVsdC1zd2l0Y2hlcmAgb25seSBvbiBkZXNrdG9wOyBvbiBtb2JpbGUgdGhlIHZhdWx0IG5hbWUgaXMgdGhlIGRyYXdlciBoZWFkZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBVUxUX05BTUVfU0VMRUNUT1JTID0gW1xuICAnLndvcmtzcGFjZS1kcmF3ZXItdmF1bHQtc3dpdGNoZXInLFxuICAnLndvcmtzcGFjZS1kcmF3ZXItaGVhZGVyLW5hbWUnXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSBgc291cmNlYCBPYnNpZGlhbiBwYXNzZXMgd2l0aCBgZmlsZS1tZW51YCB3aGVuIHRoZSBGaWxlIEV4cGxvcmVyIG9wZW5zIGEgbWVudS5cbiAqL1xuY29uc3QgRklMRV9FWFBMT1JFUl9NRU5VX1NPVVJDRSA9ICdmaWxlLWV4cGxvcmVyLWNvbnRleHQtbWVudSc7XG5cbi8qKlxuICogVGhlIG1lbnUgaXRlbXMgdGhhdCBtdXN0IG5vdCBhY3Qgb24gdGhlIHZhdWx0IHJvb3QsIGJ5IHRoZSBsb2NhbGl6YXRpb24ga2V5IG9mIHRoZWlyIHRpdGxlLiBUaGV5IGFwcGVhciBvbmx5IHdoZW5cbiAqIHRoZSByb290IGlzIHByZXNlbnRlZCBhcyBhbiBvcmRpbmFyeSBmb2xkZXIsIGZyb20gT2JzaWRpYW4gaXRzZWxmIG9yIGZyb20gYW5vdGhlciBwbHVnaW4ncyBgZmlsZS1tZW51YCBoYW5kbGVyLlxuICovXG5jb25zdCBST09UX1VOU0FGRV9JVEVNX1RJVExFX0tFWVMgPSBbXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIuYWN0aW9uLW1vdmUtZm9sZGVyJyxcbiAgJ3BsdWdpbnMuZmlsZS1leHBsb3Jlci5tZW51LW9wdC1kZWxldGUnLFxuICAncGx1Z2lucy5maWxlLWV4cGxvcmVyLm1lbnUtb3B0LW1ha2UtY29weScsXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIubWVudS1vcHQtcmVuYW1lJyxcbiAgJ3BsdWdpbnMuc2VhcmNoLm1lbnUtb3B0LXNlYXJjaC1pbi1mb2xkZXInXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBTSEFSRURfU1RBVEVfS0VZID0gJ2ZpbGVFeHBsb3JlclJvb3RNZW51QnlBcHBWMSc7XG5cbi8qKlxuICogV2hpY2ggc3BvdCBvZiB0aGUgRmlsZSBFeHBsb3JlciB0aGUgdmF1bHQtcm9vdCBtZW51IHdhcyBvcGVuZWQgZnJvbS5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90IHtcbiAgLyoqXG4gICAqIFRoZSBlbXB0eSBhcmVhIGJlbG93IHRoZSBmaWxlIGxpc3QuXG4gICAqL1xuICBFbXB0eUFyZWEgPSAnZW1wdHktYXJlYScsXG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCBuYW1lIGF0IHRoZSB0b3Agb2YgdGhlIGxlZnQgc2lkZWJhci5cbiAgICovXG4gIFZhdWx0TmFtZSA9ICd2YXVsdC1uYW1lJ1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBGaWxlRXhwbG9yZXJSb290TWVudUNvbXBvbmVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBlYWNoIHRpbWUgdGhlIHZhdWx0LXJvb3QgbWVudSBpcyBhYm91dCB0byBiZSBzaG93bi5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcm9vdCBpcyBwcmVzZW50ZWQgYXMgYW4gb3JkaW5hcnkgZm9sZGVyIHdoaWxlIGl0cyBtZW51IGlzIGJ1aWx0LCBzbyB0aGF0IE9ic2lkaWFuIGFuZCBvdGhlciBwbHVnaW5zIGFkZFxuICAgKiB0aGUgaXRlbXMgdGhleSBhZGQgdG8gYW55IGZvbGRlci4gVGhlIGl0ZW1zIHRoYXQgbXVzdCBub3QgYWN0IG9uIHRoZSByb290IChyZW5hbWUsIGRlbGV0ZSwgbW92ZSwgbWFrZSBhIGNvcHkgYW5kXG4gICAqIHNlYXJjaCBpbiBmb2xkZXIpIGFyZSByZW1vdmVkIGFnYWluIGJlZm9yZSB0aGUgbWVudSBpcyBzaG93bi4gT24gdGhlIHZhdWx0IG5hbWUsIHRoZSByb290J3MgZm9sZGVyIG1lbnUgdGhlbiByZXBsYWNlc1xuICAgKiBPYnNpZGlhbidzIHZhdWx0IG1lbnUuIEl0IGhvbGRzIHdoaWxlIGFueSBzdWJzY3JpYmVyIGFza3MgZm9yIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIGhhbmRsZXIgb2YgdGhlIHZhdWx0LXJvb3QgbWVudS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlciA9IChwYXJhbXM6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlclBhcmFtcykgPT4gdm9pZDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBhIHtAbGluayBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJ9LlxuICpcbiAqIFRoZSBzaGFwZSBpcyBwYXJ0IG9mIHRoZSB3aXJlIGZvcm1hdCBiZXR3ZWVuIGNvcGllcyBvZiB0aGlzIGxpYnJhcnk6IGZpZWxkcyBhcmUgb25seSBldmVyIGFkZGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbWVudSwgYWJvdXQgdG8gYmUgc2hvd246IHRoZSByb290J3MgZm9sZGVyIG1lbnUsIGFmdGVyIGV2ZXJ5IGBmaWxlLW1lbnVgIGhhbmRsZXIgaGFzIHJ1biwgb3Igb24gdGhlIHZhdWx0IG5hbWUgdGhlXG4gICAqIHZhdWx0IG1lbnUgT2JzaWRpYW4gYnVpbGRzIHRoZXJlLiBBIG1lbnUgc3RpbGwgZW1wdHkgYWZ0ZXIgZXZlcnkgaGFuZGxlciBpcyBub3Qgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBtZW51OiBNZW51O1xuXG4gIC8qKlxuICAgKiBUaGUgcmlnaHQtY2xpY2sgb3IgbG9uZy1wcmVzcyB0aGF0IG9wZW5lZCB0aGUgbWVudS5cbiAgICovXG4gIHJlYWRvbmx5IG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgcm9vdEZvbGRlcjogVEZvbGRlcjtcblxuICAvKipcbiAgICogV2hpY2ggc3BvdCB0aGUgbWVudSB3YXMgb3BlbmVkIGZyb20uXG4gICAqL1xuICByZWFkb25seSBzcG90OiBGaWxlRXhwbG9yZXJSb290TWVudVNwb3Q7XG59XG5cbmludGVyZmFjZSBGaWxlRXhwbG9yZXJSb290TWVudUluc3RhbGxhdGlvbiB7XG4gIHJlYWRvbmx5IG93bmVyOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbjtcbiAgdW5pbnN0YWxsOiAoKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSB7XG4gIGluc3RhbGxhdGlvbjogRmlsZUV4cGxvcmVyUm9vdE1lbnVJbnN0YWxsYXRpb24gfCBudWxsO1xuICByZWFkb25seSBzdWJzY3JpcHRpb25zOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbltdO1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVTdWJzY3JpcHRpb24ge1xuICBoYW5kbGVyOiAocGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpID0+IHZvaWQ7XG4gIGluc3RhbGw6ICgpID0+ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHNob3VsZFByZXNlbnRSb290QXNGb2xkZXI6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51IGV4dGVuZHMgRmlsZUV4cGxvcmVyVmlldyB7XG4gIG9uRmlsZUNvbnRleHRNZW51OiAobW91c2VFdmVudDogTW91c2VFdmVudCwgZmlsZTogVEFic3RyYWN0RmlsZSkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIE9wZW5Sb290TWVudVBhcmFtcyB7XG4gIHJlYWRvbmx5IG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XG4gIHJlYWRvbmx5IG9wZW5OYXRpdmU6ICgpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IFRGb2xkZXI7XG4gIHJlYWRvbmx5IHNwb3Q6IEZpbGVFeHBsb3JlclJvb3RNZW51U3BvdDtcbn1cblxuLyoqXG4gKiBIYW5kcyB0aGUgY29yZSBGaWxlIEV4cGxvcmVyJ3MgdmF1bHQtcm9vdCBtZW51IHRvIGEgaGFuZGxlciwgYW5kIG9wZW5zIHRoYXQgbWVudSBmcm9tIHRoZSB2YXVsdCBuYW1lIHRvby5cbiAqXG4gKiBBbnkgbnVtYmVyIG9mIHRoZXNlLCBpbiBhbnkgbnVtYmVyIG9mIHBsdWdpbnMsIHNoYXJlIG9uZSBpbnN0YWxsYXRpb24gcGVyIHtAbGluayBBcHB9LlxuICovXG5leHBvcnQgY2xhc3MgRmlsZUV4cGxvcmVyUm9vdE1lbnVDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSB2YXVsdC1yb290IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFuZGxlcjogRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSByb290IGlzIHByZXNlbnRlZCBhcyBhbiBvcmRpbmFyeSBmb2xkZXIgd2hpbGUgaXRzIG1lbnUgaXMgYnVpbHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmaWxlIGV4cGxvcmVyIHJvb3QgbWVudSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEZpbGVFeHBsb3JlclJvb3RNZW51Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYXBwID0gcGFyYW1zLmFwcDtcbiAgICB0aGlzLmhhbmRsZXIgPSBwYXJhbXMuaGFuZGxlcjtcbiAgICB0aGlzLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIgPSBwYXJhbXMuc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlciA/PyBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmVzIHRvIHRoZSBzaGFyZWQgaW5zdGFsbGF0aW9uLCBpbnN0YWxsaW5nIGl0IHdoZW4gbm9ib2R5IGhhcyB5ZXQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuXG4gICAgY29uc3Qgc3RhdGUgPSBnZXRTaGFyZWRTdGF0ZSh0aGlzLmFwcCk7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uOiBGaWxlRXhwbG9yZXJSb290TWVudVN1YnNjcmlwdGlvbiA9IHtcbiAgICAgIGhhbmRsZXI6IHRoaXMuaGFuZGxlcixcbiAgICAgIGluc3RhbGw6ICgpID0+IGluc3RhbGxSb290TWVudSh0aGlzLmFwcCwgc3RhdGUpLFxuICAgICAgc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcjogdGhpcy5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyXG4gICAgfTtcbiAgICBzdGF0ZS5zdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICBzdGF0ZS5pbnN0YWxsYXRpb24gPz89IHsgb3duZXI6IHN1YnNjcmlwdGlvbiwgdW5pbnN0YWxsOiBzdWJzY3JpcHRpb24uaW5zdGFsbCgpIH07XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHN0YXRlLnN1YnNjcmlwdGlvbnMuc3BsaWNlKHN0YXRlLnN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pLCAxKTtcbiAgICAgIGlmIChzdGF0ZS5pbnN0YWxsYXRpb24/Lm93bmVyICE9PSBzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5pbnN0YWxsYXRpb24udW5pbnN0YWxsKCk7XG4gICAgICBjb25zdCBuZXh0T3duZXIgPSBzdGF0ZS5zdWJzY3JpcHRpb25zWzBdO1xuICAgICAgc3RhdGUuaW5zdGFsbGF0aW9uID0gbmV4dE93bmVyID8geyBvd25lcjogbmV4dE93bmVyLCB1bmluc3RhbGw6IG5leHRPd25lci5pbnN0YWxsKCkgfSA6IG51bGw7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2goc3RhdGU6IEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGUsIHBhcmFtczogRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyUGFyYW1zKTogdm9pZCB7XG4gIGlmIChzdGF0ZS5zdWJzY3JpcHRpb25zLnNvbWUoKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIpKSB7XG4gICAgcmVtb3ZlUm9vdFVuc2FmZUl0ZW1zKHBhcmFtcy5tZW51KTtcbiAgfVxuXG4gIC8vIEEgc25hcHNob3Q6IGEgaGFuZGxlciBtYXkgdW5sb2FkIGl0cyBvd24gY29tcG9uZW50LCBvciBhbm90aGVyIG9uZSwgd2hpbGUgdGhlIG1lbnUgaXMgZGlzcGF0Y2hlZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbm8tdXNlbGVzcy1zcHJlYWQgLS0gVGhlIGNvcHkgaXMgdGhlIHBvaW50OiB0aGUgbGlzdCBtYXkgY2hhbmdlIGR1cmluZyB0aGUgbG9vcC5cbiAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgWy4uLnN0YXRlLnN1YnNjcmlwdGlvbnNdKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN1YnNjcmlwdGlvbi5oYW5kbGVyKHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0EgZmlsZSBleHBsb3JlciByb290IG1lbnUgaGFuZGxlciBmYWlsZWQnLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRpc3BhdGNoQmVmb3JlU2hvdyhzdGF0ZTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSwgcGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgdW5pbnN0YWxsU2hvd1BhdGNoID0gYXJvdW5kKHBhcmFtcy5tZW51LCB7XG4gICAgc2hvd0F0TW91c2VFdmVudDogKG5leHQpID0+XG4gICAgICBmdW5jdGlvbiBwYXRjaGVkU2hvd0F0TW91c2VFdmVudCh0aGlzOiBNZW51LCBzaG93TW91c2VFdmVudDogTW91c2VFdmVudCk6IE1lbnUge1xuICAgICAgICB1bmluc3RhbGxTaG93UGF0Y2goKTtcbiAgICAgICAgZGlzcGF0Y2goc3RhdGUsIHBhcmFtcyk7XG4gICAgICAgIHJldHVybiBwYXJhbXMubWVudS5pdGVtcy5sZW5ndGggPT09IDAgPyB0aGlzIDogbmV4dC5jYWxsKHRoaXMsIHNob3dNb3VzZUV2ZW50KTtcbiAgICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEZpbGVFeHBsb3JlckxlYWYoYXBwOiBBcHApOiBudWxsIHwgV29ya3NwYWNlTGVhZiB7XG4gIHJldHVybiBhcHAud29ya3NwYWNlLmdldExlYXZlc09mVHlwZShWaWV3VHlwZS5GaWxlRXhwbG9yZXIpWzBdID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFNoYXJlZFN0YXRlKGFwcDogQXBwKTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSB7XG4gIGNvbnN0IHN0YXRlc0J5QXBwID0gZ2V0T2JzaWRpYW5MaWJTdGF0ZShTSEFSRURfU1RBVEVfS0VZLCBuZXcgV2Vha01hcDxBcHAsIEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGU+KCkpLnZhbHVlO1xuICBsZXQgc3RhdGUgPSBzdGF0ZXNCeUFwcC5nZXQoYXBwKTtcbiAgaWYgKCFzdGF0ZSkge1xuICAgIHN0YXRlID0geyBpbnN0YWxsYXRpb246IG51bGwsIHN1YnNjcmlwdGlvbnM6IFtdIH07XG4gICAgc3RhdGVzQnlBcHAuc2V0KGFwcCwgc3RhdGUpO1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbFJvb3RNZW51KGFwcDogQXBwLCBzdGF0ZTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSk6ICgpID0+IHZvaWQge1xuICBsZXQgaXNVbmluc3RhbGxlZCA9IGZhbHNlO1xuICBsZXQgcGVuZGluZ1Nwb3Q6IEZpbGVFeHBsb3JlclJvb3RNZW51U3BvdCB8IG51bGwgPSBudWxsO1xuICBsZXQgdW5pbnN0YWxsUGF0Y2g6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHRyeVBhdGNoKCk6IHZvaWQge1xuICAgIGlmIChpc1VuaW5zdGFsbGVkIHx8IHVuaW5zdGFsbFBhdGNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmlldyA9IGdldEZpbGVFeHBsb3JlckxlYWYoYXBwKT8udmlldztcbiAgICBpZiAoIWlzRmlsZUV4cGxvcmVyVmlldyh2aWV3KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHVuaW5zdGFsbFBhdGNoID0gYXJvdW5kKGdldFByb3RvdHlwZU9mKHZpZXcpLCB7XG4gICAgICBvbkZpbGVDb250ZXh0TWVudTogKG5leHQpID0+XG4gICAgICAgIGZ1bmN0aW9uIHBhdGNoZWRPbkZpbGVDb250ZXh0TWVudSh0aGlzOiBGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51LCBtb3VzZUV2ZW50OiBNb3VzZUV2ZW50LCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogdm9pZCB7XG4gICAgICAgICAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHx8ICFmaWxlLmlzUm9vdCgpKSB7XG4gICAgICAgICAgICBuZXh0LmNhbGwodGhpcywgbW91c2VFdmVudCwgZmlsZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgb3BlblJvb3RNZW51KHtcbiAgICAgICAgICAgIG1vdXNlRXZlbnQsXG4gICAgICAgICAgICBvcGVuTmF0aXZlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCBtb3VzZUV2ZW50LCBmaWxlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb290Rm9sZGVyOiBmaWxlLFxuICAgICAgICAgICAgc3BvdDogcGVuZGluZ1Nwb3QgPz8gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LkVtcHR5QXJlYVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuUm9vdE1lbnUocGFyYW1zOiBPcGVuUm9vdE1lbnVQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG1vdXNlRXZlbnQsIG9wZW5OYXRpdmUsIHJvb3RGb2xkZXIsIHNwb3QgfSA9IHBhcmFtcztcbiAgICBjb25zdCBldmVudFJlZiA9IGFwcC53b3Jrc3BhY2Uub24oJ2ZpbGUtbWVudScsIChtZW51LCBmaWxlLCBzb3VyY2UpID0+IHtcbiAgICAgIGlmIChmaWxlICE9PSByb290Rm9sZGVyIHx8IHNvdXJjZSAhPT0gRklMRV9FWFBMT1JFUl9NRU5VX1NPVVJDRSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIGRpc3BhdGNoQmVmb3JlU2hvdyhzdGF0ZSwgeyBtZW51LCBtb3VzZUV2ZW50LCByb290Rm9sZGVyLCBzcG90IH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdG9yZUlzUm9vdCA9IHN0YXRlLnN1YnNjcmlwdGlvbnMuc29tZSgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24uc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcilcbiAgICAgID8gcHJlc2VudEFzRm9sZGVyKHJvb3RGb2xkZXIpXG4gICAgICA6IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgb3Blbk5hdGl2ZSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZXN0b3JlSXNSb290Py4oKTtcbiAgICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRnJvbVZhdWx0TmFtZShtb3VzZUV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaXNPblZhdWx0TmFtZSA9IG1vdXNlRXZlbnQuY29tcG9zZWRQYXRoKCkuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBWQVVMVF9OQU1FX1NFTEVDVE9SUy5zb21lKChzZWxlY3RvcikgPT4gdGFyZ2V0Lm1hdGNoZXMoc2VsZWN0b3IpKSk7XG4gICAgaWYgKCFpc09uVmF1bHROYW1lKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYE1lbnUuZm9yRXZlbnRgIGhhbmRzIGV2ZXJ5IGxpc3RlbmVyIG9mIG9uZSBldmVudCB0aGUgc2FtZSBtZW51IGFuZCBzaG93cyBpdCBvbiB0aGUgbmV4dCB0YXNrLiBPYnNpZGlhbidzIG93blxuICAgIC8vIGxpc3RlbmVyIG9uIHRoZSB2YXVsdCBuYW1lIGFkZHMgaXRzIHZhdWx0IGl0ZW1zIHRvIGl0IGFmdGVyIHRoaXMgY2FwdHVyZS1waGFzZSBvbmUgaGFzIHJ1bi5cbiAgICBjb25zdCB2YXVsdE1lbnUgPSBNZW51LmZvckV2ZW50KG1vdXNlRXZlbnQpO1xuICAgIGNvbnN0IHJvb3RGb2xkZXIgPSBhcHAudmF1bHQuZ2V0Um9vdCgpO1xuICAgIGNvbnN0IGxlYWYgPSBnZXRGaWxlRXhwbG9yZXJMZWFmKGFwcCk7XG4gICAgaWYgKCFsZWFmIHx8IHN0YXRlLnN1YnNjcmlwdGlvbnMuZXZlcnkoKHN1YnNjcmlwdGlvbikgPT4gIXN1YnNjcmlwdGlvbi5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyKSkge1xuICAgICAgZGlzcGF0Y2hCZWZvcmVTaG93KHN0YXRlLCB7IG1lbnU6IHZhdWx0TWVudSwgbW91c2VFdmVudCwgcm9vdEZvbGRlciwgc3BvdDogRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LlZhdWx0TmFtZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVzZW50ZWQgYXMgYSBmb2xkZXIsIHRoZSByb290J3MgZm9sZGVyIG1lbnUgcmVwbGFjZXMgdGhlIHZhdWx0IG1lbnUgcmF0aGVyIHRoYW4gb3BlbmluZyBvbiB0b3Agb2YgaXQuXG4gICAgZnVuY3Rpb24gc3VwcHJlc3NWYXVsdE1lbnVTaG93KCk6IE1lbnUge1xuICAgICAgdW5pbnN0YWxsVmF1bHRNZW51U2hvd1BhdGNoKCk7XG4gICAgICByZXR1cm4gdmF1bHRNZW51O1xuICAgIH1cbiAgICBjb25zdCB1bmluc3RhbGxWYXVsdE1lbnVTaG93UGF0Y2ggPSBhcm91bmQodmF1bHRNZW51LCB7IHNob3dBdE1vdXNlRXZlbnQ6ICgpID0+IHN1cHByZXNzVmF1bHRNZW51U2hvdyB9KTtcbiAgICBpbnZva2VBc3luY1NhZmVseShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCBsZWFmLmxvYWRJZkRlZmVycmVkKCk7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKGlzVW5pbnN0YWxsZWQgfHwgIWlzRmlsZUV4cGxvcmVyVmlldyh2aWV3KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeVBhdGNoKCk7XG4gICAgICB2aWV3LnRyZWUuY2xlYXJTZWxlY3RlZERvbXMoKTtcbiAgICAgIHBlbmRpbmdTcG90ID0gRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90LlZhdWx0TmFtZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZpZXcub25GaWxlQ29udGV4dE1lbnUobW91c2VFdmVudCwgcm9vdEZvbGRlcik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBwZW5kaW5nU3BvdCA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB0cnlQYXRjaCgpO1xuICBjb25zdCBsYXlvdXRDaGFuZ2VFdmVudFJlZiA9IGFwcC53b3Jrc3BhY2Uub24oJ2xheW91dC1jaGFuZ2UnLCB0cnlQYXRjaCk7XG4gIGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeSh0cnlQYXRjaCk7XG4gIGNvbnN0IGRvYyA9IGFwcC53b3Jrc3BhY2UuY29udGFpbmVyRWwuZG9jO1xuICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuRnJvbVZhdWx0TmFtZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgaXNVbmluc3RhbGxlZCA9IHRydWU7XG4gICAgdW5pbnN0YWxsUGF0Y2g/LigpO1xuICAgIGFwcC53b3Jrc3BhY2Uub2ZmcmVmKGxheW91dENoYW5nZUV2ZW50UmVmKTtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvcGVuRnJvbVZhdWx0TmFtZSwgeyBjYXB0dXJlOiB0cnVlIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBpc0ZpbGVFeHBsb3JlclZpZXcodmlldzogdW5rbm93bik6IHZpZXcgaXMgRmlsZUV4cGxvcmVyVmlld1dpdGhDb250ZXh0TWVudSB7XG4gIHJldHVybiB0eXBlb2YgKHZpZXcgYXMgUGFydGlhbDxGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51PiB8IHVuZGVmaW5lZCk/Lm9uRmlsZUNvbnRleHRNZW51ID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBwcmVzZW50QXNGb2xkZXIocm9vdEZvbGRlcjogVEZvbGRlcik6ICgpID0+IHZvaWQge1xuICBjb25zdCBvd25Jc1Jvb3REZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyb290Rm9sZGVyLCAnaXNSb290Jyk7XG4gIHJvb3RGb2xkZXIuaXNSb290ID0gKCk6IGJvb2xlYW4gPT4gZmFsc2U7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKG93bklzUm9vdERlc2NyaXB0b3IpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyb290Rm9sZGVyLCAnaXNSb290Jywgb3duSXNSb290RGVzY3JpcHRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSAocm9vdEZvbGRlciBhcyBQYXJ0aWFsPFRGb2xkZXI+KS5pc1Jvb3Q7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVSb290VW5zYWZlSXRlbXMobWVudTogTWVudSk6IHZvaWQge1xuICBjb25zdCB1bnNhZmVUaXRsZXMgPSBuZXcgU2V0PG51bGwgfCBzdHJpbmc+KFJPT1RfVU5TQUZFX0lURU1fVElUTEVfS0VZUy5tYXAoKGtleSkgPT4gYWN0aXZlV2luZG93LmkxOG5leHQudChrZXkpKSk7XG4gIG1lbnUuaXRlbXMgPSBtZW51Lml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gIShpdGVtIGluc3RhbmNlb2YgTWVudUl0ZW0pIHx8ICF1bnNhZmVUaXRsZXMuaGFzKGl0ZW0udGl0bGVFbC50ZXh0Q29udGVudCkpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTZCQSxtQkFBa0M7QUFDbEMsMEJBQStCO0FBQy9CLDZCQUF5QjtBQUN6QixzQkFJTztBQUVQLGdDQUFvQztBQUNwQywwQkFB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
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2ZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogT3BlbnMgYW5kIGV4dGVuZHMgdGhlIGNvcmUgRmlsZSBFeHBsb3JlcidzIGNvbnRleHQgbWVudSBmb3IgdGhlIHZhdWx0IHJvb3QsIGF0IHRoZSB0d28gc3BvdHMgdGhhdCBzdGFuZCBmb3IgaXQ6IHRoZVxuICogdmF1bHQgbmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGFuZCB0aGUgZW1wdHkgYXJlYSBiZWxvdyB0aGUgZmlsZSBsaXN0LlxuICpcbiAqIE9ic2lkaWFuIGFscmVhZHkgb3BlbnMgYSBtZW51IGZvciB0aGUgZW1wdHkgYXJlYTogdGhlIHZpZXcncyBvd24gYGNvbnRleHRtZW51YCBsaXN0ZW5lciBvbiBpdHMgZmlsZXMgY29udGFpbmVyIGNhbGxzXG4gKiBgb25GaWxlQ29udGV4dE1lbnUoZXZ0LCB2YXVsdC5nZXRSb290KCkpYCwgd2hpY2ggYnVpbGRzIGEge0BsaW5rIE1lbnV9LCB0cmlnZ2VycyBgZmlsZS1tZW51YCB3aXRoIHRoZSByb290IGZvbGRlciBhbmRcbiAqIHRoZSBzb3VyY2UgYGZpbGUtZXhwbG9yZXItY29udGV4dC1tZW51YCwgYW5kIHNob3dzIGl0LiBUaGUgdmF1bHQgbmFtZSAoYC53b3Jrc3BhY2UtZHJhd2VyLXZhdWx0LXN3aXRjaGVyYCBvbiBkZXNrdG9wLFxuICogYC53b3Jrc3BhY2UtZHJhd2VyLWhlYWRlci1uYW1lYCBvbiBtb2JpbGUsIHdoZXJlIE9ic2lkaWFuIGJ1aWxkcyBubyBzd2l0Y2hlcikgb3BlbnMgYSBkaWZmZXJlbnQgbWVudTogb24gZGVza3RvcFxuICogT2JzaWRpYW4gYWRkcyBgU2hvdyBpbiBzeXN0ZW0gZXhwbG9yZXJgIGFuZCBgQ29weSBwYXRoYCB0byB0aGUgcGVyLWV2ZW50IG1lbnUgYE1lbnUuZm9yRXZlbnRgIGhhbmRzIG91dC4gVGhlIGhhbmRsZXJzXG4gKiBnZXQgdGhhdCBtZW51LCBzbyBhIHJpZ2h0LWNsaWNrIHRoZXJlIG5ldmVyIG9wZW5zIGEgc2Vjb25kIG9uZS4gQSBzdWJzY3JpYmVyIHRoYXQgcHJlc2VudHMgdGhlIHJvb3QgYXMgYSBmb2xkZXJcbiAqIHJlcGxhY2VzIGl0IHdpdGggdGhlIHJvb3QncyBmb2xkZXIgbWVudSBpbnN0ZWFkLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMGAuXG4gKlxuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIG93biBjb3B5IG9mIHRoaXMgbGlicmFyeSwgYW5kIHNldmVyYWwgb2YgdGhlbSBtYXkgd2FudCB0aGlzIG1lbnUuIFR3byBjb3BpZXMgcGF0Y2hpbmcgdGhlXG4gKiBzYW1lIHByb3RvdHlwZSBhbmQgbGlzdGVuaW5nIG9uIHRoZSBzYW1lIGVsZW1lbnQgd291bGQgb3BlbiBpdCB0d2ljZSwgc28gdGhlcmUgaXMgT05FIGluc3RhbGxhdGlvbiBwZXIge0BsaW5rIEFwcH0sXG4gKiBrZXB0IGluIHRoZSBzaGFyZWQtc3RhdGUgYmFnIHVuZGVyIGEgdmVyc2lvbmVkIGtleSBhbmQgb3duZWQgYnkgb25lIHN1YnNjcmliZXIuIFdoZW4gdGhlIG93bmVyIHVubG9hZHMgd2hpbGUgb3RoZXJzXG4gKiByZW1haW4sIHRoZSBuZXh0IHN1YnNjcmliZXIgaW5zdGFsbHMgaXQgYWdhaW4gZnJvbSBpdHMgb3duIGNvcHkuIFdoYXQgY3Jvc3NlcyB0aGF0IGJvdW5kYXJ5IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlblxuICogY29waWVzIG9mIGRpZmZlcmVudCB2ZXJzaW9uczogcGxhaW4gb2JqZWN0cyBhbmQgcGxhaW4gZnVuY3Rpb25zIG9ubHksIHJlYWQgc3RydWN0dXJhbGx5LCBhbmQgYSBjaGFuZ2UgdG8gd2hhdCBhIGZpZWxkXG4gKiBtZWFucyBtb3ZlcyB0byBhIG5ldyBrZXkgcmF0aGVyIHRoYW4gcmVpbnRlcnByZXRpbmcgdGhlIG9sZCBvbmUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBGaWxlRXhwbG9yZXJWaWV3IH0gZnJvbSAnQG9ic2lkaWFuLXR5cGluZ3Mvb2JzaWRpYW4tcHVibGljLWxhdGVzdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEFic3RyYWN0RmlsZSxcbiAgV29ya3NwYWNlTGVhZlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGdldFByb3RvdHlwZU9mIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIE1lbnUsXG4gIE1lbnVJdGVtLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcbmltcG9ydCB7IGFyb3VuZCB9IGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuXG4vKipcbiAqIFRoZSBlbGVtZW50cyB0aGF0IHN0YW5kIGZvciB0aGUgdmF1bHQgcm9vdCBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIsIGluIHByaW9yaXR5IG9yZGVyLiBPYnNpZGlhbiBidWlsZHNcbiAqIGAud29ya3NwYWNlLWRyYXdlci12YXVsdC1zd2l0Y2hlcmAgb25seSBvbiBkZXNrdG9wOyBvbiBtb2JpbGUgdGhlIHZhdWx0IG5hbWUgaXMgdGhlIGRyYXdlciBoZWFkZXIgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFZBVUxUX05BTUVfU0VMRUNUT1JTID0gW1xuICAnLndvcmtzcGFjZS1kcmF3ZXItdmF1bHQtc3dpdGNoZXInLFxuICAnLndvcmtzcGFjZS1kcmF3ZXItaGVhZGVyLW5hbWUnXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFRoZSBgc291cmNlYCBPYnNpZGlhbiBwYXNzZXMgd2l0aCBgZmlsZS1tZW51YCB3aGVuIHRoZSBGaWxlIEV4cGxvcmVyIG9wZW5zIGEgbWVudS5cbiAqL1xuY29uc3QgRklMRV9FWFBMT1JFUl9NRU5VX1NPVVJDRSA9ICdmaWxlLWV4cGxvcmVyLWNvbnRleHQtbWVudSc7XG5cbi8qKlxuICogVGhlIG1lbnUgaXRlbXMgdGhhdCBtdXN0IG5vdCBhY3Qgb24gdGhlIHZhdWx0IHJvb3QsIGJ5IHRoZSBsb2NhbGl6YXRpb24ga2V5IG9mIHRoZWlyIHRpdGxlLiBUaGV5IGFwcGVhciBvbmx5IHdoZW5cbiAqIHRoZSByb290IGlzIHByZXNlbnRlZCBhcyBhbiBvcmRpbmFyeSBmb2xkZXIsIGZyb20gT2JzaWRpYW4gaXRzZWxmIG9yIGZyb20gYW5vdGhlciBwbHVnaW4ncyBgZmlsZS1tZW51YCBoYW5kbGVyLlxuICovXG5jb25zdCBST09UX1VOU0FGRV9JVEVNX1RJVExFX0tFWVMgPSBbXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIuYWN0aW9uLW1vdmUtZm9sZGVyJyxcbiAgJ3BsdWdpbnMuZmlsZS1leHBsb3Jlci5tZW51LW9wdC1kZWxldGUnLFxuICAncGx1Z2lucy5maWxlLWV4cGxvcmVyLm1lbnUtb3B0LW1ha2UtY29weScsXG4gICdwbHVnaW5zLmZpbGUtZXhwbG9yZXIubWVudS1vcHQtcmVuYW1lJyxcbiAgJ3BsdWdpbnMuc2VhcmNoLm1lbnUtb3B0LXNlYXJjaC1pbi1mb2xkZXInXG5dIGFzIGNvbnN0O1xuXG5jb25zdCBTSEFSRURfU1RBVEVfS0VZID0gJ2ZpbGVFeHBsb3JlclJvb3RNZW51VjEnO1xuXG4vKipcbiAqIFdoaWNoIHNwb3Qgb2YgdGhlIEZpbGUgRXhwbG9yZXIgdGhlIHZhdWx0LXJvb3QgbWVudSB3YXMgb3BlbmVkIGZyb20uXG4gKi9cbmV4cG9ydCBlbnVtIEZpbGVFeHBsb3JlclJvb3RNZW51U3BvdCB7XG4gIC8qKlxuICAgKiBUaGUgZW1wdHkgYXJlYSBiZWxvdyB0aGUgZmlsZSBsaXN0LlxuICAgKi9cbiAgRW1wdHlBcmVhID0gJ2VtcHR5LWFyZWEnLFxuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgbmFtZSBhdCB0aGUgdG9wIG9mIHRoZSBsZWZ0IHNpZGViYXIuXG4gICAqL1xuICBWYXVsdE5hbWUgPSAndmF1bHQtbmFtZSdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgRmlsZUV4cGxvcmVyUm9vdE1lbnVDb21wb25lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVFeHBsb3JlclJvb3RNZW51Q29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgZWFjaCB0aW1lIHRoZSB2YXVsdC1yb290IG1lbnUgaXMgYWJvdXQgdG8gYmUgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVyOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJvb3QgaXMgcHJlc2VudGVkIGFzIGFuIG9yZGluYXJ5IGZvbGRlciB3aGlsZSBpdHMgbWVudSBpcyBidWlsdCwgc28gdGhhdCBPYnNpZGlhbiBhbmQgb3RoZXIgcGx1Z2lucyBhZGRcbiAgICogdGhlIGl0ZW1zIHRoZXkgYWRkIHRvIGFueSBmb2xkZXIuIFRoZSBpdGVtcyB0aGF0IG11c3Qgbm90IGFjdCBvbiB0aGUgcm9vdCAocmVuYW1lLCBkZWxldGUsIG1vdmUsIG1ha2UgYSBjb3B5IGFuZFxuICAgKiBzZWFyY2ggaW4gZm9sZGVyKSBhcmUgcmVtb3ZlZCBhZ2FpbiBiZWZvcmUgdGhlIG1lbnUgaXMgc2hvd24uIE9uIHRoZSB2YXVsdCBuYW1lLCB0aGUgcm9vdCdzIGZvbGRlciBtZW51IHRoZW4gcmVwbGFjZXNcbiAgICogT2JzaWRpYW4ncyB2YXVsdCBtZW51LiBJdCBob2xkcyB3aGlsZSBhbnkgc3Vic2NyaWJlciBhc2tzIGZvciBpdC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIG9mIHRoZSB2YXVsdC1yb290IG1lbnUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXIgPSAocGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpID0+IHZvaWQ7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgYSB7QGxpbmsgRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyfS5cbiAqXG4gKiBUaGUgc2hhcGUgaXMgcGFydCBvZiB0aGUgd2lyZSBmb3JtYXQgYmV0d2VlbiBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5OiBmaWVsZHMgYXJlIG9ubHkgZXZlciBhZGRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG1lbnUsIGFib3V0IHRvIGJlIHNob3duOiB0aGUgcm9vdCdzIGZvbGRlciBtZW51LCBhZnRlciBldmVyeSBgZmlsZS1tZW51YCBoYW5kbGVyIGhhcyBydW4sIG9yIG9uIHRoZSB2YXVsdCBuYW1lIHRoZVxuICAgKiB2YXVsdCBtZW51IE9ic2lkaWFuIGJ1aWxkcyB0aGVyZS4gQSBtZW51IHN0aWxsIGVtcHR5IGFmdGVyIGV2ZXJ5IGhhbmRsZXIgaXMgbm90IHNob3duLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVudTogTWVudTtcblxuICAvKipcbiAgICogVGhlIHJpZ2h0LWNsaWNrIG9yIGxvbmctcHJlc3MgdGhhdCBvcGVuZWQgdGhlIG1lbnUuXG4gICAqL1xuICByZWFkb25seSBtb3VzZUV2ZW50OiBNb3VzZUV2ZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RGb2xkZXI6IFRGb2xkZXI7XG5cbiAgLyoqXG4gICAqIFdoaWNoIHNwb3QgdGhlIG1lbnUgd2FzIG9wZW5lZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BvdDogRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90O1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyUm9vdE1lbnVJbnN0YWxsYXRpb24ge1xuICByZWFkb25seSBvd25lcjogRmlsZUV4cGxvcmVyUm9vdE1lbnVTdWJzY3JpcHRpb247XG4gIHJlYWRvbmx5IHVuaW5zdGFsbDogKCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGUge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBTdWJzY3JpYmVyIGNoYW5nZXMgcmVwbGFjZSBvciBjbGVhciB0aGUgc2hhcmVkIG1lbnUgaW5zdGFsbGF0aW9uLlxuICBpbnN0YWxsYXRpb246IEZpbGVFeHBsb3JlclJvb3RNZW51SW5zdGFsbGF0aW9uIHwgbnVsbDtcbiAgcmVhZG9ubHkgc3Vic2NyaXB0aW9uczogRmlsZUV4cGxvcmVyUm9vdE1lbnVTdWJzY3JpcHRpb25bXTtcbn1cblxuaW50ZXJmYWNlIEZpbGVFeHBsb3JlclJvb3RNZW51U3Vic2NyaXB0aW9uIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogKHBhcmFtczogRmlsZUV4cGxvcmVyUm9vdE1lbnVIYW5kbGVyUGFyYW1zKSA9PiB2b2lkO1xuICByZWFkb25seSBpbnN0YWxsOiAoKSA9PiAoKSA9PiB2b2lkO1xuICByZWFkb25seSBzaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmlsZUV4cGxvcmVyVmlld1dpdGhDb250ZXh0TWVudSBleHRlbmRzIEZpbGVFeHBsb3JlclZpZXcge1xuICByZWFkb25seSBvbkZpbGVDb250ZXh0TWVudTogKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBPcGVuUm9vdE1lbnVQYXJhbXMge1xuICByZWFkb25seSBtb3VzZUV2ZW50OiBNb3VzZUV2ZW50O1xuICByZWFkb25seSBvcGVuTmF0aXZlOiAoKSA9PiB2b2lkO1xuICByZWFkb25seSByb290Rm9sZGVyOiBURm9sZGVyO1xuICByZWFkb25seSBzcG90OiBGaWxlRXhwbG9yZXJSb290TWVudVNwb3Q7XG59XG5cbi8qKlxuICogSGFuZHMgdGhlIGNvcmUgRmlsZSBFeHBsb3JlcidzIHZhdWx0LXJvb3QgbWVudSB0byBhIGhhbmRsZXIsIGFuZCBvcGVucyB0aGF0IG1lbnUgZnJvbSB0aGUgdmF1bHQgbmFtZSB0b28uXG4gKlxuICogQW55IG51bWJlciBvZiB0aGVzZSwgaW4gYW55IG51bWJlciBvZiBwbHVnaW5zLCBzaGFyZSBvbmUgaW5zdGFsbGF0aW9uIHBlciB7QGxpbmsgQXBwfS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVFeHBsb3JlclJvb3RNZW51Q29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQ2FsbGVkIGVhY2ggdGltZSB0aGUgdmF1bHQtcm9vdCBtZW51IGlzIGFib3V0IHRvIGJlIHNob3duLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGhhbmRsZXI6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcm9vdCBpcyBwcmVzZW50ZWQgYXMgYW4gb3JkaW5hcnkgZm9sZGVyIHdoaWxlIGl0cyBtZW51IGlzIGJ1aWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3VsZFByZXNlbnRSb290QXNGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZmlsZSBleHBsb3JlciByb290IG1lbnUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5oYW5kbGVyID0gcGFyYW1zLmhhbmRsZXI7XG4gICAgdGhpcy5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyID0gcGFyYW1zLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIgPz8gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byB0aGUgc2hhcmVkIGluc3RhbGxhdGlvbiwgaW5zdGFsbGluZyBpdCB3aGVuIG5vYm9keSBoYXMgeWV0LlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcblxuICAgIGNvbnN0IHN0YXRlID0gZ2V0U2hhcmVkU3RhdGUoKTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb246IEZpbGVFeHBsb3JlclJvb3RNZW51U3Vic2NyaXB0aW9uID0ge1xuICAgICAgaGFuZGxlcjogdGhpcy5oYW5kbGVyLFxuICAgICAgaW5zdGFsbDogKCkgPT4gaW5zdGFsbFJvb3RNZW51KHRoaXMuYXBwLCBzdGF0ZSksXG4gICAgICBzaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyOiB0aGlzLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXJcbiAgICB9O1xuICAgIHN0YXRlLnN1YnNjcmlwdGlvbnMucHVzaChzdWJzY3JpcHRpb24pO1xuICAgIHN0YXRlLmluc3RhbGxhdGlvbiA/Pz0geyBvd25lcjogc3Vic2NyaXB0aW9uLCB1bmluc3RhbGw6IHN1YnNjcmlwdGlvbi5pbnN0YWxsKCkgfTtcblxuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgc3RhdGUuc3Vic2NyaXB0aW9ucy5zcGxpY2Uoc3RhdGUuc3Vic2NyaXB0aW9ucy5pbmRleE9mKHN1YnNjcmlwdGlvbiksIDEpO1xuICAgICAgaWYgKHN0YXRlLmluc3RhbGxhdGlvbj8ub3duZXIgIT09IHN1YnNjcmlwdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmluc3RhbGxhdGlvbi51bmluc3RhbGwoKTtcbiAgICAgIGNvbnN0IG5leHRPd25lciA9IHN0YXRlLnN1YnNjcmlwdGlvbnNbMF07XG4gICAgICBzdGF0ZS5pbnN0YWxsYXRpb24gPSBuZXh0T3duZXIgPyB7IG93bmVyOiBuZXh0T3duZXIsIHVuaW5zdGFsbDogbmV4dE93bmVyLmluc3RhbGwoKSB9IDogbnVsbDtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkaXNwYXRjaChzdGF0ZTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSwgcGFyYW1zOiBGaWxlRXhwbG9yZXJSb290TWVudUhhbmRsZXJQYXJhbXMpOiB2b2lkIHtcbiAgaWYgKHN0YXRlLnN1YnNjcmlwdGlvbnMuc29tZSgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24uc2hvdWxkUHJlc2VudFJvb3RBc0ZvbGRlcikpIHtcbiAgICByZW1vdmVSb290VW5zYWZlSXRlbXMocGFyYW1zLm1lbnUpO1xuICB9XG5cbiAgLy8gQSBzbmFwc2hvdDogYSBoYW5kbGVyIG1heSB1bmxvYWQgaXRzIG93biBjb21wb25lbnQsIG9yIGFub3RoZXIgb25lLCB3aGlsZSB0aGUgbWVudSBpcyBkaXNwYXRjaGVkLlxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11c2VsZXNzLXNwcmVhZCAtLSBUaGUgY29weSBpcyB0aGUgcG9pbnQ6IHRoZSBsaXN0IG1heSBjaGFuZ2UgZHVyaW5nIHRoZSBsb29wLlxuICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBbLi4uc3RhdGUuc3Vic2NyaXB0aW9uc10pIHtcbiAgICB0cnkge1xuICAgICAgc3Vic2NyaXB0aW9uLmhhbmRsZXIocGFyYW1zKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignQSBmaWxlIGV4cGxvcmVyIHJvb3QgbWVudSBoYW5kbGVyIGZhaWxlZCcsIGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZGlzcGF0Y2hCZWZvcmVTaG93KHN0YXRlOiBGaWxlRXhwbG9yZXJSb290TWVudVNoYXJlZFN0YXRlLCBwYXJhbXM6IEZpbGVFeHBsb3JlclJvb3RNZW51SGFuZGxlclBhcmFtcyk6IHZvaWQge1xuICBjb25zdCB1bmluc3RhbGxTaG93UGF0Y2ggPSBhcm91bmQocGFyYW1zLm1lbnUsIHtcbiAgICBzaG93QXRNb3VzZUV2ZW50OiAobmV4dCkgPT5cbiAgICAgIGZ1bmN0aW9uIHBhdGNoZWRTaG93QXRNb3VzZUV2ZW50KHRoaXM6IE1lbnUsIHNob3dNb3VzZUV2ZW50OiBNb3VzZUV2ZW50KTogTWVudSB7XG4gICAgICAgIHVuaW5zdGFsbFNob3dQYXRjaCgpO1xuICAgICAgICBkaXNwYXRjaChzdGF0ZSwgcGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5tZW51Lml0ZW1zLmxlbmd0aCA9PT0gMCA/IHRoaXMgOiBuZXh0LmNhbGwodGhpcywgc2hvd01vdXNlRXZlbnQpO1xuICAgICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RmlsZUV4cGxvcmVyTGVhZihhcHA6IEFwcCk6IG51bGwgfCBXb3Jrc3BhY2VMZWFmIHtcbiAgcmV0dXJuIGFwcC53b3Jrc3BhY2UuZ2V0TGVhdmVzT2ZUeXBlKFZpZXdUeXBlLkZpbGVFeHBsb3JlcilbMF0gPz8gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmVkU3RhdGUoKTogRmlsZUV4cGxvcmVyUm9vdE1lbnVTaGFyZWRTdGF0ZSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkxpYlN0YXRlPEZpbGVFeHBsb3JlclJvb3RNZW51U2hhcmVkU3RhdGU+KFNIQVJFRF9TVEFURV9LRVksIHtcbiAgICBpbnN0YWxsYXRpb246IG51bGwsXG4gICAgc3Vic2NyaXB0aW9uczogW11cbiAgfSkudmFsdWU7XG59XG5mdW5jdGlvbiBpbnN0YWxsUm9vdE1lbnUoYXBwOiBBcHAsIHN0YXRlOiBGaWxlRXhwbG9yZXJSb290TWVudVNoYXJlZFN0YXRlKTogKCkgPT4gdm9pZCB7XG4gIGxldCBpc1VuaW5zdGFsbGVkID0gZmFsc2U7XG4gIGxldCBwZW5kaW5nU3BvdDogRmlsZUV4cGxvcmVyUm9vdE1lbnVTcG90IHwgbnVsbCA9IG51bGw7XG4gIGxldCB1bmluc3RhbGxQYXRjaDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdHJ5UGF0Y2goKTogdm9pZCB7XG4gICAgaWYgKGlzVW5pbnN0YWxsZWQgfHwgdW5pbnN0YWxsUGF0Y2gpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aWV3ID0gZ2V0RmlsZUV4cGxvcmVyTGVhZihhcHApPy52aWV3O1xuICAgIGlmICghaXNGaWxlRXhwbG9yZXJWaWV3KHZpZXcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdW5pbnN0YWxsUGF0Y2ggPSBhcm91bmQoZ2V0UHJvdG90eXBlT2YodmlldyksIHtcbiAgICAgIG9uRmlsZUNvbnRleHRNZW51OiAobmV4dCkgPT5cbiAgICAgICAgZnVuY3Rpb24gcGF0Y2hlZE9uRmlsZUNvbnRleHRNZW51KHRoaXM6IEZpbGVFeHBsb3JlclZpZXdXaXRoQ29udGV4dE1lbnUsIG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQsIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICAgICAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZvbGRlcikgfHwgIWZpbGUuaXNSb290KCkpIHtcbiAgICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCBtb3VzZUV2ZW50LCBmaWxlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcGVuUm9vdE1lbnUoe1xuICAgICAgICAgICAgbW91c2VFdmVudCxcbiAgICAgICAgICAgIG9wZW5OYXRpdmU6ICgpID0+IHtcbiAgICAgICAgICAgICAgbmV4dC5jYWxsKHRoaXMsIG1vdXNlRXZlbnQsIGZpbGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvb3RGb2xkZXI6IGZpbGUsXG4gICAgICAgICAgICBzcG90OiBwZW5kaW5nU3BvdCA/PyBGaWxlRXhwbG9yZXJSb290TWVudVNwb3QuRW1wdHlBcmVhXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Sb290TWVudShwYXJhbXM6IE9wZW5Sb290TWVudVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgbW91c2VFdmVudCwgb3Blbk5hdGl2ZSwgcm9vdEZvbGRlciwgc3BvdCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGV2ZW50UmVmID0gYXBwLndvcmtzcGFjZS5vbignZmlsZS1tZW51JywgKG1lbnUsIGZpbGUsIHNvdXJjZSkgPT4ge1xuICAgICAgaWYgKGZpbGUgIT09IHJvb3RGb2xkZXIgfHwgc291cmNlICE9PSBGSUxFX0VYUExPUkVSX01FTlVfU09VUkNFKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXBwLndvcmtzcGFjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgZGlzcGF0Y2hCZWZvcmVTaG93KHN0YXRlLCB7IG1lbnUsIG1vdXNlRXZlbnQsIHJvb3RGb2xkZXIsIHNwb3QgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN0b3JlSXNSb290ID0gc3RhdGUuc3Vic2NyaXB0aW9ucy5zb21lKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi5zaG91bGRQcmVzZW50Um9vdEFzRm9sZGVyKVxuICAgICAgPyBwcmVzZW50QXNGb2xkZXIocm9vdEZvbGRlcilcbiAgICAgIDogbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBvcGVuTmF0aXZlKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc3RvcmVJc1Jvb3Q/LigpO1xuICAgICAgYXBwLndvcmtzcGFjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9wZW5Gcm9tVmF1bHROYW1lKG1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpc09uVmF1bHROYW1lID0gbW91c2VFdmVudC5jb21wb3NlZFBhdGgoKS5zb21lKCh0YXJnZXQpID0+IHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIFZBVUxUX05BTUVfU0VMRUNUT1JTLnNvbWUoKHNlbGVjdG9yKSA9PiB0YXJnZXQubWF0Y2hlcyhzZWxlY3RvcikpKTtcbiAgICBpZiAoIWlzT25WYXVsdE5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBgTWVudS5mb3JFdmVudGAgaGFuZHMgZXZlcnkgbGlzdGVuZXIgb2Ygb25lIGV2ZW50IHRoZSBzYW1lIG1lbnUgYW5kIHNob3dzIGl0IG9uIHRoZSBuZXh0IHRhc2suIE9ic2lkaWFuJ3Mgb3duXG4gICAgLy8gbGlzdGVuZXIgb24gdGhlIHZhdWx0IG5hbWUgYWRkcyBpdHMgdmF1bHQgaXRlbXMgdG8gaXQgYWZ0ZXIgdGhpcyBjYXB0dXJlLXBoYXNlIG9uZSBoYXMgcnVuLlxuICAgIGNvbnN0IHZhdWx0TWVudSA9IE1lbnUuZm9yRXZlbnQobW91c2VFdmVudCk7XG4gICAgY29uc3Qgcm9vdEZvbGRlciA9IGFwcC52YXVsdC5nZXRSb290KCk7XG4gICAgY29uc3QgbGVhZiA9IGdldEZpbGVFeHBsb3JlckxlYWYoYXBwKTtcbiAgICBpZiAoIWxlYWYgfHwgc3RhdGUuc3Vic2NyaXB0aW9ucy5ldmVyeSgoc3Vic2NyaXB0aW9uKSA9PiAhc3Vic2NyaXB0aW9uLnNob3VsZFByZXNlbnRSb290QXNGb2xkZXIpKSB7XG4gICAgICBkaXNwYXRjaEJlZm9yZVNob3coc3RhdGUsIHsgbWVudTogdmF1bHRNZW51LCBtb3VzZUV2ZW50LCByb290Rm9sZGVyLCBzcG90OiBGaWxlRXhwbG9yZXJSb290TWVudVNwb3QuVmF1bHROYW1lIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFByZXNlbnRlZCBhcyBhIGZvbGRlciwgdGhlIHJvb3QncyBmb2xkZXIgbWVudSByZXBsYWNlcyB0aGUgdmF1bHQgbWVudSByYXRoZXIgdGhhbiBvcGVuaW5nIG9uIHRvcCBvZiBpdC5cbiAgICBmdW5jdGlvbiBzdXBwcmVzc1ZhdWx0TWVudVNob3coKTogTWVudSB7XG4gICAgICB1bmluc3RhbGxWYXVsdE1lbnVTaG93UGF0Y2goKTtcbiAgICAgIHJldHVybiB2YXVsdE1lbnU7XG4gICAgfVxuICAgIGNvbnN0IHVuaW5zdGFsbFZhdWx0TWVudVNob3dQYXRjaCA9IGFyb3VuZCh2YXVsdE1lbnUsIHsgc2hvd0F0TW91c2VFdmVudDogKCkgPT4gc3VwcHJlc3NWYXVsdE1lbnVTaG93IH0pO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGxlYWYubG9hZElmRGVmZXJyZWQoKTtcbiAgICAgIGNvbnN0IHZpZXcgPSBsZWFmLnZpZXc7XG4gICAgICBpZiAoaXNVbmluc3RhbGxlZCB8fCAhaXNGaWxlRXhwbG9yZXJWaWV3KHZpZXcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5UGF0Y2goKTtcbiAgICAgIHZpZXcudHJlZS5jbGVhclNlbGVjdGVkRG9tcygpO1xuICAgICAgcGVuZGluZ1Nwb3QgPSBGaWxlRXhwbG9yZXJSb290TWVudVNwb3QuVmF1bHROYW1lO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmlldy5vbkZpbGVDb250ZXh0TWVudShtb3VzZUV2ZW50LCByb290Rm9sZGVyKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHBlbmRpbmdTcG90ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyeVBhdGNoKCk7XG4gIGNvbnN0IGxheW91dENoYW5nZUV2ZW50UmVmID0gYXBwLndvcmtzcGFjZS5vbignbGF5b3V0LWNoYW5nZScsIHRyeVBhdGNoKTtcbiAgYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHRyeVBhdGNoKTtcbiAgY29uc3QgZG9jID0gYXBwLndvcmtzcGFjZS5jb250YWluZXJFbC5kb2M7XG4gIGRvYy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5Gcm9tVmF1bHROYW1lLCB7IGNhcHR1cmU6IHRydWUgfSk7XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBpc1VuaW5zdGFsbGVkID0gdHJ1ZTtcbiAgICB1bmluc3RhbGxQYXRjaD8uKCk7XG4gICAgYXBwLndvcmtzcGFjZS5vZmZyZWYobGF5b3V0Q2hhbmdlRXZlbnRSZWYpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIG9wZW5Gcm9tVmF1bHROYW1lLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzRmlsZUV4cGxvcmVyVmlldyh2aWV3OiB1bmtub3duKTogdmlldyBpcyBGaWxlRXhwbG9yZXJWaWV3V2l0aENvbnRleHRNZW51IHtcbiAgcmV0dXJuIHR5cGVvZiAodmlldyBhcyBQYXJ0aWFsPEZpbGVFeHBsb3JlclZpZXdXaXRoQ29udGV4dE1lbnU+IHwgdW5kZWZpbmVkKT8ub25GaWxlQ29udGV4dE1lbnUgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIHByZXNlbnRBc0ZvbGRlcihyb290Rm9sZGVyOiBURm9sZGVyKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IG93bklzUm9vdERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHJvb3RGb2xkZXIsICdpc1Jvb3QnKTtcbiAgcm9vdEZvbGRlci5pc1Jvb3QgPSAoKTogYm9vbGVhbiA9PiBmYWxzZTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAob3duSXNSb290RGVzY3JpcHRvcikge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJvb3RGb2xkZXIsICdpc1Jvb3QnLCBvd25Jc1Jvb3REZXNjcmlwdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIChyb290Rm9sZGVyIGFzIFBhcnRpYWw8VEZvbGRlcj4pLmlzUm9vdDtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZVJvb3RVbnNhZmVJdGVtcyhtZW51OiBNZW51KTogdm9pZCB7XG4gIGNvbnN0IHVuc2FmZVRpdGxlcyA9IG5ldyBTZXQ8bnVsbCB8IHN0cmluZz4oUk9PVF9VTlNBRkVfSVRFTV9USVRMRV9LRVlTLm1hcCgoa2V5KSA9PiBhY3RpdmVXaW5kb3cuaTE4bmV4dC50KGtleSkpKTtcbiAgbWVudS5pdGVtcyA9IG1lbnUuaXRlbXMuZmlsdGVyKChpdGVtKSA9PiAhKGl0ZW0gaW5zdGFuY2VvZiBNZW51SXRlbSkgfHwgIXVuc2FmZVRpdGxlcy5oYXMoaXRlbS50aXRsZUVsLnRleHRDb250ZW50KSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkJBLG1CQUFrQztBQUNsQywwQkFBK0I7QUFDL0IsNkJBQXlCO0FBQ3pCLHNCQUlPO0FB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
@@ -14,8 +14,8 @@ if you want to view the source, please visit the github repository of this plugi
14
14
  __isPatched: true
15
15
  }
16
16
  );
17
- function extractDefault(module) {
18
- return module && module.__esModule && "default" in module ? module.default : module;
17
+ function extractDefault($module) {
18
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
19
19
  }
20
20
  const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
21
21
  "@codemirror/autocomplete",
@@ -57,9 +57,9 @@ if you want to view the source, please visit the github repository of this plugi
57
57
  return process;
58
58
  }
59
59
  } else {
60
- const module = originalRequire?.(id);
61
- if (module) {
62
- return extractDefault(module);
60
+ const $module = originalRequire?.(id);
61
+ if ($module) {
62
+ return extractDefault($module);
63
63
  }
64
64
  }
65
65
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
@@ -0,0 +1,340 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var incremental_file_index_component_exports = {};
116
+ __export(incremental_file_index_component_exports, {
117
+ IncrementalFileIndexComponent: () => IncrementalFileIndexComponent
118
+ });
119
+ module.exports = __toCommonJS(incremental_file_index_component_exports);
120
+ var import_async = require('@mnaoumov/typescript-lib/async');
121
+ var import_function = require('@mnaoumov/typescript-lib/function');
122
+ var import_obsidian = require('obsidian');
123
+ var import_component_ex = require('./component-ex.cjs');
124
+ const SAVE_DEBOUNCE_IN_MILLISECONDS = 5e3;
125
+ class IncrementalFileIndexComponent extends import_component_ex.ComponentEx {
126
+ /**
127
+ * Whether startup reconciliation has completed.
128
+ *
129
+ * @returns Whether the index completed its first reconciliation.
130
+ */
131
+ get isBuilt() {
132
+ return this.isBuiltValue;
133
+ }
134
+ /**
135
+ * Projection, notifications and persistence supplied by the consumer.
136
+ */
137
+ options;
138
+ isBuiltValue = false;
139
+ readTail = (0, import_function.noopAsync)();
140
+ records = /* @__PURE__ */ new Map();
141
+ requestSave;
142
+ revision = 0;
143
+ revisions = /* @__PURE__ */ new WeakMap();
144
+ savedRevision = 0;
145
+ savePromise = null;
146
+ /**
147
+ * Creates an index with consumer-owned projection and persistence.
148
+ *
149
+ * @param params - The index dependencies.
150
+ */
151
+ constructor(params) {
152
+ super();
153
+ this.options = { accepts: params.accepts, app: params.app, indexFile: params.indexFile, load: params.load, onRemove: params.onRemove, onSet: params.onSet, save: params.save };
154
+ this.requestSave = (0, import_obsidian.debounce)(
155
+ () => {
156
+ (0, import_async.invokeAsyncSafely)(() => this.flush());
157
+ },
158
+ SAVE_DEBOUNCE_IN_MILLISECONDS,
159
+ false
160
+ );
161
+ }
162
+ /**
163
+ * Saves a snapshot after previous writes finish, including changes arriving during a write.
164
+ *
165
+ * @returns Completion of the serialized writes; rejects on persistence failure without marking it saved.
166
+ */
167
+ async flush() {
168
+ if (this.savePromise) {
169
+ await this.savePromise;
170
+ return;
171
+ }
172
+ this.savePromise = this.saveChanges();
173
+ try {
174
+ await this.savePromise;
175
+ } finally {
176
+ this.savePromise = null;
177
+ }
178
+ }
179
+ /**
180
+ * Returns a shallow snapshot; consumers must treat records as immutable.
181
+ *
182
+ * @returns Current records by vault-relative path.
183
+ */
184
+ getRecords() {
185
+ return new Map(this.records);
186
+ }
187
+ /**
188
+ * Registers changes before startup restoration.
189
+ */
190
+ onload() {
191
+ const { app } = this.options;
192
+ this.registerEvent(app.metadataCache.on("changed", (file, content) => {
193
+ this.setText(file, content);
194
+ }));
195
+ this.registerEvent(app.vault.on("create", this.queueScan.bind(this)));
196
+ this.registerEvent(app.vault.on("modify", this.queueScan.bind(this)));
197
+ this.registerEvent(app.vault.on("delete", (file) => {
198
+ if (file instanceof import_obsidian.TFile) {
199
+ this.removeRecord(file.path);
200
+ } else {
201
+ this.removeTree(file.path);
202
+ }
203
+ }));
204
+ this.registerEvent(app.vault.on("rename", (file, oldPath) => {
205
+ this.rename(file, oldPath);
206
+ }));
207
+ }
208
+ /**
209
+ * Reuses unchanged saved records and reads other files one at a time.
210
+ *
211
+ * @returns Completion of startup reconciliation.
212
+ */
213
+ async onloadAsync() {
214
+ const saved = await this.options.load();
215
+ for (const file of this.options.app.vault.getFiles()) {
216
+ if (this.isUnloaded()) {
217
+ return;
218
+ }
219
+ if (!this.options.accepts(file) || this.revisions.has(file) || this.options.app.vault.getFileByPath(file.path) !== file) {
220
+ continue;
221
+ }
222
+ const entry = saved.get(file.path);
223
+ if (entry?.mtime === file.stat.mtime && entry.size === file.stat.size) {
224
+ this.setRecord(file.path, entry);
225
+ } else {
226
+ await this.scanFile(file);
227
+ }
228
+ }
229
+ await this.readTail;
230
+ if (this.isUnloaded()) {
231
+ return;
232
+ }
233
+ this.isBuiltValue = true;
234
+ this.markDirty();
235
+ }
236
+ /**
237
+ * Cancels the debounce and flushes completed indexes before disposing event listeners.
238
+ */
239
+ onunload() {
240
+ this.requestSave.cancel();
241
+ if (this.isBuiltValue) {
242
+ (0, import_async.invokeAsyncSafely)(() => this.flush());
243
+ }
244
+ super.onunload();
245
+ }
246
+ /**
247
+ * Rebuilds projections for every accepted file, for example after a consumer learns new names to find in text.
248
+ * Events arriving during the scan supersede its older reads. Consumers coordinate any domain scan markers.
249
+ *
250
+ * @returns Completion of the bounded full scan.
251
+ */
252
+ async rescan() {
253
+ for (const file of this.options.app.vault.getFiles()) {
254
+ await this.scanFile(file);
255
+ }
256
+ }
257
+ markDirty() {
258
+ this.revision++;
259
+ if (this.isBuiltValue && !this.isUnloaded()) {
260
+ this.requestSave();
261
+ }
262
+ }
263
+ queueScan(file) {
264
+ if (file instanceof import_obsidian.TFile) {
265
+ (0, import_async.invokeAsyncSafely)(() => this.scanFile(file));
266
+ }
267
+ }
268
+ removeRecord(path) {
269
+ if (!this.records.delete(path)) {
270
+ return;
271
+ }
272
+ this.options.onRemove(path);
273
+ this.markDirty();
274
+ }
275
+ removeTree(path) {
276
+ for (const key of this.records.keys()) {
277
+ if (!(key === path || key.startsWith(`${path}/`))) {
278
+ continue;
279
+ }
280
+ this.removeRecord(key);
281
+ }
282
+ }
283
+ rename(file, oldPath) {
284
+ if (file instanceof import_obsidian.TFile) {
285
+ this.removeRecord(oldPath);
286
+ } else {
287
+ this.removeTree(oldPath);
288
+ }
289
+ this.queueScan(file);
290
+ if (file instanceof import_obsidian.TFolder) {
291
+ import_obsidian.Vault.recurseChildren(file, this.queueScan.bind(this));
292
+ }
293
+ }
294
+ async saveChanges() {
295
+ while (this.isBuiltValue && this.savedRevision !== this.revision) {
296
+ const revision = this.revision;
297
+ await this.options.save(new Map(this.records));
298
+ this.savedRevision = revision;
299
+ }
300
+ }
301
+ async scanFile(file) {
302
+ if (this.isUnloaded() || !this.options.accepts(file)) {
303
+ return;
304
+ }
305
+ this.removeRecord(file.path);
306
+ const token = {};
307
+ this.revisions.set(file, token);
308
+ const { path } = file;
309
+ const { mtime, size } = file.stat;
310
+ const isCurrent = () => !this.isUnloaded() && this.revisions.get(file) === token && file.path === path && file.stat.mtime === mtime && file.stat.size === size && this.options.app.vault.getFileByPath(path) === file;
311
+ const read = this.readTail.then(async () => {
312
+ if (!isCurrent()) {
313
+ return;
314
+ }
315
+ const content = await this.options.app.vault.cachedRead(file);
316
+ if (!isCurrent()) {
317
+ return;
318
+ }
319
+ this.setText(file, content);
320
+ });
321
+ this.readTail = read.catch(import_function.noop);
322
+ await read;
323
+ }
324
+ setRecord(path, entry) {
325
+ this.records.set(path, entry);
326
+ this.options.onSet(path, entry.record);
327
+ this.markDirty();
328
+ }
329
+ setText(file, content) {
330
+ this.revisions.set(file, {});
331
+ if (!this.isUnloaded() && this.options.accepts(file)) {
332
+ this.setRecord(file.path, { mtime: file.stat.mtime, record: this.options.indexFile({ content, file }), size: file.stat.size });
333
+ }
334
+ }
335
+ }
336
+ // Annotate the CommonJS export names for ESM import in node:
337
+ 0 && (module.exports = {
338
+ IncrementalFileIndexComponent
339
+ });
340
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luY3JlbWVudGFsLWZpbGUtaW5kZXgtY29tcG9uZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBJbmNyZW1lbnRhbCBwZXItZmlsZSBwcm9qZWN0aW9ucyB3aXRoIHN0YXQtYmFzZWQgcmVzdG9yYXRpb24gYW5kIGluamVjdGVkIHBlcnNpc3RlbmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBEZWJvdW5jZXIsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBpbnZva2VBc3luY1NhZmVseSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Z1bmN0aW9uJztcbmltcG9ydCB7XG4gIGRlYm91bmNlLFxuICBURmlsZSxcbiAgVEZvbGRlcixcbiAgVmF1bHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgU0FWRV9ERUJPVU5DRV9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4vKipcbiAqIERlcGVuZGVuY2llcyBvZiBhbiBpbmNyZW1lbnRhbCBpbmRleC4gUGVyc2lzdGVuY2UgbXVzdCB2YWxpZGF0ZSBpdHMgb3duIHNjaGVtYS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgaW1tdXRhYmxlIHBlci1maWxlIHByb2plY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jcmVtZW50YWxGaWxlSW5kZXhDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtczxUPiB7XG4gIC8qKlxuICAgKiBGaWxlcyBhY2NlcHRlZCBieSB0aGlzIGluZGV4LCBmb3IgZXhhbXBsZSBNYXJrZG93biBmaWxlcyBvbmx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXB0czogKGZpbGU6IFRGaWxlKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIG93bmluZyB0aGUgdmF1bHQuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBpbW11dGFibGUgcmVjb3JkIHN5bmNocm9ub3VzbHk7IHRleHQgaXMgbmV2ZXIgcmV0YWluZWQgYnkgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICByZWFkb25seSBpbmRleEZpbGU6IChwYXJhbXM6IEluZGV4RmlsZVBhcmFtcykgPT4gVDtcbiAgLyoqXG4gICAqIFJlYWRzIHZhbGlkYXRlZCByZWNvcmRzLCBvciBhbiBlbXB0eSBtYXAgZm9yIGEgbWlzc2luZy9pbmNvbXBhdGlibGUgY2FjaGUuXG4gICAqL1xuICByZWFkb25seSBsb2FkOiAoKSA9PiBQcm9taXNlPFJlYWRvbmx5TWFwPHN0cmluZywgSW5kZXhlZEZpbGVSZWNvcmQ8VD4+PjtcbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByZWNvcmQgZnJvbSBhIGNvbnN1bWVyJ3Mgc2Vjb25kYXJ5IGluZGV4LiBDYWxsZWQgZm9yIGtub3duIHJlY29yZHMgb25seS5cbiAgICovXG4gIHJlYWRvbmx5IG9uUmVtb3ZlOiAocGF0aDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbnN1bWVyJ3Mgc2Vjb25kYXJ5IGluZGV4LCBpbmNsdWRpbmcgcmVzdG9yZWQgcmVjb3Jkcy5cbiAgICovXG4gIHJlYWRvbmx5IG9uU2V0OiAocGF0aDogc3RyaW5nLCByZWNvcmQ6IFQpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBQZXJzaXN0cyBhIHNuYXBzaG90OyB3cml0ZXMgYXJlIHNlcmlhbGl6ZWQgYW5kIHJldHJpZWQgYnkgdGhlIG5leHQgZmx1c2ggYWZ0ZXIgZmFpbHVyZS5cbiAgICovXG4gIHJlYWRvbmx5IHNhdmU6IChyZWNvcmRzOiBSZWFkb25seU1hcDxzdHJpbmcsIEluZGV4ZWRGaWxlUmVjb3JkPFQ+PikgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHByb2plY3Rpb24gYW5kIHRoZSBmaWxlIHN0YXRzIG9ic2VydmVkIGJlZm9yZSByZWFkaW5nIGl0cyB0ZXh0LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBpbW11dGFibGUgcGVyLWZpbGUgcHJvamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleGVkRmlsZVJlY29yZDxUPiB7XG4gIC8qKlxuICAgKiBMYXN0IG1vZGlmaWNhdGlvbiB0aW1lLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSBtdGltZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3MgaW1tdXRhYmxlIHByb2plY3Rpb24uXG4gICAqL1xuICByZWFkb25seSByZWNvcmQ6IFQ7XG4gIC8qKlxuICAgKiBGaWxlIHNpemUgaW4gYnl0ZXMuXG4gICAqL1xuICByZWFkb25seSBzaXplOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW5wdXRzIHRvIGEgcGVyLWZpbGUgcHJvamVjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleEZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGV4dCByZWFkIGZyb20gdGhlIHZhdWx0LCBvciBzdXBwbGllZCBieSBhIG1ldGFkYXRhLWNhY2hlIGV2ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGZpbGUgYmVpbmcgaW5kZXhlZC5cbiAgICovXG4gIHJlYWRvbmx5IGZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIEtlZXBzIHBlci1maWxlIHByb2plY3Rpb25zIGN1cnJlbnQgd2hpbGUgbG9hZGVkLiBDYWxsIGxvYWRXaXRoUHJvbWlzZXMgYWZ0ZXIgbWV0YWRhdGEgcmVhZGluZXNzIGlmIHRoZVxuICogcHJvamVjdGlvbiBuZWVkcyBjYWNoZWQgbWV0YWRhdGEuIExpc3RlbmVycyBhcmUgaW5zdGFsbGVkIGJlZm9yZSByZXN0b3JhdGlvbiwgYW5kIGV2ZW50cyB3aW4gb3ZlciBvbGRlciByZWFkcy5cbiAqIFJlYWRzIGFyZSBzZXF1ZW50aWFsLCBib3VuZGluZyBtZW1vcnkgYW5kIEkvTzsgY29uc3VtZXJzIG93biBzY2hlbWEsIHN0b3JhZ2UgbG9jYXRpb24gYW5kIHNlY29uZGFyeSBpbmRleGVzLlxuICogVW5jaGFuZ2VkIHJlY29yZHMgYXJlIHJldXNlZCBieSBtdGltZSBhbmQgc2l6ZSwgd2hpY2ggY2Fubm90IGRldGVjdCBhIHNhbWUtc3RhdCBleHRlcm5hbCByZXdyaXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBpbW11dGFibGUgcGVyLWZpbGUgcHJvamVjdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIEluY3JlbWVudGFsRmlsZUluZGV4Q29tcG9uZW50PFQ+IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICAvKipcbiAgICogV2hldGhlciBzdGFydHVwIHJlY29uY2lsaWF0aW9uIGhhcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGluZGV4IGNvbXBsZXRlZCBpdHMgZmlyc3QgcmVjb25jaWxpYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQnVpbHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCdWlsdFZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2plY3Rpb24sIG5vdGlmaWNhdGlvbnMgYW5kIHBlcnNpc3RlbmNlIHN1cHBsaWVkIGJ5IHRoZSBjb25zdW1lci5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBvcHRpb25zOiBJbmNyZW1lbnRhbEZpbGVJbmRleENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFQ+O1xuXG4gIHByaXZhdGUgaXNCdWlsdFZhbHVlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZFRhaWw6IFByb21pc2U8dm9pZD4gPSBub29wQXN5bmMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWNvcmRzID0gbmV3IE1hcDxzdHJpbmcsIEluZGV4ZWRGaWxlUmVjb3JkPFQ+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RTYXZlOiBEZWJvdW5jZXI8W10sIHZvaWQ+O1xuICBwcml2YXRlIHJldmlzaW9uID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXZpc2lvbnMgPSBuZXcgV2Vha01hcDxURmlsZSwgb2JqZWN0PigpO1xuICBwcml2YXRlIHNhdmVkUmV2aXNpb24gPSAwO1xuICBwcml2YXRlIHNhdmVQcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5kZXggd2l0aCBjb25zdW1lci1vd25lZCBwcm9qZWN0aW9uIGFuZCBwZXJzaXN0ZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbmRleCBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBJbmNyZW1lbnRhbEZpbGVJbmRleENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zPFQ+KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7IGFjY2VwdHM6IHBhcmFtcy5hY2NlcHRzLCBhcHA6IHBhcmFtcy5hcHAsIGluZGV4RmlsZTogcGFyYW1zLmluZGV4RmlsZSwgbG9hZDogcGFyYW1zLmxvYWQsIG9uUmVtb3ZlOiBwYXJhbXMub25SZW1vdmUsIG9uU2V0OiBwYXJhbXMub25TZXQsIHNhdmU6IHBhcmFtcy5zYXZlIH07XG4gICAgdGhpcy5yZXF1ZXN0U2F2ZSA9IGRlYm91bmNlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmZsdXNoKCkpO1xuICAgICAgfSxcbiAgICAgIFNBVkVfREVCT1VOQ0VfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgZmFsc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgc25hcHNob3QgYWZ0ZXIgcHJldmlvdXMgd3JpdGVzIGZpbmlzaCwgaW5jbHVkaW5nIGNoYW5nZXMgYXJyaXZpbmcgZHVyaW5nIGEgd3JpdGUuXG4gICAqXG4gICAqIEByZXR1cm5zIENvbXBsZXRpb24gb2YgdGhlIHNlcmlhbGl6ZWQgd3JpdGVzOyByZWplY3RzIG9uIHBlcnNpc3RlbmNlIGZhaWx1cmUgd2l0aG91dCBtYXJraW5nIGl0IHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmVQcm9taXNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVQcm9taXNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcm9taXNlID0gdGhpcy5zYXZlQ2hhbmdlcygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmVQcm9taXNlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnNhdmVQcm9taXNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHNoYWxsb3cgc25hcHNob3Q7IGNvbnN1bWVycyBtdXN0IHRyZWF0IHJlY29yZHMgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBDdXJyZW50IHJlY29yZHMgYnkgdmF1bHQtcmVsYXRpdmUgcGF0aC5cbiAgICovXG4gIHB1YmxpYyBnZXRSZWNvcmRzKCk6IFJlYWRvbmx5TWFwPHN0cmluZywgSW5kZXhlZEZpbGVSZWNvcmQ8VD4+IHtcbiAgICByZXR1cm4gbmV3IE1hcCh0aGlzLnJlY29yZHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjaGFuZ2VzIGJlZm9yZSBzdGFydHVwIHJlc3RvcmF0aW9uLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBjb25zdCB7IGFwcCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudChhcHAubWV0YWRhdGFDYWNoZS5vbignY2hhbmdlZCcsIChmaWxlLCBjb250ZW50KSA9PiB7XG4gICAgICB0aGlzLnNldFRleHQoZmlsZSwgY29udGVudCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KGFwcC52YXVsdC5vbignY3JlYXRlJywgdGhpcy5xdWV1ZVNjYW4uYmluZCh0aGlzKSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudChhcHAudmF1bHQub24oJ21vZGlmeScsIHRoaXMucXVldWVTY2FuLmJpbmQodGhpcykpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSkgPT4ge1xuICAgICAgaWYgKGZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuICAgICAgICB0aGlzLnJlbW92ZVJlY29yZChmaWxlLnBhdGgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVUcmVlKGZpbGUucGF0aCk7XG4gICAgICB9XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudChhcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICB0aGlzLnJlbmFtZShmaWxlLCBvbGRQYXRoKTtcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV1c2VzIHVuY2hhbmdlZCBzYXZlZCByZWNvcmRzIGFuZCByZWFkcyBvdGhlciBmaWxlcyBvbmUgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcmV0dXJucyBDb21wbGV0aW9uIG9mIHN0YXJ0dXAgcmVjb25jaWxpYXRpb24uXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2F2ZWQgPSBhd2FpdCB0aGlzLm9wdGlvbnMubG9hZCgpO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiB0aGlzLm9wdGlvbnMuYXBwLnZhdWx0LmdldEZpbGVzKCkpIHtcbiAgICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hY2NlcHRzKGZpbGUpIHx8IHRoaXMucmV2aXNpb25zLmhhcyhmaWxlKSB8fCB0aGlzLm9wdGlvbnMuYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgoZmlsZS5wYXRoKSAhPT0gZmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVudHJ5ID0gc2F2ZWQuZ2V0KGZpbGUucGF0aCk7XG4gICAgICBpZiAoZW50cnk/Lm10aW1lID09PSBmaWxlLnN0YXQubXRpbWUgJiYgZW50cnkuc2l6ZSA9PT0gZmlsZS5zdGF0LnNpemUpIHtcbiAgICAgICAgdGhpcy5zZXRSZWNvcmQoZmlsZS5wYXRoLCBlbnRyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0aGlzLnNjYW5GaWxlKGZpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBhd2FpdCB0aGlzLnJlYWRUYWlsO1xuICAgIGlmICh0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNCdWlsdFZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbHMgdGhlIGRlYm91bmNlIGFuZCBmbHVzaGVzIGNvbXBsZXRlZCBpbmRleGVzIGJlZm9yZSBkaXNwb3NpbmcgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIHRoaXMucmVxdWVzdFNhdmUuY2FuY2VsKCk7XG4gICAgaWYgKHRoaXMuaXNCdWlsdFZhbHVlKSB7XG4gICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLmZsdXNoKCkpO1xuICAgIH1cbiAgICBzdXBlci5vbnVubG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYnVpbGRzIHByb2plY3Rpb25zIGZvciBldmVyeSBhY2NlcHRlZCBmaWxlLCBmb3IgZXhhbXBsZSBhZnRlciBhIGNvbnN1bWVyIGxlYXJucyBuZXcgbmFtZXMgdG8gZmluZCBpbiB0ZXh0LlxuICAgKiBFdmVudHMgYXJyaXZpbmcgZHVyaW5nIHRoZSBzY2FuIHN1cGVyc2VkZSBpdHMgb2xkZXIgcmVhZHMuIENvbnN1bWVycyBjb29yZGluYXRlIGFueSBkb21haW4gc2NhbiBtYXJrZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDb21wbGV0aW9uIG9mIHRoZSBib3VuZGVkIGZ1bGwgc2Nhbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXNjYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHRoaXMub3B0aW9ucy5hcHAudmF1bHQuZ2V0RmlsZXMoKSkge1xuICAgICAgYXdhaXQgdGhpcy5zY2FuRmlsZShmaWxlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1hcmtEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLnJldmlzaW9uKys7XG4gICAgaWYgKHRoaXMuaXNCdWlsdFZhbHVlICYmICF0aGlzLmlzVW5sb2FkZWQoKSkge1xuICAgICAgdGhpcy5yZXF1ZXN0U2F2ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcXVldWVTY2FuKGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG4gICAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLnNjYW5GaWxlKGZpbGUpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlY29yZChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVjb3Jkcy5kZWxldGUocGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMub25SZW1vdmUocGF0aCk7XG4gICAgdGhpcy5tYXJrRGlydHkoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVHJlZShwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnJlY29yZHMua2V5cygpKSB7XG4gICAgICBpZiAoIShrZXkgPT09IHBhdGggfHwga2V5LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJlbW92ZVJlY29yZChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVuYW1lKGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlUmVjb3JkKG9sZFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVRyZWUob2xkUGF0aCk7XG4gICAgfVxuICAgIHRoaXMucXVldWVTY2FuKGZpbGUpO1xuICAgIGlmIChmaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuICAgICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKGZpbGUsIHRoaXMucXVldWVTY2FuLmJpbmQodGhpcykpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZUNoYW5nZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHRoaXMuaXNCdWlsdFZhbHVlICYmIHRoaXMuc2F2ZWRSZXZpc2lvbiAhPT0gdGhpcy5yZXZpc2lvbikge1xuICAgICAgY29uc3QgcmV2aXNpb24gPSB0aGlzLnJldmlzaW9uO1xuICAgICAgYXdhaXQgdGhpcy5vcHRpb25zLnNhdmUobmV3IE1hcCh0aGlzLnJlY29yZHMpKTtcbiAgICAgIHRoaXMuc2F2ZWRSZXZpc2lvbiA9IHJldmlzaW9uO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2NhbkZpbGUoZmlsZTogVEZpbGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1VubG9hZGVkKCkgfHwgIXRoaXMub3B0aW9ucy5hY2NlcHRzKGZpbGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlUmVjb3JkKGZpbGUucGF0aCk7XG4gICAgY29uc3QgdG9rZW4gPSB7fTtcbiAgICB0aGlzLnJldmlzaW9ucy5zZXQoZmlsZSwgdG9rZW4pO1xuICAgIGNvbnN0IHsgcGF0aCB9ID0gZmlsZTtcbiAgICBjb25zdCB7IG10aW1lLCBzaXplIH0gPSBmaWxlLnN0YXQ7XG4gICAgY29uc3QgaXNDdXJyZW50ID0gKCk6IGJvb2xlYW4gPT5cbiAgICAgICF0aGlzLmlzVW5sb2FkZWQoKSAmJiB0aGlzLnJldmlzaW9ucy5nZXQoZmlsZSkgPT09IHRva2VuICYmIGZpbGUucGF0aCA9PT0gcGF0aFxuICAgICAgJiYgZmlsZS5zdGF0Lm10aW1lID09PSBtdGltZSAmJiBmaWxlLnN0YXQuc2l6ZSA9PT0gc2l6ZSAmJiB0aGlzLm9wdGlvbnMuYXBwLnZhdWx0LmdldEZpbGVCeVBhdGgocGF0aCkgPT09IGZpbGU7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMucmVhZFRhaWwudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWlzQ3VycmVudCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLm9wdGlvbnMuYXBwLnZhdWx0LmNhY2hlZFJlYWQoZmlsZSk7XG4gICAgICBpZiAoIWlzQ3VycmVudCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0VGV4dChmaWxlLCBjb250ZW50KTtcbiAgICB9KTtcbiAgICB0aGlzLnJlYWRUYWlsID0gcmVhZC5jYXRjaChub29wKTtcbiAgICBhd2FpdCByZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRSZWNvcmQocGF0aDogc3RyaW5nLCBlbnRyeTogSW5kZXhlZEZpbGVSZWNvcmQ8VD4pOiB2b2lkIHtcbiAgICB0aGlzLnJlY29yZHMuc2V0KHBhdGgsIGVudHJ5KTtcbiAgICB0aGlzLm9wdGlvbnMub25TZXQocGF0aCwgZW50cnkucmVjb3JkKTtcbiAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRUZXh0KGZpbGU6IFRGaWxlLCBjb250ZW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJldmlzaW9ucy5zZXQoZmlsZSwge30pO1xuICAgIGlmICghdGhpcy5pc1VubG9hZGVkKCkgJiYgdGhpcy5vcHRpb25zLmFjY2VwdHMoZmlsZSkpIHtcbiAgICAgIHRoaXMuc2V0UmVjb3JkKGZpbGUucGF0aCwgeyBtdGltZTogZmlsZS5zdGF0Lm10aW1lLCByZWNvcmQ6IHRoaXMub3B0aW9ucy5pbmRleEZpbGUoeyBjb250ZW50LCBmaWxlIH0pLCBzaXplOiBmaWxlLnN0YXQuc2l6ZSB9KTtcbiAgICB9XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLG1CQUFrQztBQUNsQyxzQkFHTztBQUNQLHNCQUtPO0FBRVAsMEJBQTRCO0FBRTVCLE1BQU0sZ0NBQWdDO0FBZ0YvQixNQUFNLHNDQUF5QyxnQ0FBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1oRSxJQUFXLFVBQW1CO0FBQzVCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUttQjtBQUFBLEVBRVgsZUFBZTtBQUFBLEVBQ2YsZUFBMEIsMkJBQVU7QUFBQSxFQUMzQixVQUFVLG9CQUFJLElBQWtDO0FBQUEsRUFDaEQ7QUFBQSxFQUNULFdBQVc7QUFBQSxFQUNGLFlBQVksb0JBQUksUUFBdUI7QUFBQSxFQUNoRCxnQkFBZ0I7QUFBQSxFQUNoQixjQUFvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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