@mnaoumov/obsidian-lib 10.11.0 → 11.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 (460) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/worker-component/package.json +6 -0
  5. package/components/worker-pool-component/package.json +6 -0
  6. package/components/workspace-layout-state-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +477 -285
  8. package/dist/lib/cjs/__merged.d.cts +26 -10
  9. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  10. package/dist/lib/cjs/app.cjs +2 -2
  11. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  12. package/dist/lib/cjs/attachment-path.cjs +9 -9
  13. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  15. package/dist/lib/cjs/backlink-index.cjs +5 -5
  16. package/dist/lib/cjs/backlink.cjs +7 -7
  17. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  18. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  19. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  20. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  21. package/dist/lib/cjs/bug-report.cjs +38 -12
  22. package/dist/lib/cjs/bug-report.d.cts +65 -0
  23. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  24. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  25. package/dist/lib/cjs/callout.cjs +6 -6
  26. package/dist/lib/cjs/canvas.cjs +11 -9
  27. package/dist/lib/cjs/canvas.d.cts +13 -0
  28. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  29. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  30. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  31. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  32. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  33. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  34. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  35. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  39. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  40. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  41. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  42. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  43. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  44. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  46. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
  47. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  48. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  49. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  50. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  51. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  52. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  53. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  54. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  55. package/dist/lib/cjs/community-plugins.cjs +3 -3
  56. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  57. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  58. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  59. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  60. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  61. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  62. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  63. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  64. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  65. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  66. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  67. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  68. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  69. package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
  70. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  71. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
  72. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  73. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  74. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  75. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  76. package/dist/lib/cjs/components/index.cjs +54 -39
  77. package/dist/lib/cjs/components/index.d.cts +5 -0
  78. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  79. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  80. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  81. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  82. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  83. package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
  84. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  85. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  86. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  87. package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
  88. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  89. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  90. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  91. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  92. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  93. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  94. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  95. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  96. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  97. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  98. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  99. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  100. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  101. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  102. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  103. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  104. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  105. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  106. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  107. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  108. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  109. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  110. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  111. package/dist/lib/cjs/constructors/index.cjs +1 -1
  112. package/dist/lib/cjs/css-class.cjs +5 -1
  113. package/dist/lib/cjs/css-class.d.cts +16 -0
  114. package/dist/lib/cjs/data-handler.cjs +264 -6
  115. package/dist/lib/cjs/data-handler.d.cts +219 -2
  116. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  117. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  118. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  119. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  120. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  121. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  122. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  123. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  124. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  125. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  126. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  127. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  128. package/dist/lib/cjs/dataview-link.cjs +2 -2
  129. package/dist/lib/cjs/dataview.cjs +27 -7
  130. package/dist/lib/cjs/dataview.d.cts +14 -0
  131. package/dist/lib/cjs/debug.cjs +3 -3
  132. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  133. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  134. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  135. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  136. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  137. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  138. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  139. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  140. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  141. package/dist/lib/cjs/disposable.cjs +150 -0
  142. package/dist/lib/cjs/disposable.d.cts +39 -0
  143. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  144. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  145. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  146. package/dist/lib/cjs/editor.cjs +6 -6
  147. package/dist/lib/cjs/events.cjs +2 -2
  148. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  149. package/dist/lib/cjs/feature-request.cjs +1 -1
  150. package/dist/lib/cjs/file-change.cjs +10 -10
  151. package/dist/lib/cjs/file-explorer.cjs +2 -2
  152. package/dist/lib/cjs/file-manager.cjs +5 -5
  153. package/dist/lib/cjs/file-system.cjs +10 -10
  154. package/dist/lib/cjs/folder-note.cjs +4 -4
  155. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  156. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  157. package/dist/lib/cjs/frontmatter.cjs +5 -5
  158. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  159. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  160. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  161. package/dist/lib/cjs/hotkey.cjs +1 -1
  162. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  163. package/dist/lib/cjs/html-element.cjs +2 -2
  164. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  165. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  166. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  167. package/dist/lib/cjs/i18n/index.cjs +4 -4
  168. package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
  169. package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
  170. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  171. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  172. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
  173. package/dist/lib/cjs/index.cjs +147 -126
  174. package/dist/lib/cjs/index.d.cts +7 -0
  175. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  176. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  177. package/dist/lib/cjs/library-styles.cjs +3 -3
  178. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  179. package/dist/lib/cjs/link.cjs +76 -56
  180. package/dist/lib/cjs/link.d.cts +20 -14
  181. package/dist/lib/cjs/logger.cjs +4 -4
  182. package/dist/lib/cjs/loop.cjs +10 -16
  183. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  184. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  185. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  186. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  187. package/dist/lib/cjs/markdown-view.cjs +191 -3
  188. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  189. package/dist/lib/cjs/markdown.cjs +12 -12
  190. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  191. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  192. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  193. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  194. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  195. package/dist/lib/cjs/modals/alert.cjs +4 -4
  196. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  197. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  198. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  199. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  200. package/dist/lib/cjs/modals/index.cjs +17 -11
  201. package/dist/lib/cjs/modals/index.d.cts +2 -0
  202. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  203. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  204. package/dist/lib/cjs/modals/modal.cjs +3 -3
  205. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  206. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  207. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  208. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  209. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  210. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  211. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  212. package/dist/lib/cjs/note-priority.cjs +2 -2
  213. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  214. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  215. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  216. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  217. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  218. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  219. package/dist/lib/cjs/parse-link.cjs +14 -14
  220. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  221. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  222. package/dist/lib/cjs/path-settings.cjs +3 -3
  223. package/dist/lib/cjs/pdf.cjs +2 -2
  224. package/dist/lib/cjs/plugin/index.cjs +18 -12
  225. package/dist/lib/cjs/plugin/index.d.cts +2 -0
  226. package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
  227. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  228. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  229. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  230. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  231. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  232. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  233. package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
  234. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  235. package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
  236. package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
  237. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  238. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  239. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  240. package/dist/lib/cjs/plugin/plugin.cjs +133 -34
  241. package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
  242. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  243. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  244. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  245. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  246. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  247. package/dist/lib/cjs/popovers/index.cjs +3 -3
  248. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  249. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  250. package/dist/lib/cjs/queue.cjs +8 -8
  251. package/dist/lib/cjs/react/app-context.cjs +3 -3
  252. package/dist/lib/cjs/react/index.cjs +1 -1
  253. package/dist/lib/cjs/reference-definition.cjs +1 -1
  254. package/dist/lib/cjs/reference.cjs +3 -3
  255. package/dist/lib/cjs/release-asset.cjs +5 -5
  256. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  257. package/dist/lib/cjs/request-url.cjs +4 -4
  258. package/dist/lib/cjs/resource-lock.cjs +46 -42
  259. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  260. package/dist/lib/cjs/resource-url.cjs +3 -3
  261. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  262. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  264. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  265. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  266. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  268. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  269. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  270. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  271. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  272. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  273. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  274. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  275. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  276. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  277. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  278. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  279. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  280. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  281. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  282. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  283. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  284. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  285. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  286. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  287. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  288. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  289. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  290. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  291. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  292. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  293. package/dist/lib/cjs/setting-ex.cjs +26 -26
  294. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  295. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  296. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  297. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  298. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  299. package/dist/lib/cjs/templater.cjs +14 -4
  300. package/dist/lib/cjs/templater.d.cts +6 -0
  301. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  302. package/dist/lib/cjs/transformers/index.cjs +1 -1
  303. package/dist/lib/cjs/trusted-input.cjs +1 -1
  304. package/dist/lib/cjs/validation.cjs +4 -4
  305. package/dist/lib/cjs/vault-delete.cjs +6 -6
  306. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  307. package/dist/lib/cjs/vault.cjs +12 -12
  308. package/dist/lib/cjs/view-registrar.cjs +1 -1
  309. package/dist/lib/cjs/virtual-file.cjs +16 -14
  310. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  311. package/dist/lib/cjs/wasm.cjs +119 -0
  312. package/dist/lib/cjs/wasm.d.cts +54 -0
  313. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  314. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  315. package/dist/lib/cjs/workspace.cjs +1 -1
  316. package/dist/lib/esm/__merged.d.mts +26 -10
  317. package/dist/lib/esm/__merged.mjs +215 -5
  318. package/dist/lib/esm/app.mjs +2 -2
  319. package/dist/lib/esm/attachment-path.d.mts +3 -3
  320. package/dist/lib/esm/attachment-path.mjs +2 -2
  321. package/dist/lib/esm/backlink-index.mjs +2 -2
  322. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  323. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  324. package/dist/lib/esm/bug-report.d.mts +65 -0
  325. package/dist/lib/esm/bug-report.mjs +33 -10
  326. package/dist/lib/esm/canvas.d.mts +13 -0
  327. package/dist/lib/esm/canvas.mjs +6 -5
  328. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  329. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  330. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  331. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  332. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  333. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  334. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  335. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  336. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  337. package/dist/lib/esm/components/component-ex.mjs +19 -6
  338. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  339. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  340. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  341. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  342. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  343. package/dist/lib/esm/components/index.d.mts +5 -0
  344. package/dist/lib/esm/components/index.mjs +12 -2
  345. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  346. package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
  347. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  348. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  349. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  350. package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
  351. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  352. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  353. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  354. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  355. package/dist/lib/esm/components/worker-component.mjs +279 -0
  356. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  357. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  358. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  359. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  360. package/dist/lib/esm/css-class.d.mts +16 -0
  361. package/dist/lib/esm/css-class.mjs +5 -1
  362. package/dist/lib/esm/data-handler.d.mts +219 -2
  363. package/dist/lib/esm/data-handler.mjs +262 -5
  364. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  365. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  366. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  367. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  368. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  369. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  370. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  371. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  372. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  373. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  374. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  375. package/dist/lib/esm/dataview.d.mts +14 -0
  376. package/dist/lib/esm/dataview.mjs +19 -1
  377. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  378. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  379. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  380. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  381. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  382. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  383. package/dist/lib/esm/disposable.d.mts +39 -0
  384. package/dist/lib/esm/disposable.mjs +64 -0
  385. package/dist/lib/esm/file-system.mjs +2 -2
  386. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  387. package/dist/lib/esm/generated-during-build.mjs +2 -2
  388. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  389. package/dist/lib/esm/git-rename-history.mjs +1 -1
  390. package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
  391. package/dist/lib/esm/i18n/locales/en.mjs +27 -1
  392. package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
  393. package/dist/lib/esm/index.d.mts +7 -0
  394. package/dist/lib/esm/index.mjs +15 -1
  395. package/dist/lib/esm/link.d.mts +20 -14
  396. package/dist/lib/esm/link.mjs +57 -38
  397. package/dist/lib/esm/loop.mjs +2 -8
  398. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  399. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  400. package/dist/lib/esm/markdown-view.d.mts +48 -1
  401. package/dist/lib/esm/markdown-view.mjs +192 -2
  402. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  403. package/dist/lib/esm/metadata-cache.mjs +6 -6
  404. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  405. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  406. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  407. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  408. package/dist/lib/esm/modals/index.d.mts +2 -0
  409. package/dist/lib/esm/modals/index.mjs +5 -1
  410. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  411. package/dist/lib/esm/modals/prompt.mjs +1 -1
  412. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  413. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  414. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  415. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  416. package/dist/lib/esm/parse-link.mjs +4 -4
  417. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  418. package/dist/lib/esm/path-compatibility.mjs +277 -0
  419. package/dist/lib/esm/plugin/index.d.mts +2 -0
  420. package/dist/lib/esm/plugin/index.mjs +6 -2
  421. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  422. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  423. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  424. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  425. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  426. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  427. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  428. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  429. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  430. package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
  431. package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
  432. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  433. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  434. package/dist/lib/esm/plugin/plugin.d.mts +35 -5
  435. package/dist/lib/esm/plugin/plugin.mjs +118 -9
  436. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  437. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  438. package/dist/lib/esm/release-asset.mjs +1 -1
  439. package/dist/lib/esm/resource-lock.d.mts +8 -7
  440. package/dist/lib/esm/resource-lock.mjs +31 -26
  441. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  442. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  443. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  444. package/dist/lib/esm/settings-recovery.mjs +125 -0
  445. package/dist/lib/esm/settings-tabs.mjs +2 -2
  446. package/dist/lib/esm/templater.d.mts +6 -0
  447. package/dist/lib/esm/templater.mjs +11 -2
  448. package/dist/lib/esm/vault.mjs +1 -1
  449. package/dist/lib/esm/virtual-file.d.mts +2 -1
  450. package/dist/lib/esm/virtual-file.mjs +7 -5
  451. package/dist/lib/esm/wasm.d.mts +54 -0
  452. package/dist/lib/esm/wasm.mjs +30 -0
  453. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  454. package/dist/lib/esm/worker-protocol.mjs +113 -0
  455. package/dist/styles.css +16 -1
  456. package/modals/copy-text-manually/package.json +6 -0
  457. package/modals/review-bug-report-diagnostics/package.json +6 -0
  458. package/package.json +10 -8
  459. package/plugin/plugin-instance/package.json +6 -0
  460. package/plugin/third-party-plugin/package.json +6 -0
@@ -117,9 +117,9 @@ __export(data_store_transport_exports, {
117
117
  DataStoreTransport: () => DataStoreTransport
118
118
  });
119
119
  module.exports = __toCommonJS(data_store_transport_exports);
120
- var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
121
- var import_obsidian = require('obsidian');
122
- var import_debug = require('../debug.cjs');
120
+ var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
121
+ var import_obsidian = require("obsidian");
122
+ var import_debug = require("../debug.cjs");
123
123
  const DEFAULT_MAX_FILE_BYTES = 1e6;
124
124
  const MIN_FILE_BYTES = 256;
125
125
  const MAX_FILE_BYTES = 4e6;
@@ -129,6 +129,7 @@ const DOCUMENT_SUFFIX = "\n```\n";
129
129
  const BISECTION_DIVISOR = 2;
130
130
  const HEX_RADIX = 16;
131
131
  const HEX_BYTE_LENGTH = 2;
132
+ const JOURNAL_SEGMENT_REG_EXP = /\/log-\d+\.(?:md|json)$/;
132
133
  class DataStoreTransport {
133
134
  /**
134
135
  * Creates a bounded vault transport.
@@ -186,7 +187,7 @@ class DataStoreTransport {
186
187
  const files = allFiles.filter((path) => path.startsWith(`${this.root}/devices/`));
187
188
  const complete = /* @__PURE__ */ new Set();
188
189
  for (const path of files) {
189
- if (/\/log-\d+\.(?:md|json)$/.test(path) && await this.read(path) !== void 0) {
190
+ if (JOURNAL_SEGMENT_REG_EXP.test(path) && await this.read(path) !== void 0) {
190
191
  complete.add(path);
191
192
  }
192
193
  if (!/\/snapshot-[\w-]+-manifest\.(?:md|json)$/.test(path) || await this.readSnapshot(path) === void 0) {
@@ -209,8 +210,8 @@ class DataStoreTransport {
209
210
  const destination = target.root + path.slice(this.root.length);
210
211
  target.checkPath(destination);
211
212
  if (await target.adapter.exists(destination)) {
212
- if (await target.adapter.read(destination) !== text) {
213
- throw new Error("Conflicting immutable data-store history");
213
+ if (await target.adapter.read(destination) !== text && !await this.copyOverDifferentHistory(target, path, destination, text)) {
214
+ continue;
214
215
  }
215
216
  } else {
216
217
  await target.ensureParent(destination);
@@ -228,7 +229,7 @@ class DataStoreTransport {
228
229
  * @returns Whether its document fits the configured cap.
229
230
  */
230
231
  fits(value) {
231
- return new TextEncoder().encode(this.encode(value)).length <= this.maxFileBytes;
232
+ return this.measure(value) <= this.maxFileBytes;
232
233
  }
233
234
  /**
234
235
  * Lists the store's files recursively, never leaving its folder.
@@ -249,6 +250,15 @@ class DataStoreTransport {
249
250
  }
250
251
  return files.sort();
251
252
  }
253
+ /**
254
+ * Measures the complete encoded size of a new document without writing.
255
+ *
256
+ * @param value - JSON payload.
257
+ * @returns UTF-8 bytes, encoding wrapper included.
258
+ */
259
+ measure(value) {
260
+ return new TextEncoder().encode(this.encode(value)).length;
261
+ }
252
262
  /**
253
263
  * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
254
264
  *
@@ -340,6 +350,32 @@ class DataStoreTransport {
340
350
  await this.ensureParent(path);
341
351
  await this.adapter.write(path, text);
342
352
  }
353
+ /**
354
+ * Publishes an append-only document: an occupied path is rewritten only when the new list strictly extends the stored one.
355
+ * A reader that sees an older copy sees a prefix, so it applies fewer entries and never a different one.
356
+ *
357
+ * @param path - Vault-relative destination within this store.
358
+ * @param values - JSON-compatible entries; the stored entries must be their prefix.
359
+ * @returns A promise that resolves after publication, or at once when the stored list is already identical.
360
+ */
361
+ async writeAppendOnly(path, values) {
362
+ this.checkPath(path);
363
+ const text = this.encode(values, path.endsWith(".json"));
364
+ this.checkSize(text);
365
+ if (await this.adapter.exists(path)) {
366
+ const stored = await this.readStoredList(path);
367
+ if (stored === null || !isListPrefix(stored, values)) {
368
+ throw new Error("Conflicting immutable data-store document");
369
+ }
370
+ if (stored.length === values.length) {
371
+ return;
372
+ }
373
+ await this.adapter.write(path, text);
374
+ return;
375
+ }
376
+ await this.ensureParent(path);
377
+ await this.adapter.write(path, text);
378
+ }
343
379
  /**
344
380
  * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
345
381
  *
@@ -416,6 +452,31 @@ class DataStoreTransport {
416
452
  (0, import_debug.getObsidianLibDebugger)("DataStore")(message);
417
453
  throw new Error(message);
418
454
  }
455
+ /**
456
+ * Reconciles a destination whose bytes differ from the source. Only a journal segment may differ, because it grows
457
+ * while its device writes it, so either copy may be the older prefix of the other; anything else is a conflict.
458
+ *
459
+ * @param target - Destination transport.
460
+ * @param path - Source path.
461
+ * @param destination - Destination path.
462
+ * @param text - Source bytes.
463
+ * @returns Whether the source was written over the destination, which must then be verified.
464
+ */
465
+ async copyOverDifferentHistory(target, path, destination, text) {
466
+ const source = JOURNAL_SEGMENT_REG_EXP.test(path) ? await this.readStoredList(path) : null;
467
+ const copied = source === null ? null : await target.readStoredList(destination);
468
+ if (source === null || copied === null) {
469
+ throw new Error("Conflicting immutable data-store history");
470
+ }
471
+ if (isListPrefix(source, copied)) {
472
+ return false;
473
+ }
474
+ if (!isListPrefix(copied, source)) {
475
+ throw new Error("Conflicting immutable data-store history");
476
+ }
477
+ await target.adapter.write(destination, text);
478
+ return true;
479
+ }
419
480
  encode(value, isJson = this.extension === ".json") {
420
481
  const json = JSON.stringify(value);
421
482
  if (json === void 0) {
@@ -440,11 +501,23 @@ class DataStoreTransport {
440
501
  }
441
502
  }
442
503
  }
504
+ async readStoredList(path) {
505
+ let value;
506
+ try {
507
+ value = await this.read(path);
508
+ } catch {
509
+ return null;
510
+ }
511
+ return Array.isArray(value) ? value : null;
512
+ }
443
513
  }
444
514
  async function digest(text) {
445
515
  const hash = await window.crypto.subtle.digest("SHA-256", new TextEncoder().encode(text));
446
516
  return [...new Uint8Array(hash)].map((byte) => byte.toString(HEX_RADIX).padStart(HEX_BYTE_LENGTH, "0")).join("");
447
517
  }
518
+ function isListPrefix(prefix, list) {
519
+ return prefix.length <= list.length && prefix.every((value, index) => JSON.stringify(value) === JSON.stringify(list[index]));
520
+ }
448
521
  function isSafeVaultPath(path) {
449
522
  return path.split("/").every((part) => part.length > 0 && part !== "." && part !== ".." && !/[<>:"\\|?*\p{Control}]|[. ]$/u.test(part));
450
523
  }
@@ -452,4 +525,4 @@ function isSafeVaultPath(path) {
452
525
  0 && (module.exports = {
453
526
  DataStoreTransport
454
527
  });
455
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaXplLWJvdW5kZWQgTWFya2Rvd24gb3IgSlNPTiB0cmFuc3BvcnQsIHdpdGggdmVyaWZpZWQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgTm90aWNlIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBnZXRPYnNpZGlhbkxpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuXG5jb25zdCBERUZBVUxUX01BWF9GSUxFX0JZVEVTID0gMV8wMDBfMDAwO1xuY29uc3QgTUlOX0ZJTEVfQllURVMgPSAyNTY7XG5jb25zdCBNQVhfRklMRV9CWVRFUyA9IDRfMDAwXzAwMDtcbmNvbnN0IE1BWF9TTkFQU0hPVF9CWVRFUyA9IDY0XzAwMF8wMDA7XG5jb25zdCBET0NVTUVOVF9QUkVGSVggPSAnYGBganNvblxcbic7XG5jb25zdCBET0NVTUVOVF9TVUZGSVggPSAnXFxuYGBgXFxuJztcbmNvbnN0IEJJU0VDVElPTl9ESVZJU09SID0gMjtcbmNvbnN0IEhFWF9SQURJWCA9IDE2O1xuY29uc3QgSEVYX0JZVEVfTEVOR1RIID0gMjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUgc2hhcmVkLXN0b3JlIHZhdWx0IHRyYW5zcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyOyBubyBkZXNrdG9wIGZpbGVzeXN0ZW0gQVBJcyBhcmUgdXNlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFkYXB0ZXI6IERhdGFBZGFwdGVyO1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgZm9sZGVyLiBIaWRkZW4gc2VnbWVudHMgYXJlIGFsbG93ZWQ7IGNhbGxlcnMgbXVzdCBhcnJhbmdlIHRoZWlyIHN5bmNocm9uaXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdQbHVnaW4gZGF0YSdgXG4gICAqL1xuICByZWFkb25seSBmb2xkZXI/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEb2N1bWVudCBlbmNvZGluZy4gSlNPTiByZXF1aXJlcyBhIHN5bmMgdG9vbCBjb25maWd1cmVkIHRvIGNhcnJ5IGFyYml0cmFyeSBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogTWF4aW11bSBVVEYtOCBieXRlcyBpbiBhbnkgZmlsZSwgaW5jbHVkaW5nIGl0cyBlbmNvZGluZyB3cmFwcGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gdGhlIHJlY29uc3RydWN0ZWQgc25hcHNob3QsIGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHB1Ymxpc2hpbmcgYSBjaHVua2VkIHNuYXBzaG90LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdG9yZVRyYW5zcG9ydFdyaXRlU25hcHNob3RQYXJhbXMge1xuICAvKipcbiAgICogVmF1bHQtcmVsYXRpdmUgYmFzZSBwYXRoIHdpdGhvdXQgaXRzIGV4dGVuc2lvbi4gVXNlIGEgZnJlc2ggdW5pcXVlIG5hbWUgZm9yIGV2ZXJ5IHB1YmxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZTogc3RyaW5nO1xuICAvKipcbiAgICogSlNPTi1jb21wYXRpYmxlIHNuYXBzaG90LCBpbmNsdWRpbmcgaXRzIGNvbnN1bWVyIHNjaGVtYSBhbmQgY292ZXJhZ2UgbWV0YWRhdGEuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEEgc3RvcmUtc2NvcGVkIHRyYW5zcG9ydC4gRXZlcnkgcHVibGlzaGVkIGRvY3VtZW50IGlzIGltbXV0YWJsZSBleGNlcHQgZGV2aWNlIGFja25vd2xlZGdlbWVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAvKipcbiAgRmlsZSBleHRlbnNpb24gZm9yIG5ldyBkb2N1bWVudHMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBNYXhpbXVtIGVuY29kZWQgYnl0ZXMgcGVyIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1heEZpbGVCeXRlczogbnVtYmVyO1xuICAvKipcbiAgICogRnVsbCB2YXVsdC1yZWxhdGl2ZSBzdG9yZSByb290LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJvb3Q6IHN0cmluZztcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIgdXNlZCBieSB0aGlzIHRyYW5zcG9ydC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBtYXhTbmFwc2hvdEJ5dGVzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBib3VuZGVkIHZhdWx0IHRyYW5zcG9ydC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEFkYXB0ZXIsIGlkZW50aXR5IGFuZCBmaWxlIGJvdW5kcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuYWRhcHRlciA9IHBhcmFtcy5hZGFwdGVyO1xuICAgIHRoaXMuZXh0ZW5zaW9uID0gcGFyYW1zLmZvcm1hdCA9PT0gJ2pzb24nID8gJy5qc29uJyA6ICcubWQnO1xuICAgIGNvbnN0IGZvbGRlciA9IHBhcmFtcy5mb2xkZXIgPz8gJ1BsdWdpbiBkYXRhJztcbiAgICBpZiAoXG4gICAgICAhaXNTYWZlVmF1bHRQYXRoKGZvbGRlcilcbiAgICAgIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5wbHVnaW5JZCkgfHwgIS9eW1xcdy1dKyQvLnRlc3QocGFyYW1zLnN0b3JlSWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgc3RvcmUgcmVxdWlyZXMgYSBzYWZlIHZhdWx0LXJlbGF0aXZlIGZvbGRlciBhbmQgc2FmZSBwbHVnaW4vc3RvcmUgaWRzJyk7XG4gICAgfVxuICAgIHRoaXMucm9vdCA9IGAke2ZvbGRlcn0vJHtwYXJhbXMucGx1Z2luSWR9LyR7cGFyYW1zLnN0b3JlSWR9YDtcbiAgICB0aGlzLm1heEZpbGVCeXRlcyA9IHBhcmFtcy5tYXhGaWxlQnl0ZXMgPz8gREVGQVVMVF9NQVhfRklMRV9CWVRFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHRoaXMubWF4RmlsZUJ5dGVzKSB8fCB0aGlzLm1heEZpbGVCeXRlcyA8IE1JTl9GSUxFX0JZVEVTIHx8IHRoaXMubWF4RmlsZUJ5dGVzID4gTUFYX0ZJTEVfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBmaWxlIGxpbWl0IG11c3QgYmUgYmV0d2VlbiAyNTYgYW5kIDQwMDAwMDAgYnl0ZXMnKTtcbiAgICB9XG4gICAgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzID0gcGFyYW1zLm1heFNuYXBzaG90Qnl0ZXMgPz8gTUFYX1NOQVBTSE9UX0JZVEVTO1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heFNuYXBzaG90Qnl0ZXMgPiBNQVhfU05BUFNIT1RfQllURVMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBzbmFwc2hvdCBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA2NDAwMDAwMCBieXRlcycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb3BpZXMgaGlzdG9yeSBieXRlIGZvciBieXRlLCBwcmVzZXJ2aW5nIHNvdXJjZSBmaWxlcyBhbmQgcmVmdXNpbmcgY29uZmxpY3RpbmcgaW1tdXRhYmxlIGRlc3RpbmF0aW9ucy5cbiAgICogQWNrbm93bGVkZ2VtZW50cyBhcmUgbG9jYWwgdG8gZWFjaCBsb2NhdGlvbiBhbmQgYXJlIG5vdCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXQgLSBEZXN0aW5hdGlvbiBmb3IgdGhpcyBzYW1lIHBsdWdpbiBhbmQgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGV2ZXJ5IGNvcGllZCBmaWxlIGhhcyBiZWVuIHZlcmlmaWVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvcHlIaXN0b3J5VG8odGFyZ2V0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wYXJhbXMucGx1Z2luSWQgIT09IHRhcmdldC5wYXJhbXMucGx1Z2luSWQgfHwgdGhpcy5wYXJhbXMuc3RvcmVJZCAhPT0gdGFyZ2V0LnBhcmFtcy5zdG9yZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjb3B5IGRhdGEtc3RvcmUgaGlzdG9yeSB0byBhIGRpZmZlcmVudCBzdG9yZScpO1xuICAgIH1cbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dGhpcy5yb290fS9kZXZpY2VzL2ApKTtcbiAgICBjb25zdCBjb21wbGV0ZSA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBmaWxlcykge1xuICAgICAgaWYgKC9cXC9sb2ctXFxkK1xcLig/Om1kfGpzb24pJC8udGVzdChwYXRoKSAmJiBhd2FpdCB0aGlzLnJlYWQocGF0aCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21wbGV0ZS5hZGQocGF0aCk7XG4gICAgICB9XG4gICAgICBpZiAoIS9cXC9zbmFwc2hvdC1bXFx3LV0rLW1hbmlmZXN0XFwuKD86bWR8anNvbikkLy50ZXN0KHBhdGgpIHx8IGF3YWl0IHRoaXMucmVhZFNuYXBzaG90KHBhdGgpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBwYXRoLmVuZHNXaXRoKCcuanNvbicpID8gJy5qc29uJyA6ICcubWQnO1xuICAgICAgY29uc3QgYmFzZSA9IHBhdGguc2xpY2UoMCwgLWV4dGVuc2lvbi5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBmaWxlcykge1xuICAgICAgICBpZiAoY2h1bmsuc3RhcnRzV2l0aChgJHtiYXNlfS1gKSAmJiBjaHVuay5lbmRzV2l0aChleHRlbnNpb24pKSB7XG4gICAgICAgICAgY29tcGxldGUuYWRkKGNodW5rKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29tcGxldGUuYWRkKHBhdGgpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgY29tcGxldGUpIHtcbiAgICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHBhdGgpO1xuICAgICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgICB0YXJnZXQuY2hlY2tTaXplKHRleHQpO1xuICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0YXJnZXQucm9vdCArIHBhdGguc2xpY2UodGhpcy5yb290Lmxlbmd0aCk7XG4gICAgICB0YXJnZXQuY2hlY2tQYXRoKGRlc3RpbmF0aW9uKTtcbiAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5leGlzdHMoZGVzdGluYXRpb24pKSB7XG4gICAgICAgIGlmIChhd2FpdCB0YXJnZXQuYWRhcHRlci5yZWFkKGRlc3RpbmF0aW9uKSAhPT0gdGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0YXJnZXQuZW5zdXJlUGFyZW50KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmFkYXB0ZXIud3JpdGUoZGVzdGluYXRpb24sIHRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBoaXN0b3J5IGNvcHkgZmFpbGVkIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGl0cyBkb2N1bWVudCBmaXRzIHRoZSBjb25maWd1cmVkIGNhcC5cbiAgICovXG4gIHB1YmxpYyBmaXRzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0aGlzLmVuY29kZSh2YWx1ZSkpLmxlbmd0aCA8PSB0aGlzLm1heEZpbGVCeXRlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgc3RvcmUncyBmaWxlcyByZWN1cnNpdmVseSwgbmV2ZXIgbGVhdmluZyBpdHMgZm9sZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBWYXVsdC1yZWxhdGl2ZSBwYXRocy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHModGhpcy5yb290KSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwZW5kaW5nID0gW3RoaXMucm9vdF07XG4gICAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZm9sZGVyID0gZW5zdXJlTm9uTnVsbGFibGUocGVuZGluZy5zaGlmdCgpKTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gYXdhaXQgdGhpcy5hZGFwdGVyLmxpc3QoZm9sZGVyKTtcbiAgICAgIGZpbGVzLnB1c2goLi4uY2hpbGRyZW4uZmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgICAgcGVuZGluZy5wdXNoKC4uLmNoaWxkcmVuLmZvbGRlcnMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7Zm9sZGVyfS9gKSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZXMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGNvbXBsZXRlIGZlbmNlZCBNYXJrZG93biBKU09OIG9yIGEgdmVyc2lvbi1vbmUgSlNPTiBlbnZlbG9wZS4gUGFydGlhbCBkb2N1bWVudHMgcmVtYWluIHBlbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8IGRvY3VtZW50ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmZvcm1hdCAhPT0gMSB8fCAhKCdwYXlsb2FkJyBpbiBkb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gZGF0YS1zdG9yZSBkb2N1bWVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnBheWxvYWQ7XG4gICAgfVxuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGhhc2hdIG9mIG1hbmlmZXN0Lmhhc2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKX0tJHtTdHJpbmcoaW5kZXgpfSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgfHwgYXdhaXQgZGlnZXN0KGNodW5rKSAhPT0gaGFzaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnl0ZXMgKz0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKS5sZW5ndGg7XG4gICAgICBpZiAoYnl0ZXMgPiB0aGlzLm1heFNuYXBzaG90Qnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHNuYXBzaG90IGV4Y2VlZHMgZGVjb2RlZCBieXRlIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gaW1tdXRhYmxlIGRvY3VtZW50LCBhY2NlcHRpbmcgb25seSBieXRlLWlkZW50aWNhbCByZXRyaWVzIGF0IGFuIG9jY3VwaWVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiBvciBhbiBpZGVudGljYWwgcmV0cnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd3JpdGVJbW11dGFibGUocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZSwgcGF0aC5lbmRzV2l0aCgnLmpzb24nKSk7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChwYXRoKSAhPT0gdGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGlmIChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGF5bG9hZCkubGVuZ3RoID4gdGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgZXhjZWVkcyBkZWNvZGVkIGJ5dGUgbGltaXQnKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgPCBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgbGV0IGxvdyA9IDE7XG4gICAgICBsZXQgaGlnaCA9IE1hdGgubWluKHBheWxvYWQubGVuZ3RoIC0gb2Zmc2V0LCB0aGlzLm1heEZpbGVCeXRlcyk7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gQklTRUNUSU9OX0RJVklTT1IpO1xuICAgICAgICBpZiAodGhpcy5maXRzKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtaWRkbGUpKSkge1xuICAgICAgICAgIGxvdyA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2gocGF5bG9hZC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxvdykpO1xuICAgICAgb2Zmc2V0ICs9IGxvdztcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBoYXNoZXMucHVzaChhd2FpdCBkaWdlc3QoY2h1bmspKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IGZvcm1hdDogMSwgaGFzaGVzIH07XG4gICAgdGhpcy5jaGVja1NpemUodGhpcy5lbmNvZGUobWFuaWZlc3QpKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGUoYCR7cGFyYW1zLmJhc2V9LSR7U3RyaW5nKGluZGV4KX0ke3RoaXMuZXh0ZW5zaW9ufWAsIGNodW5rKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZShgJHtwYXJhbXMuYmFzZX0ke3RoaXMuZXh0ZW5zaW9ufWAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmNvZGUodmFsdWU6IHVua25vd24sIGlzSnNvbiA9IHRoaXMuZXh0ZW5zaW9uID09PSAnLmpzb24nKTogc3RyaW5nIHtcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICAgIGlmIChqc29uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBwYXlsb2FkIG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIHJldHVybiBpc0pzb24gPyBKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogMSwgcGF5bG9hZDogdmFsdWUgfSkgOiBgJHtET0NVTUVOVF9QUkVGSVh9JHtqc29ufSR7RE9DVU1FTlRfU1VGRklYfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVBhcmVudChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBwYXJ0cy5wb3AoKTtcbiAgICBsZXQgZm9sZGVyID0gJyc7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBmb2xkZXIgPSBmb2xkZXIgPyBgJHtmb2xkZXJ9LyR7cGFydH1gIDogcGFydDtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhmb2xkZXIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hZGFwdGVyLm1rZGlyKGZvbGRlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHlCQUFrQztBQUNsQyxzQkFBdUI7QUFFdkIsbUJBQXVDO0FBRXZDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sWUFBWTtBQUNsQixNQUFNLGtCQUFrQjtBQTZEakIsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3QnZCLFlBQStCLFFBQTZDO0FBQTdDO0FBQ3BDLFNBQUssVUFBVSxPQUFPO0FBQ3RCLFNBQUssWUFBWSxPQUFPLFdBQVcsU0FBUyxVQUFVO0FBQ3RELFVBQU0sU0FBUyxPQUFPLFVBQVU7QUFDaEMsUUFDRSxDQUFDLGdCQUFnQixNQUFNLEtBQ3BCLENBQUMsV0FBVyxLQUFLLE9BQU8sUUFBUSxLQUFLLENBQUMsV0FBVyxLQUFLLE9BQU8sT0FBTyxHQUN2RTtBQUNBLFlBQU0sSUFBSSxNQUFNLDRFQUE0RTtBQUFBLElBQzlGO0FBQ0EsU0FBSyxPQUFPLEdBQUcsTUFBTSxJQUFJLE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTztBQUMxRCxTQUFLLGVBQWUsT0FBTyxnQkFBZ0I7QUFDM0MsUUFBSSxDQUFDLE9BQU8sY0FBYyxLQUFLLFlBQVksS0FBSyxLQUFLLGVBQWUsa0JBQWtCLEtBQUssZUFBZSxnQkFBZ0I7QUFDeEgsWUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQUEsSUFDL0U7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
528
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9kYXRhLXN0b3JlLXRyYW5zcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogU2l6ZS1ib3VuZGVkIE1hcmtkb3duIG9yIEpTT04gdHJhbnNwb3J0LCB3aXRoIHZlcmlmaWVkIGNodW5rZWQgc25hcHNob3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGF0YUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4uL2RlYnVnLnRzJztcblxuY29uc3QgREVGQVVMVF9NQVhfRklMRV9CWVRFUyA9IDFfMDAwXzAwMDtcbmNvbnN0IE1JTl9GSUxFX0JZVEVTID0gMjU2O1xuY29uc3QgTUFYX0ZJTEVfQllURVMgPSA0XzAwMF8wMDA7XG5jb25zdCBNQVhfU05BUFNIT1RfQllURVMgPSA2NF8wMDBfMDAwO1xuY29uc3QgRE9DVU1FTlRfUFJFRklYID0gJ2BgYGpzb25cXG4nO1xuY29uc3QgRE9DVU1FTlRfU1VGRklYID0gJ1xcbmBgYFxcbic7XG5jb25zdCBCSVNFQ1RJT05fRElWSVNPUiA9IDI7XG5jb25zdCBIRVhfUkFESVggPSAxNjtcbmNvbnN0IEhFWF9CWVRFX0xFTkdUSCA9IDI7XG5jb25zdCBKT1VSTkFMX1NFR01FTlRfUkVHX0VYUCA9IC9cXC9sb2ctXFxkK1xcLig/Om1kfGpzb24pJC87XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHNoYXJlZC1zdG9yZSB2YXVsdCB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVmF1bHQgYWRhcHRlcjsgbm8gZGVza3RvcCBmaWxlc3lzdGVtIEFQSXMgYXJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogRG9jdW1lbnQgZW5jb2RpbmcuIEpTT04gcmVxdWlyZXMgYSBzeW5jIHRvb2wgY29uZmlndXJlZCB0byBjYXJyeSBhcmJpdHJhcnkgZmlsZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbWFya2Rvd24nYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0PzogJ2pzb24nIHwgJ21hcmtkb3duJztcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYW55IGZpbGUsIGluY2x1ZGluZyBpdHMgZW5jb2Rpbmcgd3JhcHBlci5cbiAgICpcbiAgICogQGRlZmF1bHQgYDEwMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBtYXhGaWxlQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIGluIHRoZSByZWNvbnN0cnVjdGVkIHNuYXBzaG90LCBiZWZvcmUgSlNPTiBwYXJzaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNjQwMDAwMDBgXG4gICAqL1xuICByZWFkb25seSBtYXhTbmFwc2hvdEJ5dGVzPzogbnVtYmVyO1xuICAvKipcbiAgICogUGx1Z2luIG1hbmlmZXN0IGlkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JlIG5hbWUgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgdmVyc2lvbi5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nIGEgY2h1bmtlZCBzbmFwc2hvdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zIHtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGJhc2UgcGF0aCB3aXRob3V0IGl0cyBleHRlbnNpb24uIFVzZSBhIGZyZXNoIHVuaXF1ZSBuYW1lIGZvciBldmVyeSBwdWJsaWNhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2U6IHN0cmluZztcbiAgLyoqXG4gICAqIEpTT04tY29tcGF0aWJsZSBzbmFwc2hvdCwgaW5jbHVkaW5nIGl0cyBjb25zdW1lciBzY2hlbWEgYW5kIGNvdmVyYWdlIG1ldGFkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBIHN0b3JlLXNjb3BlZCB0cmFuc3BvcnQuIEV2ZXJ5IHB1Ymxpc2hlZCBkb2N1bWVudCBpcyBpbW11dGFibGUgZXhjZXB0IGRldmljZSBhY2tub3dsZWRnZW1lbnRzIGFuZCBhcHBlbmQtb25seVxuICogam91cm5hbCBzZWdtZW50cywgd2hpY2ggb25seSB0aGVpciBvd24gZGV2aWNlIHJld3JpdGVzIGFuZCBvbmx5IGJ5IGV4dGVuZGluZyB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVN0b3JlVHJhbnNwb3J0IHtcbiAgLyoqXG4gIEZpbGUgZXh0ZW5zaW9uIGZvciBuZXcgZG9jdW1lbnRzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogTWF4aW11bSBlbmNvZGVkIGJ5dGVzIHBlciBkb2N1bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtYXhGaWxlQnl0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEZ1bGwgdmF1bHQtcmVsYXRpdmUgc3RvcmUgcm9vdC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByb290OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBWYXVsdCBhZGFwdGVyIHVzZWQgYnkgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWRhcHRlcjogRGF0YUFkYXB0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4U25hcHNob3RCeXRlczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYm91bmRlZCB2YXVsdCB0cmFuc3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBBZGFwdGVyLCBpZGVudGl0eSBhbmQgZmlsZSBib3VuZHMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogRGF0YVN0b3JlVHJhbnNwb3J0Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmFkYXB0ZXIgPSBwYXJhbXMuYWRhcHRlcjtcbiAgICB0aGlzLmV4dGVuc2lvbiA9IHBhcmFtcy5mb3JtYXQgPT09ICdqc29uJyA/ICcuanNvbicgOiAnLm1kJztcbiAgICBjb25zdCBmb2xkZXIgPSBwYXJhbXMuZm9sZGVyID8/ICdQbHVnaW4gZGF0YSc7XG4gICAgaWYgKFxuICAgICAgIWlzU2FmZVZhdWx0UGF0aChmb2xkZXIpXG4gICAgICB8fCAhL15bXFx3LV0rJC8udGVzdChwYXJhbXMucGx1Z2luSWQpIHx8ICEvXltcXHctXSskLy50ZXN0KHBhcmFtcy5zdG9yZUlkKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHN0b3JlIHJlcXVpcmVzIGEgc2FmZSB2YXVsdC1yZWxhdGl2ZSBmb2xkZXIgYW5kIHNhZmUgcGx1Z2luL3N0b3JlIGlkcycpO1xuICAgIH1cbiAgICB0aGlzLnJvb3QgPSBgJHtmb2xkZXJ9LyR7cGFyYW1zLnBsdWdpbklkfS8ke3BhcmFtcy5zdG9yZUlkfWA7XG4gICAgdGhpcy5tYXhGaWxlQnl0ZXMgPSBwYXJhbXMubWF4RmlsZUJ5dGVzID8/IERFRkFVTFRfTUFYX0ZJTEVfQllURVM7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih0aGlzLm1heEZpbGVCeXRlcykgfHwgdGhpcy5tYXhGaWxlQnl0ZXMgPCBNSU5fRklMRV9CWVRFUyB8fCB0aGlzLm1heEZpbGVCeXRlcyA+IE1BWF9GSUxFX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgZmlsZSBsaW1pdCBtdXN0IGJlIGJldHdlZW4gMjU2IGFuZCA0MDAwMDAwIGJ5dGVzJyk7XG4gICAgfVxuICAgIHRoaXMubWF4U25hcHNob3RCeXRlcyA9IHBhcmFtcy5tYXhTbmFwc2hvdEJ5dGVzID8/IE1BWF9TTkFQU0hPVF9CWVRFUztcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHRoaXMubWF4U25hcHNob3RCeXRlcykgfHwgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzIDwgTUlOX0ZJTEVfQllURVMgfHwgdGhpcy5tYXhTbmFwc2hvdEJ5dGVzID4gTUFYX1NOQVBTSE9UX0JZVEVTKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgbGltaXQgbXVzdCBiZSBiZXR3ZWVuIDI1NiBhbmQgNjQwMDAwMDAgYnl0ZXMnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29waWVzIGhpc3RvcnkgYnl0ZSBmb3IgYnl0ZSwgcHJlc2VydmluZyBzb3VyY2UgZmlsZXMgYW5kIHJlZnVzaW5nIGNvbmZsaWN0aW5nIGltbXV0YWJsZSBkZXN0aW5hdGlvbnMuXG4gICAqIEFja25vd2xlZGdlbWVudHMgYXJlIGxvY2FsIHRvIGVhY2ggbG9jYXRpb24gYW5kIGFyZSBub3QgY29waWVkLlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gRGVzdGluYXRpb24gZm9yIHRoaXMgc2FtZSBwbHVnaW4gYW5kIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBldmVyeSBjb3BpZWQgZmlsZSBoYXMgYmVlbiB2ZXJpZmllZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb3B5SGlzdG9yeVRvKHRhcmdldDogRGF0YVN0b3JlVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGFyYW1zLnBsdWdpbklkICE9PSB0YXJnZXQucGFyYW1zLnBsdWdpbklkIHx8IHRoaXMucGFyYW1zLnN0b3JlSWQgIT09IHRhcmdldC5wYXJhbXMuc3RvcmVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29weSBkYXRhLXN0b3JlIGhpc3RvcnkgdG8gYSBkaWZmZXJlbnQgc3RvcmUnKTtcbiAgICB9XG4gICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICBjb25zdCBmaWxlcyA9IGFsbEZpbGVzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgY29tcGxldGUgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmIChKT1VSTkFMX1NFR01FTlRfUkVHX0VYUC50ZXN0KHBhdGgpICYmIGF3YWl0IHRoaXMucmVhZChwYXRoKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbXBsZXRlLmFkZChwYXRoKTtcbiAgICAgIH1cbiAgICAgIGlmICghL1xcL3NuYXBzaG90LVtcXHctXSstbWFuaWZlc3RcXC4oPzptZHxqc29uKSQvLnRlc3QocGF0aCkgfHwgYXdhaXQgdGhpcy5yZWFkU25hcHNob3QocGF0aCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBiYXNlID0gcGF0aC5zbGljZSgwLCAtZXh0ZW5zaW9uLmxlbmd0aCk7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChjaHVuay5zdGFydHNXaXRoKGAke2Jhc2V9LWApICYmIGNodW5rLmVuZHNXaXRoKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICBjb21wbGV0ZS5hZGQoY2h1bmspO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb21wbGV0ZS5hZGQocGF0aCk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgcGF0aCBvZiBjb21wbGV0ZSkge1xuICAgICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgICB0aGlzLmNoZWNrU2l6ZSh0ZXh0KTtcbiAgICAgIHRhcmdldC5jaGVja1NpemUodGV4dCk7XG4gICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRhcmdldC5yb290ICsgcGF0aC5zbGljZSh0aGlzLnJvb3QubGVuZ3RoKTtcbiAgICAgIHRhcmdldC5jaGVja1BhdGgoZGVzdGluYXRpb24pO1xuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLmV4aXN0cyhkZXN0aW5hdGlvbikpIHtcbiAgICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0ICYmICFhd2FpdCB0aGlzLmNvcHlPdmVyRGlmZmVyZW50SGlzdG9yeSh0YXJnZXQsIHBhdGgsIGRlc3RpbmF0aW9uLCB0ZXh0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCB0YXJnZXQuZW5zdXJlUGFyZW50KGRlc3RpbmF0aW9uKTtcbiAgICAgICAgYXdhaXQgdGFyZ2V0LmFkYXB0ZXIud3JpdGUoZGVzdGluYXRpb24sIHRleHQpO1xuICAgICAgfVxuICAgICAgaWYgKGF3YWl0IHRhcmdldC5hZGFwdGVyLnJlYWQoZGVzdGluYXRpb24pICE9PSB0ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGF0YS1zdG9yZSBoaXN0b3J5IGNvcHkgZmFpbGVkIHZlcmlmaWNhdGlvbicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0cyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGl0cyBkb2N1bWVudCBmaXRzIHRoZSBjb25maWd1cmVkIGNhcC5cbiAgICovXG4gIHB1YmxpYyBmaXRzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZSh2YWx1ZSkgPD0gdGhpcy5tYXhGaWxlQnl0ZXM7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIHN0b3JlJ3MgZmlsZXMgcmVjdXJzaXZlbHksIG5ldmVyIGxlYXZpbmcgaXRzIGZvbGRlci5cbiAgICpcbiAgICogQHJldHVybnMgVmF1bHQtcmVsYXRpdmUgcGF0aHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdCgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHRoaXMucm9vdCkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgcGVuZGluZyA9IFt0aGlzLnJvb3RdO1xuICAgIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHdoaWxlIChwZW5kaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGZvbGRlciA9IGVuc3VyZU5vbk51bGxhYmxlKHBlbmRpbmcuc2hpZnQoKSk7XG4gICAgICBjb25zdCBjaGlsZHJlbiA9IGF3YWl0IHRoaXMuYWRhcHRlci5saXN0KGZvbGRlcik7XG4gICAgICBmaWxlcy5wdXNoKC4uLmNoaWxkcmVuLmZpbGVzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke2ZvbGRlcn0vYCkpKTtcbiAgICAgIHBlbmRpbmcucHVzaCguLi5jaGlsZHJlbi5mb2xkZXJzLmZpbHRlcigocGF0aCkgPT4gcGF0aC5zdGFydHNXaXRoKGAke2ZvbGRlcn0vYCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGVzLnNvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZWFzdXJlcyB0aGUgY29tcGxldGUgZW5jb2RlZCBzaXplIG9mIGEgbmV3IGRvY3VtZW50IHdpdGhvdXQgd3JpdGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gSlNPTiBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBVVEYtOCBieXRlcywgZW5jb2Rpbmcgd3JhcHBlciBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyBtZWFzdXJlKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHRoaXMuZW5jb2RlKHZhbHVlKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIGNvbXBsZXRlIGZlbmNlZCBNYXJrZG93biBKU09OIG9yIGEgdmVyc2lvbi1vbmUgSlNPTiBlbnZlbG9wZS4gUGFydGlhbCBkb2N1bWVudHMgcmVtYWluIHBlbmRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZmlsZSB3aXRoaW4gdGhpcyBzdG9yZS5cbiAgICogQHJldHVybnMgUGFyc2VkIEpTT04sIG9yIGB1bmRlZmluZWRgIGZvciBhbiBpbmNvbXBsZXRlIGRvY3VtZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWQocGF0aDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdGhpcy5jaGVja1BhdGgocGF0aCk7XG4gICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICB0ZXh0ID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICghYXdhaXQgdGhpcy5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChwYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICBsZXQgZG9jdW1lbnQ6IHVua25vd247XG4gICAgICB0cnkge1xuICAgICAgICBkb2N1bWVudCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8IGRvY3VtZW50ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gZG9jdW1lbnQpIHx8IGRvY3VtZW50LmZvcm1hdCAhPT0gMSB8fCAhKCdwYXlsb2FkJyBpbiBkb2N1bWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gZGF0YS1zdG9yZSBkb2N1bWVudCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnBheWxvYWQ7XG4gICAgfVxuICAgIGlmICghdGV4dC5zdGFydHNXaXRoKERPQ1VNRU5UX1BSRUZJWCkgfHwgIXRleHQuZW5kc1dpdGgoRE9DVU1FTlRfU1VGRklYKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcGFyc2VkOiB1bmtub3duID0gSlNPTi5wYXJzZSh0ZXh0LnNsaWNlKERPQ1VNRU5UX1BSRUZJWC5sZW5ndGgsIC1ET0NVTUVOVF9TVUZGSVgubGVuZ3RoKSk7XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHNuYXBzaG90IG9ubHkgYWZ0ZXIgZXZlcnkgbnVtYmVyZWQgY2h1bmsgYXJyaXZlcyBhbmQgcGFzc2VzIGl0cyBTSEEtMjU2IGNoZWNrLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIG1hbmlmZXN0IHBhdGguXG4gICAqIEByZXR1cm5zIEl0cyBwYXlsb2FkLCBvciBgdW5kZWZpbmVkYCB3aGlsZSBkZWxpdmVyeSBpcyBpbmNvbXBsZXRlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlYWRTbmFwc2hvdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtYW5pZmVzdCA9IGF3YWl0IHRoaXMucmVhZChwYXRoKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbWFuaWZlc3QgIT09ICdvYmplY3QnIHx8IG1hbmlmZXN0ID09PSBudWxsIHx8ICEoJ2Zvcm1hdCcgaW4gbWFuaWZlc3QpIHx8IG1hbmlmZXN0LmZvcm1hdCAhPT0gMVxuICAgICAgfHwgISgnaGFzaGVzJyBpbiBtYW5pZmVzdCkgfHwgIUFycmF5LmlzQXJyYXkobWFuaWZlc3QuaGFzaGVzKVxuICAgICAgfHwgbWFuaWZlc3QuaGFzaGVzLmxlbmd0aCA9PT0gMCB8fCBtYW5pZmVzdC5oYXNoZXMuc29tZSgoaGFzaDogdW5rbm93bikgPT4gdHlwZW9mIGhhc2ggIT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBieXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBbaW5kZXgsIGhhc2hdIG9mIG1hbmlmZXN0Lmhhc2hlcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IHBhdGguZW5kc1dpdGgoJy5qc29uJykgPyAnLmpzb24nIDogJy5tZCc7XG4gICAgICBjb25zdCBjaHVuayA9IGF3YWl0IHRoaXMucmVhZChgJHtwYXRoLnNsaWNlKDAsIC1leHRlbnNpb24ubGVuZ3RoKX0tJHtTdHJpbmcoaW5kZXgpfSR7ZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKHR5cGVvZiBjaHVuayAhPT0gJ3N0cmluZycgfHwgYXdhaXQgZGlnZXN0KGNodW5rKSAhPT0gaGFzaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnl0ZXMgKz0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNodW5rKS5sZW5ndGg7XG4gICAgICBpZiAoYnl0ZXMgPiB0aGlzLm1heFNuYXBzaG90Qnl0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHNuYXBzaG90IGV4Y2VlZHMgZGVjb2RlZCBieXRlIGxpbWl0Jyk7XG4gICAgICB9XG4gICAgICBjaHVua3MucHVzaChjaHVuayk7XG4gICAgfVxuICAgIGNvbnN0IHBhcnNlZDogdW5rbm93biA9IEpTT04ucGFyc2UoY2h1bmtzLmpvaW4oJycpKTtcbiAgICByZXR1cm4gcGFyc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBkb2N1bWVudCBvd25lZCBieSB0aGUgY2FsbGVyJ3MgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFZhdWx0LXJlbGF0aXZlIGZpbGUgd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHJlbW92YWwuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVtb3ZlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci5yZW1vdmUocGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgY29tcGxldGUgZG9jdW1lbnQsIHJlZnVzaW5nIGFuIG92ZXJzaXplZCB3cml0ZSBiZWZvcmUgYWRhcHRlciBtdXRhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIHdpdGhpbiB0aGlzIHN0b3JlLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBKU09OLWNvbXBhdGlibGUgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgYWRhcHRlciBmaW5pc2hlcyB3cml0aW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlKHBhdGg6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNoZWNrUGF0aChwYXRoKTtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5lbmNvZGUodmFsdWUsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gYXBwZW5kLW9ubHkgZG9jdW1lbnQ6IGFuIG9jY3VwaWVkIHBhdGggaXMgcmV3cml0dGVuIG9ubHkgd2hlbiB0aGUgbmV3IGxpc3Qgc3RyaWN0bHkgZXh0ZW5kcyB0aGUgc3RvcmVkIG9uZS5cbiAgICogQSByZWFkZXIgdGhhdCBzZWVzIGFuIG9sZGVyIGNvcHkgc2VlcyBhIHByZWZpeCwgc28gaXQgYXBwbGllcyBmZXdlciBlbnRyaWVzIGFuZCBuZXZlciBhIGRpZmZlcmVudCBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZXMgLSBKU09OLWNvbXBhdGlibGUgZW50cmllczsgdGhlIHN0b3JlZCBlbnRyaWVzIG11c3QgYmUgdGhlaXIgcHJlZml4LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiwgb3IgYXQgb25jZSB3aGVuIHRoZSBzdG9yZWQgbGlzdCBpcyBhbHJlYWR5IGlkZW50aWNhbC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB3cml0ZUFwcGVuZE9ubHkocGF0aDogc3RyaW5nLCB2YWx1ZXM6IHJlYWRvbmx5IHVua25vd25bXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZXMsIHBhdGguZW5kc1dpdGgoJy5qc29uJykpO1xuICAgIHRoaXMuY2hlY2tTaXplKHRleHQpO1xuICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKHBhdGgpKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBhd2FpdCB0aGlzLnJlYWRTdG9yZWRMaXN0KHBhdGgpO1xuICAgICAgaWYgKHN0b3JlZCA9PT0gbnVsbCB8fCAhaXNMaXN0UHJlZml4KHN0b3JlZCwgdmFsdWVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICBpZiAoc3RvcmVkLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIud3JpdGUocGF0aCwgdGV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYW4gaW1tdXRhYmxlIGRvY3VtZW50LCBhY2NlcHRpbmcgb25seSBieXRlLWlkZW50aWNhbCByZXRyaWVzIGF0IGFuIG9jY3VwaWVkIHBhdGguXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gVmF1bHQtcmVsYXRpdmUgZGVzdGluYXRpb24gd2l0aGluIHRoaXMgc3RvcmUuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBwdWJsaWNhdGlvbiBvciBhbiBpZGVudGljYWwgcmV0cnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd3JpdGVJbW11dGFibGUocGF0aDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuY2hlY2tQYXRoKHBhdGgpO1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLmVuY29kZSh2YWx1ZSwgcGF0aC5lbmRzV2l0aCgnLmpzb24nKSk7XG4gICAgdGhpcy5jaGVja1NpemUodGV4dCk7XG4gICAgaWYgKGF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMocGF0aCkpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZChwYXRoKSAhPT0gdGV4dCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZsaWN0aW5nIGltbXV0YWJsZSBkYXRhLXN0b3JlIGRvY3VtZW50Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuZW5zdXJlUGFyZW50KHBhdGgpO1xuICAgIGF3YWl0IHRoaXMuYWRhcHRlci53cml0ZShwYXRoLCB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYm91bmRlZCBpbW11dGFibGUgY2h1bmtzIGJlZm9yZSB0aGVpciBtYW5pZmVzdC4gUmVhZGVycyB2ZXJpZnkgZGVsaXZlcnkgY29tcGxldGVuZXNzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVW5pcXVlIGJhc2UgcGF0aCBhbmQgc25hcHNob3QgcGF5bG9hZC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbWFuaWZlc3QgaGFzIGJlZW4gcHVibGlzaGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdyaXRlU25hcHNob3QocGFyYW1zOiBEYXRhU3RvcmVUcmFuc3BvcnRXcml0ZVNuYXBzaG90UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGF5bG9hZCA9IEpTT04uc3RyaW5naWZ5KHBhcmFtcy5wYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NuYXBzaG90IG11c3QgYmUgSlNPTi1jb21wYXRpYmxlJyk7XG4gICAgfVxuICAgIGlmIChuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocGF5bG9hZCkubGVuZ3RoID4gdGhpcy5tYXhTbmFwc2hvdEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEtc3RvcmUgc25hcHNob3QgZXhjZWVkcyBkZWNvZGVkIGJ5dGUgbGltaXQnKTtcbiAgICB9XG4gICAgY29uc3QgY2h1bmtzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIHdoaWxlIChvZmZzZXQgPCBwYXlsb2FkLmxlbmd0aCkge1xuICAgICAgbGV0IGxvdyA9IDE7XG4gICAgICBsZXQgaGlnaCA9IE1hdGgubWluKHBheWxvYWQubGVuZ3RoIC0gb2Zmc2V0LCB0aGlzLm1heEZpbGVCeXRlcyk7XG4gICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmNlaWwoKGxvdyArIGhpZ2gpIC8gQklTRUNUSU9OX0RJVklTT1IpO1xuICAgICAgICBpZiAodGhpcy5maXRzKHBheWxvYWQuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBtaWRkbGUpKSkge1xuICAgICAgICAgIGxvdyA9IG1pZGRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2h1bmtzLnB1c2gocGF5bG9hZC5zbGljZShvZmZzZXQsIG9mZnNldCArIGxvdykpO1xuICAgICAgb2Zmc2V0ICs9IGxvdztcbiAgICB9XG4gICAgY29uc3QgaGFzaGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBoYXNoZXMucHVzaChhd2FpdCBkaWdlc3QoY2h1bmspKTtcbiAgICB9XG4gICAgY29uc3QgbWFuaWZlc3QgPSB7IGZvcm1hdDogMSwgaGFzaGVzIH07XG4gICAgdGhpcy5jaGVja1NpemUodGhpcy5lbmNvZGUobWFuaWZlc3QpKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2h1bmtdIG9mIGNodW5rcy5lbnRyaWVzKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGUoYCR7cGFyYW1zLmJhc2V9LSR7U3RyaW5nKGluZGV4KX0ke3RoaXMuZXh0ZW5zaW9ufWAsIGNodW5rKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZShgJHtwYXJhbXMuYmFzZX0ke3RoaXMuZXh0ZW5zaW9ufWAsIG1hbmlmZXN0KTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMucm9vdH0vYCkgfHwgIWlzU2FmZVZhdWx0UGF0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBhdGggbGVhdmVzIGl0cyBjb25maWd1cmVkIGZvbGRlcicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tTaXplKHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHNpemUgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkubGVuZ3RoO1xuICAgIGlmIChzaXplIDw9IHRoaXMubWF4RmlsZUJ5dGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgUGx1Z2luIGRhdGEgc3RvcmU6ICR7U3RyaW5nKHNpemUpfSBieXRlcyBleGNlZWRzIHRoZSAke1N0cmluZyh0aGlzLm1heEZpbGVCeXRlcyl9IGJ5dGUgZmlsZSBsaW1pdC5gO1xuICAgIG5ldyBOb3RpY2UobWVzc2FnZSk7XG4gICAgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcignRGF0YVN0b3JlJykobWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgYSBkZXN0aW5hdGlvbiB3aG9zZSBieXRlcyBkaWZmZXIgZnJvbSB0aGUgc291cmNlLiBPbmx5IGEgam91cm5hbCBzZWdtZW50IG1heSBkaWZmZXIsIGJlY2F1c2UgaXQgZ3Jvd3NcbiAgICogd2hpbGUgaXRzIGRldmljZSB3cml0ZXMgaXQsIHNvIGVpdGhlciBjb3B5IG1heSBiZSB0aGUgb2xkZXIgcHJlZml4IG9mIHRoZSBvdGhlcjsgYW55dGhpbmcgZWxzZSBpcyBhIGNvbmZsaWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdGFyZ2V0IC0gRGVzdGluYXRpb24gdHJhbnNwb3J0LlxuICAgKiBAcGFyYW0gcGF0aCAtIFNvdXJjZSBwYXRoLlxuICAgKiBAcGFyYW0gZGVzdGluYXRpb24gLSBEZXN0aW5hdGlvbiBwYXRoLlxuICAgKiBAcGFyYW0gdGV4dCAtIFNvdXJjZSBieXRlcy5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgc291cmNlIHdhcyB3cml0dGVuIG92ZXIgdGhlIGRlc3RpbmF0aW9uLCB3aGljaCBtdXN0IHRoZW4gYmUgdmVyaWZpZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvcHlPdmVyRGlmZmVyZW50SGlzdG9yeSh0YXJnZXQ6IERhdGFTdG9yZVRyYW5zcG9ydCwgcGF0aDogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBKT1VSTkFMX1NFR01FTlRfUkVHX0VYUC50ZXN0KHBhdGgpID8gYXdhaXQgdGhpcy5yZWFkU3RvcmVkTGlzdChwYXRoKSA6IG51bGw7XG4gICAgY29uc3QgY29waWVkID0gc291cmNlID09PSBudWxsID8gbnVsbCA6IGF3YWl0IHRhcmdldC5yZWFkU3RvcmVkTGlzdChkZXN0aW5hdGlvbik7XG4gICAgaWYgKHNvdXJjZSA9PT0gbnVsbCB8fCBjb3BpZWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgIH1cbiAgICBpZiAoaXNMaXN0UHJlZml4KHNvdXJjZSwgY29waWVkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWlzTGlzdFByZWZpeChjb3BpZWQsIHNvdXJjZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29uZmxpY3RpbmcgaW1tdXRhYmxlIGRhdGEtc3RvcmUgaGlzdG9yeScpO1xuICAgIH1cbiAgICBhd2FpdCB0YXJnZXQuYWRhcHRlci53cml0ZShkZXN0aW5hdGlvbiwgdGV4dCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGVuY29kZSh2YWx1ZTogdW5rbm93biwgaXNKc29uID0gdGhpcy5leHRlbnNpb24gPT09ICcuanNvbicpOiBzdHJpbmcge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgaWYgKGpzb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhLXN0b3JlIHBheWxvYWQgbXVzdCBiZSBKU09OLWNvbXBhdGlibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzSnNvbiA/IEpTT04uc3RyaW5naWZ5KHsgZm9ybWF0OiAxLCBwYXlsb2FkOiB2YWx1ZSB9KSA6IGAke0RPQ1VNRU5UX1BSRUZJWH0ke2pzb259JHtET0NVTUVOVF9TVUZGSVh9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlUGFyZW50KHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIHBhcnRzLnBvcCgpO1xuICAgIGxldCBmb2xkZXIgPSAnJztcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGZvbGRlciA9IGZvbGRlciA/IGAke2ZvbGRlcn0vJHtwYXJ0fWAgOiBwYXJ0O1xuICAgICAgaWYgKCFhd2FpdCB0aGlzLmFkYXB0ZXIuZXhpc3RzKGZvbGRlcikpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFkYXB0ZXIubWtkaXIoZm9sZGVyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuYWRhcHRlci5leGlzdHMoZm9sZGVyKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkTGlzdChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPG51bGwgfCB1bmtub3duW10+IHtcbiAgICBsZXQgdmFsdWU6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHZhbHVlID0gYXdhaXQgdGhpcy5yZWFkKHBhdGgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBkaWdlc3QodGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGFzaCA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSk7XG4gIHJldHVybiBbLi4ubmV3IFVpbnQ4QXJyYXkoaGFzaCldLm1hcCgoYnl0ZSkgPT4gYnl0ZS50b1N0cmluZyhIRVhfUkFESVgpLnBhZFN0YXJ0KEhFWF9CWVRFX0xFTkdUSCwgJzAnKSkuam9pbignJyk7XG59XG5cbmZ1bmN0aW9uIGlzTGlzdFByZWZpeChwcmVmaXg6IHJlYWRvbmx5IHVua25vd25bXSwgbGlzdDogcmVhZG9ubHkgdW5rbm93bltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVmaXgubGVuZ3RoIDw9IGxpc3QubGVuZ3RoICYmIHByZWZpeC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgPT09IEpTT04uc3RyaW5naWZ5KGxpc3RbaW5kZXhdKSk7XG59XG5cbmZ1bmN0aW9uIGlzU2FmZVZhdWx0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoJy8nKS5ldmVyeSgocGFydCkgPT4gcGFydC5sZW5ndGggPiAwICYmIHBhcnQgIT09ICcuJyAmJiBwYXJ0ICE9PSAnLi4nICYmICEvWzw+OlwiXFxcXHw/KlxccHtDb250cm9sfV18Wy4gXSQvdS50ZXN0KHBhcnQpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHlCQUFrQztBQUNsQyxzQkFBdUI7QUFFdkIsbUJBQXVDO0FBRXZDLE1BQU0seUJBQXlCO0FBQy9CLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sWUFBWTtBQUNsQixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLDBCQUEwQjtBQThEekIsTUFBTSxtQkFBbUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF3QnZCLFlBQStCLFFBQTZDO0FBQTdDO0FBQ3BD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
@@ -60,7 +60,8 @@ export interface DataStoreTransportWriteSnapshotParams {
60
60
  readonly payload: unknown;
61
61
  }
62
62
  /**
63
- * A store-scoped transport. Every published document is immutable except device acknowledgements.
63
+ * A store-scoped transport. Every published document is immutable except device acknowledgements and append-only
64
+ * journal segments, which only their own device rewrites and only by extending them.
64
65
  */
65
66
  export declare class DataStoreTransport {
66
67
  protected readonly params: DataStoreTransportConstructorParams;
@@ -108,6 +109,13 @@ export declare class DataStoreTransport {
108
109
  * @returns Vault-relative paths.
109
110
  */
110
111
  list(): Promise<string[]>;
112
+ /**
113
+ * Measures the complete encoded size of a new document without writing.
114
+ *
115
+ * @param value - JSON payload.
116
+ * @returns UTF-8 bytes, encoding wrapper included.
117
+ */
118
+ measure(value: unknown): number;
111
119
  /**
112
120
  * Reads complete fenced Markdown JSON or a version-one JSON envelope. Partial documents remain pending.
113
121
  *
@@ -137,6 +145,15 @@ export declare class DataStoreTransport {
137
145
  * @returns A promise that resolves once the adapter finishes writing.
138
146
  */
139
147
  write(path: string, value: unknown): Promise<void>;
148
+ /**
149
+ * Publishes an append-only document: an occupied path is rewritten only when the new list strictly extends the stored one.
150
+ * A reader that sees an older copy sees a prefix, so it applies fewer entries and never a different one.
151
+ *
152
+ * @param path - Vault-relative destination within this store.
153
+ * @param values - JSON-compatible entries; the stored entries must be their prefix.
154
+ * @returns A promise that resolves after publication, or at once when the stored list is already identical.
155
+ */
156
+ writeAppendOnly(path: string, values: readonly unknown[]): Promise<void>;
140
157
  /**
141
158
  * Publishes an immutable document, accepting only byte-identical retries at an occupied path.
142
159
  *
@@ -154,6 +171,18 @@ export declare class DataStoreTransport {
154
171
  writeSnapshot(params: DataStoreTransportWriteSnapshotParams): Promise<void>;
155
172
  private checkPath;
156
173
  private checkSize;
174
+ /**
175
+ * Reconciles a destination whose bytes differ from the source. Only a journal segment may differ, because it grows
176
+ * while its device writes it, so either copy may be the older prefix of the other; anything else is a conflict.
177
+ *
178
+ * @param target - Destination transport.
179
+ * @param path - Source path.
180
+ * @param destination - Destination path.
181
+ * @param text - Source bytes.
182
+ * @returns Whether the source was written over the destination, which must then be verified.
183
+ */
184
+ private copyOverDifferentHistory;
157
185
  private encode;
158
186
  private ensureParent;
187
+ private readStoredList;
159
188
  }
@@ -105,12 +105,12 @@ __export(data_stores_exports, {
105
105
  "shared-data-store": () => shared_data_store
106
106
  });
107
107
  module.exports = __toCommonJS(data_stores_exports);
108
- var data_store_locations = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-locations.cjs')), 1);
109
- var data_store_replica = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-replica.cjs')), 1);
110
- var data_store_seeds = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-seeds.cjs')), 1);
111
- var data_store_transport = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./data-store-transport.cjs')), 1);
112
- var local_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./local-data-store.cjs')), 1);
113
- var shared_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./shared-data-store.cjs')), 1);
108
+ var data_store_locations = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./data-store-locations.cjs")), 1);
109
+ var data_store_replica = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./data-store-replica.cjs")), 1);
110
+ var data_store_seeds = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./data-store-seeds.cjs")), 1);
111
+ var data_store_transport = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./data-store-transport.cjs")), 1);
112
+ var local_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./local-data-store.cjs")), 1);
113
+ var shared_data_store = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require("./shared-data-store.cjs")), 1);
114
114
  // Annotate the CommonJS export names for ESM import in node:
115
115
  0 && (module.exports = {
116
116
  "data-store-locations": null,
@@ -87,14 +87,39 @@ var __copyProps = (to, from, except, desc) => {
87
87
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
88
88
  var local_data_store_exports = {};
89
89
  __export(local_data_store_exports, {
90
- LocalDataStore: () => LocalDataStore
90
+ LocalDataStore: () => LocalDataStore,
91
+ LocalDataStoreCloseReason: () => LocalDataStoreCloseReason,
92
+ LocalDataStoreClosedError: () => LocalDataStoreClosedError
91
93
  });
92
94
  module.exports = __toCommonJS(local_data_store_exports);
95
+ var LocalDataStoreCloseReason = /* @__PURE__ */ ((LocalDataStoreCloseReason2) => {
96
+ LocalDataStoreCloseReason2["ClosedByBrowser"] = "closedByBrowser";
97
+ LocalDataStoreCloseReason2["ClosedByOwner"] = "closedByOwner";
98
+ LocalDataStoreCloseReason2["VersionChange"] = "versionChange";
99
+ return LocalDataStoreCloseReason2;
100
+ })(LocalDataStoreCloseReason || {});
93
101
  class LocalDataStore {
94
102
  constructor(database) {
95
103
  this.database = database;
104
+ database.onversionchange = () => {
105
+ this.markClosed("versionChange" /* VersionChange */);
106
+ database.close();
107
+ };
108
+ database.addEventListener("close", () => {
109
+ this.markClosed("closedByBrowser" /* ClosedByBrowser */);
110
+ });
96
111
  }
97
112
  database;
113
+ /**
114
+ * Whether the connection is closed or closing, so no further operation can run.
115
+ *
116
+ * @returns `true` once {@link LocalDataStore.close} was called, or the browser or a schema upgrade closed the
117
+ * connection.
118
+ */
119
+ get isClosed() {
120
+ return this.closeReason !== null;
121
+ }
122
+ closeReason = null;
98
123
  /**
99
124
  * Opens an isolated database. Writes resolve only once their transaction commits.
100
125
  *
@@ -112,11 +137,7 @@ class LocalDataStore {
112
137
  reject(new Error("Could not open local data store", { cause: request.error }));
113
138
  });
114
139
  request.onsuccess = () => {
115
- const database = request.result;
116
- database.onversionchange = () => {
117
- database.close();
118
- };
119
- resolve(new LocalDataStore(database));
140
+ resolve(new LocalDataStore(request.result));
120
141
  };
121
142
  });
122
143
  }
@@ -129,9 +150,11 @@ class LocalDataStore {
129
150
  await this.run("readwrite", (store) => store.clear());
130
151
  }
131
152
  /**
132
- * Closes this connection without deleting its records.
153
+ * Closes this connection without deleting its records. Every later operation rejects with
154
+ * {@link LocalDataStoreClosedError}. Closing twice is harmless.
133
155
  */
134
156
  close() {
157
+ this.markClosed("closedByOwner" /* ClosedByOwner */);
135
158
  this.database.close();
136
159
  }
137
160
  /**
@@ -233,9 +256,22 @@ class LocalDataStore {
233
256
  async set(key, value) {
234
257
  await this.run("readwrite", (store) => store.put(value, key));
235
258
  }
259
+ markClosed(reason) {
260
+ this.closeReason ??= reason;
261
+ }
262
+ // eslint-disable-next-line typescript-dev-toolkit/no-undefined-return-type -- Mirrors IndexedDB: a missing record reads as `undefined`, which a stored `null` must stay distinct from.
236
263
  async run(mode, action) {
237
264
  return await new Promise((resolve, reject) => {
238
- const transaction = this.database.transaction("records", mode);
265
+ let transaction;
266
+ try {
267
+ if (this.closeReason !== null) {
268
+ throw new LocalDataStoreClosedError(this.database.name, this.closeReason);
269
+ }
270
+ transaction = this.database.transaction("records", mode);
271
+ } catch (error) {
272
+ reject(this.toClosedError(error));
273
+ return;
274
+ }
239
275
  let request;
240
276
  try {
241
277
  request = action(transaction.objectStore("records"));
@@ -252,9 +288,37 @@ class LocalDataStore {
252
288
  });
253
289
  });
254
290
  }
291
+ toClosedError(error) {
292
+ if (error instanceof LocalDataStoreClosedError) {
293
+ return error;
294
+ }
295
+ if (error instanceof Error && error.name === "InvalidStateError") {
296
+ return new LocalDataStoreClosedError(this.database.name, this.closeReason ?? "closedByBrowser" /* ClosedByBrowser */, { cause: error });
297
+ }
298
+ return error instanceof Error ? error : new Error("Local data-store transaction failed", { cause: error });
299
+ }
300
+ }
301
+ class LocalDataStoreClosedError extends Error {
302
+ /**
303
+ * Creates a {@link LocalDataStoreClosedError}.
304
+ *
305
+ * @param databaseName - The IndexedDB database name of the store.
306
+ * @param reason - Why the connection closed.
307
+ * @param options - The IndexedDB error this one replaces, as its `cause`.
308
+ */
309
+ constructor(databaseName, reason, options) {
310
+ super(`The local data store "${databaseName}" is closed (${reason}), so the operation was not run.`, options);
311
+ this.databaseName = databaseName;
312
+ this.reason = reason;
313
+ this.name = "LocalDataStoreClosedError";
314
+ }
315
+ databaseName;
316
+ reason;
255
317
  }
256
318
  // Annotate the CommonJS export names for ESM import in node:
257
319
  0 && (module.exports = {
258
- LocalDataStore
320
+ LocalDataStore,
321
+ LocalDataStoreCloseReason,
322
+ LocalDataStoreClosedError
259
323
  });
260
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9sb2NhbC1kYXRhLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFJlY29yZC1iYXNlZCBkZXZpY2UtbG9jYWwgcGVyc2lzdGVuY2UsIGlzb2xhdGVkIGJ5IHZhdWx0LCBwbHVnaW4gYW5kIHN0b3JlLlxuICovXG5cbi8qKlxuICogQXRvbWljIG11dGF0aW9ucyBvZiBhIGxvY2FsIHJlY29yZCBzdG9yZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyB7XG4gIC8qKlxuICAgKiBLZXkvdmFsdWUgcGFpcnMgdG8gd3JpdGUuXG4gICAqL1xuICByZWFkb25seSBlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgdW5rbm93bl0pW107XG4gIC8qKlxuICAgKiBLZXlzIHJlbW92ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZlZEtleXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIG9mIHRoaXMgc3RvcmUgZmlyc3QsIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGFzIHRoZSB3cml0ZXMuXG4gICAqXG4gICAqIEVpdGhlciB0aGUgc3RvcmUgaXMgcmVwbGFjZWQgYnkgYGVudHJpZXNgIGFzIGEgd2hvbGUsIG9yLCB3aGVuIHRoZSB0cmFuc2FjdGlvbiBmYWlscywgZXZlcnkgcHJldmlvdXMgcmVjb3JkIHN1cnZpdmVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRDbGVhcj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Igb3BlbmluZyBhIGxvY2FsIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyB7XG4gIC8qKlxuICAgKiBJbmRleGVkREIgaW1wbGVtZW50YXRpb24sIGluamVjdGFibGUgZm9yIHRlc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFjdG9yeT86IElEQkZhY3Rvcnk7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgbmFtZSBhbmQgc2NoZW1hIHZlcnNpb24gY2hvc2VuIGJ5IHRoZSBjb25zdW1lci5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YWJsZSwgZGV2aWNlLWxvY2FsIHZhdWx0IGlkZW50aXR5OyBuZXZlciB0aGUgdmF1bHQgZGlzcGxheSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbG9jYWwgc3RvcmUgaG9sZHMgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWVzOyBpdCBuZXZlciB3cml0ZXMgdG8gdGhlIHZhdWx0LlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxEYXRhU3RvcmUge1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGF0YWJhc2U6IElEQkRhdGFiYXNlKSB7fVxuXG4gIC8qKlxuICAgKiBPcGVucyBhbiBpc29sYXRlZCBkYXRhYmFzZS4gV3JpdGVzIHJlc29sdmUgb25seSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBTdG9yZSBpZGVudGl0eSBhbmQgb3B0aW9uYWwgSW5kZXhlZERCIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIHN0b3JlOyBjbG9zZSBpdCB3aGVuIGl0cyBvd25lciB1bmxvYWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhc3luYyBvcGVuKHBhcmFtczogTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zKTogUHJvbWlzZTxMb2NhbERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgb2JzaWRpYW4tbGliOiR7SlNPTi5zdHJpbmdpZnkoW3BhcmFtcy52YXVsdElkLCBwYXJhbXMucGx1Z2luSWQsIHBhcmFtcy5zdG9yZUlkXSl9YDtcbiAgICBjb25zdCByZXF1ZXN0ID0gKHBhcmFtcy5mYWN0b3J5ID8/IGluZGV4ZWREQikub3BlbihuYW1lLCAxKTtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKCdyZWNvcmRzJyk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignQ291bGQgbm90IG9wZW4gbG9jYWwgZGF0YSBzdG9yZScsIHsgY2F1c2U6IHJlcXVlc3QuZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgZGF0YWJhc2Uub252ZXJzaW9uY2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICAgIH07XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKGRhdGFiYXNlKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy5cbiAgICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFiYXNlLmNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0cyBzZXZlcmFsIHJlY29yZCBjaGFuZ2VzIGF0b21pY2FsbHkgd2l0aG91dCBzZXJpYWxpemluZyB0aGUgcmVzdCBvZiB0aGUgZGF0YWJhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBXcml0ZXMgYW5kIGRlbGV0aW9ucyBpbiBvbmUgdHJhbnNhY3Rpb24sIG9wdGlvbmFsbHkgYWZ0ZXIgY2xlYXJpbmcgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmx5IGFmdGVyIGFsbCBjaGFuZ2VzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjb21taXQocGFyYW1zOiBMb2NhbERhdGFTdG9yZUNvbW1pdFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGlmIChwYXJhbXMuc2hvdWxkQ2xlYXIpIHtcbiAgICAgICAgc3RvcmUuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHBhcmFtcy5yZW1vdmVkS2V5cyA/PyBbXSkge1xuICAgICAgICBzdG9yZS5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHBhcmFtcy5lbnRyaWVzKSB7XG4gICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgIH1cbiAgICAgIC8vIE5vIHJlcXVlc3QgdG8gcmVzb2x2ZSB3aXRoOiBhIGNsb3NpbmcgYHN0b3JlLmNvdW50KClgIHdvdWxkIHdhbGsgZXZlcnkgcmVjb3JkIG9mIHRoZSBzdG9yZSBvbiBlYWNoIGNvbW1pdC5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgcmVjb3JkLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlbGV0ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmRlbGV0ZShrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbGwgcmVjb3JkcyBpbiBrZXkgb3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIERldGFjaGVkIGtleS92YWx1ZSBwYWlycy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbnRyaWVzKCk6IFByb21pc2U8W3N0cmluZywgdW5rbm93bl1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbXTtcbiAgICAvLyBUd28gYnVsayByZWFkcyBpbiBvbmUgdHJhbnNhY3Rpb24gc2VlIHRoZSBzYW1lIHNuYXBzaG90IGluIHRoZSBzYW1lIGtleSBvcmRlciwgc28gdGhleSBwYWlyIHVwIGJ5IGluZGV4LlxuICAgIC8vIEEgY3Vyc29yIGRpc3BhdGNoZXMgb25lIGV2ZW50IHBlciByZWNvcmQgaW5zdGVhZDsgYXQgOTAsMDAwIHJlY29yZHMgaW4gT2JzaWRpYW4gaXQgdG9vayAxLjUgdG8gMiB0aW1lcyBhcyBsb25nLlxuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkb25seScsIChzdG9yZSkgPT4ge1xuICAgICAgY29uc3Qga2V5c1JlcXVlc3QgPSBzdG9yZS5nZXRBbGxLZXlzKCk7XG4gICAgICBjb25zdCB2YWx1ZXNSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsKCk7XG4gICAgICB2YWx1ZXNSZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qga2V5cyA9IGtleXNSZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdmFsdWVzUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBrZXldIG9mIGtleXMuZW50cmllcygpKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIGtleSBpcyBub3QgYSBzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVjb3Jkcy5wdXNoKFtrZXksIHZhbHVlc1tpbmRleF1dKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB2YWx1ZXNSZXF1ZXN0O1xuICAgIH0pO1xuICAgIHJldHVybiByZWNvcmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBzaGFyZWQtc3RvcmUgb3BlcmF0aW9uIGFjcm9zcyBjb25uZWN0aW9ucywgd2luZG93cyBhbmQgYnVuZGxlZCBsaWJyYXJ5IGNvcGllcy5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gQ2FsbGJhY2sgcmVzdWx0LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBXb3JrIHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoaXMgZGF0YWJhc2UncyBXZWIgTG9jay5cbiAgICogQHJldHVybnMgVGhlIGNhbGxiYWNrIHJlc3VsdCBhZnRlciByZWxlYXNpbmcgdGhlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhjbHVzaXZlPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIGF3YWl0IHdpbmRvdy5uYXZpZ2F0b3IubG9ja3MucmVxdWVzdCh0aGlzLmRhdGFiYXNlLm5hbWUsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEl0cyB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkb25seScsIChzdG9yZSkgPT4gc3RvcmUuZ2V0KGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgcmVjb3JkIG9uY2UsIGF0b21pY2FsbHkgYWNyb3NzIGNvbm5lY3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdXNlZCBvbmx5IHdoZW4gdGhlIGtleSBpcyBhYnNlbnQuXG4gICAqIEByZXR1cm5zIFRoZSBleGlzdGluZyBvciBuZXdseSBjb21taXR0ZWQgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0T3JDcmVhdGUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuPHVua25vd24+KCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocmVxdWVzdC5yZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHN0b3JlLnB1dCh2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH0pLnRoZW4oKGV4aXN0aW5nKSA9PiBleGlzdGluZyA9PT0gdW5kZWZpbmVkID8gdmFsdWUgOiBleGlzdGluZyk7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGEgc3RydWN0dXJlZC1jbG9uZWFibGUgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBwZXJzaXN0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLnB1dCh2YWx1ZSwga2V5KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oJ3JlY29yZHMnLCBtb2RlKTtcbiAgICAgIGxldCByZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+IHwgdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVxdWVzdCA9IGFjdGlvbih0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgncmVjb3JkcycpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmFib3J0KCk7XG4gICAgICAgIHJlamVjdChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ0xvY2FsIGRhdGEtc3RvcmUgdHJhbnNhY3Rpb24gZmFpbGVkJywgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBBbiBhY3Rpb24gdGhhdCBpc3N1ZWQgbm8gcmVxdWVzdCBvZiBpdHMgb3duIHJlc29sdmVzIHdpdGggYHVuZGVmaW5lZGAgb25jZSBpdHMgd3JpdGVzIGNvbW1pdC5cbiAgICAgICAgcmVzb2x2ZShyZXF1ZXN0Py5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHRyYW5zYWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCk6IHZvaWQgPT4ge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGFib3J0ZWQnLCB7IGNhdXNlOiB0cmFuc2FjdGlvbi5lcnJvciB9KSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiBlc2xpbnQtZW5hYmxlIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUaGVzZSBhcmUgT2JzaWRpYW4gcmVuZGVyZXIgV2ViIEFQSXMsIG5vdCBOb2RlIGJ1aWx0aW5zLiAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBd0RPLE1BQU0sZUFBZTtBQUFBLEVBQ2xC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
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9sb2NhbC1kYXRhLXN0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBSZWNvcmQtYmFzZWQgZGV2aWNlLWxvY2FsIHBlcnNpc3RlbmNlLCBpc29sYXRlZCBieSB2YXVsdCwgcGx1Z2luIGFuZCBzdG9yZS5cbiAqL1xuXG4vKipcbiAqIFdoeSBhIHtAbGluayBMb2NhbERhdGFTdG9yZX0gY29ubmVjdGlvbiBzdG9wcGVkIGFjY2VwdGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZW51bSBMb2NhbERhdGFTdG9yZUNsb3NlUmVhc29uIHtcbiAgLyoqXG4gICAqIFRoZSBicm93c2VyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBvbiBpdHMgb3duLCBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZSBkYXRhYmFzZSB3YXMgZGVsZXRlZCBvciB0aGUgc3RvcmFnZSB3YXNcbiAgICogY2xlYXJlZC5cbiAgICovXG4gIENsb3NlZEJ5QnJvd3NlciA9ICdjbG9zZWRCeUJyb3dzZXInLFxuICAvKipcbiAgICogVGhlIG93bmVyIGNhbGxlZCB7QGxpbmsgTG9jYWxEYXRhU3RvcmUuY2xvc2V9LCB1c3VhbGx5IGJlY2F1c2UgaXQgdW5sb2FkZWQuXG4gICAqL1xuICBDbG9zZWRCeU93bmVyID0gJ2Nsb3NlZEJ5T3duZXInLFxuICAvKipcbiAgICogQW5vdGhlciBjb25uZWN0aW9uIGFza2VkIGZvciBhIG5ld2VyIHNjaGVtYSB2ZXJzaW9uLCBzbyB0aGlzIG9uZSBjbG9zZWQgdG8gbGV0IGl0IHVwZ3JhZGUuXG4gICAqL1xuICBWZXJzaW9uQ2hhbmdlID0gJ3ZlcnNpb25DaGFuZ2UnXG59XG5cbi8qKlxuICogT3B0aW9ucyBvZiBhIHtAbGluayBMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBJbmRleGVkREIgZXJyb3IgdGhlIGNsb3NlZC1zdG9yZSBlcnJvciByZXBsYWNlcy5cbiAgICovXG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBdG9taWMgbXV0YXRpb25zIG9mIGEgbG9jYWwgcmVjb3JkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRGF0YVN0b3JlQ29tbWl0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEtleS92YWx1ZSBwYWlycyB0byB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IChyZWFkb25seSBbc3RyaW5nLCB1bmtub3duXSlbXTtcbiAgLyoqXG4gICAqIEtleXMgcmVtb3ZlZCBpbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBhcyB0aGUgd3JpdGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSByZW1vdmVkS2V5cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogRGVsZXRlcyBldmVyeSByZWNvcmQgb2YgdGhpcyBzdG9yZSBmaXJzdCwgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMgdGhlIHdyaXRlcy5cbiAgICpcbiAgICogRWl0aGVyIHRoZSBzdG9yZSBpcyByZXBsYWNlZCBieSBgZW50cmllc2AgYXMgYSB3aG9sZSwgb3IsIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGZhaWxzLCBldmVyeSBwcmV2aW91cyByZWNvcmQgc3Vydml2ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZENsZWFyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgbG9jYWwgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxEYXRhU3RvcmVPcGVuUGFyYW1zIHtcbiAgLyoqXG4gICAqIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbiwgaW5qZWN0YWJsZSBmb3IgdGVzdHMuXG4gICAqL1xuICByZWFkb25seSBmYWN0b3J5PzogSURCRmFjdG9yeTtcbiAgLyoqXG4gICAqIFBsdWdpbiBtYW5pZmVzdCBpZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yZSBuYW1lIGFuZCBzY2hlbWEgdmVyc2lvbiBjaG9zZW4gYnkgdGhlIGNvbnN1bWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RhYmxlLCBkZXZpY2UtbG9jYWwgdmF1bHQgaWRlbnRpdHk7IG5ldmVyIHRoZSB2YXVsdCBkaXNwbGF5IG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2YXVsdElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBsb2NhbCBzdG9yZSBob2xkcyBzdHJ1Y3R1cmVkLWNsb25lYWJsZSB2YWx1ZXM7IGl0IG5ldmVyIHdyaXRlcyB0byB0aGUgdmF1bHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2NhbERhdGFTdG9yZSB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBvciBjbG9zaW5nLCBzbyBubyBmdXJ0aGVyIG9wZXJhdGlvbiBjYW4gcnVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgb25jZSB7QGxpbmsgTG9jYWxEYXRhU3RvcmUuY2xvc2V9IHdhcyBjYWxsZWQsIG9yIHRoZSBicm93c2VyIG9yIGEgc2NoZW1hIHVwZ3JhZGUgY2xvc2VkIHRoZVxuICAgKiAgIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGlzQ2xvc2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsb3NlUmVhc29uICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZVJlYXNvbjogTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkYXRhYmFzZTogSURCRGF0YWJhc2UpIHtcbiAgICBkYXRhYmFzZS5vbnZlcnNpb25jaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm1hcmtDbG9zZWQoTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbi5WZXJzaW9uQ2hhbmdlKTtcbiAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgfTtcbiAgICAvLyBGaXJlZCBvbmx5IHdoZW4gdGhlIGJyb3dzZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGFibm9ybWFsbHksIG5ldmVyIGFmdGVyIGBjbG9zZSgpYC5cbiAgICBkYXRhYmFzZS5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsICgpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMubWFya0Nsb3NlZChMb2NhbERhdGFTdG9yZUNsb3NlUmVhc29uLkNsb3NlZEJ5QnJvd3Nlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gaXNvbGF0ZWQgZGF0YWJhc2UuIFdyaXRlcyByZXNvbHZlIG9ubHkgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBjb21taXRzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gU3RvcmUgaWRlbnRpdHkgYW5kIG9wdGlvbmFsIEluZGV4ZWREQiBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGNvbm5lY3RlZCBzdG9yZTsgY2xvc2UgaXQgd2hlbiBpdHMgb3duZXIgdW5sb2Fkcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IExvY2FsRGF0YVN0b3JlT3BlblBhcmFtcyk6IFByb21pc2U8TG9jYWxEYXRhU3RvcmU+IHtcbiAgICBjb25zdCBuYW1lID0gYG9ic2lkaWFuLWxpYjoke0pTT04uc3RyaW5naWZ5KFtwYXJhbXMudmF1bHRJZCwgcGFyYW1zLnBsdWdpbklkLCBwYXJhbXMuc3RvcmVJZF0pfWA7XG4gICAgY29uc3QgcmVxdWVzdCA9IChwYXJhbXMuZmFjdG9yeSA/PyBpbmRleGVkREIpLm9wZW4obmFtZSwgMSk7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICByZXF1ZXN0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSgncmVjb3JkcycpO1xuICAgICAgfTtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0NvdWxkIG5vdCBvcGVuIGxvY2FsIGRhdGEgc3RvcmUnLCB7IGNhdXNlOiByZXF1ZXN0LmVycm9yIH0pKTtcbiAgICAgIH0pO1xuICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHJlc29sdmUobmV3IExvY2FsRGF0YVN0b3JlKHJlcXVlc3QucmVzdWx0KSk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgZXZlcnkgcmVjb3JkIGluIHRoaXMgc3RvcmUgb25seS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNsZWFyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucnVuKCdyZWFkd3JpdGUnLCAoc3RvcmUpID0+IHN0b3JlLmNsZWFyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dCBkZWxldGluZyBpdHMgcmVjb3Jkcy4gRXZlcnkgbGF0ZXIgb3BlcmF0aW9uIHJlamVjdHMgd2l0aFxuICAgKiB7QGxpbmsgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcn0uIENsb3NpbmcgdHdpY2UgaXMgaGFybWxlc3MuXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQ2xvc2VkKExvY2FsRGF0YVN0b3JlQ2xvc2VSZWFzb24uQ2xvc2VkQnlPd25lcik7XG4gICAgdGhpcy5kYXRhYmFzZS5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgc2V2ZXJhbCByZWNvcmQgY2hhbmdlcyBhdG9taWNhbGx5IHdpdGhvdXQgc2VyaWFsaXppbmcgdGhlIHJlc3Qgb2YgdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV3JpdGVzIGFuZCBkZWxldGlvbnMgaW4gb25lIHRyYW5zYWN0aW9uLCBvcHRpb25hbGx5IGFmdGVyIGNsZWFyaW5nIHRoZSBzdG9yZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25seSBhZnRlciBhbGwgY2hhbmdlcyBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgY29tbWl0KHBhcmFtczogTG9jYWxEYXRhU3RvcmVDb21taXRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBpZiAocGFyYW1zLnNob3VsZENsZWFyKSB7XG4gICAgICAgIHN0b3JlLmNsZWFyKCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBwYXJhbXMucmVtb3ZlZEtleXMgPz8gW10pIHtcbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBwYXJhbXMuZW50cmllcykge1xuICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICB9XG4gICAgICAvLyBObyByZXF1ZXN0IHRvIHJlc29sdmUgd2l0aDogYSBjbG9zaW5nIGBzdG9yZS5jb3VudCgpYCB3b3VsZCB3YWxrIGV2ZXJ5IHJlY29yZCBvZiB0aGUgc3RvcmUgb24gZWFjaCBjb21taXQuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhIHJlY29yZC5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5kZWxldGUoa2V5KSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYWxsIHJlY29yZHMgaW4ga2V5IG9yZGVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXRhY2hlZCBrZXkvdmFsdWUgcGFpcnMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW50cmllcygpOiBQcm9taXNlPFtzdHJpbmcsIHVua25vd25dW10+IHtcbiAgICBjb25zdCByZWNvcmRzOiBbc3RyaW5nLCB1bmtub3duXVtdID0gW107XG4gICAgLy8gVHdvIGJ1bGsgcmVhZHMgaW4gb25lIHRyYW5zYWN0aW9uIHNlZSB0aGUgc2FtZSBzbmFwc2hvdCBpbiB0aGUgc2FtZSBrZXkgb3JkZXIsIHNvIHRoZXkgcGFpciB1cCBieSBpbmRleC5cbiAgICAvLyBBIGN1cnNvciBkaXNwYXRjaGVzIG9uZSBldmVudCBwZXIgcmVjb3JkIGluc3RlYWQ7IGF0IDkwLDAwMCByZWNvcmRzIGluIE9ic2lkaWFuIGl0IHRvb2sgMS41IHRvIDIgdGltZXMgYXMgbG9uZy5cbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZG9ubHknLCAoc3RvcmUpID0+IHtcbiAgICAgIGNvbnN0IGtleXNSZXF1ZXN0ID0gc3RvcmUuZ2V0QWxsS2V5cygpO1xuICAgICAgY29uc3QgdmFsdWVzUmVxdWVzdCA9IHN0b3JlLmdldEFsbCgpO1xuICAgICAgdmFsdWVzUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBrZXlzUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlc1JlcXVlc3QucmVzdWx0O1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwga2V5XSBvZiBrZXlzLmVudHJpZXMoKSkge1xuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTG9jYWwgZGF0YS1zdG9yZSBrZXkgaXMgbm90IGEgc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY29yZHMucHVzaChba2V5LCB2YWx1ZXNbaW5kZXhdXSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gdmFsdWVzUmVxdWVzdDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVjb3JkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgc2hhcmVkLXN0b3JlIG9wZXJhdGlvbiBhY3Jvc3MgY29ubmVjdGlvbnMsIHdpbmRvd3MgYW5kIGJ1bmRsZWQgbGlicmFyeSBjb3BpZXMuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gV29yayBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGlzIGRhdGFiYXNlJ3MgV2ViIExvY2suXG4gICAqIEByZXR1cm5zIFRoZSBjYWxsYmFjayByZXN1bHQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsb2NrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV4Y2x1c2l2ZTxUPihjYWxsYmFjazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCB3aW5kb3cubmF2aWdhdG9yLmxvY2tzLnJlcXVlc3QodGhpcy5kYXRhYmFzZS5uYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSByZWNvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5LlxuICAgKiBAcmV0dXJucyBJdHMgdmFsdWUsIG9yIGB1bmRlZmluZWRgIHdoZW4gYWJzZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bjx1bmtub3duPigncmVhZG9ubHknLCAoc3RvcmUpID0+IHN0b3JlLmdldChrZXkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIHJlY29yZCBvbmNlLCBhdG9taWNhbGx5IGFjcm9zcyBjb25uZWN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHVzZWQgb25seSB3aGVuIHRoZSBrZXkgaXMgYWJzZW50LlxuICAgKiBAcmV0dXJucyBUaGUgZXhpc3Rpbmcgb3IgbmV3bHkgY29tbWl0dGVkIHZhbHVlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldE9yQ3JlYXRlKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnJ1bjx1bmtub3duPigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QucmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBzdG9yZS5wdXQodmFsdWUsIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9KS50aGVuKChleGlzdGluZykgPT4gZXhpc3RpbmcgPT09IHVuZGVmaW5lZCA/IHZhbHVlIDogZXhpc3RpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyBhIHN0cnVjdHVyZWQtY2xvbmVhYmxlIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gUmVjb3JkIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gcGVyc2lzdC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgY29tbWl0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bigncmVhZHdyaXRlJywgKHN0b3JlKSA9PiBzdG9yZS5wdXQodmFsdWUsIGtleSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQ2xvc2VkKHJlYXNvbjogTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbik6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VSZWFzb24gPz89IHJlYXNvbjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L25vLXVuZGVmaW5lZC1yZXR1cm4tdHlwZSAtLSBNaXJyb3JzIEluZGV4ZWREQjogYSBtaXNzaW5nIHJlY29yZCByZWFkcyBhcyBgdW5kZWZpbmVkYCwgd2hpY2ggYSBzdG9yZWQgYG51bGxgIG11c3Qgc3RheSBkaXN0aW5jdCBmcm9tLlxuICBwcml2YXRlIGFzeW5jIHJ1bjxUPihtb2RlOiBJREJUcmFuc2FjdGlvbk1vZGUsIGFjdGlvbjogKHN0b3JlOiBJREJPYmplY3RTdG9yZSkgPT4gSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdHJhbnNhY3Rpb246IElEQlRyYW5zYWN0aW9uO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VSZWFzb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcih0aGlzLmRhdGFiYXNlLm5hbWUsIHRoaXMuY2xvc2VSZWFzb24pO1xuICAgICAgICB9XG4gICAgICAgIHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbigncmVjb3JkcycsIG1vZGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KHRoaXMudG9DbG9zZWRFcnJvcihlcnJvcikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgcmVxdWVzdDogSURCUmVxdWVzdDxUPiB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QgPSBhY3Rpb24odHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ3JlY29yZHMnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0cmFuc2FjdGlvbi5hYm9ydCgpO1xuICAgICAgICByZWplY3QoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGZhaWxlZCcsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLy8gQW4gYWN0aW9uIHRoYXQgaXNzdWVkIG5vIHJlcXVlc3Qgb2YgaXRzIG93biByZXNvbHZlcyB3aXRoIGB1bmRlZmluZWRgIG9uY2UgaXRzIHdyaXRlcyBjb21taXQuXG4gICAgICAgIHJlc29sdmUocmVxdWVzdD8ucmVzdWx0KTtcbiAgICAgIH07XG4gICAgICB0cmFuc2FjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpOiB2b2lkID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignTG9jYWwgZGF0YS1zdG9yZSB0cmFuc2FjdGlvbiBhYm9ydGVkJywgeyBjYXVzZTogdHJhbnNhY3Rpb24uZXJyb3IgfSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHRvQ2xvc2VkRXJyb3IoZXJyb3I6IHVua25vd24pOiBFcnJvciB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcikge1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cbiAgICAvLyBBIGNsb3NpbmcgY29ubmVjdGlvbiBtYWtlcyBgdHJhbnNhY3Rpb24oKWAgdGhyb3cgYEludmFsaWRTdGF0ZUVycm9yYCBzeW5jaHJvbm91c2x5LlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm5hbWUgPT09ICdJbnZhbGlkU3RhdGVFcnJvcicpIHtcbiAgICAgIHJldHVybiBuZXcgTG9jYWxEYXRhU3RvcmVDbG9zZWRFcnJvcih0aGlzLmRhdGFiYXNlLm5hbWUsIHRoaXMuY2xvc2VSZWFzb24gPz8gTG9jYWxEYXRhU3RvcmVDbG9zZVJlYXNvbi5DbG9zZWRCeUJyb3dzZXIsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yIDogbmV3IEVycm9yKCdMb2NhbCBkYXRhLXN0b3JlIHRyYW5zYWN0aW9uIGZhaWxlZCcsIHsgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IGV2ZXJ5IG9wZXJhdGlvbiBvZiBhIHtAbGluayBMb2NhbERhdGFTdG9yZX0gd2hvc2UgY29ubmVjdGlvbiBpcyBjbG9zZWQgb3IgY2xvc2luZy5cbiAqXG4gKiBJdCByZXBsYWNlcyBJbmRleGVkREIncyByYXcgYEludmFsaWRTdGF0ZUVycm9yYCAoXCJUaGUgZGF0YWJhc2UgY29ubmVjdGlvbiBpcyBjbG9zaW5nXCIpLCB3aGljaCBuYW1lcyBuZWl0aGVyIHRoZVxuICogc3RvcmUgbm9yIHRoZSBjYXVzZS4gVGhlIHVzdWFsIGNhdXNlIGlzIHdvcmsgdGhhdCBvdXRsaXZlZCBpdHMgb3duZXI6IGEgZGVib3VuY2VkIG9yIHNjaGVkdWxlZCBzYXZlIHRoYXQgcnVucyBhZnRlclxuICogdGhlIHBsdWdpbiB1bmxvYWRlZCBhbmQgY2xvc2VkIGl0cyBzdG9yZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIC0gVGhlIEluZGV4ZWREQiBkYXRhYmFzZSBuYW1lIG9mIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHJlYXNvbiAtIFdoeSB0aGUgY29ubmVjdGlvbiBjbG9zZWQuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIEluZGV4ZWREQiBlcnJvciB0aGlzIG9uZSByZXBsYWNlcywgYXMgaXRzIGBjYXVzZWAuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSByZWFzb246IExvY2FsRGF0YVN0b3JlQ2xvc2VSZWFzb24sXG4gICAgb3B0aW9ucz86IExvY2FsRGF0YVN0b3JlQ2xvc2VkRXJyb3JDb25zdHJ1Y3Rvck9wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoYFRoZSBsb2NhbCBkYXRhIHN0b3JlIFwiJHtkYXRhYmFzZU5hbWV9XCIgaXMgY2xvc2VkICgke3JlYXNvbn0pLCBzbyB0aGUgb3BlcmF0aW9uIHdhcyBub3QgcnVuLmAsIG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9ICdMb2NhbERhdGFTdG9yZUNsb3NlZEVycm9yJztcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNPLElBQUss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QXlDO0FBQzFELFNBQUssZ0JBQWdCO0FBQUEsRUFDdkI7QUFBQTtBQUFBLEVBR0EsTUFBYyxJQUFPLE1BQTBCLFFBQXNGO0FBQ25JLFdBQU8sTUFBTSxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFDNUMsVUFBSTtBQUNKLFVBQUk7QUFDRixZQUFJLEtBQUssZ0JBQWdCLE1BQU07QUFDN0IsZ0JBQU0sSUFBSSwwQkFBMEIsS0FBSyxTQUFTLE1BQU0sS0FBSyxXQUFXO0FBQUEsUUFDMUU7QUFDQSxzQkFBYyxLQUFLLFNBQVMsWUFBWSxXQUFXLElBQUk7QUFBQSxNQUN6RCxTQUFTLE9BQU87QUFDZCxlQUFPLEtBQUssY0FBYyxLQUFLLENBQUM7QUFDaEM7QUFBQSxNQUNGO0FBQ0EsVUFBSTtBQUNKLFVBQUk7QUFDRixrQkFBVSxPQUFPLFlBQVksWUFBWSxTQUFTLENBQUM7QUFBQSxNQUNyRCxTQUFTLE9BQU87QUFDZCxvQkFBWSxNQUFNO0FBQ2xCLGVBQU8saUJBQWlCLFFBQVEsUUFBUSxJQUFJLE1BQU0sdUNBQXVDLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUMxRztBQUFBLE1BQ0Y7QUFDQSxrQkFBWSxhQUFhLE1BQVk7QUFFbkMsZ0JBQVEsU0FBUyxNQUFNO0FBQUEsTUFDekI7QUFDQSxrQkFBWSxpQkFBaUIsU0FBUyxNQUFZO0FBQ2hELGVBQU8sSUFBSSxNQUFNLHdDQUF3QyxFQUFFLE9BQU8sWUFBWSxNQUFNLENBQUMsQ0FBQztBQUFBLE1BQ3hGLENBQUM7QUFBQSxJQUNILENBQUM7QUFBQSxFQUNIO0FBQUEsRUFFUSxjQUFjLE9BQXVCO0FBQzNDLFFBQUksaUJBQWlCLDJCQUEyQjtBQUM5QyxhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUksaUJBQWlCLFNBQVMsTUFBTSxTQUFTLHFCQUFxQjtBQUNoRSxhQUFPLElBQUksMEJBQTBCLEtBQUssU0FBUyxNQUFNLEtBQUssZUFBZSx5Q0FBMkMsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUFBLElBQzFJO0FBQ0EsV0FBTyxpQkFBaUIsUUFBUSxRQUFRLElBQUksTUFBTSx1Q0FBdUMsRUFBRSxPQUFPLE1BQU0sQ0FBQztBQUFBLEVBQzNHO0FBQ0Y7QUFTTyxNQUFNLGtDQUFrQyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE1QyxZQUNXLGNBQ0EsUUFDaEIsU0FDQTtBQUNBLFVBQU0seUJBQXlCLFlBQVksZ0JBQWdCLE1BQU0sb0NBQW9DLE9BQU87QUFKNUY7QUFDQTtBQUloQixTQUFLLE9BQU87QUFBQSxFQUNkO0FBQUEsRUFOa0I7QUFBQSxFQUNBO0FBTXBCOyIsIm5hbWVzIjpbIkxvY2FsRGF0YVN0b3JlQ2xvc2VSZWFzb24iXX0=