@mnaoumov/obsidian-lib 10.12.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 (399) hide show
  1. package/components/worker-component/package.json +6 -0
  2. package/components/worker-pool-component/package.json +6 -0
  3. package/dist/lib/cjs/__merged.cjs +409 -292
  4. package/dist/lib/cjs/__merged.d.cts +17 -8
  5. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  6. package/dist/lib/cjs/app.cjs +2 -2
  7. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  8. package/dist/lib/cjs/attachment-path.cjs +9 -9
  9. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  10. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  11. package/dist/lib/cjs/backlink-index.cjs +5 -5
  12. package/dist/lib/cjs/backlink.cjs +7 -7
  13. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  14. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  15. package/dist/lib/cjs/bug-report.cjs +3 -3
  16. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  17. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  18. package/dist/lib/cjs/callout.cjs +6 -6
  19. package/dist/lib/cjs/canvas.cjs +11 -9
  20. package/dist/lib/cjs/canvas.d.cts +13 -0
  21. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  22. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  23. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  24. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  25. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  26. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  27. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  28. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  29. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  30. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  31. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  32. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  33. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  34. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  35. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  36. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  37. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  38. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  39. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +6 -6
  40. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  41. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  42. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  43. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  44. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  46. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  47. package/dist/lib/cjs/community-plugins.cjs +3 -3
  48. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  49. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  50. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +3 -3
  51. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  52. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  53. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  54. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  55. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  56. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  57. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  58. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  59. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  60. package/dist/lib/cjs/components/embed-extensions-component.cjs +1 -1
  61. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +8 -8
  62. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  63. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  64. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  65. package/dist/lib/cjs/components/index.cjs +46 -40
  66. package/dist/lib/cjs/components/index.d.cts +2 -0
  67. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  68. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  69. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  70. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  71. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  72. package/dist/lib/cjs/components/plugin-gate-component.cjs +68 -28
  73. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  74. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  75. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  76. package/dist/lib/cjs/components/plugin-settings-component.cjs +113 -17
  77. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  78. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  79. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  80. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  81. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  82. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  83. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  84. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  85. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  86. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  87. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  88. package/dist/lib/cjs/components/shared-component-pool-component.cjs +6 -6
  89. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  90. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  91. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  92. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  93. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  94. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  95. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  96. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +7 -7
  97. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  98. package/dist/lib/cjs/constructors/index.cjs +1 -1
  99. package/dist/lib/cjs/data-handler.cjs +111 -4
  100. package/dist/lib/cjs/data-handler.d.cts +92 -1
  101. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  102. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  103. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  104. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  105. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  106. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  107. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  108. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  109. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  110. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  111. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  112. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  113. package/dist/lib/cjs/dataview-link.cjs +2 -2
  114. package/dist/lib/cjs/dataview.cjs +27 -7
  115. package/dist/lib/cjs/dataview.d.cts +14 -0
  116. package/dist/lib/cjs/debug.cjs +3 -3
  117. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  118. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  119. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  120. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  121. package/dist/lib/cjs/desktop-git-runner.cjs +2 -2
  122. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  123. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  124. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  125. package/dist/lib/cjs/disposable.cjs +150 -0
  126. package/dist/lib/cjs/disposable.d.cts +39 -0
  127. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  128. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  129. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  130. package/dist/lib/cjs/editor.cjs +6 -6
  131. package/dist/lib/cjs/events.cjs +2 -2
  132. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  133. package/dist/lib/cjs/feature-request.cjs +1 -1
  134. package/dist/lib/cjs/file-change.cjs +10 -10
  135. package/dist/lib/cjs/file-explorer.cjs +2 -2
  136. package/dist/lib/cjs/file-manager.cjs +5 -5
  137. package/dist/lib/cjs/file-system.cjs +10 -10
  138. package/dist/lib/cjs/folder-note.cjs +4 -4
  139. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  140. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  141. package/dist/lib/cjs/frontmatter.cjs +5 -5
  142. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  143. package/dist/lib/cjs/hotkey.cjs +1 -1
  144. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  145. package/dist/lib/cjs/html-element.cjs +2 -2
  146. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  147. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  148. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  149. package/dist/lib/cjs/i18n/index.cjs +4 -4
  150. package/dist/lib/cjs/i18n/locales/en.cjs +5 -1
  151. package/dist/lib/cjs/i18n/locales/en.d.cts +4 -0
  152. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  153. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  154. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +4 -0
  155. package/dist/lib/cjs/index.cjs +145 -127
  156. package/dist/lib/cjs/index.d.cts +6 -0
  157. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  158. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  159. package/dist/lib/cjs/library-styles.cjs +3 -3
  160. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  161. package/dist/lib/cjs/link.cjs +76 -56
  162. package/dist/lib/cjs/link.d.cts +20 -14
  163. package/dist/lib/cjs/logger.cjs +4 -4
  164. package/dist/lib/cjs/loop.cjs +10 -16
  165. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  166. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  167. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  168. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  169. package/dist/lib/cjs/markdown-view.cjs +3 -3
  170. package/dist/lib/cjs/markdown.cjs +12 -12
  171. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  172. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  173. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  174. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  175. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  176. package/dist/lib/cjs/modals/alert.cjs +4 -4
  177. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  178. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  179. package/dist/lib/cjs/modals/copy-text-manually.cjs +4 -4
  180. package/dist/lib/cjs/modals/index.cjs +12 -12
  181. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  182. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  183. package/dist/lib/cjs/modals/modal.cjs +3 -3
  184. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  185. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  186. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +5 -5
  187. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  188. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  189. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  190. package/dist/lib/cjs/note-priority.cjs +2 -2
  191. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  192. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  193. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  194. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  195. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  196. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  197. package/dist/lib/cjs/parse-link.cjs +14 -14
  198. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  199. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  200. package/dist/lib/cjs/path-settings.cjs +3 -3
  201. package/dist/lib/cjs/pdf.cjs +2 -2
  202. package/dist/lib/cjs/plugin/index.cjs +16 -13
  203. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  204. package/dist/lib/cjs/plugin/plugin-api.cjs +8 -8
  205. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  206. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  207. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  208. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  209. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  210. package/dist/lib/cjs/plugin/plugin-install-state.cjs +4 -4
  211. package/dist/lib/cjs/plugin/plugin-instance.cjs +14 -12
  212. package/dist/lib/cjs/plugin/plugin-instance.d.cts +7 -0
  213. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  214. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  215. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  216. package/dist/lib/cjs/plugin/plugin.cjs +118 -34
  217. package/dist/lib/cjs/plugin/plugin.d.cts +28 -5
  218. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  219. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  220. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  221. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  222. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  223. package/dist/lib/cjs/popovers/index.cjs +3 -3
  224. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  225. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  226. package/dist/lib/cjs/queue.cjs +8 -8
  227. package/dist/lib/cjs/react/app-context.cjs +3 -3
  228. package/dist/lib/cjs/react/index.cjs +1 -1
  229. package/dist/lib/cjs/reference-definition.cjs +1 -1
  230. package/dist/lib/cjs/reference.cjs +3 -3
  231. package/dist/lib/cjs/release-asset.cjs +5 -5
  232. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  233. package/dist/lib/cjs/request-url.cjs +4 -4
  234. package/dist/lib/cjs/resource-lock.cjs +46 -42
  235. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  236. package/dist/lib/cjs/resource-url.cjs +3 -3
  237. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  238. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  239. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  240. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  241. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  242. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  243. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  244. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  245. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  246. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  247. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  248. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  249. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  250. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  251. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  252. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  253. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  254. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  255. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  256. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  257. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  258. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  259. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  260. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  261. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  262. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  264. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  265. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  266. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  268. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  269. package/dist/lib/cjs/setting-ex.cjs +26 -26
  270. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  271. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  272. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  273. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  274. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  275. package/dist/lib/cjs/templater.cjs +14 -4
  276. package/dist/lib/cjs/templater.d.cts +6 -0
  277. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  278. package/dist/lib/cjs/transformers/index.cjs +1 -1
  279. package/dist/lib/cjs/trusted-input.cjs +1 -1
  280. package/dist/lib/cjs/validation.cjs +4 -4
  281. package/dist/lib/cjs/vault-delete.cjs +6 -6
  282. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  283. package/dist/lib/cjs/vault.cjs +12 -12
  284. package/dist/lib/cjs/view-registrar.cjs +1 -1
  285. package/dist/lib/cjs/virtual-file.cjs +16 -14
  286. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  287. package/dist/lib/cjs/wasm.cjs +119 -0
  288. package/dist/lib/cjs/wasm.d.cts +54 -0
  289. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  290. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  291. package/dist/lib/cjs/workspace.cjs +1 -1
  292. package/dist/lib/esm/__merged.d.mts +17 -8
  293. package/dist/lib/esm/__merged.mjs +133 -3
  294. package/dist/lib/esm/app.mjs +2 -2
  295. package/dist/lib/esm/attachment-path.d.mts +3 -3
  296. package/dist/lib/esm/attachment-path.mjs +2 -2
  297. package/dist/lib/esm/backlink-index.mjs +2 -2
  298. package/dist/lib/esm/canvas.d.mts +13 -0
  299. package/dist/lib/esm/canvas.mjs +6 -5
  300. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  301. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  302. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  303. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  304. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  305. package/dist/lib/esm/components/component-ex.mjs +19 -6
  306. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  307. package/dist/lib/esm/components/index.d.mts +2 -0
  308. package/dist/lib/esm/components/index.mjs +5 -1
  309. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  310. package/dist/lib/esm/components/plugin-gate-component.mjs +57 -14
  311. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  312. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  313. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  314. package/dist/lib/esm/components/plugin-settings-component.mjs +99 -3
  315. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  316. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  317. package/dist/lib/esm/components/worker-component.mjs +279 -0
  318. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  319. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  320. package/dist/lib/esm/components/workspace-layout-state-component.mjs +1 -1
  321. package/dist/lib/esm/data-handler.d.mts +92 -1
  322. package/dist/lib/esm/data-handler.mjs +112 -3
  323. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  324. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  325. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  326. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  327. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  328. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  329. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  330. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  331. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  332. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  333. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  334. package/dist/lib/esm/dataview.d.mts +14 -0
  335. package/dist/lib/esm/dataview.mjs +19 -1
  336. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  337. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  338. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  339. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  340. package/dist/lib/esm/disposable.d.mts +39 -0
  341. package/dist/lib/esm/disposable.mjs +64 -0
  342. package/dist/lib/esm/file-system.mjs +2 -2
  343. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  344. package/dist/lib/esm/generated-during-build.mjs +1 -1
  345. package/dist/lib/esm/i18n/locales/en.d.mts +4 -0
  346. package/dist/lib/esm/i18n/locales/en.mjs +5 -1
  347. package/dist/lib/esm/i18n/locales/translations-map.d.mts +4 -0
  348. package/dist/lib/esm/index.d.mts +6 -0
  349. package/dist/lib/esm/index.mjs +13 -1
  350. package/dist/lib/esm/link.d.mts +20 -14
  351. package/dist/lib/esm/link.mjs +57 -38
  352. package/dist/lib/esm/loop.mjs +2 -8
  353. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  354. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  355. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  356. package/dist/lib/esm/metadata-cache.mjs +6 -6
  357. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  358. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  359. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  360. package/dist/lib/esm/modals/prompt.mjs +1 -1
  361. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  362. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  363. package/dist/lib/esm/parse-link.mjs +4 -4
  364. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  365. package/dist/lib/esm/path-compatibility.mjs +277 -0
  366. package/dist/lib/esm/plugin/index.d.mts +1 -0
  367. package/dist/lib/esm/plugin/index.mjs +4 -2
  368. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  369. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  370. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  371. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  372. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  373. package/dist/lib/esm/plugin/plugin-instance.d.mts +7 -0
  374. package/dist/lib/esm/plugin/plugin-instance.mjs +2 -1
  375. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  376. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  377. package/dist/lib/esm/plugin/plugin.d.mts +28 -5
  378. package/dist/lib/esm/plugin/plugin.mjs +103 -9
  379. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  380. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  381. package/dist/lib/esm/release-asset.mjs +1 -1
  382. package/dist/lib/esm/resource-lock.d.mts +8 -7
  383. package/dist/lib/esm/resource-lock.mjs +31 -26
  384. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  385. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  386. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  387. package/dist/lib/esm/settings-recovery.mjs +125 -0
  388. package/dist/lib/esm/settings-tabs.mjs +2 -2
  389. package/dist/lib/esm/templater.d.mts +6 -0
  390. package/dist/lib/esm/templater.mjs +11 -2
  391. package/dist/lib/esm/vault.mjs +1 -1
  392. package/dist/lib/esm/virtual-file.d.mts +2 -1
  393. package/dist/lib/esm/virtual-file.mjs +7 -5
  394. package/dist/lib/esm/wasm.d.mts +54 -0
  395. package/dist/lib/esm/wasm.mjs +30 -0
  396. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  397. package/dist/lib/esm/worker-protocol.mjs +113 -0
  398. package/package.json +9 -8
  399. package/plugin/third-party-plugin/package.json +6 -0
@@ -14,7 +14,7 @@ export { BUG_REPORT_ISSUE_FORM_TEMPLATE, BUG_REPORT_PASTE_INSTRUCTIONS, BugRepor
14
14
  export { BULK_OPERATION_HOLD_INTERVAL_IN_MILLISECONDS, holdBulkOperationWhile, registerBulkOperationProgressListener, reportBulkOperationProgress } from './bulk-operation-progress.cjs';
15
15
  export { buildBeforeOperationCommitSubject, buildOperationCommitMessage, BULK_OPERATION_LOCK_FILE_NAME, BULK_OPERATION_LOCK_STALE_AFTER_IN_MILLISECONDS, formatOperationId, getNextOperationId, isBulkOperationLock, isBulkOperationLockStale, OPERATION_TRAILER_KEY, parseBulkOperationCommit, parseOperationNumber, PLUGIN_TRAILER_KEY } from './bulk-operation.cjs';
16
16
  export { CalloutMode, renderCallout, wrapForCallout } from './callout.cjs';
17
- export { getCanvasReferences } from './canvas.cjs';
17
+ export { getCanvasReferences, getCanvasReferencesFromContent } from './canvas.cjs';
18
18
  export { CaseInsensitiveFileIndex, getCaseInsensitiveFileIndex, setCaseInsensitiveFileIndex, unsetCaseInsensitiveFileIndex } from './case-insensitive-file-index.cjs';
19
19
  export { createCodeBlockRegExp } from './code-block-reg-exp.cjs';
20
20
  export { captureCodeBlockFocus, claimCodeBlockRenderHandoff, CODE_BLOCK_RENDER_HANDOFF_LIFETIME_IN_MILLISECONDS, recordCodeBlockRenderHandoff, restoreCodeBlockFocus } from './code-block-render-handoff.cjs';
@@ -79,18 +79,20 @@ export { SharedComponentPoolComponent } from './components/shared-component-pool
79
79
  export { registerStyle, StyleSheetComponent } from './components/style-sheet-component.cjs';
80
80
  export { SyntaxHighlightingComponent } from './components/syntax-highlighting-component.cjs';
81
81
  export { TemplatesLanguageComponent } from './components/templates-language-component.cjs';
82
+ export { WorkerCallError, WorkerComponent } from './components/worker-component.cjs';
83
+ export { getDefaultWorkerPoolSize, MAX_DEFAULT_WORKER_POOL_SIZE, WorkerPoolComponent } from './components/worker-pool-component.cjs';
82
84
  export { parseWorkspaceLayoutStateRecord, serializeWorkspaceLayoutStateRecord, WORKSPACE_LAYOUT_STATE_LAYOUT_KEY, WorkspaceLayoutStateComponent } from './components/workspace-layout-state-component.cjs';
83
85
  export { getDomEventsHandlersConstructor } from './constructors/get-dom-events-handlers-constructor.cjs';
84
86
  export { CssClass } from './css-class.cjs';
85
- export { DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES, PluginDataHandler, PluginDataOperation, PluginDataSizeLimitExceededError } from './data-handler.cjs';
87
+ export { DEFAULT_PLUGIN_DATA_MAX_SIZE_IN_BYTES, PluginDataHandler, PluginDataOperation, PluginDataParseError, PluginDataSizeLimitExceededError } from './data-handler.cjs';
86
88
  export { DataStoreLocations } from './data-stores/data-store-locations.cjs';
87
89
  export { DataStoreReplica, isDataStoreJsonValue, isDataStoreOperation } from './data-stores/data-store-replica.cjs';
88
90
  export { DataStoreSeeds, validateDataStoreSeed } from './data-stores/data-store-seeds.cjs';
89
91
  export { DataStoreTransport } from './data-stores/data-store-transport.cjs';
90
- export { LocalDataStore } from './data-stores/local-data-store.cjs';
92
+ export { LocalDataStore, LocalDataStoreClosedError, LocalDataStoreCloseReason } from './data-stores/local-data-store.cjs';
91
93
  export { SharedDataStore } from './data-stores/shared-data-store.cjs';
92
94
  export { fixTitle, makeLinkWithPath } from './dataview-link.cjs';
93
- export { getRenderedContainer, insertCodeBlock, reloadCurrentFileCache, renderIframe, renderPaginatedList, renderPaginatedTable } from './dataview.cjs';
95
+ export { DATAVIEW_PLUGIN_ADAPTER, DATAVIEW_PLUGIN_ID, getRenderedContainer, insertCodeBlock, reloadCurrentFileCache, renderIframe, renderPaginatedList, renderPaginatedTable } from './dataview.cjs';
94
96
  export { getObsidianLibDebugger, showInitialDebugMessage } from './debug.cjs';
95
97
  export { bootstrapDemoVault } from './demo-vault-helper.cjs';
96
98
  export { getDemoVaultArchiveFileName, getDemoVaultFolderName } from './demo-vault-naming.cjs';
@@ -99,6 +101,7 @@ export { openDemoVault } from './desktop-demo-vault-opener.cjs';
99
101
  export { createDesktopGitRunner } from './desktop-git-runner.cjs';
100
102
  export { getDesktopOperatingSystem } from './desktop-operating-system.cjs';
101
103
  export { openDesktopRequestUrlStream } from './desktop-request-url-stream.cjs';
104
+ export { registerAsyncDisposable, registerDisposable } from './disposable.cjs';
102
105
  export { PluginEditorExtensionRegistrar } from './editor-extension-registrar.cjs';
103
106
  export { PluginEditorSuggestRegistrar } from './editor-suggest-registrar.cjs';
104
107
  export { CommandEditorSuggest, prioritizeEditorSuggest } from './editor-suggest.cjs';
@@ -140,6 +143,7 @@ export { getFullContentHtml, rerenderPreviews } from './markdown-view.cjs';
140
143
  export { fullRender, markdownToHtml, registerLinkHandlers, renderExternalLink, renderInternalLink } from './markdown.cjs';
141
144
  export { addSingleChoiceMenuItems } from './menu.cjs';
142
145
  export { ADVANCED_METADATA_CACHE_PLUGIN_ID, BACKLINK_CACHE_PLUGIN_ID, CachedMetadataExFeature, ensureMetadataCacheReady, getBacklinksForFileOrPath, getBacklinksForFileSafe, getCacheSafe, getFrontmatterSafe, getReferences, hasBacklinkCachePlugin, isCachedMetadataEx, parseMetadata, registerFileCacheForNonExistingFile, registerFiles, unregisterFileCacheForNonExistingFile, unregisterFiles } from './metadata-cache.cjs';
146
+ export { ExternalAttachmentLinkMode, getAttachmentPlacement, MisplacedAttachmentIndex, recordAttachmentPlacement } from './misplaced-attachment.cjs';
143
147
  export { getMobileAppInfo } from './mobile-app-info.cjs';
144
148
  export { alert } from './modals/alert.cjs';
145
149
  export { formatCodeBlock, showCodeBlockBuilder } from './modals/code-block-builder.cjs';
@@ -154,25 +158,27 @@ export { selectItem } from './modals/select-item.cjs';
154
158
  export { selectOption } from './modals/select-option.cjs';
155
159
  export { SuggestModalCommandBuilder } from './modals/suggest-modal-command-builder.cjs';
156
160
  export { filterHighestPriorityNotePaths, findNoPriorityWinnerReason, findNotePriorityRank, NO_PRIORITY_MATCH, NoPriorityWinnerReason, pickHighestPriorityNotePath } from './note-priority.cjs';
157
- export { NOTEBOOK_NAVIGATOR_MENU_SOURCE, NOTEBOOK_NAVIGATOR_PLUGIN_ID, resolveNotebookNavigatorApi } from './notebook-navigator.cjs';
161
+ export { NOTEBOOK_NAVIGATOR_MENU_SOURCE, NOTEBOOK_NAVIGATOR_PLUGIN_ADAPTER, NOTEBOOK_NAVIGATOR_PLUGIN_ID, resolveNotebookNavigatorApi } from './notebook-navigator.cjs';
158
162
  export { getObsidianLibState, resetObsidianLibState } from './obsidian-lib-state.cjs';
159
163
  export { PluginObsidianProtocolHandlerRegistrar } from './obsidian-protocol-handler-registrar.cjs';
160
164
  export { getNewLinkFormat, isSpellcheckEnabled, isSpellcheckEnabledForMode, shouldUseWikilinks, SpellcheckMode } from './obsidian-settings.cjs';
161
165
  export { canonicalizeObsidianText, createObsidianMentionRegExp, getObsidianNameTokens, isObsidianWordCharacter, tokenizeObsidianWords } from './obsidian-word-characters.cjs';
162
166
  export { escapeAlias, isParseLinkFrontmatterReference, isParseLinkReference, parseFrontmatterLinks, parseLink, parseLinks, toParseLinkReference, unescapeAlias } from './parse-link.cjs';
167
+ export { findPathCompatibilityViolations, getCurrentPathCompatibilityPlatform, getForbiddenCharacterReplacementValidationMessage, isUnicodeNormalized, measure, PATH_COMPATIBILITY_PLATFORM_LABELS, PATH_COMPATIBILITY_PLATFORMS, PathCompatibilityPlatform, PathCompatibilityViolationType, repairName } from './path-compatibility.cjs';
163
168
  export { PathSettings, pathsValidator } from './path-settings.cjs';
164
169
  export { printToPdf } from './pdf.cjs';
165
170
  export { PluginCliHandlerRegistrar } from './plugin-cli-handler-registrar.cjs';
166
171
  export { findPluginApi, getValidatePluginApiPayloadsDebugSwitch, PluginApiPayloadKind, PluginApiRevokedError, PluginApiUnavailabilityReason, PluginApiUnavailableError, PluginApiValidationError, publishPluginApi, watchPluginApi } from './plugin/plugin-api.cjs';
167
- export { DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS, didPluginAsyncCleanupsSettle, hasPendingPluginAsyncCleanups, PLUGIN_ASYNC_CLEANUPS_STATE_KEY, registerPluginAsyncCleanup, trackPluginAsyncCleanup } from './plugin/plugin-async-cleanup.cjs';
172
+ export { DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS, DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS, didPluginAsyncCleanupsSettle, hasPendingPluginAsyncCleanups, PLUGIN_ASYNC_CLEANUPS_STATE_KEY, registerPluginAsyncCleanup, trackPluginAsyncCleanup } from './plugin/plugin-async-cleanup.cjs';
168
173
  export { addPluginCssClasses, initDebugController, initPluginContext } from './plugin/plugin-context.cjs';
169
174
  export { PluginEventSourceImpl } from './plugin/plugin-event-source.cjs';
170
175
  export { comparePluginVersionWithMinimum, getInstalledPluginState, getInstalledPluginVersion, installAndEnablePlugin, InstalledPluginState, PluginVersionComparison, updatePlugin } from './plugin/plugin-install-state.cjs';
171
- export { getLoadedPlugin, getPluginAvailability, PluginAvailability, PluginInstanceUnavailableError, requirePlugin, waitForPlugin } from './plugin/plugin-instance.cjs';
176
+ export { getLoadedPlugin, getPluginAvailability, PluginAvailability, PluginInstanceUnavailableError, PLUGINS_CHANGED_EVENT_NAME, requirePlugin, waitForPlugin } from './plugin/plugin-instance.cjs';
172
177
  export { PLUGIN_LOADED_EVENT_NAME, PLUGIN_UNLOADED_EVENT_NAME, triggerPluginLifecycleEvent } from './plugin/plugin-lifecycle-events.cjs';
173
178
  export { PluginSettingsTabBase, SAVE_TO_FILE_CONTEXT } from './plugin/plugin-settings-tab.cjs';
174
179
  export { PluginBase, reloadPlugin, showErrorAndDisablePlugin } from './plugin/plugin.cjs';
175
180
  export { getSettingsMigrationApiContract } from './plugin/settings-migration-api.cjs';
181
+ export { createThirdPartyPluginDependency, getThirdPartyPluginApi, getThirdPartyPluginAvailability, isThirdPartyPluginDependency, requireThirdPartyPluginApi, waitForThirdPartyPluginApi, watchThirdPartyPluginApi } from './plugin/third-party-plugin.cjs';
176
182
  export { editFieldsInPopover } from './popovers/field-popover.cjs';
177
183
  export { createAnchorFromDocumentCenter, createAnchorFromElement, createAnchorFromPoint, createAnchorFromSelection } from './popovers/popover-anchor.cjs';
178
184
  export { showPopover } from './popovers/popover.cjs';
@@ -220,9 +226,10 @@ export { WeekComponent } from './setting-components/week-component.cjs';
220
226
  export { adoptSettingEx, SettingEx } from './setting-ex.cjs';
221
227
  export { SettingGroupEx } from './setting-group-ex.cjs';
222
228
  export { openSettingTab } from './settings-modal.cjs';
229
+ export { DEFAULT_MAX_SETTINGS_RECOVERY_COPIES, isSettingsRecoveryCopy, LocalSettingsRecoveryStore, SETTINGS_RECOVERY_STORE_ID, SettingsRecoveryReason } from './settings-recovery.cjs';
223
230
  export { SettingsTabs } from './settings-tabs.cjs';
224
231
  export { PluginStatusBarItemRegistrar } from './status-bar-item-registrar.cjs';
225
- export { getTemplaterFunctions, getTemplaterRenderTargetFile, parseTemplate, requireTemplaterApi, resolveTemplaterApi, TEMPLATER_PLUGIN_ID, TemplaterActiveFileProvider, TemplaterRunMode, TemplaterUnavailabilityReason, TemplaterUnavailableError } from './templater.cjs';
232
+ export { getTemplaterFunctions, getTemplaterRenderTargetFile, parseTemplate, requireTemplaterApi, resolveTemplaterApi, TEMPLATER_PLUGIN_ADAPTER, TEMPLATER_PLUGIN_ID, TemplaterActiveFileProvider, TemplaterRunMode, TemplaterUnavailabilityReason, TemplaterUnavailableError } from './templater.cjs';
226
233
  export { DurationTransformer } from './transformers/duration-transformer.cjs';
227
234
  export { clickElement, clickMouse, hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement } from './trusted-input.cjs';
228
235
  export { ANDROID_UNSAFE_PATH_CHARS, getFileNameValidationMessage, getOsAndObsidianUnsafePathCharsRegExp, getOsUnsafePathCharsRegExp, getPathValidationMessage, hasWindowsTrailingChars, isValidationMessageHolder, isWindowsReservedName, OBSIDIAN_UNSAFE_FILENAME_CHARS, trimWindowsTrailingChars, UNIX_UNSAFE_PATH_CHARS, WINDOWS_UNSAFE_PATH_CHARS } from './validation.cjs';
@@ -231,6 +238,8 @@ export { VaultTransaction } from './vault-transaction.cjs';
231
238
  export { cleanupEmptyFolders, copySafe, createFolderSafe, CreateFolderSafeResult, createTemporaryFile, createTemporaryFolder, deleteEmptyFolder, deleteEmptyFolderHierarchy, getAbstractFilePathSafe, getAvailablePath, getFilePathSafe, getFolderPathSafe, getMarkdownFilesSorted, getNoteFilesSorted, getOrCreateAbstractFileSafe, getOrCreateFileSafe, getOrCreateFolderSafe, getSafeRenamePath, InvokeFileActionSafeResult, invokeWithFileSystemLock, isChild, isChildOrSelf, isEmptyFolder, listSafe, process, readSafe, renameSafe, saveNote, trashSafe } from './vault.cjs';
232
239
  export { PluginViewRegistrar } from './view-registrar.cjs';
233
240
  export { registerVirtualFile } from './virtual-file.cjs';
241
+ export { compileWasmModule, instantiateWasmModule } from './wasm.cjs';
242
+ export { exposeWorkerApi, invokeWorkerHandler, isTransferredValue, isWorkerRequestMessage, isWorkerResponseMessage, serializeWorkerError, unwrapTransferredValue, withTransfer, WORKER_PROTOCOL } from './worker-protocol.cjs';
234
243
  export { ensureLayoutReady, getAllContainers, getAllDomWindows, getMainWindow, switchToMainWindow, switchToWindow } from './workspace.cjs';
235
244
  export { abortSignalAny, abortSignalNever, abortSignalTimeout, getSharedAbortController, getSharedAbortSignal, INFINITE_TIMEOUT, onAbort, ResettableAbortController, waitForAbort } from '@mnaoumov/typescript-lib/abort-controller';
236
245
  export { createAggregateError } from '@mnaoumov/typescript-lib/aggregate-error';
@@ -117,7 +117,7 @@ __export(anchored_suggest_exports, {
117
117
  AnchoredSuggest: () => AnchoredSuggest
118
118
  });
119
119
  module.exports = __toCommonJS(anchored_suggest_exports);
120
- var import_obsidian = require('obsidian');
120
+ var import_obsidian = require("obsidian");
121
121
  const DEFAULT_LIMIT = 100;
122
122
  class AnchoredSuggest extends import_obsidian.PopoverSuggest {
123
123
  /**
@@ -96,7 +96,7 @@ function getApp() {
96
96
  return app;
97
97
  }
98
98
  try {
99
- return globalThis.require('obsidian/app');
99
+ return globalThis.require("obsidian/app");
100
100
  } catch {
101
101
  throw new Error("Obsidian App global instance not found");
102
102
  }
@@ -105,4 +105,4 @@ function getApp() {
105
105
  0 && (module.exports = {
106
106
  getApp
107
107
  });
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIGEgdXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgT2JzaWRpYW4gYEFwcGAgaW5zdGFuY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBPYnNpZGlhbiBgQXBwYCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYEFwcGAgaW5zdGFuY2UuXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGBBcHBgIGluc3RhbmNlIGNhbm5vdCBiZSBmb3VuZC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0L2Jsb2IvbWFpbi9kb2NzL29ic2lkaWFuLWFwcC1tb2R1bGUubWR9XG4gKiBAZGVwcmVjYXRlZCBVc2FnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC4gUGFzcyB0aGUge0BsaW5rIEFwcH0gaW5zdGFuY2UgdG8gdGhlIGZ1bmN0aW9uIGluc3RlYWQgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFwcCgpOiBBcHAge1xuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlIGdsb2JhbCBgYXBwYCBhcyBhbHdheXMgcHJlc2VudDsgaXQgaXMgbm90IG91dHNpZGUgT2JzaWRpYW4sIGhlbmNlIGBQYXJ0aWFsYC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvbm8tZ2xvYmFsLXRoaXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIEFjdGl2ZWx5IHVzZSBnbG9iYWxUaGlzLCBhbmQgcmVhZGluZyB0aGUgZGVwcmVjYXRlZCBnbG9iYWwgYGFwcGAgaXMgdGhpcyBmdW5jdGlvbidzIHdob2xlIHB1cnBvc2UuXG4gIGNvbnN0IGFwcCA9IChnbG9iYWxUaGlzIGFzIFBhcnRpYWw8dHlwZW9mIGdsb2JhbFRoaXM+KS5hcHA7XG5cbiAgaWYgKGFwcCkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzIC0tIEFjdGl2ZWx5IHVzZSBnbG9iYWxUaGlzOiB0aGlzIG1vZHVsZSBpcyBlbWl0dGVkIGFzIEVTTSwgd2hlcmUgYSBiYXJlIGByZXF1aXJlYCBpcyBub3QgaW4gc2NvcGUgYXQgYWxsLCBzbyB0aGUgcHJvcGVydHkgYWNjZXNzIGlzIHdoYXQgbWFrZXMgdGhlIE9ic2lkaWFuLWluamVjdGVkIGxvYWRlciByZWFjaGFibGUuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucmVxdWlyZSgnb2JzaWRpYW4vYXBwJykgYXMgQXBwO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09ic2lkaWFuIEFwcCBnbG9iYWwgaW5zdGFuY2Ugbm90IGZvdW5kJyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCTyxTQUFTLFNBQWM7QUFHNUIsUUFBTSxNQUFPLFdBQTBDO0FBRXZELE1BQUksS0FBSztBQUNQLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUVGLFdBQU8sV0FBVyxRQUFRLGNBQWM7QUFBQSxFQUMxQyxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sd0NBQXdDO0FBQUEsRUFDMUQ7QUFDRjsiLCJuYW1lcyI6W119
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcHAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIGEgdXRpbGl0eSB0byByZXRyaWV2ZSB0aGUgT2JzaWRpYW4gYEFwcGAgaW5zdGFuY2UuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBPYnNpZGlhbiBgQXBwYCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYEFwcGAgaW5zdGFuY2UuXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGBBcHBgIGluc3RhbmNlIGNhbm5vdCBiZSBmb3VuZC5cbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbW5hb3Vtb3Yvb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0L2Jsb2IvbWFpbi9kb2NzL29ic2lkaWFuLWFwcC1tb2R1bGUubWR9XG4gKiBAZGVwcmVjYXRlZCBVc2FnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZWNvbW1lbmRlZC4gUGFzcyB0aGUge0BsaW5rIEFwcH0gaW5zdGFuY2UgdG8gdGhlIGZ1bmN0aW9uIGluc3RlYWQgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFwcCgpOiBBcHAge1xuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlIGdsb2JhbCBgYXBwYCBhcyBhbHdheXMgcHJlc2VudDsgaXQgaXMgbm90IG91dHNpZGUgT2JzaWRpYW4sIGhlbmNlIGBQYXJ0aWFsYC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvbm8tZ2xvYmFsLXRoaXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIEFjdGl2ZWx5IHVzZSBnbG9iYWxUaGlzLCBhbmQgcmVhZGluZyB0aGUgZGVwcmVjYXRlZCBnbG9iYWwgYGFwcGAgaXMgdGhpcyBmdW5jdGlvbidzIHdob2xlIHB1cnBvc2UuXG4gIGNvbnN0IGFwcCA9IChnbG9iYWxUaGlzIGFzIFBhcnRpYWw8dHlwZW9mIGdsb2JhbFRoaXM+KS5hcHA7XG5cbiAgaWYgKGFwcCkge1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWdsb2JhbC10aGlzLCB1bmljb3JuL25vLXVubmVjZXNzYXJ5LWdsb2JhbC10aGlzIC0tIEFjdGl2ZWx5IHVzZSBnbG9iYWxUaGlzOiB0aGlzIG1vZHVsZSBpcyBlbWl0dGVkIGFzIEVTTSwgd2hlcmUgYSBiYXJlIGByZXF1aXJlYCBpcyBub3QgaW4gc2NvcGUgYXQgYWxsLCBzbyB0aGUgcHJvcGVydHkgYWNjZXNzIGlzIHdoYXQgbWFrZXMgdGhlIE9ic2lkaWFuLWluamVjdGVkIGxvYWRlciByZWFjaGFibGUuXG4gICAgcmV0dXJuIGdsb2JhbFRoaXMucmVxdWlyZSgnb2JzaWRpYW4vYXBwJykgYXMgQXBwO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09ic2lkaWFuIEFwcCBnbG9iYWwgaW5zdGFuY2Ugbm90IGZvdW5kJyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWlCTyxTQUFTLFNBQWM7QUFHNUIsUUFBTSxNQUFPLFdBQTBDO0FBRXZELE1BQUksS0FBSztBQUNQLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUVGLFdBQU8sV0FBVyxRQUFRLGNBQWM7QUFBQSxFQUMxQyxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sd0NBQXdDO0FBQUEsRUFDMUQ7QUFDRjsiLCJuYW1lcyI6W119
@@ -118,10 +118,10 @@ __export(async_with_notice_exports, {
118
118
  runWithTimeoutNotice: () => runWithTimeoutNotice
119
119
  });
120
120
  module.exports = __toCommonJS(async_with_notice_exports);
121
- var import_async = require('@mnaoumov/typescript-lib/async');
122
- var import_debug = require('@mnaoumov/typescript-lib/debug');
123
- var import_value_provider = require('@mnaoumov/typescript-lib/value-provider');
124
- var import_i18n = require('./i18n/i18n.cjs');
121
+ var import_async = require("@mnaoumov/typescript-lib/async");
122
+ var import_debug = require("@mnaoumov/typescript-lib/debug");
123
+ var import_value_provider = require("@mnaoumov/typescript-lib/value-provider");
124
+ var import_i18n = require("./i18n/i18n.cjs");
125
125
  async function retryWithTimeoutNotice(params) {
126
126
  return (0, import_async.retryWithTimeout)({
127
127
  ...params,
@@ -127,13 +127,13 @@ __export(attachment_path_exports, {
127
127
  isAtProperAttachmentPath: () => isAtProperAttachmentPath
128
128
  });
129
129
  module.exports = __toCommonJS(attachment_path_exports);
130
- var import_api_contract = require('@mnaoumov/typescript-lib/api-contract');
131
- var import_path = require('@mnaoumov/typescript-lib/path');
132
- var import_string = require('@mnaoumov/typescript-lib/string');
133
- var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
134
- var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
135
- var import_file_system = require('./file-system.cjs');
136
- var import_plugin_api = require('./plugin/plugin-api.cjs');
130
+ var import_api_contract = require("@mnaoumov/typescript-lib/api-contract");
131
+ var import_path = require("@mnaoumov/typescript-lib/path");
132
+ var import_string = require("@mnaoumov/typescript-lib/string");
133
+ var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
134
+ var import_implementations = require("@obsidian-typings/obsidian-public-latest/implementations");
135
+ var import_file_system = require("./file-system.cjs");
136
+ var import_plugin_api = require("./plugin/plugin-api.cjs");
137
137
  var AttachmentPathContext = /* @__PURE__ */ ((AttachmentPathContext2) => {
138
138
  AttachmentPathContext2["DeleteNote"] = "DeleteNote";
139
139
  AttachmentPathContext2["RenameNote"] = "RenameNote";
@@ -254,7 +254,7 @@ async function getAvailablePathForAttachments(params) {
254
254
  }
255
255
  function getCheckIsAttachmentUnitFolderFunction(_app) {
256
256
  const customAttachmentLocationApi = findCustomAttachmentLocationApi();
257
- return customAttachmentLocationApi ? (folderPath) => customAttachmentLocationApi.isAttachmentUnitFolder({ folderPath }) : void 0;
257
+ return customAttachmentLocationApi ? (folderPath) => customAttachmentLocationApi.isAttachmentUnitFolder({ folderPath }) : null;
258
258
  }
259
259
  async function hasOwnAttachmentFolder(params) {
260
260
  const {
@@ -437,4 +437,4 @@ function resolveAttachmentFolder(params) {
437
437
  hasOwnAttachmentFolder,
438
438
  isAtProperAttachmentPath
439
439
  });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRhY2htZW50LXBhdGgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwaUNvbnRyYWN0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRmlsZVN0YXRzLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbWFrZUZpbGVOYW1lXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNQYXRoT3JGaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGZpbmRQbHVnaW5BcGkgfSBmcm9tICcuL3BsdWdpbi9wbHVnaW4tYXBpLnRzJztcblxuLyoqXG4gKiBBIGNvbnRleHQgZm9yIGFuIGF0dGFjaG1lbnQgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gQXR0YWNobWVudFBhdGhDb250ZXh0IHtcbiAgLyoqXG4gICAqIEEgY29udGV4dCBmb3IgYSBkZWxldGUgbm90ZS5cbiAgICovXG4gIERlbGV0ZU5vdGUgPSAnRGVsZXRlTm90ZScsXG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCBmb3IgYSByZW5hbWUgbm90ZS5cbiAgICovXG4gIFJlbmFtZU5vdGUgPSAnUmVuYW1lTm90ZScsXG5cbiAgLyoqXG4gICAqIEFuIHVua25vd24gY29udGV4dC5cbiAgICovXG4gIFVua25vd24gPSAnVW5rbm93bidcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyBleHRlbmRlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgYmFzZSBuYW1lIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVCYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXRzIG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZVN0YXRzPzogRmlsZVN0YXRzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb3IgZmlsZSBvZiB0aGUgb2xkIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9yIGZpbGUgb2YgdGhlIG9sZCBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkTm90ZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBMYXppbHkgcmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGF0dGFjaG1lbnQgZmlsZS5cbiAgICpcbiAgICogVGhlIGNvbnRlbnQgaXMgcmVhZCBvbiBkZW1hbmQgb25seSB3aGVuIGEgY29uc3VtZXIgYWN0dWFsbHkgbmVlZHMgdGhlIGJ5dGVzIChlLmcuIGEgdGVtcGxhdGVcbiAgICogdG9rZW4gdGhhdCBlbWJlZHMgdGhlbSkuIEZvciB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgbm90aGluZyBwdWxscyB0aGUgYnl0ZXMsIHNvIHRoZSBwb3RlbnRpYWxseVxuICAgKiBleHBlbnNpdmUgKHNpemUtcHJvcG9ydGlvbmFsKSBgcmVhZEJpbmFyeWAgbmV2ZXIgcnVucy4gQ29uc3VtZXJzIHRoYXQgbWF5IGNhbGwgdGhpcyBtb3JlIHRoYW5cbiAgICogb25jZSBzaG91bGQgbWVtb2l6ZSB0aGUgZmlyc3QgY2FsbC4gYG51bGxgIHdoZW4gdGhlcmUgaXMgbm8gYXR0YWNobWVudCBmaWxlIHRvIHJlYWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQ6ICgoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPikgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGR1cGxpY2F0ZSBjaGVjayBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBnZW5lcmF0ZWQgYXR0YWNobWVudCBmaWxlIG5hbWUgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyByZWdpc3RyeSBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIGRlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQ6XG4gKiB0aGF0IHBsdWdpbiBzaGlwcyBpdHMgc3VyZmFjZSBhcyBhIGhhbmQtd3JpdHRlbiBgYXBpLmQudHNgLCBub3QgYXMgYSBwYWNrYWdlIChzZWUgcnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKi9cbmludGVyZmFjZSBDdXN0b21BdHRhY2htZW50TG9jYXRpb25BdHRhY2htZW50UGF0aEFwaSB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgZnVsbCBhdHRhY2htZW50LXBhdGggcmVzb2x2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2FtZSBmaWVsZHMgYXMge0BsaW5rIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRnVuY3Rpb25QYXJhbXN9LCB3aGljaCB0aGVcbiAgICogICBwbHVnaW4gZGVjbGFyZXMgZmllbGQgZm9yIGZpZWxkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdHRhY2htZW50J3MgcGF0aCBmcm9tIHRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzOiAocGFyYW1zOiBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgZGVzaWduYXRlZCBhIGZvbGRlciBhbiBhdHRhY2htZW50IHVuaXQgZm9sZGVyLiBTeW5jaHJvbm91cyBvbiBwdXJwb3NlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZm9sZGVyIGlzIGRlc2lnbmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBpc0F0dGFjaG1lbnRVbml0Rm9sZGVyOiAocGFyYW1zOiBDdXN0b21BdHRhY2htZW50TG9jYXRpb25Jc0F0dGFjaG1lbnRVbml0Rm9sZGVyUGFyYW1zKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDdXN0b21BdHRhY2htZW50TG9jYXRpb25BdHRhY2htZW50UGF0aEFwaS5pc0F0dGFjaG1lbnRVbml0Rm9sZGVyfS5cbiAqL1xuaW50ZXJmYWNlIEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbklzQXR0YWNobWVudFVuaXRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZvbGRlciwgYXMgYSB2YXVsdC1yZWxhdGl2ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCBwdWJsaXNoZXMgaXRzIEFQSSB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX1BMVUdJTl9JRCA9ICdvYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbic7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3RcbiAqIHRvIGNhcnJ5IHRoZSB0d28gYXR0YWNobWVudC1wYXRoIG1ldGhvZHMuXG4gKi9cbmNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfVkVSU0lPTl9SQU5HRSA9ICdeMS4zLjAnO1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCBvZiB0aGUgbWVtYmVycyBvZiBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gJ3MgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBzbyBhIHJlY29yZCB0aGF0IGxhY2tzXG4gKiBlaXRoZXIgaXMgcGFzc2VkIG92ZXIsIGFuZCBhIHBheWxvYWQgdGhhdCBicmVha3MgaXRzIHNpZ25hdHVyZSBpcyByZXBvcnRlZCB3aGlsZSB0aGUgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBkZWJ1ZyBzd2l0Y2ggaXMgb24uXG4gKlxuICogQSBjb3B5IG9mIHRob3NlIHR3byBlbnRyaWVzIG9mIGBDVVNUT01fQVRUQUNITUVOVF9MT0NBVElPTl9BUElfQ09OVFJBQ1RgLCB3aGljaCBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gIHNoaXBzIGFzIGl0cyByb290IGBhcGktY29udHJhY3QudHNgXG4gKiBhbmQgcHVibGlzaGVzLiBLZWVwIHRoZSBndWFyZHMgaW4gYWdyZWVtZW50IHdpdGggdGhhdCBmaWxlLCBzbyB0aGUgcHJvdmlkZXIgYW5kIHRoaXMgY29uc3VtZXIgY2hlY2sgb25lIGRlZmluaXRpb24uXG4gKi9cbmNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfQ09OVFJBQ1Q6IEFwaUNvbnRyYWN0PEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkF0dGFjaG1lbnRQYXRoQXBpPiA9IHtcbiAgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzOiB7XG4gICAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGFyYW1zOiBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zXT4oW3tcbiAgICAgIGV4cGVjdGVkOiAnYXZhaWxhYmxlLXBhdGgtZm9yLWF0dGFjaG1lbnRzIHBhcmFtcycsXG4gICAgICB0eXBlR3VhcmQ6IGlzR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGdW5jdGlvblBhcmFtc1xuICAgIH1dKSxcbiAgICBvdXRwdXQ6IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IGV4cGVjdGVkOiAnYW4gYXR0YWNobWVudCBwYXRoJywgdHlwZUd1YXJkOiBpc1N0cmluZyB9KVxuICB9LFxuICBpc0F0dGFjaG1lbnRVbml0Rm9sZGVyOiB7XG4gICAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGFyYW1zOiBDdXN0b21BdHRhY2htZW50TG9jYXRpb25Jc0F0dGFjaG1lbnRVbml0Rm9sZGVyUGFyYW1zXT4oW3tcbiAgICAgIGV4cGVjdGVkOiAnYXR0YWNobWVudC11bml0LWZvbGRlciBwYXJhbXM6IHsgZm9sZGVyUGF0aDogc3RyaW5nIH0nLFxuICAgICAgdHlwZUd1YXJkOiBpc0N1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbklzQXR0YWNobWVudFVuaXRGb2xkZXJQYXJhbXNcbiAgICB9XSksXG4gICAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH0pXG4gIH1cbn07XG5cbi8qKlxuICogRHVtbXkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX1BBVEggPSAnX19EVU1NWV9fJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXR0YWNobWVudEZpbGVQYXRoIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBnZW5lcmF0ZWQgYXR0YWNobWVudCBmaWxlIG5hbWUgYmUgc2tpcHBlZCwga2VlcGluZyB0aGUgYXR0YWNobWVudCdzIG93biBuYW1lLlxuICAgKlxuICAgKiBPbmx5IGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyByZXNvbHZlciBnZW5lcmF0ZXMgYSBuYW1lLCBzbyBvbmx5IGl0IHJlYWRzIHRoaXMgZmxhZy4gQSBjYWxsZXIgdGhhdCBrZWVwc1xuICAgKiBqdXN0IHRoZSBmb2xkZXIgb2YgdGhlIGFuc3dlciBzaG91bGQgc2V0IGl0OiB0aGUgZm9sZGVyIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZ2VuZXJhdGVkIG5hbWUsIGFuZCBnZW5lcmF0aW5nXG4gICAqIG9uZSBjYW4gd2FsayBldmVyeSBsaW5rIG9mIHRoZSBub3RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwR2VuZXJhdGVkQXR0YWNobWVudEZpbGVOYW1lPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBdHRhY2htZW50Rm9sZGVyUGF0aEZvckF0dGFjaG1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhlIGF0dGFjaG1lbnQgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXR0YWNobWVudEZvbGRlclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aFN5bmNPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGhhc093bkF0dGFjaG1lbnRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc093bkF0dGFjaG1lbnRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNBdFByb3BlckF0dGFjaG1lbnRQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEF0dGFjaG1lbnRGaWxlUGF0aFN5bmN9LlxuICovXG5pbnRlcmZhY2UgR2V0QXR0YWNobWVudEZpbGVQYXRoU3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1N5bmN9LlxuICovXG5pbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGJhc2UgbmFtZSBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVBdHRhY2htZW50Rm9sZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVBdHRhY2htZW50Rm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byBhdHRhY2ggdG8uXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIGF0dGFjaG1lbnQgZm9sZGVyIGEgbm90ZSByZXNvbHZlcyB0bywgYmVmb3JlIHRoZSBhdHRhY2htZW50IGZpbGUgbmFtZSBpcyBhcHBlbmRlZC5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVBdHRhY2htZW50Rm9sZGVyUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBhdHRhY2htZW50IGZvbGRlciwgb3IgYG51bGxgIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHZhdWx0IHlldC5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogbnVsbCB8IFRGb2xkZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBub3JtYWxpemVkIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGgsIHdoZXRoZXIgb3Igbm90IHRoZSBmb2xkZXIgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydCBvZiB0aGUgYGF0dGFjaG1lbnRGb2xkZXJQYXRoYCBzZXR0aW5nIHRoYXQgZm9sbG93cyBgLi9gLCBvciBgbnVsbGAgd2hlbiB0aGUgc2V0dGluZyBpcyBub3RcbiAgICogcmVsYXRpdmUgdG8gdGhlIG5vdGUuIE9ubHkgYSByZWxhdGl2ZSBzZXR0aW5nIG1heSBoYXZlIGl0cyBtaXNzaW5nIGZvbGRlciBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZmlsZSBwYXRoIGZvciBhbiBhdHRhY2htZW50IHdpdGhpbiBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXR0YWNobWVudCBmaWxlIHBhdGggZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWxlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50RmlsZVBhdGgocGFyYW1zOiBHZXRBdHRhY2htZW50RmlsZVBhdGhQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaSA9IGZpbmRDdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkoKTtcbiAgaWYgKCFjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkpIHtcbiAgICAvLyBOb2JvZHkgb3ZlcnJpZGVzIHRoZSByZXNvbHV0aW9uLCBzbyBpdCBpcyBlbnRpcmVseSBzeW5jaHJvbm91cy5cbiAgICAvLyBUaGUgc2FtZSBjb3JlIGFuc3dlcnMgYGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbGAsIHdoaWNoIGlzIHdoYXQga2VlcHMgdGhlIHR3byBpbiBzdGVwLlxuICAgIHJldHVybiBnZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jKHtcbiAgICAgIGFwcCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2tcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudFBhdGggfSk7XG5cbiAgcmV0dXJuIGF3YWl0IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaS5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoe1xuICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLnNsaWNlKDEpLFxuICAgIGF0dGFjaG1lbnRGaWxlU3RhdHM6IGF0dGFjaG1lbnRGaWxlPy5zdGF0LFxuICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgIG9sZE5vdGVQYXRoT3JGaWxlOiBwYXJhbXMub2xkTm90ZVBhdGhPckZpbGUsXG4gICAgcmVhZEF0dGFjaG1lbnRGaWxlQ29udGVudDogYXR0YWNobWVudEZpbGUgPyAoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4gYXBwLnZhdWx0LnJlYWRCaW5hcnkoYXR0YWNobWVudEZpbGUpIDogbnVsbCxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2ssXG4gICAgc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZTogcGFyYW1zLnNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWUgPz8gZmFsc2UsXG4gICAgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoIGZvciBhIGdpdmVuIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChwYXJhbXM6IEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBhcmVudEZvbGRlclBhdGgoXG4gICAgYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgIGFwcCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBub3RlUGF0aE9yRmlsZSxcbiAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBEVU1NWV9QQVRILFxuICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlLFxuICAgICAgc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZTogdHJ1ZVxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmb2xkZXIgYSBnaXZlbiBhdHRhY2htZW50IG9mIGEgbm90ZSBiZWxvbmdzIGluLCB3aXRob3V0IGdlbmVyYXRpbmcgdGhlIGF0dGFjaG1lbnQncyBuYW1lLlxuICpcbiAqIFRoaXMgaXMgdGhlIHF1ZXN0aW9uIGEgY2FsbGVyIGp1ZGdpbmcgb25seSBXSEVSRSBhbiBhdHRhY2htZW50IHNob3VsZCBiZSBhc2tzLiBJdCBpcyBjaGVhcGVyIHRoYW4gdGFraW5nIHRoZVxuICogZm9sZGVyIG9mIHtAbGluayBnZXRBdHRhY2htZW50RmlsZVBhdGh9J3MgYW5zd2VyLCBiZWNhdXNlIGl0IHNldHNcbiAqIHtAbGluayBHZXRBdHRhY2htZW50RmlsZVBhdGhQYXJhbXMuc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZX0sIHNvIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAgc2tpcHNcbiAqIGdlbmVyYXRpbmcgYSBuYW1lLCB3aGljaCBjYW4gd2FsayBldmVyeSBsaW5rIG9mIHRoZSBub3RlLlxuICpcbiAqIFRoZSBhbnN3ZXIgY2FuIGRpZmZlciBmcm9tIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0ncywgd2hpY2ggYXNrcyBvbiBiZWhhbGYgb2YgYSBkdW1teSBhdHRhY2htZW50OiBhXG4gKiBmb2xkZXIgdGVtcGxhdGUgbWF5IHJlYWQgdGhlIGF0dGFjaG1lbnQncyBvd24gbmFtZSwgZXh0ZW5zaW9uIG9yIHN0YXRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF0dGFjaG1lbnQgZm9sZGVyIHBhdGggZm9yIGF0dGFjaG1lbnQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50KHBhcmFtczogR2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBhcmVudEZvbGRlclBhdGgoXG4gICAgYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgIGFwcCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBub3RlUGF0aE9yRmlsZSxcbiAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZSxcbiAgICAgIHNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWU6IHRydWVcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmb3IgYSBnaXZlbiBub3RlICoqc3luY2hyb25vdXNseSoqLCB3aGVuIHRoYXQgaXMgcG9zc2libGUgYXQgYWxsLlxuICpcbiAqIE9ic2lkaWFuIGJ1aWxkcyBpdHMgZmlsZS9mb2xkZXIgY29udGV4dCBtZW51cyBhbmQgZXZhbHVhdGVzIGEgY29tbWFuZCdzIGBjaGVja0NhbGxiYWNrYCBzeW5jaHJvbm91c2x5LCBzbyBhXG4gKiBjYWxsZXIgZGVjaWRpbmcgd2hldGhlciB0byBtZXJlbHkgKm9mZmVyKiBhIGNvbW1hbmQgY2Fubm90IGF3YWl0IHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0uIFRoaXMgaXNcbiAqIHRoZSBzeW5jaHJvbm91cyB0d2luIHN1Y2ggYSBjYWxsZXIgY2FuIHVzZSBpbnN0ZWFkLlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgYG51bGxgIHdoZW4gaXQgaXMgbm90IGtub3dhYmxlIHN5bmNocm9ub3VzbHkg4oCUIHRoYXQgaXMsIHdoZW4gYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCBwdWJsaXNoZXNcbiAqIGl0cyBhdHRhY2htZW50LXBhdGggQVBJIGFuZCB0aGVyZWZvcmUgb3ducyB0aGUgcmVzb2x1dGlvbiwgd2hpY2ggaXMgZ2VudWluZWx5IGFzeW5jaHJvbm91cy4gYG51bGxgIG1lYW5zIFwiYXNrIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH1cIiwgbmV2ZXIgXCJ0aGVyZSBpcyBubyBhdHRhY2htZW50XG4gKiBmb2xkZXJcIi4gT3RoZXJ3aXNlIHRoZSBhbnN3ZXIgaXMgZXhhY3QgcmF0aGVyIHRoYW4gYSBndWVzczogaXQgaXMgcHJvZHVjZWQgYnkgdGhlIHZlcnkgc2FtZSBjb2RlXG4gKiB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGh9IHJ1bnMsIHdob3NlIG9ubHkgYXN5bmNocm9ub3VzIHN0ZXAg4oCUIGNyZWF0aW5nIGEgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciDigJRcbiAqIGlzIHVucmVhY2hhYmxlIG9uIHRoaXMgcGF0aC5cbiAqXG4gKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gYGNvbnRleHRgIHBhcmFtZXRlcjoge0BsaW5rIEF0dGFjaG1lbnRQYXRoQ29udGV4dH0gb25seSBldmVyIHJlYWNoZXMgdGhhdCBwbHVnaW4nc1xuICogcmVzb2x2ZXIsIGFuZCB0aGlzIGZ1bmN0aW9uIGFuc3dlcnMgYG51bGxgIHdoZW5ldmVyIGl0IGlzIHB1Ymxpc2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZvbGRlciBwYXRoIHN5bmMgb3IgbnVsbCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoLCBvciBgbnVsbGAgd2hlbiBpdCBjYW4gb25seSBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbChwYXJhbXM6IEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbFBhcmFtcyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGZpbmRDdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkoKVxuICAgID8gbnVsbFxuICAgIDogcGFyZW50Rm9sZGVyUGF0aChnZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jKHtcbiAgICAgIGFwcCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IERVTU1ZX1BBVEgsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKHBhcmFtczogR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBub3RlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvblxuICB9ID0gcGFyYW1zO1xuXG4gIC8vIE1hdGVyaWFsaXppbmcgYSBtaXNzaW5nIGF0dGFjaG1lbnQgZm9sZGVyIGlzIHRoZSBPTkUgZ2VudWluZWx5IGFzeW5jaHJvbm91cyBzdGVwIGluIHRoaXMgZnVuY3Rpb24uXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBsaXZlcyBpbiB0aGUgc3luY2hyb25vdXMgY29yZSwgd2hpY2ggdGhlIHN5bmNocm9ub3VzIGVudHJ5IHBvaW50cyByZXVzZSB2ZXJiYXRpbS5cbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IHJlc29sdmVBdHRhY2htZW50Rm9sZGVyKHsgYXBwLCBub3RlUGF0aE9yRmlsZSB9KTtcbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyLmZvbGRlciAmJiBhdHRhY2htZW50Rm9sZGVyLnJlbGF0aXZlUGF0aCAmJiAhc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24pIHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKGF0dGFjaG1lbnRGb2xkZXIucGF0aCk7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luYyhwYXJhbXMpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBhdHRhY2htZW50LXVuaXQtZm9sZGVyIGRlc2lnbmF0aW9uIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAgcHVibGlzaGVzIHRocm91Z2ggaXRzIHBsdWdpbiBBUEkuXG4gKlxuICogVGhlIGRlc2lnbmF0aW9uIGlzIG9uZSBwbHVnaW4ncyBzZXR0aW5nIGJ1dCBldmVyeSByZWxvY2F0aW5nIHBsdWdpbidzIGJ1c2luZXNzLCBzbyBpdCBpcyByZWFkIGZyb20gdGhlIHNhbWVcbiAqIEFQSSB0aGF0IGFuc3dlcnMgdGhlIGF0dGFjaG1lbnQgcGF0aCBpdHNlbGYuIFJlYWRpbmcgaXQgaGVyZSByYXRoZXIgdGhhbiBoYXZpbmcgZWFjaCBjYWxsZXIgbG9vayBmb3IgdGhlXG4gKiBwbHVnaW4gaXMgdGhlIHBvaW50IOKAlCBhIGZvbGRlciBrZXB0IHdob2xlIGJ5IG9uZSBwbHVnaW4gYW5kIHRvcm4gYXBhcnQgYnkgYW5vdGhlciBpcyBleGFjdGx5IHRoZSBmYWlsdXJlXG4gKiBgZmluZEF0dGFjaG1lbnRVbml0Rm9sZGVyUGF0aGAgZXhpc3RzIHRvIHByZXZlbnQuXG4gKlxuICogYHVuZGVmaW5lZGAgbWVhbnMgbm9ib2R5IHB1Ymxpc2hlZCBhIGRlc2lnbmF0aW9uLCB0aGUgc2FtZSBcIm5vYm9keSBvd25zIHRoaXMgcG9saWN5XCIgYW5zd2VyIHRoYXQgc2VuZHNcbiAqIHtAbGluayBnZXRBdHRhY2htZW50RmlsZVBhdGh9IHRvIE9ic2lkaWFuJ3Mgb3duIHJlc29sdXRpb24uIEl0IGlzIGRpc3RpbmN0IGZyb20gYSBkZXNpZ25hdGlvbiB0aGF0IGFuc3dlcnNcbiAqIGBmYWxzZWAgZm9yIGV2ZXJ5IGZvbGRlci5cbiAqXG4gKiBUaGUgcmVnaXN0cnkgaXMgbG9va2VkIHVwIG9uY2UsIHdoZW4gdGhpcyBpcyBjYWxsZWQsIHNvIGEgY2FsbGVyIHdhbGtpbmcgYSBmb2xkZXIncyBhbmNlc3RvcnMgYXNrcyB0aGUgc2FtZVxuICogQVBJIGFsbCB0aGUgd2F5IHVwLlxuICpcbiAqIEBwYXJhbSBfYXBwIC0gQW4gT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuIFVudXNlZCBzaW5jZSB0aGUgYW5zd2VyIGNvbWVzIGZyb20gdGhlIHBsdWdpbiBBUEkgcmVnaXN0cnk7XG4gKiAgIGtlcHQgc28gZXhpc3RpbmcgY2FsbGVycyBjb21waWxlIHVuY2hhbmdlZC5cbiAqIEByZXR1cm5zIFRoZSBkZXNpZ25hdGlvbiBwcmVkaWNhdGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9ib2R5IHB1Ymxpc2hlZCBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGVja0lzQXR0YWNobWVudFVuaXRGb2xkZXJGdW5jdGlvbihfYXBwOiBBcHApOiAoKGZvbGRlclBhdGg6IHN0cmluZykgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQge1xuICBjb25zdCBjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkgPSBmaW5kQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uQXBpKCk7XG4gIHJldHVybiBjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGlcbiAgICA/IChmb2xkZXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaS5pc0F0dGFjaG1lbnRVbml0Rm9sZGVyKHsgZm9sZGVyUGF0aCB9KVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgbm90ZSdzIGF0dGFjaG1lbnQgZm9sZGVyIGlzIHNwZWNpZmljIHRvIHRoYXQgbm90ZSByYXRoZXIgdGhhbiBzaGFyZWQgd2l0aCBpdHMgc2libGluZ3MuXG4gKlxuICogVGhlIGFuc3dlciBpcyBkZXJpdmVkIGJ5IGNvbXBhcmluZyB0aGUgbm90ZSdzIGF0dGFjaG1lbnQgZm9sZGVyIHdpdGggdGhlIG9uZSBhIHNhbWUtZm9sZGVyIHNpYmxpbmcgbm90ZVxuICogd291bGQgZ2V0OiB0aGV5IGRpZmZlciBvbmx5IHdoZW4gdGhlIGZvbGRlciBkZXBlbmRzIG9uIHRoZSBub3RlJ3MgTkFNRS4gRXZlcnkgYnVpbHQtaW5cbiAqIGBhdHRhY2htZW50Rm9sZGVyUGF0aGAgbW9kZSDigJQgdGhlIHZhdWx0IHJvb3QsIGEgZml4ZWQgZm9sZGVyLCB0aGUgbm90ZSdzIG93biBmb2xkZXIgKGAuL2ApLCBhIHN1YmZvbGRlciBvZlxuICogdGhlIG5vdGUncyBmb2xkZXIgKGAuL3N1YmApIOKAlCBpcyBzaGFyZWQgYnkgZXZlcnkgbm90ZSBpbiB0aGF0IGZvbGRlciwgc28gaXQgYW5zd2VycyBgZmFsc2VgOyBgdHJ1ZWAgYXJpc2VzXG4gKiBmcm9tIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyByZXNvbHZlciBkZXJpdmluZyB0aGUgZm9sZGVyIGZyb20gdGhlIG5vdGUncyBuYW1lLlxuICpcbiAqIFRoaXMgaXMgdGhlIGRpc3RpbmN0aW9uIGEgY2FsbGVyIG5lZWRzIGJlZm9yZSBzd2VlcGluZyBhbiBhdHRhY2htZW50IGZvbGRlciB3aG9sZXNhbGU6IG9ubHkgYVxuICogbm90ZS1zcGVjaWZpYyBmb2xkZXIgY2FuIGJlIHRyZWF0ZWQgYXMgYmVsb25naW5nIHRvIHRoZSBub3RlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaGFzIG93biBhdHRhY2htZW50IGZvbGRlciBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbm90ZSBoYXMgaXRzIG93biBhdHRhY2htZW50IGZvbGRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhc093bkF0dGFjaG1lbnRGb2xkZXIocGFyYW1zOiBIYXNPd25BdHRhY2htZW50Rm9sZGVyUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGV4dCA9IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3duLFxuICAgIHBhdGhcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IHBhdGhcbiAgfSk7XG4gIGNvbnN0IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCh7XG4gICAgYXBwLFxuICAgIGNvbnRleHQsXG4gICAgbm90ZVBhdGhPckZpbGU6IGpvaW4oZGlybmFtZShwYXRoKSwgYCR7RFVNTVlfUEFUSH0uJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gKVxuICB9KTtcbiAgcmV0dXJuIGF0dGFjaG1lbnRGb2xkZXJQYXRoICE9PSBkdW1teUF0dGFjaG1lbnRGb2xkZXJQYXRoO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGFuIGF0dGFjaG1lbnQgYWxyZWFkeSBzaXRzIGF0IGl0cyBwcm9wZXIgYXR0YWNobWVudCBwYXRoLlxuICpcbiAqIFJldHVybnMgYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQncyBjdXJyZW50IHBhdGggaXMsIHdpdGhpbiBpdHMgcHJvcGVyIGF0dGFjaG1lbnQgZm9sZGVyLCBlaXRoZXIgdGhlIHByb3BlclxuICogYmFzZSBuYW1lIG9yIHRoZSBwcm9wZXIgYmFzZSBuYW1lIHBsdXMgYW4gT2JzaWRpYW4gZGVkdXBsaWNhdGlvbiBzdWZmaXggKGEgc3BhY2UgZm9sbG93ZWQgYnkgZGlnaXRzLCBlLmcuXG4gKiBgaW1nIDFgKSB3aXRoIHRoZSBzYW1lIGV4dGVuc2lvbi4gVGhlIHByb3BlciBwYXRoIGlzIGNvbXB1dGVkIHZpYSB7QGxpbmsgZ2V0QXR0YWNobWVudEZpbGVQYXRofSB3aXRoXG4gKiB7QGxpbmsgR2V0QXR0YWNobWVudEZpbGVQYXRoUGFyYW1zLnNob3VsZFNraXBEdXBsaWNhdGVDaGVja30gc2V0IHRvIGB0cnVlYCAodGhlIHRhcmdldCBiZWZvcmUgYW55XG4gKiBkZWR1cGxpY2F0aW9uIHN1ZmZpeCksIGFuZCB0aGUgY29tcGFyaXNvbiByZXNwZWN0cyB0aGUgZmlsZSBzeXN0ZW0gY2FzZS1zZW5zaXRpdml0eSBmbGFnXG4gKiAoYGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZWApIHRoYXQgYGdldFNhZmVSZW5hbWVQYXRoYCB1c2VzLlxuICpcbiAqIFRoaXMgbGV0cyBhIGNhbGxlciByZWNvZ25pemUgYSBkZWR1cGxpY2F0aW9uLXBhcmtlZCBhdHRhY2htZW50IGFzIGFscmVhZHktY29sbGVjdGVkLCBzbyBhIFwibmVlZHMgbW92ZT9cIlxuICogZGVjaXNpb24gbWFkZSBhZ2FpbnN0IHRoZSBkZWR1cGxpY2F0aW9uLWZyZWUgcHJvcGVyIHBhdGggY29udmVyZ2VzIGluc3RlYWQgb2YgcmUtc2NoZWR1bGluZyB0aGUgZmlsZSBmb3JldmVyLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgaXMgYXQgcHJvcGVyIGF0dGFjaG1lbnQgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIHdoZW4gdGhlIGF0dGFjaG1lbnQgaXMgYWxyZWFkeSBhdCBpdHMgcHJvcGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpc0F0UHJvcGVyQXR0YWNobWVudFBhdGgocGFyYW1zOiBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcblxuICBjb25zdCBjdXJyZW50UGF0aCA9IGdldFBhdGgoYXBwLCBhdHRhY2htZW50UGF0aE9yRmlsZSk7XG4gIGNvbnN0IHByb3BlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgIGFwcCxcbiAgICBjb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgfSk7XG5cbiAgY29uc3QgaXNJbnNlbnNpdGl2ZSA9IGdldERhdGFBZGFwdGVyRXgoYXBwKS5pbnNlbnNpdGl2ZTtcblxuICBmdW5jdGlvbiBmb2xkKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBpc0luc2Vuc2l0aXZlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlO1xuICB9XG5cbiAgaWYgKGZvbGQoZGlybmFtZShjdXJyZW50UGF0aCkpICE9PSBmb2xkKGRpcm5hbWUocHJvcGVyUGF0aCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4dGVuc2lvbiA9IGV4dG5hbWUoY3VycmVudFBhdGgpO1xuICBjb25zdCBwcm9wZXJFeHRlbnNpb24gPSBleHRuYW1lKHByb3BlclBhdGgpO1xuICBpZiAoZm9sZChjdXJyZW50RXh0ZW5zaW9uKSAhPT0gZm9sZChwcm9wZXJFeHRlbnNpb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEJhc2VOYW1lID0gYmFzZW5hbWUoY3VycmVudFBhdGgsIGN1cnJlbnRFeHRlbnNpb24pO1xuICBjb25zdCBwcm9wZXJCYXNlTmFtZSA9IGJhc2VuYW1lKHByb3BlclBhdGgsIHByb3BlckV4dGVuc2lvbik7XG5cbiAgaWYgKGZvbGQoY3VycmVudEJhc2VOYW1lKSA9PT0gZm9sZChwcm9wZXJCYXNlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25QcmVmaXggPSBgJHtwcm9wZXJCYXNlTmFtZX0gYDtcbiAgaWYgKCFmb2xkKGN1cnJlbnRCYXNlTmFtZSkuc3RhcnRzV2l0aChmb2xkKGRlZHVwbGljYXRpb25QcmVmaXgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlZHVwbGljYXRpb25TdWZmaXggPSBjdXJyZW50QmFzZU5hbWUuc2xpY2UoZGVkdXBsaWNhdGlvblByZWZpeC5sZW5ndGgpO1xuICByZXR1cm4gL15cXGQrJC8udGVzdChkZWR1cGxpY2F0aW9uU3VmZml4KTtcbn1cblxuLyoqXG4gKiBGaW5kcyBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gJ3MgYXR0YWNobWVudC1wYXRoIEFQSSBpbiB0aGUgcGx1Z2luIEFQSSByZWdpc3RyeS4gSXRzIHByZXNlbmNlIGlzIHRoZVxuICogc3luY2hyb25vdXMgcHJvYmUgZm9yIFwic29tZWJvZHkgZWxzZSBvd25zIHRoZSByZXNvbHV0aW9uXCIuXG4gKlxuICogQHJldHVybnMgVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gdGhhdCBwbHVnaW4gcHVibGlzaGVzIG5vIHJlY29yZCBzYXRpc2Z5aW5nIHRoZSByYW5nZSBhbmQgY29udHJhY3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRDdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkoKTogQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uQXR0YWNobWVudFBhdGhBcGkgfCBudWxsIHtcbiAgcmV0dXJuIGZpbmRQbHVnaW5BcGk8Q3VzdG9tQXR0YWNobWVudExvY2F0aW9uQXR0YWNobWVudFBhdGhBcGk+KHtcbiAgICBhcGlWZXJzaW9uUmFuZ2U6IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfVkVSU0lPTl9SQU5HRSxcbiAgICBjb250cmFjdDogQ1VTVE9NX0FUVEFDSE1FTlRfTE9DQVRJT05fQVRUQUNITUVOVF9QQVRIX0FQSV9DT05UUkFDVCxcbiAgICBwbHVnaW5JZDogQ1VTVE9NX0FUVEFDSE1FTlRfTE9DQVRJT05fUExVR0lOX0lEXG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBnZXRBdHRhY2htZW50RmlsZVBhdGh9LCByZWFjaGVkIHdoZW4gYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCBwdWJsaXNoZXMgbm9cbiAqIGF0dGFjaG1lbnQtcGF0aCBBUEkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXR0YWNobWVudCBmaWxlIHBhdGggc3luYyBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aFN5bmMocGFyYW1zOiBHZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBub3RlUGF0aE9yRmlsZSxcbiAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2tcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYXR0YWNobWVudFBhdGggPSBnZXRQYXRoKGFwcCwgb2xkQXR0YWNobWVudFBhdGhPckZpbGUpO1xuICBjb25zdCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbiA9IGV4dG5hbWUoYXR0YWNobWVudFBhdGgpO1xuXG4gIHJldHVybiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNTeW5jKHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVCYXNlTmFtZTogYmFzZW5hbWUoYXR0YWNobWVudFBhdGgsIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uKSxcbiAgICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogYXR0YWNobWVudEZpbGVFeHRlbnNpb24uc2xpY2UoMSksXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrXG4gIH0pO1xufVxuXG4vKipcbiAqIFRoZSBzeW5jaHJvbm91cyBjb3JlIG9mIHtAbGluayBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHN9LCB3aGljaCBjYW5ub3QgY3JlYXRlIGEgbWlzc2luZyBhdHRhY2htZW50XG4gKiBmb2xkZXIuIEl0cyBjYWxsZXIgY3JlYXRlcyB0aGUgZm9sZGVyIGZpcnN0IHdoZW4gdGhhdCBpcyB3YW50ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzIHN5bmMgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICovXG5mdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNTeW5jKHBhcmFtczogR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luY1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb24sXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSByZXNvbHZlQXR0YWNobWVudEZvbGRlcih7IGFwcCwgbm90ZVBhdGhPckZpbGUgfSk7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUgPSBub3JtYWxpemVTdHJpbmcobm9ybWFsaXplU2xhc2hlcyhwYXJhbXMuYXR0YWNobWVudEZpbGVCYXNlTmFtZSkpO1xuXG4gIC8vIEEgZm9sZGVyIHRoYXQgZG9lcyBub3QgZXhpc3QgeWV0IHN0aWxsIG93bnMgdGhlIGF0dGFjaG1lbnQgcGF0aC5cbiAgLy8gUmVzb2x2aW5nIGl0IGFzIGEgbm9uLWV4aXN0aW5nIGZvbGRlciBzdG9wcyB0aGUgYW5zd2VyIGZyb20gY29sbGFwc2luZyB0byB0aGUgdmF1bHQgcm9vdC5cbiAgY29uc3QgZm9sZGVyID0gYXR0YWNobWVudEZvbGRlci5mb2xkZXIgPz8gZ2V0Rm9sZGVyKHsgYXBwLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXIucGF0aCwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuXG4gIGNvbnN0IHByZWZpeCA9IGZvbGRlci5nZXRQYXJlbnRQcmVmaXgoKTtcbiAgcmV0dXJuIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICAgID8gbWFrZUZpbGVOYW1lKHtcbiAgICAgIGZpbGVCYXNlTmFtZTogcHJlZml4ICsgYXR0YWNobWVudEZpbGVCYXNlTmFtZSxcbiAgICAgIGZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uXG4gICAgfSlcbiAgICA6IGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uKTtcbn1cblxuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcbn1cblxuZnVuY3Rpb24gaXNDdXN0b21BdHRhY2htZW50TG9jYXRpb25Jc0F0dGFjaG1lbnRVbml0Rm9sZGVyUGFyYW1zKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uSXNBdHRhY2htZW50VW5pdEZvbGRlclBhcmFtcyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2ZvbGRlclBhdGgnKSA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzRmlsZVN0YXRzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRmlsZVN0YXRzIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ2N0aW1lJykgPT09ICdudW1iZXInXG4gICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAnbXRpbWUnKSA9PT0gJ251bWJlcidcbiAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdzaXplJykgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc0dldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRnVuY3Rpb25QYXJhbXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkKGtleToga2V5b2YgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGdW5jdGlvblBhcmFtcyk6IHVua25vd24ge1xuICAgIHJldHVybiBSZWZsZWN0LmdldCh2YWx1ZSBhcyBvYmplY3QsIGtleSk7XG4gIH1cblxuICBjb25zdCBhdHRhY2htZW50RmlsZVN0YXRzID0gcmVhZCgnYXR0YWNobWVudEZpbGVTdGF0cycpO1xuICBjb25zdCBjb250ZXh0ID0gcmVhZCgnY29udGV4dCcpO1xuICBjb25zdCBub3RlUGF0aE9yRmlsZSA9IHJlYWQoJ25vdGVQYXRoT3JGaWxlJyk7XG4gIGNvbnN0IG9sZE5vdGVQYXRoT3JGaWxlID0gcmVhZCgnb2xkTm90ZVBhdGhPckZpbGUnKTtcbiAgY29uc3QgcmVhZEF0dGFjaG1lbnRGaWxlQ29udGVudCA9IHJlYWQoJ3JlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQnKTtcbiAgcmV0dXJuIHR5cGVvZiByZWFkKCdhdHRhY2htZW50RmlsZUJhc2VOYW1lJykgPT09ICdzdHJpbmcnXG4gICAgJiYgdHlwZW9mIHJlYWQoJ2F0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uJykgPT09ICdzdHJpbmcnXG4gICAgJiYgKGF0dGFjaG1lbnRGaWxlU3RhdHMgPT09IHVuZGVmaW5lZCB8fCBpc0ZpbGVTdGF0cyhhdHRhY2htZW50RmlsZVN0YXRzKSlcbiAgICAmJiBPYmplY3QudmFsdWVzKEF0dGFjaG1lbnRQYXRoQ29udGV4dCkuaW5jbHVkZXMoY29udGV4dClcbiAgICAmJiAobm90ZVBhdGhPckZpbGUgPT09IG51bGwgfHwgaXNQYXRoT3JGaWxlKG5vdGVQYXRoT3JGaWxlKSlcbiAgICAmJiBpc1BhdGhPckZpbGUocmVhZCgnb2xkQXR0YWNobWVudFBhdGhPckZpbGUnKSlcbiAgICAmJiAob2xkTm90ZVBhdGhPckZpbGUgPT09IHVuZGVmaW5lZCB8fCBpc1BhdGhPckZpbGUob2xkTm90ZVBhdGhPckZpbGUpKVxuICAgICYmIChyZWFkQXR0YWNobWVudEZpbGVDb250ZW50ID09PSBudWxsIHx8IHR5cGVvZiByZWFkQXR0YWNobWVudEZpbGVDb250ZW50ID09PSAnZnVuY3Rpb24nKVxuICAgICYmIGlzT3B0aW9uYWxCb29sZWFuKHJlYWQoJ3Nob3VsZFNraXBEdXBsaWNhdGVDaGVjaycpKVxuICAgICYmIGlzT3B0aW9uYWxCb29sZWFuKHJlYWQoJ3Nob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWUnKSlcbiAgICAmJiBpc09wdGlvbmFsQm9vbGVhbihyZWFkKCdzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbicpKTtcbn1cbmZ1bmN0aW9uIGlzT3B0aW9uYWxCb29sZWFuKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGlzQm9vbGVhbih2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGggYnkgY29tYmluaW5nIG11bHRpcGxlIHNsYXNoZXMgaW50byBhIHNpbmdsZSBzbGFzaCBhbmQgcmVtb3ZpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFBhdGggdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2xhc2hlcyhwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBwYXRoID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogcGF0aCxcbiAgICByZXBsYWNlcjogJy8nLFxuICAgIHNlYXJjaFZhbHVlOiAvKD86W1xcXFwvXSkrL2dcbiAgfSk7XG4gIHBhdGggPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBwYXRoLFxuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogL15cXC8rfFxcLyskL2dcbiAgfSk7XG4gIHJldHVybiBwYXRoIHx8ICcvJztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgYGF0dGFjaG1lbnRGb2xkZXJQYXRoYCBzZXR0aW5nIGFnYWluc3QgYSBub3RlIGludG8gYSBjb25jcmV0ZSBhdHRhY2htZW50IGZvbGRlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIHJlc29sdmUgYXR0YWNobWVudCBmb2xkZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgYXR0YWNobWVudCBmb2xkZXIuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVBdHRhY2htZW50Rm9sZGVyKHBhcmFtczogUmVzb2x2ZUF0dGFjaG1lbnRGb2xkZXJQYXJhbXMpOiBSZXNvbHZlQXR0YWNobWVudEZvbGRlclJlc3VsdCB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgLy8gYGdldENvbmZpZ2AgZmFsbHMgYmFjayB0byBPYnNpZGlhbidzIGRlZmF1bHQgZm9yIGEga2V5IHRoZSB1c2VyIG5ldmVyIHNldCwgc28gaXQgYWx3YXlzIGhhcyBhIHZhbHVlIGhlcmUuXG4gIGxldCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IGVuc3VyZU5vbk51bGxhYmxlKGFwcC52YXVsdC5nZXRDb25maWcoJ2F0dGFjaG1lbnRGb2xkZXJQYXRoJykpO1xuICBjb25zdCBpc0N1cnJlbnRGb2xkZXIgPSBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4nIHx8IGF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSAnLi8nO1xuICBjb25zdCByZWxhdGl2ZVBhdGggPSBhdHRhY2htZW50Rm9sZGVyUGF0aC5zdGFydHNXaXRoKCcuLycpXG4gICAgPyB0cmltU3RhcnQoe1xuICAgICAgJHN0cmluZzogYXR0YWNobWVudEZvbGRlclBhdGgsXG4gICAgICBwcmVmaXg6ICcuLydcbiAgICB9KVxuICAgIDogbnVsbDtcblxuICAvLyBBIG5vdGUgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQgKGEgcmVuYW1lIHRhcmdldCwgYSBkdW1teSBzaWJsaW5nKSBzdGlsbCBiZWxvbmdzIHRvIGl0cyBvd24gZm9sZGVyLlxuICAvLyBNYXRlcmlhbGl6aW5nIGl0IGZyb20gaXRzIHBhdGgga2VlcHMgdGhhdCBmb2xkZXIsIHdoZXJlIGEgdmF1bHQgbG9va3VwIHdvdWxkIGZhbGwgYmFjayB0byB0aGUgcm9vdC5cbiAgLy8gT25seSBhbiBleHBsaWNpdGx5IG5vdGUtbGVzcyBhdHRhY2htZW50IHJlc29sdmVzIHRvIHRoZSB2YXVsdCByb290LlxuICBjb25zdCBub3RlRmlsZU9yTnVsbCA9IG5vdGVQYXRoT3JGaWxlID09PSBudWxsXG4gICAgPyBudWxsXG4gICAgOiBnZXRGaWxlKHtcbiAgICAgIGFwcCxcbiAgICAgIHBhdGhPckZpbGU6IG5vdGVQYXRoT3JGaWxlLFxuICAgICAgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlXG4gICAgfSk7XG5cbiAgaWYgKGlzQ3VycmVudEZvbGRlcikge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm90ZUZpbGVPck51bGwgPyBub3RlRmlsZU9yTnVsbC5wYXJlbnQ/LnBhdGggPz8gJycgOiAnJztcbiAgfSBlbHNlIGlmIChyZWxhdGl2ZVBhdGgpIHtcbiAgICBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IChub3RlRmlsZU9yTnVsbCA/IG5vdGVGaWxlT3JOdWxsLnBhcmVudD8uZ2V0UGFyZW50UHJlZml4KCkgPz8gJycgOiAnJykgKyByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IG5vcm1hbGl6ZVN0cmluZyhub3JtYWxpemVTbGFzaGVzKGF0dGFjaG1lbnRGb2xkZXJQYXRoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICBmb2xkZXI6IGdldEZvbGRlck9yTnVsbCh7IGFwcCwgaXNDYXNlSW5zZW5zaXRpdmU6IHRydWUsIHBhdGhPckZvbGRlcjogYXR0YWNobWVudEZvbGRlclBhdGggfSksXG4gICAgcGF0aDogYXR0YWNobWVudEZvbGRlclBhdGgsXG4gICAgcmVsYXRpdmVQYXRoXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWFBLDBCQUdPO0FBQ1Asa0JBTU87QUFDUCxvQkFJTztBQUNQLHlCQUFrQztBQUNsQyw2QkFHTztBQUlQLHlCQVFPO0FBQ1Asd0JBQThCO0FBS3ZCLElBQUssd0JBQUwsa0JBQUtBLDJCQUFMO0FBSUwsRUFBQUEsdUJBQUEsZ0JBQWE7QUFLYixFQUFBQSx1QkFBQSxnQkFBYTtBQUtiLEVBQUFBLHVCQUFBLGFBQVU7QUFkQSxTQUFBQTtBQUFBLEdBQUE7QUF3SEwsTUFBTSx1Q0FBdUM7QUFNcEQsTUFBTSwrREFBK0Q7QUFTckUsTUFBTSwwREFBa0g7QUFBQSxFQUN0SCxnQ0FBZ0M7QUFBQSxJQUM5QixXQUFPLDJDQUFzRixDQUFDO0FBQUEsTUFDNUYsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLElBQ2IsQ0FBQyxDQUFDO0FBQUEsSUFDRixZQUFRLDJDQUFzQixFQUFFLFVBQVUsc0JBQXNCLFdBQVcsU0FBUyxDQUFDO0FBQUEsRUFDdkY7QUFBQSxFQUNBLHdCQUF3QjtBQUFBLElBQ3RCLFdBQU8sMkNBQXNGLENBQUM7QUFBQSxNQUM1RixVQUFVO0FBQUEsTUFDVixXQUFXO0FBQUEsSUFDYixDQUFDLENBQUM7QUFBQSxJQUNGLFlB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LE1BQ3BELG1CQUFtQixZQUFRLGlDQUFhLGNBQWMsVUFDdkQsaUNBQWEsS0FBSyx5QkFBeUIsQ0FBQyxNQUMzQyxzQkFBc0IsY0FBYSxpQ0FBYSxpQkFBaUIsT0FDakUsOEJBQThCLFFBQVEsT0FBTyw4QkFBOEIsZUFDNUUsa0JBQWtCLEtBQUssMEJBQTBCLENBQUMsS0FDbEQsa0JBQWtCLEtBQUssdUNBQXVDLENBQUMsS0FDL0Qsa0JBQWtCLEtBQUssMkNBQTJDLENBQUM7QUFDMUU7QUFDQSxTQUFTLGtCQUFrQixPQUE4QztBQUN2RSxTQUFPLFVBQVUsVUFBYSxVQUFVLEtBQUs7QUFDL0M7QUFFQSxTQUFTLFNBQVMsT0FBaUM7QUFDakQsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFRQSxTQUFTLGlCQUFpQixNQUFzQjtBQUM5QyxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELGFBQU8sMEJBQVc7QUFBQSxJQUNoQixTQUFTO0FBQUEsSUFDVCxVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZixDQUFDO0FBQ0QsU0FBTyxRQUFRO0FBQ2pCO0FBUUEsU0FBUyx3QkFBd0IsUUFBc0U7QUFDckcsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBRUosTUFBSSwyQkFBdUIsc0NBQWtCLElBQUksTUFBTSxVQUFVLHNCQUFzQixDQUFDO0FBQ3hGLFFBQU0sa0JBQWtCLHlCQUF5QixPQUFPLHlCQUF5QjtBQUNqRixRQUFNLGVBQWUscUJBQXFCLFdBQVcsSUFBSSxRQUNyRCx5QkFBVTtBQUFBLElBQ1YsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLEVBQ1YsQ0FBQyxJQUNDO0FBS0osUUFBTSxpQkFBaUIsbUJBQW1CLE9BQ3RDLFdBQ0EsNEJBQVE7QUFBQSxJQUNSO0FBQUEsSUFDQSxZQUFZO0FBQUEsSUFDWiwwQkFBMEI7QUFBQSxFQUM1QixDQUFDO0FBRUgsTUFBSSxpQkFBaUI7QUFDbkIsMkJBQXVCLGlCQUFpQixlQUFlLFFBQVEsUUFBUSxLQUFLO0FBQUEsRUFDOUUsV0FBVyxjQUFjO0FBQ3ZCLDRCQUF3QixpQkFBaUIsZUFBZSxRQUFRLGdCQUFnQixLQUFLLEtBQUssTUFBTTtBQUFBLEVBQ2xHO0FBRUEsNkJBQXVCLCtCQUFnQixpQkFBaUIsb0JBQW9CLENBQUM7QUFFN0UsU0FBTztBQUFBLElBQ0wsWUFBUSxvQ0FBZ0IsRUFBRSxLQUFLLG1CQUFtQixNQUFNLGNBQWMscUJBQXFCLENBQUM7QUFBQSxJQUM1RixNQUFNO0FBQUEsSUFDTjtBQUFBLEVBQ0Y7QUFDRjsiLCJuYW1lcyI6WyJBdHRhY2htZW50UGF0aENvbnRleHQiXX0=
440
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdHRhY2htZW50LXBhdGgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwaUNvbnRyYWN0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRmlsZVN0YXRzLFxuICBURm9sZGVyXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgY3JlYXRlQXJndW1lbnRzU2NoZW1hLFxuICBjcmVhdGVUeXBlR3VhcmRTY2hlbWFcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FwaS1jb250cmFjdCc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgbWFrZUZpbGVOYW1lXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9wYXRoJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVN0cmluZyxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbVN0YXJ0XG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZ2V0RGF0YUFkYXB0ZXJFeCxcbiAgcGFyZW50Rm9sZGVyUGF0aFxufSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXIsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgZ2V0UGF0aCxcbiAgaXNQYXRoT3JGaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IGZpbmRQbHVnaW5BcGkgfSBmcm9tICcuL3BsdWdpbi9wbHVnaW4tYXBpLnRzJztcblxuLyoqXG4gKiBBIGNvbnRleHQgZm9yIGFuIGF0dGFjaG1lbnQgcGF0aC5cbiAqL1xuZXhwb3J0IGVudW0gQXR0YWNobWVudFBhdGhDb250ZXh0IHtcbiAgLyoqXG4gICAqIEEgY29udGV4dCBmb3IgYSBkZWxldGUgbm90ZS5cbiAgICovXG4gIERlbGV0ZU5vdGUgPSAnRGVsZXRlTm90ZScsXG5cbiAgLyoqXG4gICAqIEEgY29udGV4dCBmb3IgYSByZW5hbWUgbm90ZS5cbiAgICovXG4gIFJlbmFtZU5vdGUgPSAnUmVuYW1lTm90ZScsXG5cbiAgLyoqXG4gICAqIEFuIHVua25vd24gY29udGV4dC5cbiAgICovXG4gIFVua25vd24gPSAnVW5rbm93bidcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyBleHRlbmRlZCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgYmFzZSBuYW1lIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVCYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0YXRzIG9mIHRoZSBhdHRhY2htZW50IGZpbGUuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZVN0YXRzPzogRmlsZVN0YXRzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IG51bGwgfCBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb3IgZmlsZSBvZiB0aGUgb2xkIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9yIGZpbGUgb2YgdGhlIG9sZCBub3RlLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkTm90ZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBMYXppbHkgcmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIGF0dGFjaG1lbnQgZmlsZS5cbiAgICpcbiAgICogVGhlIGNvbnRlbnQgaXMgcmVhZCBvbiBkZW1hbmQgb25seSB3aGVuIGEgY29uc3VtZXIgYWN0dWFsbHkgbmVlZHMgdGhlIGJ5dGVzIChlLmcuIGEgdGVtcGxhdGVcbiAgICogdG9rZW4gdGhhdCBlbWJlZHMgdGhlbSkuIEZvciB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgbm90aGluZyBwdWxscyB0aGUgYnl0ZXMsIHNvIHRoZSBwb3RlbnRpYWxseVxuICAgKiBleHBlbnNpdmUgKHNpemUtcHJvcG9ydGlvbmFsKSBgcmVhZEJpbmFyeWAgbmV2ZXIgcnVucy4gQ29uc3VtZXJzIHRoYXQgbWF5IGNhbGwgdGhpcyBtb3JlIHRoYW5cbiAgICogb25jZSBzaG91bGQgbWVtb2l6ZSB0aGUgZmlyc3QgY2FsbC4gYG51bGxgIHdoZW4gdGhlcmUgaXMgbm8gYXR0YWNobWVudCBmaWxlIHRvIHJlYWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQ6ICgoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPikgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGR1cGxpY2F0ZSBjaGVjayBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBnZW5lcmF0ZWQgYXR0YWNobWVudCBmaWxlIG5hbWUgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyByZWdpc3RyeSBBUEkgdGhpcyBtb2R1bGUgY2FsbHMsIGRlY2xhcmVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wb3J0ZWQ6XG4gKiB0aGF0IHBsdWdpbiBzaGlwcyBpdHMgc3VyZmFjZSBhcyBhIGhhbmQtd3JpdHRlbiBgYXBpLmQudHNgLCBub3QgYXMgYSBwYWNrYWdlIChzZWUgcnVsZSBMOSBpbiBgQUdFTlRTLm1kYCkuXG4gKi9cbmludGVyZmFjZSBDdXN0b21BdHRhY2htZW50TG9jYXRpb25BdHRhY2htZW50UGF0aEFwaSB7XG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luJ3MgZnVsbCBhdHRhY2htZW50LXBhdGggcmVzb2x2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2FtZSBmaWVsZHMgYXMge0BsaW5rIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRnVuY3Rpb25QYXJhbXN9LCB3aGljaCB0aGVcbiAgICogICBwbHVnaW4gZGVjbGFyZXMgZmllbGQgZm9yIGZpZWxkLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdHRhY2htZW50J3MgcGF0aCBmcm9tIHRoZSB2YXVsdCByb290LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzOiAocGFyYW1zOiBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHVzZXIgZGVzaWduYXRlZCBhIGZvbGRlciBhbiBhdHRhY2htZW50IHVuaXQgZm9sZGVyLiBTeW5jaHJvbm91cyBvbiBwdXJwb3NlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGZvbGRlci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZm9sZGVyIGlzIGRlc2lnbmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBpc0F0dGFjaG1lbnRVbml0Rm9sZGVyOiAocGFyYW1zOiBDdXN0b21BdHRhY2htZW50TG9jYXRpb25Jc0F0dGFjaG1lbnRVbml0Rm9sZGVyUGFyYW1zKSA9PiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDdXN0b21BdHRhY2htZW50TG9jYXRpb25BdHRhY2htZW50UGF0aEFwaS5pc0F0dGFjaG1lbnRVbml0Rm9sZGVyfS5cbiAqL1xuaW50ZXJmYWNlIEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbklzQXR0YWNobWVudFVuaXRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGZvbGRlciwgYXMgYSB2YXVsdC1yZWxhdGl2ZSBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBwbHVnaW4gaWQgYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCBwdWJsaXNoZXMgaXRzIEFQSSB1bmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX1BMVUdJTl9JRCA9ICdvYnNpZGlhbi1jdXN0b20tYXR0YWNobWVudC1sb2NhdGlvbic7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IHZlcnNpb25zIG9mIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyBBUEkgdGhpcyBtb2R1bGUgY29tcGlsZWQgYWdhaW5zdC4gYDEuMy4wYCBpcyB0aGUgZmlyc3RcbiAqIHRvIGNhcnJ5IHRoZSB0d28gYXR0YWNobWVudC1wYXRoIG1ldGhvZHMuXG4gKi9cbmNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfVkVSU0lPTl9SQU5HRSA9ICdeMS4zLjAnO1xuXG4vKipcbiAqIFRoZSBjb250cmFjdCBvZiB0aGUgbWVtYmVycyBvZiBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gJ3MgQVBJIHRoaXMgbW9kdWxlIGNhbGxzLCBzbyBhIHJlY29yZCB0aGF0IGxhY2tzXG4gKiBlaXRoZXIgaXMgcGFzc2VkIG92ZXIsIGFuZCBhIHBheWxvYWQgdGhhdCBicmVha3MgaXRzIHNpZ25hdHVyZSBpcyByZXBvcnRlZCB3aGlsZSB0aGUgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBkZWJ1ZyBzd2l0Y2ggaXMgb24uXG4gKlxuICogQSBjb3B5IG9mIHRob3NlIHR3byBlbnRyaWVzIG9mIGBDVVNUT01fQVRUQUNITUVOVF9MT0NBVElPTl9BUElfQ09OVFJBQ1RgLCB3aGljaCBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gIHNoaXBzIGFzIGl0cyByb290IGBhcGktY29udHJhY3QudHNgXG4gKiBhbmQgcHVibGlzaGVzLiBLZWVwIHRoZSBndWFyZHMgaW4gYWdyZWVtZW50IHdpdGggdGhhdCBmaWxlLCBzbyB0aGUgcHJvdmlkZXIgYW5kIHRoaXMgY29uc3VtZXIgY2hlY2sgb25lIGRlZmluaXRpb24uXG4gKi9cbmNvbnN0IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfQ09OVFJBQ1Q6IEFwaUNvbnRyYWN0PEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkF0dGFjaG1lbnRQYXRoQXBpPiA9IHtcbiAgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzOiB7XG4gICAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGFyYW1zOiBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zXT4oW3tcbiAgICAgIGV4cGVjdGVkOiAnYXZhaWxhYmxlLXBhdGgtZm9yLWF0dGFjaG1lbnRzIHBhcmFtcycsXG4gICAgICB0eXBlR3VhcmQ6IGlzR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGdW5jdGlvblBhcmFtc1xuICAgIH1dKSxcbiAgICBvdXRwdXQ6IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IGV4cGVjdGVkOiAnYW4gYXR0YWNobWVudCBwYXRoJywgdHlwZUd1YXJkOiBpc1N0cmluZyB9KVxuICB9LFxuICBpc0F0dGFjaG1lbnRVbml0Rm9sZGVyOiB7XG4gICAgaW5wdXQ6IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxbcGFyYW1zOiBDdXN0b21BdHRhY2htZW50TG9jYXRpb25Jc0F0dGFjaG1lbnRVbml0Rm9sZGVyUGFyYW1zXT4oW3tcbiAgICAgIGV4cGVjdGVkOiAnYXR0YWNobWVudC11bml0LWZvbGRlciBwYXJhbXM6IHsgZm9sZGVyUGF0aDogc3RyaW5nIH0nLFxuICAgICAgdHlwZUd1YXJkOiBpc0N1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbklzQXR0YWNobWVudFVuaXRGb2xkZXJQYXJhbXNcbiAgICB9XSksXG4gICAgb3V0cHV0OiBjcmVhdGVUeXBlR3VhcmRTY2hlbWEoeyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH0pXG4gIH1cbn07XG5cbi8qKlxuICogRHVtbXkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX1BBVEggPSAnX19EVU1NWV9fJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXR0YWNobWVudEZpbGVQYXRoIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBvbGQgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG9sZE5vdGVQYXRoT3JGaWxlPzogUGF0aE9yRmlsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBnZW5lcmF0ZWQgYXR0YWNobWVudCBmaWxlIG5hbWUgYmUgc2tpcHBlZCwga2VlcGluZyB0aGUgYXR0YWNobWVudCdzIG93biBuYW1lLlxuICAgKlxuICAgKiBPbmx5IGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAncyByZXNvbHZlciBnZW5lcmF0ZXMgYSBuYW1lLCBzbyBvbmx5IGl0IHJlYWRzIHRoaXMgZmxhZy4gQSBjYWxsZXIgdGhhdCBrZWVwc1xuICAgKiBqdXN0IHRoZSBmb2xkZXIgb2YgdGhlIGFuc3dlciBzaG91bGQgc2V0IGl0OiB0aGUgZm9sZGVyIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZ2VuZXJhdGVkIG5hbWUsIGFuZCBnZW5lcmF0aW5nXG4gICAqIG9uZSBjYW4gd2FsayBldmVyeSBsaW5rIG9mIHRoZSBub3RlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwR2VuZXJhdGVkQXR0YWNobWVudEZpbGVOYW1lPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBdHRhY2htZW50Rm9sZGVyUGF0aEZvckF0dGFjaG1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhlIGF0dGFjaG1lbnQgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXR0YWNobWVudEZvbGRlclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aFN5bmNPck51bGx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGhhc093bkF0dGFjaG1lbnRGb2xkZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc093bkF0dGFjaG1lbnRGb2xkZXJQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd259XG4gICAqL1xuICByZWFkb25seSBjb250ZXh0PzogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNBdFByb3BlckF0dGFjaG1lbnRQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc0F0UHJvcGVyQXR0YWNobWVudFBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIGF0dGFjaG1lbnQgdG8gY2hlY2suXG4gICAqL1xuICByZWFkb25seSBhdHRhY2htZW50UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bn1cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHQ/OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdGhhdCByZWZlcmVuY2VzIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgbm90ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEF0dGFjaG1lbnRGaWxlUGF0aFN5bmN9LlxuICovXG5pbnRlcmZhY2UgR2V0QXR0YWNobWVudEZpbGVQYXRoU3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIG5vdGUuXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1N5bmN9LlxuICovXG5pbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luY1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGJhc2UgbmFtZSBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGF0dGFjaG1lbnRGaWxlQmFzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBhdHRhY2htZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBkdXBsaWNhdGUgY2hlY2sgYmUgc2tpcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBEdXBsaWNhdGVDaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHJlc29sdmVBdHRhY2htZW50Rm9sZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVBdHRhY2htZW50Rm9sZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byBhdHRhY2ggdG8uXG4gICAqL1xuICByZWFkb25seSBub3RlUGF0aE9yRmlsZTogbnVsbCB8IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogVGhlIGF0dGFjaG1lbnQgZm9sZGVyIGEgbm90ZSByZXNvbHZlcyB0bywgYmVmb3JlIHRoZSBhdHRhY2htZW50IGZpbGUgbmFtZSBpcyBhcHBlbmRlZC5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVBdHRhY2htZW50Rm9sZGVyUmVzdWx0IHtcbiAgLyoqXG4gICAqIFRoZSBhdHRhY2htZW50IGZvbGRlciwgb3IgYG51bGxgIHdoZW4gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHZhdWx0IHlldC5cbiAgICovXG4gIHJlYWRvbmx5IGZvbGRlcjogbnVsbCB8IFRGb2xkZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBub3JtYWxpemVkIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGgsIHdoZXRoZXIgb3Igbm90IHRoZSBmb2xkZXIgZXhpc3RzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFydCBvZiB0aGUgYGF0dGFjaG1lbnRGb2xkZXJQYXRoYCBzZXR0aW5nIHRoYXQgZm9sbG93cyBgLi9gLCBvciBgbnVsbGAgd2hlbiB0aGUgc2V0dGluZyBpcyBub3RcbiAgICogcmVsYXRpdmUgdG8gdGhlIG5vdGUuIE9ubHkgYSByZWxhdGl2ZSBzZXR0aW5nIG1heSBoYXZlIGl0cyBtaXNzaW5nIGZvbGRlciBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQYXRoOiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgZmlsZSBwYXRoIGZvciBhbiBhdHRhY2htZW50IHdpdGhpbiBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXR0YWNobWVudCBmaWxlIHBhdGggZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBmaWxlIHBhdGggb2YgdGhlIGF0dGFjaG1lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50RmlsZVBhdGgocGFyYW1zOiBHZXRBdHRhY2htZW50RmlsZVBhdGhQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaSA9IGZpbmRDdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkoKTtcbiAgaWYgKCFjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkpIHtcbiAgICAvLyBOb2JvZHkgb3ZlcnJpZGVzIHRoZSByZXNvbHV0aW9uLCBzbyBpdCBpcyBlbnRpcmVseSBzeW5jaHJvbm91cy5cbiAgICAvLyBUaGUgc2FtZSBjb3JlIGFuc3dlcnMgYGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbGAsIHdoaWNoIGlzIHdoYXQga2VlcHMgdGhlIHR3byBpbiBzdGVwLlxuICAgIHJldHVybiBnZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jKHtcbiAgICAgIGFwcCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2tcbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbCh7IGFwcCwgcGF0aE9yRmlsZTogYXR0YWNobWVudFBhdGggfSk7XG5cbiAgcmV0dXJuIGF3YWl0IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaS5nZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMoe1xuICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLnNsaWNlKDEpLFxuICAgIGF0dGFjaG1lbnRGaWxlU3RhdHM6IGF0dGFjaG1lbnRGaWxlPy5zdGF0LFxuICAgIGNvbnRleHQ6IHBhcmFtcy5jb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlLFxuICAgIG9sZE5vdGVQYXRoT3JGaWxlOiBwYXJhbXMub2xkTm90ZVBhdGhPckZpbGUsXG4gICAgcmVhZEF0dGFjaG1lbnRGaWxlQ29udGVudDogYXR0YWNobWVudEZpbGUgPyAoKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4gYXBwLnZhdWx0LnJlYWRCaW5hcnkoYXR0YWNobWVudEZpbGUpIDogbnVsbCxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2ssXG4gICAgc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZTogcGFyYW1zLnNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWUgPz8gZmFsc2UsXG4gICAgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoIGZvciBhIGdpdmVuIG5vdGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGF0dGFjaG1lbnQgZm9sZGVyIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChwYXJhbXM6IEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBhcmVudEZvbGRlclBhdGgoXG4gICAgYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgIGFwcCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBub3RlUGF0aE9yRmlsZSxcbiAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBEVU1NWV9QQVRILFxuICAgICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlLFxuICAgICAgc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZTogdHJ1ZVxuICAgIH0pXG4gICk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBmb2xkZXIgYSBnaXZlbiBhdHRhY2htZW50IG9mIGEgbm90ZSBiZWxvbmdzIGluLCB3aXRob3V0IGdlbmVyYXRpbmcgdGhlIGF0dGFjaG1lbnQncyBuYW1lLlxuICpcbiAqIFRoaXMgaXMgdGhlIHF1ZXN0aW9uIGEgY2FsbGVyIGp1ZGdpbmcgb25seSBXSEVSRSBhbiBhdHRhY2htZW50IHNob3VsZCBiZSBhc2tzLiBJdCBpcyBjaGVhcGVyIHRoYW4gdGFraW5nIHRoZVxuICogZm9sZGVyIG9mIHtAbGluayBnZXRBdHRhY2htZW50RmlsZVBhdGh9J3MgYW5zd2VyLCBiZWNhdXNlIGl0IHNldHNcbiAqIHtAbGluayBHZXRBdHRhY2htZW50RmlsZVBhdGhQYXJhbXMuc2hvdWxkU2tpcEdlbmVyYXRlZEF0dGFjaG1lbnRGaWxlTmFtZX0sIHNvIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAgc2tpcHNcbiAqIGdlbmVyYXRpbmcgYSBuYW1lLCB3aGljaCBjYW4gd2FsayBldmVyeSBsaW5rIG9mIHRoZSBub3RlLlxuICpcbiAqIFRoZSBhbnN3ZXIgY2FuIGRpZmZlciBmcm9tIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0ncywgd2hpY2ggYXNrcyBvbiBiZWhhbGYgb2YgYSBkdW1teSBhdHRhY2htZW50OiBhXG4gKiBmb2xkZXIgdGVtcGxhdGUgbWF5IHJlYWQgdGhlIGF0dGFjaG1lbnQncyBvd24gbmFtZSwgZXh0ZW5zaW9uIG9yIHN0YXRzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF0dGFjaG1lbnQgZm9sZGVyIHBhdGggZm9yIGF0dGFjaG1lbnQgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50KHBhcmFtczogR2V0QXR0YWNobWVudEZvbGRlclBhdGhGb3JBdHRhY2htZW50UGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24sXG4gICAgbm90ZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgcmV0dXJuIHBhcmVudEZvbGRlclBhdGgoXG4gICAgYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICAgIGFwcCxcbiAgICAgIGNvbnRleHQsXG4gICAgICBub3RlUGF0aE9yRmlsZSxcbiAgICAgIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlOiBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjazogdHJ1ZSxcbiAgICAgIHNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWU6IHRydWVcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmb3IgYSBnaXZlbiBub3RlICoqc3luY2hyb25vdXNseSoqLCB3aGVuIHRoYXQgaXMgcG9zc2libGUgYXQgYWxsLlxuICpcbiAqIE9ic2lkaWFuIGJ1aWxkcyBpdHMgZmlsZS9mb2xkZXIgY29udGV4dCBtZW51cyBhbmQgZXZhbHVhdGVzIGEgY29tbWFuZCdzIGBjaGVja0NhbGxiYWNrYCBzeW5jaHJvbm91c2x5LCBzbyBhXG4gKiBjYWxsZXIgZGVjaWRpbmcgd2hldGhlciB0byBtZXJlbHkgKm9mZmVyKiBhIGNvbW1hbmQgY2Fubm90IGF3YWl0IHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH0uIFRoaXMgaXNcbiAqIHRoZSBzeW5jaHJvbm91cyB0d2luIHN1Y2ggYSBjYWxsZXIgY2FuIHVzZSBpbnN0ZWFkLlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgYG51bGxgIHdoZW4gaXQgaXMgbm90IGtub3dhYmxlIHN5bmNocm9ub3VzbHkg4oCUIHRoYXQgaXMsIHdoZW4gYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCBwdWJsaXNoZXNcbiAqIGl0cyBhdHRhY2htZW50LXBhdGggQVBJIGFuZCB0aGVyZWZvcmUgb3ducyB0aGUgcmVzb2x1dGlvbiwgd2hpY2ggaXMgZ2VudWluZWx5IGFzeW5jaHJvbm91cy4gYG51bGxgIG1lYW5zIFwiYXNrIHtAbGluayBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aH1cIiwgbmV2ZXIgXCJ0aGVyZSBpcyBubyBhdHRhY2htZW50XG4gKiBmb2xkZXJcIi4gT3RoZXJ3aXNlIHRoZSBhbnN3ZXIgaXMgZXhhY3QgcmF0aGVyIHRoYW4gYSBndWVzczogaXQgaXMgcHJvZHVjZWQgYnkgdGhlIHZlcnkgc2FtZSBjb2RlXG4gKiB7QGxpbmsgZ2V0QXR0YWNobWVudEZvbGRlclBhdGh9IHJ1bnMsIHdob3NlIG9ubHkgYXN5bmNocm9ub3VzIHN0ZXAg4oCUIGNyZWF0aW5nIGEgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciDigJRcbiAqIGlzIHVucmVhY2hhYmxlIG9uIHRoaXMgcGF0aC5cbiAqXG4gKiBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gYGNvbnRleHRgIHBhcmFtZXRlcjoge0BsaW5rIEF0dGFjaG1lbnRQYXRoQ29udGV4dH0gb25seSBldmVyIHJlYWNoZXMgdGhhdCBwbHVnaW4nc1xuICogcmVzb2x2ZXIsIGFuZCB0aGlzIGZ1bmN0aW9uIGFuc3dlcnMgYG51bGxgIHdoZW5ldmVyIGl0IGlzIHB1Ymxpc2hlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZvbGRlciBwYXRoIHN5bmMgb3IgbnVsbCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoLCBvciBgbnVsbGAgd2hlbiBpdCBjYW4gb25seSBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbChwYXJhbXM6IEdldEF0dGFjaG1lbnRGb2xkZXJQYXRoU3luY09yTnVsbFBhcmFtcyk6IG51bGwgfCBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGZpbmRDdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkoKVxuICAgID8gbnVsbFxuICAgIDogcGFyZW50Rm9sZGVyUGF0aChnZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jKHtcbiAgICAgIGFwcCxcbiAgICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGU6IERVTU1ZX1BBVEgsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICB9KSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSBnZXQgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzIGZ1bmN0aW9uLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKHBhcmFtczogR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBub3RlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwTWlzc2luZ0F0dGFjaG1lbnRGb2xkZXJDcmVhdGlvblxuICB9ID0gcGFyYW1zO1xuXG4gIC8vIE1hdGVyaWFsaXppbmcgYSBtaXNzaW5nIGF0dGFjaG1lbnQgZm9sZGVyIGlzIHRoZSBPTkUgZ2VudWluZWx5IGFzeW5jaHJvbm91cyBzdGVwIGluIHRoaXMgZnVuY3Rpb24uXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBsaXZlcyBpbiB0aGUgc3luY2hyb25vdXMgY29yZSwgd2hpY2ggdGhlIHN5bmNocm9ub3VzIGVudHJ5IHBvaW50cyByZXVzZSB2ZXJiYXRpbS5cbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IHJlc29sdmVBdHRhY2htZW50Rm9sZGVyKHsgYXBwLCBub3RlUGF0aE9yRmlsZSB9KTtcbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyLmZvbGRlciAmJiBhdHRhY2htZW50Rm9sZGVyLnJlbGF0aXZlUGF0aCAmJiAhc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24pIHtcbiAgICBhd2FpdCBhcHAudmF1bHQuY3JlYXRlRm9sZGVyKGF0dGFjaG1lbnRGb2xkZXIucGF0aCk7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luYyhwYXJhbXMpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBhdHRhY2htZW50LXVuaXQtZm9sZGVyIGRlc2lnbmF0aW9uIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAgcHVibGlzaGVzIHRocm91Z2ggaXRzIHBsdWdpbiBBUEkuXG4gKlxuICogVGhlIGRlc2lnbmF0aW9uIGlzIG9uZSBwbHVnaW4ncyBzZXR0aW5nIGJ1dCBldmVyeSByZWxvY2F0aW5nIHBsdWdpbidzIGJ1c2luZXNzLCBzbyBpdCBpcyByZWFkIGZyb20gdGhlIHNhbWVcbiAqIEFQSSB0aGF0IGFuc3dlcnMgdGhlIGF0dGFjaG1lbnQgcGF0aCBpdHNlbGYuIFJlYWRpbmcgaXQgaGVyZSByYXRoZXIgdGhhbiBoYXZpbmcgZWFjaCBjYWxsZXIgbG9vayBmb3IgdGhlXG4gKiBwbHVnaW4gaXMgdGhlIHBvaW50IOKAlCBhIGZvbGRlciBrZXB0IHdob2xlIGJ5IG9uZSBwbHVnaW4gYW5kIHRvcm4gYXBhcnQgYnkgYW5vdGhlciBpcyBleGFjdGx5IHRoZSBmYWlsdXJlXG4gKiBgZmluZEF0dGFjaG1lbnRVbml0Rm9sZGVyUGF0aGAgZXhpc3RzIHRvIHByZXZlbnQuXG4gKlxuICogYG51bGxgIG1lYW5zIG5vYm9keSBwdWJsaXNoZWQgYSBkZXNpZ25hdGlvbiwgdGhlIHNhbWUgXCJub2JvZHkgb3ducyB0aGlzIHBvbGljeVwiIGFuc3dlciB0aGF0IHNlbmRzXG4gKiB7QGxpbmsgZ2V0QXR0YWNobWVudEZpbGVQYXRofSB0byBPYnNpZGlhbidzIG93biByZXNvbHV0aW9uLiBJdCBpcyBkaXN0aW5jdCBmcm9tIGEgZGVzaWduYXRpb24gdGhhdCBhbnN3ZXJzXG4gKiBgZmFsc2VgIGZvciBldmVyeSBmb2xkZXIuXG4gKlxuICogVGhlIHJlZ2lzdHJ5IGlzIGxvb2tlZCB1cCBvbmNlLCB3aGVuIHRoaXMgaXMgY2FsbGVkLCBzbyBhIGNhbGxlciB3YWxraW5nIGEgZm9sZGVyJ3MgYW5jZXN0b3JzIGFza3MgdGhlIHNhbWVcbiAqIEFQSSBhbGwgdGhlIHdheSB1cC5cbiAqXG4gKiBAcGFyYW0gX2FwcCAtIEFuIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLiBVbnVzZWQgc2luY2UgdGhlIGFuc3dlciBjb21lcyBmcm9tIHRoZSBwbHVnaW4gQVBJIHJlZ2lzdHJ5O1xuICogICBrZXB0IHNvIGV4aXN0aW5nIGNhbGxlcnMgY29tcGlsZSB1bmNoYW5nZWQuXG4gKiBAcmV0dXJucyBUaGUgZGVzaWduYXRpb24gcHJlZGljYXRlLCBvciBgbnVsbGAgd2hlbiBub2JvZHkgcHVibGlzaGVkIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoZWNrSXNBdHRhY2htZW50VW5pdEZvbGRlckZ1bmN0aW9uKF9hcHA6IEFwcCk6ICgoZm9sZGVyUGF0aDogc3RyaW5nKSA9PiBib29sZWFuKSB8IG51bGwge1xuICBjb25zdCBjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGkgPSBmaW5kQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uQXBpKCk7XG4gIHJldHVybiBjdXN0b21BdHRhY2htZW50TG9jYXRpb25BcGlcbiAgICA/IChmb2xkZXJQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IGN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkFwaS5pc0F0dGFjaG1lbnRVbml0Rm9sZGVyKHsgZm9sZGVyUGF0aCB9KVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIG5vdGUncyBhdHRhY2htZW50IGZvbGRlciBpcyBzcGVjaWZpYyB0byB0aGF0IG5vdGUgcmF0aGVyIHRoYW4gc2hhcmVkIHdpdGggaXRzIHNpYmxpbmdzLlxuICpcbiAqIFRoZSBhbnN3ZXIgaXMgZGVyaXZlZCBieSBjb21wYXJpbmcgdGhlIG5vdGUncyBhdHRhY2htZW50IGZvbGRlciB3aXRoIHRoZSBvbmUgYSBzYW1lLWZvbGRlciBzaWJsaW5nIG5vdGVcbiAqIHdvdWxkIGdldDogdGhleSBkaWZmZXIgb25seSB3aGVuIHRoZSBmb2xkZXIgZGVwZW5kcyBvbiB0aGUgbm90ZSdzIE5BTUUuIEV2ZXJ5IGJ1aWx0LWluXG4gKiBgYXR0YWNobWVudEZvbGRlclBhdGhgIG1vZGUg4oCUIHRoZSB2YXVsdCByb290LCBhIGZpeGVkIGZvbGRlciwgdGhlIG5vdGUncyBvd24gZm9sZGVyIChgLi9gKSwgYSBzdWJmb2xkZXIgb2ZcbiAqIHRoZSBub3RlJ3MgZm9sZGVyIChgLi9zdWJgKSDigJQgaXMgc2hhcmVkIGJ5IGV2ZXJ5IG5vdGUgaW4gdGhhdCBmb2xkZXIsIHNvIGl0IGFuc3dlcnMgYGZhbHNlYDsgYHRydWVgIGFyaXNlc1xuICogZnJvbSBgQ3VzdG9tIEF0dGFjaG1lbnQgTG9jYXRpb25gJ3MgcmVzb2x2ZXIgZGVyaXZpbmcgdGhlIGZvbGRlciBmcm9tIHRoZSBub3RlJ3MgbmFtZS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBkaXN0aW5jdGlvbiBhIGNhbGxlciBuZWVkcyBiZWZvcmUgc3dlZXBpbmcgYW4gYXR0YWNobWVudCBmb2xkZXIgd2hvbGVzYWxlOiBvbmx5IGFcbiAqIG5vdGUtc3BlY2lmaWMgZm9sZGVyIGNhbiBiZSB0cmVhdGVkIGFzIGJlbG9uZ2luZyB0byB0aGUgbm90ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGhhcyBvd24gYXR0YWNobWVudCBmb2xkZXIgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG5vdGUgaGFzIGl0cyBvd24gYXR0YWNobWVudCBmb2xkZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYXNPd25BdHRhY2htZW50Rm9sZGVyKHBhcmFtczogSGFzT3duQXR0YWNobWVudEZvbGRlclBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGNvbnRleHQgPSBBdHRhY2htZW50UGF0aENvbnRleHQuVW5rbm93bixcbiAgICBwYXRoXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgIGFwcCxcbiAgICBjb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlOiBwYXRoXG4gIH0pO1xuICBjb25zdCBkdW1teUF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoe1xuICAgIGFwcCxcbiAgICBjb250ZXh0LFxuICAgIG5vdGVQYXRoT3JGaWxlOiBqb2luKGRpcm5hbWUocGF0aCksIGAke0RVTU1ZX1BBVEh9LiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YClcbiAgfSk7XG4gIHJldHVybiBhdHRhY2htZW50Rm9sZGVyUGF0aCAhPT0gZHVtbXlBdHRhY2htZW50Rm9sZGVyUGF0aDtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhbiBhdHRhY2htZW50IGFscmVhZHkgc2l0cyBhdCBpdHMgcHJvcGVyIGF0dGFjaG1lbnQgcGF0aC5cbiAqXG4gKiBSZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBhdHRhY2htZW50J3MgY3VycmVudCBwYXRoIGlzLCB3aXRoaW4gaXRzIHByb3BlciBhdHRhY2htZW50IGZvbGRlciwgZWl0aGVyIHRoZSBwcm9wZXJcbiAqIGJhc2UgbmFtZSBvciB0aGUgcHJvcGVyIGJhc2UgbmFtZSBwbHVzIGFuIE9ic2lkaWFuIGRlZHVwbGljYXRpb24gc3VmZml4IChhIHNwYWNlIGZvbGxvd2VkIGJ5IGRpZ2l0cywgZS5nLlxuICogYGltZyAxYCkgd2l0aCB0aGUgc2FtZSBleHRlbnNpb24uIFRoZSBwcm9wZXIgcGF0aCBpcyBjb21wdXRlZCB2aWEge0BsaW5rIGdldEF0dGFjaG1lbnRGaWxlUGF0aH0gd2l0aFxuICoge0BsaW5rIEdldEF0dGFjaG1lbnRGaWxlUGF0aFBhcmFtcy5zaG91bGRTa2lwRHVwbGljYXRlQ2hlY2t9IHNldCB0byBgdHJ1ZWAgKHRoZSB0YXJnZXQgYmVmb3JlIGFueVxuICogZGVkdXBsaWNhdGlvbiBzdWZmaXgpLCBhbmQgdGhlIGNvbXBhcmlzb24gcmVzcGVjdHMgdGhlIGZpbGUgc3lzdGVtIGNhc2Utc2Vuc2l0aXZpdHkgZmxhZ1xuICogKGBnZXREYXRhQWRhcHRlckV4KGFwcCkuaW5zZW5zaXRpdmVgKSB0aGF0IGBnZXRTYWZlUmVuYW1lUGF0aGAgdXNlcy5cbiAqXG4gKiBUaGlzIGxldHMgYSBjYWxsZXIgcmVjb2duaXplIGEgZGVkdXBsaWNhdGlvbi1wYXJrZWQgYXR0YWNobWVudCBhcyBhbHJlYWR5LWNvbGxlY3RlZCwgc28gYSBcIm5lZWRzIG1vdmU/XCJcbiAqIGRlY2lzaW9uIG1hZGUgYWdhaW5zdCB0aGUgZGVkdXBsaWNhdGlvbi1mcmVlIHByb3BlciBwYXRoIGNvbnZlcmdlcyBpbnN0ZWFkIG9mIHJlLXNjaGVkdWxpbmcgdGhlIGZpbGUgZm9yZXZlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gUGFyYW1ldGVycyBmb3IgdGhlIGlzIGF0IHByb3BlciBhdHRhY2htZW50IHBhdGggZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCB3aGVuIHRoZSBhdHRhY2htZW50IGlzIGFscmVhZHkgYXQgaXRzIHByb3BlciBwYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNBdFByb3BlckF0dGFjaG1lbnRQYXRoKHBhcmFtczogSXNBdFByb3BlckF0dGFjaG1lbnRQYXRoUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgY29udGV4dCA9IEF0dGFjaG1lbnRQYXRoQ29udGV4dC5Vbmtub3duLFxuICAgIG5vdGVQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgY3VycmVudFBhdGggPSBnZXRQYXRoKGFwcCwgYXR0YWNobWVudFBhdGhPckZpbGUpO1xuICBjb25zdCBwcm9wZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZpbGVQYXRoKHtcbiAgICBhcHAsXG4gICAgY29udGV4dCxcbiAgICBub3RlUGF0aE9yRmlsZSxcbiAgICBvbGRBdHRhY2htZW50UGF0aE9yRmlsZTogYXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiB0cnVlXG4gIH0pO1xuXG4gIGNvbnN0IGlzSW5zZW5zaXRpdmUgPSBnZXREYXRhQWRhcHRlckV4KGFwcCkuaW5zZW5zaXRpdmU7XG5cbiAgZnVuY3Rpb24gZm9sZCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaXNJbnNlbnNpdGl2ZSA/IHZhbHVlLnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgfVxuXG4gIGlmIChmb2xkKGRpcm5hbWUoY3VycmVudFBhdGgpKSAhPT0gZm9sZChkaXJuYW1lKHByb3BlclBhdGgpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHRlbnNpb24gPSBleHRuYW1lKGN1cnJlbnRQYXRoKTtcbiAgY29uc3QgcHJvcGVyRXh0ZW5zaW9uID0gZXh0bmFtZShwcm9wZXJQYXRoKTtcbiAgaWYgKGZvbGQoY3VycmVudEV4dGVuc2lvbikgIT09IGZvbGQocHJvcGVyRXh0ZW5zaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRCYXNlTmFtZSA9IGJhc2VuYW1lKGN1cnJlbnRQYXRoLCBjdXJyZW50RXh0ZW5zaW9uKTtcbiAgY29uc3QgcHJvcGVyQmFzZU5hbWUgPSBiYXNlbmFtZShwcm9wZXJQYXRoLCBwcm9wZXJFeHRlbnNpb24pO1xuXG4gIGlmIChmb2xkKGN1cnJlbnRCYXNlTmFtZSkgPT09IGZvbGQocHJvcGVyQmFzZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBkZWR1cGxpY2F0aW9uUHJlZml4ID0gYCR7cHJvcGVyQmFzZU5hbWV9IGA7XG4gIGlmICghZm9sZChjdXJyZW50QmFzZU5hbWUpLnN0YXJ0c1dpdGgoZm9sZChkZWR1cGxpY2F0aW9uUHJlZml4KSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkZWR1cGxpY2F0aW9uU3VmZml4ID0gY3VycmVudEJhc2VOYW1lLnNsaWNlKGRlZHVwbGljYXRpb25QcmVmaXgubGVuZ3RoKTtcbiAgcmV0dXJuIC9eXFxkKyQvLnRlc3QoZGVkdXBsaWNhdGlvblN1ZmZpeCk7XG59XG5cbi8qKlxuICogRmluZHMgYEN1c3RvbSBBdHRhY2htZW50IExvY2F0aW9uYCdzIGF0dGFjaG1lbnQtcGF0aCBBUEkgaW4gdGhlIHBsdWdpbiBBUEkgcmVnaXN0cnkuIEl0cyBwcmVzZW5jZSBpcyB0aGVcbiAqIHN5bmNocm9ub3VzIHByb2JlIGZvciBcInNvbWVib2R5IGVsc2Ugb3ducyB0aGUgcmVzb2x1dGlvblwiLlxuICpcbiAqIEByZXR1cm5zIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIHRoYXQgcGx1Z2luIHB1Ymxpc2hlcyBubyByZWNvcmQgc2F0aXNmeWluZyB0aGUgcmFuZ2UgYW5kIGNvbnRyYWN0LlxuICovXG5mdW5jdGlvbiBmaW5kQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uQXBpKCk6IEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkF0dGFjaG1lbnRQYXRoQXBpIHwgbnVsbCB7XG4gIHJldHVybiBmaW5kUGx1Z2luQXBpPEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbkF0dGFjaG1lbnRQYXRoQXBpPih7XG4gICAgYXBpVmVyc2lvblJhbmdlOiBDVVNUT01fQVRUQUNITUVOVF9MT0NBVElPTl9BVFRBQ0hNRU5UX1BBVEhfQVBJX1ZFUlNJT05fUkFOR0UsXG4gICAgY29udHJhY3Q6IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX0FUVEFDSE1FTlRfUEFUSF9BUElfQ09OVFJBQ1QsXG4gICAgcGx1Z2luSWQ6IENVU1RPTV9BVFRBQ0hNRU5UX0xPQ0FUSU9OX1BMVUdJTl9JRFxuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc3luY2hyb25vdXMgY29yZSBvZiB7QGxpbmsgZ2V0QXR0YWNobWVudEZpbGVQYXRofSwgcmVhY2hlZCB3aGVuIGBDdXN0b20gQXR0YWNobWVudCBMb2NhdGlvbmAgcHVibGlzaGVzIG5vXG4gKiBhdHRhY2htZW50LXBhdGggQVBJLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF0dGFjaG1lbnQgZmlsZSBwYXRoIHN5bmMgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBUaGUgZmlsZSBwYXRoIG9mIHRoZSBhdHRhY2htZW50LlxuICovXG5mdW5jdGlvbiBnZXRBdHRhY2htZW50RmlsZVBhdGhTeW5jKHBhcmFtczogR2V0QXR0YWNobWVudEZpbGVQYXRoU3luY1BhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgb2xkQXR0YWNobWVudFBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIG9sZEF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luYyh7XG4gICAgYXBwLFxuICAgIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWU6IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbiksXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb246IGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLnNsaWNlKDEpLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgc3luY2hyb25vdXMgY29yZSBvZiB7QGxpbmsgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzfSwgd2hpY2ggY2Fubm90IGNyZWF0ZSBhIG1pc3NpbmcgYXR0YWNobWVudFxuICogZm9sZGVyLiBJdHMgY2FsbGVyIGNyZWF0ZXMgdGhlIGZvbGRlciBmaXJzdCB3aGVuIHRoYXQgaXMgd2FudGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyBzeW5jIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cy5cbiAqL1xuZnVuY3Rpb24gZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzU3luYyhwYXJhbXM6IEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c1N5bmNQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uLFxuICAgIG5vdGVQYXRoT3JGaWxlLFxuICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICB9ID0gcGFyYW1zO1xuICBjb25zdCBhdHRhY2htZW50Rm9sZGVyID0gcmVzb2x2ZUF0dGFjaG1lbnRGb2xkZXIoeyBhcHAsIG5vdGVQYXRoT3JGaWxlIH0pO1xuICBjb25zdCBhdHRhY2htZW50RmlsZUJhc2VOYW1lID0gbm9ybWFsaXplU3RyaW5nKG5vcm1hbGl6ZVNsYXNoZXMocGFyYW1zLmF0dGFjaG1lbnRGaWxlQmFzZU5hbWUpKTtcblxuICAvLyBBIGZvbGRlciB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCBzdGlsbCBvd25zIHRoZSBhdHRhY2htZW50IHBhdGguXG4gIC8vIFJlc29sdmluZyBpdCBhcyBhIG5vbi1leGlzdGluZyBmb2xkZXIgc3RvcHMgdGhlIGFuc3dlciBmcm9tIGNvbGxhcHNpbmcgdG8gdGhlIHZhdWx0IHJvb3QuXG4gIGNvbnN0IGZvbGRlciA9IGF0dGFjaG1lbnRGb2xkZXIuZm9sZGVyID8/IGdldEZvbGRlcih7IGFwcCwgcGF0aE9yRm9sZGVyOiBhdHRhY2htZW50Rm9sZGVyLnBhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcblxuICBjb25zdCBwcmVmaXggPSBmb2xkZXIuZ2V0UGFyZW50UHJlZml4KCk7XG4gIHJldHVybiBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2tcbiAgICA/IG1ha2VGaWxlTmFtZSh7XG4gICAgICBmaWxlQmFzZU5hbWU6IHByZWZpeCArIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsXG4gICAgICBmaWxlRXh0ZW5zaW9uOiBhdHRhY2htZW50RmlsZUV4dGVuc2lvblxuICAgIH0pXG4gICAgOiBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChwcmVmaXggKyBhdHRhY2htZW50RmlsZUJhc2VOYW1lLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmZ1bmN0aW9uIGlzQ3VzdG9tQXR0YWNobWVudExvY2F0aW9uSXNBdHRhY2htZW50VW5pdEZvbGRlclBhcmFtcyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEN1c3RvbUF0dGFjaG1lbnRMb2NhdGlvbklzQXR0YWNobWVudFVuaXRGb2xkZXJQYXJhbXMge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdmb2xkZXJQYXRoJykgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiBpc0ZpbGVTdGF0cyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEZpbGVTdGF0cyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiB0eXBlb2YgUmVmbGVjdC5nZXQodmFsdWUsICdjdGltZScpID09PSAnbnVtYmVyJ1xuICAgICYmIHR5cGVvZiBSZWZsZWN0LmdldCh2YWx1ZSwgJ210aW1lJykgPT09ICdudW1iZXInXG4gICAgJiYgdHlwZW9mIFJlZmxlY3QuZ2V0KHZhbHVlLCAnc2l6ZScpID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNFeHRlbmRlZEZ1bmN0aW9uUGFyYW1zKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGdW5jdGlvblBhcmFtcyB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVhZChrZXk6IGtleW9mIEdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c0V4dGVuZGVkRnVuY3Rpb25QYXJhbXMpOiB1bmtub3duIHtcbiAgICByZXR1cm4gUmVmbGVjdC5nZXQodmFsdWUgYXMgb2JqZWN0LCBrZXkpO1xuICB9XG5cbiAgY29uc3QgYXR0YWNobWVudEZpbGVTdGF0cyA9IHJlYWQoJ2F0dGFjaG1lbnRGaWxlU3RhdHMnKTtcbiAgY29uc3QgY29udGV4dCA9IHJlYWQoJ2NvbnRleHQnKTtcbiAgY29uc3Qgbm90ZVBhdGhPckZpbGUgPSByZWFkKCdub3RlUGF0aE9yRmlsZScpO1xuICBjb25zdCBvbGROb3RlUGF0aE9yRmlsZSA9IHJlYWQoJ29sZE5vdGVQYXRoT3JGaWxlJyk7XG4gIGNvbnN0IHJlYWRBdHRhY2htZW50RmlsZUNvbnRlbnQgPSByZWFkKCdyZWFkQXR0YWNobWVudEZpbGVDb250ZW50Jyk7XG4gIHJldHVybiB0eXBlb2YgcmVhZCgnYXR0YWNobWVudEZpbGVCYXNlTmFtZScpID09PSAnc3RyaW5nJ1xuICAgICYmIHR5cGVvZiByZWFkKCdhdHRhY2htZW50RmlsZUV4dGVuc2lvbicpID09PSAnc3RyaW5nJ1xuICAgICYmIChhdHRhY2htZW50RmlsZVN0YXRzID09PSB1bmRlZmluZWQgfHwgaXNGaWxlU3RhdHMoYXR0YWNobWVudEZpbGVTdGF0cykpXG4gICAgJiYgT2JqZWN0LnZhbHVlcyhBdHRhY2htZW50UGF0aENvbnRleHQpLmluY2x1ZGVzKGNvbnRleHQpXG4gICAgJiYgKG5vdGVQYXRoT3JGaWxlID09PSBudWxsIHx8IGlzUGF0aE9yRmlsZShub3RlUGF0aE9yRmlsZSkpXG4gICAgJiYgaXNQYXRoT3JGaWxlKHJlYWQoJ29sZEF0dGFjaG1lbnRQYXRoT3JGaWxlJykpXG4gICAgJiYgKG9sZE5vdGVQYXRoT3JGaWxlID09PSB1bmRlZmluZWQgfHwgaXNQYXRoT3JGaWxlKG9sZE5vdGVQYXRoT3JGaWxlKSlcbiAgICAmJiAocmVhZEF0dGFjaG1lbnRGaWxlQ29udGVudCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVhZEF0dGFjaG1lbnRGaWxlQ29udGVudCA9PT0gJ2Z1bmN0aW9uJylcbiAgICAmJiBpc09wdGlvbmFsQm9vbGVhbihyZWFkKCdzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2snKSlcbiAgICAmJiBpc09wdGlvbmFsQm9vbGVhbihyZWFkKCdzaG91bGRTa2lwR2VuZXJhdGVkQXR0YWNobWVudEZpbGVOYW1lJykpXG4gICAgJiYgaXNPcHRpb25hbEJvb2xlYW4ocmVhZCgnc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb24nKSk7XG59XG5mdW5jdGlvbiBpc09wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBpc0Jvb2xlYW4odmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoIGJ5IGNvbWJpbmluZyBtdWx0aXBsZSBzbGFzaGVzIGludG8gYSBzaW5nbGUgc2xhc2ggYW5kIHJlbW92aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMuXG4gKlxuICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIG5vcm1hbGl6ZS5cbiAqIEByZXR1cm5zIFRoZSBub3JtYWxpemVkIHBhdGguXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNsYXNoZXMocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcGF0aCA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHBhdGgsXG4gICAgcmVwbGFjZXI6ICcvJyxcbiAgICBzZWFyY2hWYWx1ZTogLyg/OltcXFxcL10pKy9nXG4gIH0pO1xuICBwYXRoID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogcGF0aCxcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwvK3xcXC8rJC9nXG4gIH0pO1xuICByZXR1cm4gcGF0aCB8fCAnLyc7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGBhdHRhY2htZW50Rm9sZGVyUGF0aGAgc2V0dGluZyBhZ2FpbnN0IGEgbm90ZSBpbnRvIGEgY29uY3JldGUgYXR0YWNobWVudCBmb2xkZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtZXRlcnMgZm9yIHRoZSByZXNvbHZlIGF0dGFjaG1lbnQgZm9sZGVyIGZ1bmN0aW9uLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIGF0dGFjaG1lbnQgZm9sZGVyLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQXR0YWNobWVudEZvbGRlcihwYXJhbXM6IFJlc29sdmVBdHRhY2htZW50Rm9sZGVyUGFyYW1zKTogUmVzb2x2ZUF0dGFjaG1lbnRGb2xkZXJSZXN1bHQge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIG5vdGVQYXRoT3JGaWxlXG4gIH0gPSBwYXJhbXM7XG4gIC8vIGBnZXRDb25maWdgIGZhbGxzIGJhY2sgdG8gT2JzaWRpYW4ncyBkZWZhdWx0IGZvciBhIGtleSB0aGUgdXNlciBuZXZlciBzZXQsIHNvIGl0IGFsd2F5cyBoYXMgYSB2YWx1ZSBoZXJlLlxuICBsZXQgYXR0YWNobWVudEZvbGRlclBhdGggPSBlbnN1cmVOb25OdWxsYWJsZShhcHAudmF1bHQuZ2V0Q29uZmlnKCdhdHRhY2htZW50Rm9sZGVyUGF0aCcpKTtcbiAgY29uc3QgaXNDdXJyZW50Rm9sZGVyID0gYXR0YWNobWVudEZvbGRlclBhdGggPT09ICcuJyB8fCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4vJztcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gYXR0YWNobWVudEZvbGRlclBhdGguc3RhcnRzV2l0aCgnLi8nKVxuICAgID8gdHJpbVN0YXJ0KHtcbiAgICAgICRzdHJpbmc6IGF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICAgICAgcHJlZml4OiAnLi8nXG4gICAgfSlcbiAgICA6IG51bGw7XG5cbiAgLy8gQSBub3RlIHRoYXQgZG9lcyBub3QgZXhpc3QgeWV0IChhIHJlbmFtZSB0YXJnZXQsIGEgZHVtbXkgc2libGluZykgc3RpbGwgYmVsb25ncyB0byBpdHMgb3duIGZvbGRlci5cbiAgLy8gTWF0ZXJpYWxpemluZyBpdCBmcm9tIGl0cyBwYXRoIGtlZXBzIHRoYXQgZm9sZGVyLCB3aGVyZSBhIHZhdWx0IGxvb2t1cCB3b3VsZCBmYWxsIGJhY2sgdG8gdGhlIHJvb3QuXG4gIC8vIE9ubHkgYW4gZXhwbGljaXRseSBub3RlLWxlc3MgYXR0YWNobWVudCByZXNvbHZlcyB0byB0aGUgdmF1bHQgcm9vdC5cbiAgY29uc3Qgbm90ZUZpbGVPck51bGwgPSBub3RlUGF0aE9yRmlsZSA9PT0gbnVsbFxuICAgID8gbnVsbFxuICAgIDogZ2V0RmlsZSh7XG4gICAgICBhcHAsXG4gICAgICBwYXRoT3JGaWxlOiBub3RlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZVxuICAgIH0pO1xuXG4gIGlmIChpc0N1cnJlbnRGb2xkZXIpIHtcbiAgICBhdHRhY2htZW50Rm9sZGVyUGF0aCA9IG5vdGVGaWxlT3JOdWxsID8gbm90ZUZpbGVPck51bGwucGFyZW50Py5wYXRoID8/ICcnIDogJyc7XG4gIH0gZWxzZSBpZiAocmVsYXRpdmVQYXRoKSB7XG4gICAgYXR0YWNobWVudEZvbGRlclBhdGggPSAobm90ZUZpbGVPck51bGwgPyBub3RlRmlsZU9yTnVsbC5wYXJlbnQ/LmdldFBhcmVudFByZWZpeCgpID8/ICcnIDogJycpICsgcmVsYXRpdmVQYXRoO1xuICB9XG5cbiAgYXR0YWNobWVudEZvbGRlclBhdGggPSBub3JtYWxpemVTdHJpbmcobm9ybWFsaXplU2xhc2hlcyhhdHRhY2htZW50Rm9sZGVyUGF0aCkpO1xuXG4gIHJldHVybiB7XG4gICAgZm9sZGVyOiBnZXRGb2xkZXJPck51bGwoeyBhcHAsIGlzQ2FzZUluc2Vuc2l0aXZlOiB0cnVlLCBwYXRoT3JGb2xkZXI6IGF0dGFjaG1lbnRGb2xkZXJQYXRoIH0pLFxuICAgIHBhdGg6IGF0dGFjaG1lbnRGb2xkZXJQYXRoLFxuICAgIHJlbGF0aXZlUGF0aFxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFhQSwwQkFHTztBQUNQLGtCQU1PO0FBQ1Asb0JBSU87QUFDUCx5QkFBa0M7QUFDbEMsNkJBR087QUFJUCx5QkFRTztBQUNQLHdCQUE4QjtBQUt2QixJQUFLLHdCQUFMLGtCQUFLQSwyQkFBTDtBQUlMLEVBQUFBLHVCQUFBLGdCQUFhO0FBS2IsRUFBQUEsdUJBQUEsZ0JBQWE7QUFLYixFQUFBQSx1QkFBQSxhQUFVO0FBZEEsU0FBQUE7QUFBQSxHQUFBO0FBd0hMLE1BQU0sdUNBQXVDO0FBTXBELE1BQU0sK0RBQStEO0FBU3JFLE1BQU0sMERBQWtIO0FBQUEsRUFDdEgsZ0NBQWdDO0FBQUEsSUFDOUIsV0FBTywyQ0FBc0YsQ0FBQztBQUFBLE1BQzVGLFVBQVU7QUFBQSxNQUNWLFdBQVc7QUFBQSxJQUNiLENBQUMsQ0FBQztBQUFBLElBQ0YsWUFBUSwyQ0FBc0IsRUFBRSxVQUFVLHNCQUFzQixXQUFXLFNBQVMsQ0FBQztBQUFBLEVBQ3ZGO0FBQUEsRUFDQSx3QkFBd0I7QUFBQSxJQUN0QixXQUFPLDJDQUFzRixDQUFDO0FBQUEsTUFDNUYsVUFBVTtBQUFBLE1BQ1YsV0FBVztBQUFBLElBQ2IsQ0FBQyxDQUFDO0FBQUEsSUFDRixZQUFRLDJDQUFzQixFQUFFLFVBQVUsYUFBYSxXQUFXLFVBQVUsQ0FBQztBQUFBLEVBQy9FO0FBQ0Y7QUFLTyxNQUFNLGFBQWE7QUFvUzFCLGVBQXNCLHNCQUFzQixRQUFzRDtBQUNoRyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLFFBQU0sOEJBQThCLGdDQUFnQztBQUNwRSxNQUFJLENBQUMsNkJBQTZCO0FBR2hDLFdBQU8sMEJBQTBCO0FBQUEsTUFDL0I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxxQkFBaUIsNEJBQVEsS0FBSyx1QkFBdUI7QUFDM0QsUUFBTSw4QkFBMEIscUJBQVEsY0FBYztBQUN0RCxRQUFNLDZCQUF5QixzQkFBUyxnQkFBZ0IsdUJBQXVCO0FBQy9FLFFBQU0scUJBQWlCLGtDQUFjLEVBQUUsS0FBSyxZQUFZLGVBQWUsQ0FBQztBQUV4RSxTQUFPLE1BQU0sNEJBQTRCLCtCQUErQjtBQUFBLElBQ3RFO0FBQUEsSUFDQSx5QkFBeUIsd0JBQXdCLE1BQU0sQ0FBQztBQUFBLElBQ3hELHFCQUFxQixnQkFBZ0I7QUFBQSxJQUNyQyxTQUFTLE9BQU87QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUNBLG1CQUFtQixPQUFPO0FBQUEsSUFDMUIsMkJBQTJCLGlCQUFpQixNQUE0QixJQUFJLE1BQU0sV0FBVyxjQUFjLElBQUk7QUFBQSxJQUMvRztBQUFBLElBQ0EsdUNBQXVDLE9BQU8seUNBQXlDO0FBQUEsSUFDdkYsMkNBQTJDO0FBQUEsRUFDN0MsQ0FBQztBQUNIO0FBUUEsZUFBc0Isd0JBQXdCLFFBQXdEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVjtBQUFBLEVBQ0YsSUFBSTtBQUNKLGFBQU87QUFBQSxJQUNMLE1BQU0sc0JBQXNCO0FBQUEsTUFDMUI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EseUJBQXlCO0FBQUEsTUFDekIsMEJBQTBCO0FBQUEsTUFDMUIsdUNBQXVDO0FBQUEsSUFDekMsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQWdCQSxlQUFzQixxQ0FBcUMsUUFBcUU7QUFDOUgsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVjtBQUFBLEVBQ0YsSUFBSTtBQUNKLGFBQU87QUFBQSxJQUNMLE1BQU0sc0JBQXNCO0FBQUEsTUFDMUI7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EseUJBQXlCO0FBQUEsTUFDekIsMEJBQTBCO0FBQUEsTUFDMUIsdUNBQXVDO0FBQUEsSUFDekMsQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQXFCTyxTQUFTLGtDQUFrQyxRQUFnRTtBQUNoSCxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixTQUFPLGdDQUFnQyxJQUNuQyxXQUNBLHlDQUFpQiwwQkFBMEI7QUFBQSxJQUMzQztBQUFBLElBQ0E7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLDBCQUEwQjtBQUFBLEVBQzVCLENBQUMsQ0FBQztBQUNOO0FBUUEsZUFBc0IsK0JBQStCLFFBQStEO0FBQ2xILFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFJSixRQUFNLG1CQUFtQix3QkFBd0IsRUFBRSxLQUFLLGVBQWUsQ0FBQztBQUN4RSxNQUFJLENBQUMsaUJBQWlCLFVBQVUsaUJBQWlCLGdCQUFnQixDQUFDLDJDQUEyQztBQUMzRyxVQUFNLElBQUksTUFBTSxhQUFhLGlCQUFpQixJQUFJO0FBQUEsRUFDcEQ7QUFFQSxTQUFPLG1DQUFtQyxNQUFNO0FBQ2xEO0FBcUJPLFNBQVMsdUNBQXVDLE1BQXFEO0FBQzFHLFFBQU0sOEJBQThCLGdDQUFnQztBQUNwRSxTQUFPLDhCQUNILENBQUMsZUFBZ0MsNEJBQTRCLHVCQUF1QixFQUFFLFdBQVcsQ0FBQyxJQUNsRztBQUNOO0FBaUJBLGVBQXNCLHVCQUF1QixRQUF3RDtBQUNuRyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1Y7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLHVCQUF1QixNQUFNLHdCQUF3QjtBQUFBLElBQ3pEO0FBQUEsSUFDQTtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsRUFDbEIsQ0FBQztBQUNELFFBQU0sNEJBQTRCLE1BQU0sd0JBQXdCO0FBQUEsSUFDOUQ7QUFBQSxJQUNBO0FBQUEsSUFDQSxvQkFBZ0Isc0JBQUsscUJBQVEsSUFBSSxHQUFHLEdBQUcsVUFBVSxJQUFJLDBDQUF1QixFQUFFO0FBQUEsRUFDaEYsQ0FBQztBQUNELFNBQU8seUJBQXlCO0FBQ2xDO0FBa0JBLGVBQXNCLHlCQUF5QixRQUEwRDtBQUN2RyxRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBLFVBQVU7QUFBQSxJQUNWO0FBQUEsRUFDRixJQUFJO0FBRUosUUFBTSxrQkFBYyw0QkFBUSxLQUFLLG9CQUFvQjtBQUNyRCxRQUFNLGFBQWEsTUFBTSxzQkFBc0I7QUFBQSxJQUM3QztBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSx5QkFBeUI7QUFBQSxJQUN6QiwwQkFBMEI7QUFBQSxFQUM1QixDQUFDO0FBRUQsUUFBTSxvQkFBZ0IseUNBQWlCLEdBQUcsRUFBRTtBQUU1QyxXQUFTLEtBQUssT0FBdUI7QUFDbkMsV0FBTyxnQkFBZ0IsTUFBTSxZQUFZLElBQUk7QUFBQSxFQUMvQztBQUVBLE1BQUksU0FBSyxxQkFBUSxXQUFXLENBQUMsTUFBTSxTQUFLLHFCQUFRLFVBQVUsQ0FBQyxHQUFHO0FBQzVELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSx1QkFBbUIscUJBQVEsV0FBVztBQUM1QyxRQUFNLHNCQUFrQixxQkFBUSxVQUFVO0FBQzFDLE1BQUksS0FBSyxnQkFBZ0IsTUFBTSxLQUFLLGVBQWUsR0FBRztBQUNwRCxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sc0JBQWtCLHNCQUFTLGFBQWEsZ0JBQWdCO0FBQzlELFFBQU0scUJBQWlCLHNCQUFTLFlBQVksZUFBZTtBQUUzRCxNQUFJLEtBQUssZUFBZSxNQUFNLEtBQUssY0FBYyxHQUFHO0FBQ2xELFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxzQkFBc0IsR0FBRyxjQUFjO0FBQzdDLE1BQUksQ0FBQyxLQUFLLGVBQWUsRUFBRSxXQUFXLEtBQUssbUJBQW1CLENBQUMsR0FBRztBQUNoRSxXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sc0JBQXNCLGdCQUFnQixNQUFNLG9CQUFvQixNQUFNO0FBQzVFLFNBQU8sUUFBUSxLQUFLLG1CQUFtQjtBQUN6QztBQVFBLFNBQVMsa0NBQW9GO0FBQzNGLGFBQU8saUNBQXlEO0FBQUEsSUFDOUQsaUJBQWlCO0FBQUEsSUFDakIsVUFBVTtBQUFBLElBQ1YsVUFBVTtBQUFBLEVBQ1osQ0FBQztBQUNIO0FBU0EsU0FBUywwQkFBMEIsUUFBaUQ7QUFDbEYsUUFBTTtBQUFBLElBQ0o7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFDSixRQUFNLHFCQUFpQiw0QkFBUSxLQUFLLHVCQUF1QjtBQUMzRCxRQUFNLDhCQUEwQixxQkFBUSxjQUFjO0FBRXRELFNBQU8sbUNBQW1DO0FBQUEsSUFDeEM7QUFBQSxJQUNBLDRCQUF3QixzQkFBUyxnQkFBZ0IsdUJBQXVCO0FBQUEsSUFDeEUseUJBQXlCLHdCQUF3QixNQUFNLENBQUM7QUFBQSxJQUN4RDtBQUFBLElBQ0E7QUFBQSxFQUNGLENBQUM7QUFDSDtBQVNBLFNBQVMsbUNBQW1DLFFBQTBEO0FBQ3BHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxtQkFBbUIsd0JBQXdCLEVBQUUsS0FBSyxlQUFlLENBQUM7QUFDeEUsUUFBTSw2QkFBeUIsK0JBQWdCLGlCQUFpQixPQUFPLHNCQUFzQixDQUFDO0FBSTlGLFFBQU0sU0FBUyxpQkFBaUIsY0FBVSw4QkFBVSxFQUFFLEtBQUssY0FBYyxpQkFBaUIsTUFBTSwwQkFBMEIsS0FBSyxDQUFDO0FBRWhJLFFBQU0sU0FBUyxPQUFPLGdCQUFnQjtBQUN0QyxTQUFPLCtCQUNILDBCQUFhO0FBQUEsSUFDYixjQUFjLFNBQVM7QUFBQSxJQUN2QixlQUFlO0FBQUEsRUFDakIsQ0FBQyxJQUNDLElBQUksTUFBTSxpQkFBaUIsU0FBUyx3QkFBd0IsdUJBQXVCO0FBQ3pGO0FBRUEsU0FBUyxVQUFVLE9BQWtDO0FBQ25ELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBRUEsU0FBUyx1REFBdUQsT0FBK0U7QUFDN0ksU0FBTyxPQUFPLFVBQVUsWUFBWSxVQUFVLFFBQVEsT0FBTyxRQUFRLElBQUksT0FBTyxZQUFZLE1BQU07QUFDcEc7QUFFQSxTQUFTLFlBQVksT0FBb0M7QUFDdkQsU0FBTyxPQUFPLFVBQVUsWUFDbkIsVUFBVSxRQUNWLE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTyxNQUFNLFlBQ3ZDLE9BQU8sUUFBUSxJQUFJLE9BQU8sT0FBTyxNQUFNLFlBQ3ZDLE9BQU8sUUFBUSxJQUFJLE9BQU8sTUFBTSxNQUFNO0FBQzdDO0FBRUEsU0FBUyx1REFBdUQsT0FBK0U7QUFDN0ksTUFBSSxPQUFPLFVBQVUsWUFBWSxVQUFVLE1BQU07QUFDL0MsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLEtBQUssS0FBMEU7QUFDdEYsV0FBTyxRQUFRLElBQUksT0FBaUIsR0FBRztBQUFBLEVBQ3pDO0FBRUEsUUFBTSxzQkFBc0IsS0FBSyxxQkFBcUI7QUFDdEQsUUFBTSxVQUFVLEtBQUssU0FBUztBQUM5QixRQUFNLGlCQUFpQixLQUFLLGdCQUFnQjtBQUM1QyxRQUFNLG9CQUFvQixLQUFLLG1CQUFtQjtBQUNsRCxRQUFNLDRCQUE0QixLQUFLLDJCQUEyQjtBQUNsRSxTQUFPLE9BQU8sS0FBSyx3QkFBd0IsTUFBTSxZQUM1QyxPQUFPLEtBQUsseUJBQXlCLE1BQU0sYUFDMUMsd0JBQXdCLFVBQWEsWUFBWSxtQkFBbUIsTUFDckUsT0FBTyxPQUFPLHFCQUFxQixFQUFFLFNBQVMsT0FBTyxNQUNwRCxtQkFBbUIsWUFBUSxpQ0FBYSxjQUFjLFVBQ3ZELGlDQUFhLEtBQUsseUJBQXlCLENBQUMsTUFDM0Msc0JBQXNCLGNBQWEsaUNBQWEsaUJBQWlCLE9BQ2pFLDhCQUE4QixRQUFRLE9BQU8sOEJBQThCLGVBQzVFLGtCQUFrQixLQUFLLDBCQUEwQixDQUFDLEtBQ2xELGtCQUFrQixLQUFLLHVDQUF1QyxDQUFDLEtBQy9ELGtCQUFrQixLQUFLLDJDQUEyQyxDQUFDO0FBQzFFO0FBQ0EsU0FBUyxrQkFBa0IsT0FBOEM7QUFDdkUsU0FBTyxVQUFVLFVBQWEsVUFBVSxLQUFLO0FBQy9DO0FBRUEsU0FBUyxTQUFTLE9BQWlDO0FBQ2pELFNBQU8sT0FBTyxVQUFVO0FBQzFCO0FBUUEsU0FBUyxpQkFBaUIsTUFBc0I7QUFDOUMsYUFBTywwQkFBVztBQUFBLElBQ2hCLFNBQVM7QUFBQSxJQUNULFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmLENBQUM7QUFDRCxhQUFPLDBCQUFXO0FBQUEsSUFDaEIsU0FBUztBQUFBLElBQ1QsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2YsQ0FBQztBQUNELFNBQU8sUUFBUTtBQUNqQjtBQVFBLFNBQVMsd0JBQXdCLFFBQXNFO0FBQ3JHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLEVBQ0YsSUFBSTtBQUVKLE1BQUksMkJBQXVCLHNDQUFrQixJQUFJLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQztBQUN4RixRQUFNLGtCQUFrQix5QkFBeUIsT0FBTyx5QkFBeUI7QUFDakYsUUFBTSxlQUFlLHFCQUFxQixXQUFXLElBQUksUUFDckQseUJBQVU7QUFBQSxJQUNWLFNBQVM7QUFBQSxJQUNULFFBQVE7QUFBQSxFQUNWLENBQUMsSUFDQztBQUtKLFFBQU0saUJBQWlCLG1CQUFtQixPQUN0QyxXQUNBLDRCQUFRO0FBQUEsSUFDUjtBQUFBLElBQ0EsWUFBWTtBQUFBLElBQ1osMEJBQTBCO0FBQUEsRUFDNUIsQ0FBQztBQUVILE1BQUksaUJBQWlCO0FBQ25CLDJCQUF1QixpQkFBaUIsZUFBZSxRQUFRLFFBQVEsS0FBSztBQUFBLEVBQzlFLFdBQVcsY0FBYztBQUN2Qiw0QkFBd0IsaUJBQWlCLGVBQWUsUUFBUSxnQkFBZ0IsS0FBSyxLQUFLLE1BQU07QUFBQSxFQUNsRztBQUVBLDZCQUF1QiwrQkFBZ0IsaUJBQWlCLG9CQUFvQixDQUFDO0FBRTdFLFNBQU87QUFBQSxJQUNMLFlBQVEsb0NBQWdCLEVBQUUsS0FBSyxtQkFBbUIsTUFBTSxjQUFjLHFCQUFxQixDQUFDO0FBQUEsSUFDNUYsTUFBTTtBQUFBLElBQ047QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOlsiQXR0YWNobWVudFBhdGhDb250ZXh0Il19
@@ -320,7 +320,7 @@ export declare function getAvailablePathForAttachments(params: GetAvailablePathF
320
320
  * plugin is the point — a folder kept whole by one plugin and torn apart by another is exactly the failure
321
321
  * `findAttachmentUnitFolderPath` exists to prevent.
322
322
  *
323
- * `undefined` means nobody published a designation, the same "nobody owns this policy" answer that sends
323
+ * `null` means nobody published a designation, the same "nobody owns this policy" answer that sends
324
324
  * {@link getAttachmentFilePath} to Obsidian's own resolution. It is distinct from a designation that answers
325
325
  * `false` for every folder.
326
326
  *
@@ -329,9 +329,9 @@ export declare function getAvailablePathForAttachments(params: GetAvailablePathF
329
329
  *
330
330
  * @param _app - An Obsidian application instance. Unused since the answer comes from the plugin API registry;
331
331
  * kept so existing callers compile unchanged.
332
- * @returns The designation predicate, or `undefined` when nobody published one.
332
+ * @returns The designation predicate, or `null` when nobody published one.
333
333
  */
334
- export declare function getCheckIsAttachmentUnitFolderFunction(_app: App): ((folderPath: string) => boolean) | undefined;
334
+ export declare function getCheckIsAttachmentUnitFolderFunction(_app: App): ((folderPath: string) => boolean) | null;
335
335
  /**
336
336
  * Checks whether a note's attachment folder is specific to that note rather than shared with its siblings.
337
337
  *
@@ -118,8 +118,8 @@ __export(attachment_unit_folder_exports, {
118
118
  rebasePathOntoFolder: () => rebasePathOntoFolder
119
119
  });
120
120
  module.exports = __toCommonJS(attachment_unit_folder_exports);
121
- var import_path = require('@mnaoumov/typescript-lib/path');
122
- var import_attachment_path = require('./attachment-path.cjs');
121
+ var import_path = require("@mnaoumov/typescript-lib/path");
122
+ var import_attachment_path = require("./attachment-path.cjs");
123
123
  function findAttachmentUnitFolderPath(params) {
124
124
  const parentFolderPath = (0, import_path.dirname)(params.attachmentPath);
125
125
  if (!parentFolderPath || parentFolderPath === "." || parentFolderPath === "/") {
@@ -118,9 +118,9 @@ __export(backlink_index_exports, {
118
118
  iterateReferencesAffectedByRename: () => iterateReferencesAffectedByRename
119
119
  });
120
120
  module.exports = __toCommonJS(backlink_index_exports);
121
- var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
122
- var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
123
- var import_obsidian_lib_state = require('./obsidian-lib-state.cjs');
121
+ var import_type_guards = require("@mnaoumov/typescript-lib/type-guards");
122
+ var import_implementations = require("@obsidian-typings/obsidian-public-latest/implementations");
123
+ var import_obsidian_lib_state = require("./obsidian-lib-state.cjs");
124
124
  const MARKDOWN_SUFFIX = ".md";
125
125
  function getIndexedBacklinksForFile(app, file) {
126
126
  const data = getBacklinkIndexData();
@@ -178,7 +178,7 @@ function getBacklinkIndexData() {
178
178
  }
179
179
  function getCachedMetadata(app, sourcePath) {
180
180
  const hash = app.metadataCache.fileCache[sourcePath]?.hash;
181
- return hash === void 0 ? void 0 : app.metadataCache.metadataCache[hash];
181
+ return hash === void 0 ? null : app.metadataCache.metadataCache[hash] ?? null;
182
182
  }
183
183
  function getCacheReferences(cache) {
184
184
  return cache ? [...cache.frontmatterLinks ?? [], ...cache.links ?? [], ...cache.embeds ?? []] : [];
@@ -258,4 +258,4 @@ function removeSource(data, sourcePath) {
258
258
  getIndexedBacklinksForFile,
259
259
  iterateReferencesAffectedByRename
260
260
  });
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIE9ic2lkaWFuJ3MgYG1ldGFkYXRhQ2FjaGUuaXRlcmF0ZUFsbFJlZnNgIHRha2VzLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRlUmVmZXJlbmNlc0NhbGxiYWNrID0gUGFyYW1ldGVyczxBcHBbJ21ldGFkYXRhQ2FjaGUnXVsnaXRlcmF0ZUFsbFJlZnMnXT5bMF07XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXNpdHMgdGhlIHJlZmVyZW5jZXMgYGFwcC5tZXRhZGF0YUNhY2hlLml0ZXJhdGVBbGxSZWZzYCB3b3VsZCB2aXNpdCwgbWludXMgZXZlcnkgcmVmZXJlbmNlIHdob3NlIHJlc29sdXRpb25cbiAqIGNhbm5vdCBjaGFuZ2Ugd2hlbiBgZmlsZWAgaXMgcmVuYW1lZCB0byBgbmV3UGF0aGAuXG4gKlxuICogT2JzaWRpYW4ncyBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCByZXNvbHZlcyBFVkVSWSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0IGJlZm9yZSBlYWNoIHJlbmFtZSwgdG8gZGlmZlxuICogdGhlIHJlc29sdXRpb25zIGFmdGVyd2FyZHMgaW4gYHVwZGF0ZUFsbExpbmtzYDsgdGhhdCBpcyB0aGUgd2hvbGUgY29zdCBvZiBhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0LiBBIHJlZmVyZW5jZVxuICogY2FuIHJlc29sdmUgdG8gYGZpbGVgIG9ubHkgaWYgaXRzIGxpbmtwYXRoJ3MgbGFzdCBzZWdtZW50IG1hdGNoZXMgYGZpbGVgJ3MgbmFtZSBiZWZvcmUgdGhlIHJlbmFtZSBvciBpdHMgbmFtZVxuICogYWZ0ZXIgaXQgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBhbmQgYSByZWZlcmVuY2UgdGhhdCByZXNvbHZlcyB0byBuZWl0aGVyIGtlZXBzIHJlc29sdmluZyB0byB3aGF0ZXZlciBpdCBkaWQuIFNvXG4gKiB0aGUgcmVmZXJlbmNlcyB0aGF0IGNhbiBjaGFuZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRleCdzIGNhbmRpZGF0ZXMgZm9yIGJvdGggbmFtZXMsIHBsdXMgdGhlIHJlZmVyZW5jZXMgaGVsZCBieVxuICogYGZpbGVgIGl0c2VsZiwgd2hvc2UgcmVsYXRpdmUgbGlua3MgcmVzb2x2ZSBmcm9tIGl0cyBuZXcgZm9sZGVyIGFmdGVyd2FyZHMuIGBsaW5rVXBkYXRlcnNgIHJlZmVyZW5jZXMgYXJlIHdhbGtlZFxuICogaW4gZnVsbCwgYXMgaW4ge0BsaW5rIGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlfS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgYmVpbmcgcmVuYW1lZCwgc3RpbGwgYXQgaXRzIG9sZCBwYXRoLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCBpdCBpcyBiZWluZyByZW5hbWVkIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHdpdGggZWFjaCByZWZlcmVuY2UgYW5kIHRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgaXQuIFJldHVybmluZyBgdHJ1ZWAgc3RvcHMgdGhlXG4gKiAgIHdhbGsgb3ZlciB0aGF0IG5vdGUncyByZWZlcmVuY2VzLCBhcyBpbiBPYnNpZGlhbidzIG93biB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKFxuICBhcHA6IEFwcCxcbiAgZmlsZTogVEZpbGUsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgY2FsbGJhY2s6IEl0ZXJhdGVSZWZlcmVuY2VzQ2FsbGJhY2tcbik6IHZvaWQge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG5ld05hbWUgPSBuZXdQYXRoLnNsaWNlKG5ld1BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBbLi4uZ2V0VGFyZ2V0TmFtZUtleXMoZmlsZS5uYW1lKSwgLi4uZ2V0VGFyZ2V0TmFtZUtleXMobmV3TmFtZSldKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgaWYgKGNhbGxiYWNrKHNvdXJjZVBhdGgsIHJlZmVyZW5jZSkgPT09IHRydWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBsaW5rVXBkYXRlciBvZiBPYmplY3QudmFsdWVzKGFwcC5tZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tsaW5rSW5kZXhEYXRhKCk6IEJhY2tsaW5rSW5kZXhEYXRhIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8QmFja2xpbmtJbmRleERhdGE+KCdiYWNrbGlua0luZGV4VjEnLCB7XG4gICAgaW5kZXhlZEhhc2hlczogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICBuYW1lS2V5U291cmNlUGF0aHM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKSxcbiAgICBzb3VyY2VQYXRoTmFtZUtleXM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKVxuICB9KS52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENhY2hlZE1ldGFkYXRhKGFwcDogQXBwLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiBDYWNoZWRNZXRhZGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhhc2ggPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVbc291cmNlUGF0aF0/Lmhhc2g7XG4gIHJldHVybiBoYXNoID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBhcHAubWV0YWRhdGFDYWNoZS5tZXRhZGF0YUNhY2hlW2hhc2hdO1xufVxuXG4vKipcbiAqIExpc3RzIGEgY2FjaGVkIG5vdGUncyByZWZlcmVuY2VzIGluIHRoZSBvcmRlciBPYnNpZGlhbidzIG93biB3YWxrIHZpc2l0cyB0aGVtOiBgZnJvbnRtYXR0ZXJMaW5rc2AsIHRoZW5cbiAqIGBsaW5rc2AsIHRoZW4gYGVtYmVkc2AuXG4gKlxuICogQHBhcmFtIGNhY2hlIC0gVGhlIG5vdGUncyBjYWNoZWQgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgbm90ZSdzIHJlZmVyZW5jZXMuXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VbXSB7XG4gIHJldHVybiBjYWNoZSA/IFsuLi5jYWNoZS5mcm9udG1hdHRlckxpbmtzID8/IFtdLCAuLi5jYWNoZS5saW5rcyA/PyBbXSwgLi4uY2FjaGUuZW1iZWRzID8/IFtdXSA6IFtdO1xufVxuXG4vKipcbiAqIFN0cmlwcyB0aGUgc3VicGF0aCBmcm9tIGEgbGluaywgdGhlIHdheSBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aGAgZG9lcy5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIHRleHQsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlI0hlYWRpbmdgLlxuICogQHJldHVybnMgVGhlIGxpbmtwYXRoLCBzdWNoIGFzIGBmb2xkZXIvTm90ZWAuXG4gKi9cbmZ1bmN0aW9uIGdldExpbmtwYXRoKGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hJbmRleCA9IGxpbmsuaW5kZXhPZignIycpO1xuICByZXR1cm4gaGFzaEluZGV4ID09PSAtMSA/IGxpbmsgOiBsaW5rLnNsaWNlKDAsIGhhc2hJbmRleCk7XG59XG5cbi8qKlxuICogVGhlIGtleSBhIHJlZmVyZW5jZSBpcyBpbmRleGVkIHVuZGVyOiB0aGUgbG93ZXJjYXNlZCBsYXN0IGAvYCBzZWdtZW50IG9mIGl0cyBsaW5rcGF0aC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIFRoZSByZWZlcmVuY2UncyBsaW5rIHRleHQuXG4gKiBAcmV0dXJucyBUaGUga2V5LlxuICovXG5mdW5jdGlvbiBnZXRSZWZlcmVuY2VOYW1lS2V5KGxpbms6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmtwYXRoID0gZ2V0TGlua3BhdGgobGluaykudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIGxpbmtwYXRoLnNsaWNlKGxpbmtwYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbn1cblxuLyoqXG4gKiBUaGUga2V5cyB1bmRlciB3aGljaCBhIHJlZmVyZW5jZSB0byBhIGZpbGUgd2l0aCB0aGlzIG5hbWUgY2FuIGJlIGluZGV4ZWQuIGBnZXRMaW5rcGF0aERlc3RgIG1hdGNoZXMgYVxuICogc2VnbWVudCBhZ2FpbnN0IHRoZSBmaWxlJ3MgbmFtZSwgYW5kIGFnYWluc3QgdGhlIG5hbWUgd2l0aCBgLm1kYCBhcHBlbmRlZCwgc28gYSBub3RlIG5hbWVkIGBOb3RlLm1kYCBpc1xuICogcmVhY2hhYmxlIGZyb20gYm90aCBgbm90ZS5tZGAgYW5kIGBub3RlYC5cbiAqXG4gKiBAcGFyYW0gZmlsZU5hbWUgLSBUaGUgZmlsZSdzIG5hbWUsIGV4dGVuc2lvbiBpbmNsdWRlZC5cbiAqIEByZXR1cm5zIFRoZSBrZXlzLlxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBuYW1lS2V5ID0gZmlsZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5hbWVLZXkuZW5kc1dpdGgoTUFSS0RPV05fU1VGRklYKSA/IFtuYW1lS2V5LCBuYW1lS2V5LnNsaWNlKDAsIC1NQVJLRE9XTl9TVUZGSVgubGVuZ3RoKV0gOiBbbmFtZUtleV07XG59XG5cbmZ1bmN0aW9uIGluZGV4U291cmNlKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSwgc291cmNlUGF0aDogc3RyaW5nLCBoYXNoOiBzdHJpbmcpOiB2b2lkIHtcbiAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICBjb25zdCBjYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF07XG4gIC8qXG4gICAqIEEgbm90ZSdzIGBmaWxlQ2FjaGVgIGVudHJ5IGNhbiBjYXJyeSBpdHMgbmV3IGhhc2ggYmVmb3JlIHRoZSBtZXRhZGF0YSBmb3IgdGhhdCBoYXNoIGlzIHN0b3JlZC4gUmVjb3JkaW5nXG4gICAqIHRoZSBoYXNoIHRoZW4gd291bGQgcGluIHRoZSBub3RlIGF0IFwibm8gcmVmZXJlbmNlc1wiIHVudGlsIGl0cyBjb250ZW50IGNoYW5nZWQgYWdhaW4sIHNvIGxlYXZlIGl0XG4gICAqIHVucmVjb3JkZWQgYW5kIGxldCB0aGUgbmV4dCBxdWVyeSBsb29rIGFnYWluLlxuICAgKi9cbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG5hbWVLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhjYWNoZSkpIHtcbiAgICBuYW1lS2V5cy5hZGQoZ2V0UmVmZXJlbmNlTmFtZUtleShyZWZlcmVuY2UubGluaykpO1xuICB9XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBuYW1lS2V5cykge1xuICAgIGxldCBzb3VyY2VQYXRocyA9IGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KTtcbiAgICBpZiAoIXNvdXJjZVBhdGhzKSB7XG4gICAgICBzb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuc2V0KG5hbWVLZXksIHNvdXJjZVBhdGhzKTtcbiAgICB9XG4gICAgc291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICB9XG4gIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLnNldChzb3VyY2VQYXRoLCBuYW1lS2V5cyk7XG4gIGRhdGEuaW5kZXhlZEhhc2hlcy5zZXQoc291cmNlUGF0aCwgaGFzaCk7XG59XG5cbi8qKlxuICogQnJpbmdzIHRoZSBpbmRleCBpbiBsaW5lIHdpdGggYG1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlYC4gSXQgcnVucyBvbiBldmVyeSBxdWVyeSwgc28gaXQgaXMgb25lIHBhc3Mgb3ZlclxuICogYGZpbGVDYWNoZWAgd2l0aCBubyBhbGxvY2F0aW9uIHBlciBub3RlIChhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0IHF1ZXJpZXMgc2V2ZXJhbCB0aW1lcyksIGFuZCB0aGUgcGFzcyBvdmVyIHRoZVxuICogaW5kZXggdGhhdCBmaW5kcyBub3RlcyBnb25lIGZyb20gYGZpbGVDYWNoZWAgcnVucyBvbmx5IHdoZW4gdGhhdCBmaXJzdCBwYXNzIGRpZCBub3Qgc2VlIGV2ZXJ5IGluZGV4ZWQgbm90ZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGluZGV4LlxuICovXG5mdW5jdGlvbiByZWZyZXNoKGFwcDogQXBwLCBkYXRhOiBCYWNrbGlua0luZGV4RGF0YSk6IHZvaWQge1xuICBjb25zdCBmaWxlQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZS5maWxlQ2FjaGU7XG4gIGNvbnN0IGluZGV4ZWRDb3VudEJlZm9yZSA9IGRhdGEuaW5kZXhlZEhhc2hlcy5zaXplO1xuICBsZXQgc2VlbkluZGV4ZWRDb3VudCA9IDA7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pbiAtLSBgT2JqZWN0Lmhhc093bmAgYmVsb3cgaXMgdGhlIGd1YXJkOyBgZm9yLi4uaW5gIGF2b2lkcyBhbiBlbnRyeSBhcnJheSBwZXIgbm90ZS5cbiAgZm9yIChjb25zdCBzb3VyY2VQYXRoIGluIGZpbGVDYWNoZSkge1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0Lmhhc093bihmaWxlQ2FjaGUsIHNvdXJjZVBhdGgpID8gZmlsZUNhY2hlW3NvdXJjZVBhdGhdIDogdW5kZWZpbmVkO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpbmRleGVkSGFzaCA9IGRhdGEuaW5kZXhlZEhhc2hlcy5nZXQoc291cmNlUGF0aCk7XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlZW5JbmRleGVkQ291bnQrKztcbiAgICB9XG4gICAgaWYgKGluZGV4ZWRIYXNoICE9PSBlbnRyeS5oYXNoKSB7XG4gICAgICBpbmRleFNvdXJjZShhcHAsIGRhdGEsIHNvdXJjZVBhdGgsIGVudHJ5Lmhhc2gpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzZWVuSW5kZXhlZENvdW50ID09PSBpbmRleGVkQ291bnRCZWZvcmUpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMua2V5cygpKSB7XG4gICAgaWYgKCFPYmplY3QuaGFzT3duKGZpbGVDYWNoZSwgc291cmNlUGF0aCkpIHtcbiAgICAgIHJlbW92ZVNvdXJjZShkYXRhLCBzb3VyY2VQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlU291cmNlKGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIGRhdGEuc291cmNlUGF0aE5hbWVLZXlzLmdldChzb3VyY2VQYXRoKSA/PyBbXSkge1xuICAgIGNvbnN0IHNvdXJjZVBhdGhzID0gZW5zdXJlTm9uTnVsbGFibGUoZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpKTtcbiAgICBzb3VyY2VQYXRocy5kZWxldGUoc291cmNlUGF0aCk7XG4gICAgaWYgKHNvdXJjZVBhdGhzLnNpemUgPT09IDApIHtcbiAgICAgIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmRlbGV0ZShuYW1lS2V5KTtcbiAgICB9XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xuICBkYXRhLmluZGV4ZWRIYXNoZXMuZGVsZXRlKHNvdXJjZVBhdGgpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnREEseUJBQWtDO0FBQ2xDLDZCQUFvQztBQUVwQyxnQ0FBb0M7QUFhcEMsTUFBTSxrQkFBa0I7QUFVakIsU0FBUywyQkFBMkIsS0FBVSxNQUF5QztBQUM1RixRQUFNLE9BQU8scUJBQXFCO0FBQ2xDLFVBQVEsS0FBSyxJQUFJO0FBRWpCLFFBQU0sZ0JBQWdCLElBQUk7QUFDMUIsUUFBTSxZQUFZLElBQUksMkNBQStCO0FBR3JELFFBQU0sdUJBQXVCLG9CQUFJLElBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztBQUN4RCxhQUFXLFdBQVcsa0JBQWtCLEtBQUss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
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iYWNrbGluay1pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQW5zd2VycyBcIndoaWNoIHJlZmVyZW5jZXMgcmVzb2x2ZSB0byB0aGlzIGZpbGU/XCIgYnkgbG9va2luZyBvbmx5IGF0IHRoZSBub3RlcyB0aGF0IENPVUxEIGhvbGQgb25lLCBpbnN0ZWFkIG9mXG4gKiByZXNvbHZpbmcgZXZlcnkgcmVmZXJlbmNlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBtZXRhZGF0YUNhY2hlLmdldEJhY2tsaW5rc0ZvckZpbGUoZmlsZSlgIGlzIG5vdCBhbiBpbmRleCBsb29rdXAuIFJlYWQgb3V0IG9mIHRoZSAxLjE0LjIgYnVuZGxlLCBpdCBpc1xuICogYGl0ZXJhdGVBbGxSZWZzYCDigJQgZXZlcnkgYGZyb250bWF0dGVyTGlua3NgLCBgbGlua3NgIGFuZCBgZW1iZWRzYCBlbnRyeSBvZiBldmVyeSBjYWNoZWQgbm90ZSwgcGx1cyBldmVyeVxuICogcmVmZXJlbmNlIGVhY2ggYGxpbmtVcGRhdGVyc2AgZW50cnkgKHRoZSBjYW52YXMgb25lKSByZXBvcnRzIOKAlCB3aXRoIG9uZSBgZ2V0Rmlyc3RMaW5rcGF0aERlc3RgIHBlciByZWZlcmVuY2UsXG4gKiBrZWVwaW5nIHRob3NlIHRoYXQgcmVzb2x2ZSB0byBgZmlsZWAuIFRoYXQgaXMgfjExNSBtcyBhdCAxMDBrIHJlZmVyZW5jZXMgYW5kIH4zMjAgbXMgYXQgMjUwaywgcGFpZCBvbmNlIHBlciBmaWxlXG4gKiBieSBldmVyeSBwZXItZmlsZSBiYWNrbGluayBsb29rdXAsIHNvIGEgMTAwMC1ub3RlIGZvbGRlciByZW5hbWUgaW4gYSA1MGstbm90ZSB2YXVsdCB0b29rIDkyNCBzLlxuICpcbiAqIFdoYXQgbWFrZXMgYSBuYXJyb3dlciBhbnN3ZXIgZXhhY3QgaXMgYSBwcm9wZXJ0eSBvZiBPYnNpZGlhbidzIGBnZXRMaW5rcGF0aERlc3RgOiBldmVyeSBicmFuY2ggb2YgaXQgY2FuIG9ubHlcbiAqIHJldHVybiBhIGZpbGUgd2hvc2UgbG93ZXJjYXNlZCBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgdGhlIGxpbmtwYXRoLCBvciB0aGF0IHNlZ21lbnQgcGx1c1xuICogYC5tZGAuIFRoZSBvbmUgZXhjZXB0aW9uIGlzIHRoZSBlbXB0eSBsaW5rcGF0aCAoYFtbI0hlYWRpbmddXWApLCB3aGljaCByZXR1cm5zIHRoZSBzb3VyY2Ugbm90ZSBpdHNlbGYuIFNvIGFcbiAqIG5vdGUgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8gYGZpbGVgIG9ubHkgaWYgaXQgaG9sZHMgYSByZWZlcmVuY2Ugd2hvc2UgbGFzdCBzZWdtZW50IG1hdGNoZXMgb25lIG9mIGBmaWxlYCdzXG4gKiBuYW1lIGtleXMsIG9yIGlmIGl0IElTIGBmaWxlYC4gVGhpcyBtb2R1bGUgaW5kZXhlcyBub3RlcyBieSB0aG9zZSBzZWdtZW50cywgdGFrZXMgdGhlIGNhbmRpZGF0ZXMgZm9yIGBmaWxlYCxcbiAqIGFuZCBydW5zIE9ic2lkaWFuJ3Mgb3duIHByZWRpY2F0ZSDigJQgYGdldEZpcnN0TGlua3BhdGhEZXN0KGxpbmtwYXRoLCBzb3VyY2UpID09PSBmaWxlYCDigJQgb3ZlciB0aGUgY2FuZGlkYXRlcydcbiAqIHJlZmVyZW5jZXMgb25seS4gVGhlIGNhbmRpZGF0ZXMgYXJlIGEgc3VwZXJzZXQgb2YgdGhlIHJlYWwgYmFja2xpbmtzIGFuZCB0aGUgcHJlZGljYXRlIGlzIHRoZSBzYW1lIG9uZSwgc29cbiAqIHRoZSBhbnN3ZXIgaXMgdGhlIG9uZSB0aGUgZnVsbCB3YWxrIGdpdmVzLCBhIGZpbGUgcmVnaXN0ZXJlZCBhdCBhIG5vbi1leGlzdGluZyBwYXRoIGluY2x1ZGVkLiBPbmx5IHRoZSBPUkRFUlxuICogb2YgdGhlIG5vdGVzIGluIHRoZSBhbnN3ZXIgZGlmZmVyczogdGhlIGZpbGUgaXRzZWxmIGZpcnN0LCB0aGVuIHRoZSBjYW5kaWRhdGVzIGluIGluZGV4IG9yZGVyLlxuICpcbiAqIFRoZSBpbmRleCBpcyBrZXB0IGZyZXNoIHdpdGhvdXQgbGlzdGVuaW5nIHRvIGFueXRoaW5nLiBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgIG1hcHMgYSBub3RlIHRvIHRoZSBoYXNoIG9mXG4gKiBpdHMgY29udGVudCwgYW5kIHRoZSByZWZlcmVuY2VzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoYXQgaGFzaCwgc28gZWFjaCBxdWVyeSBjb21wYXJlcyBldmVyeSBub3RlJ3MgaGFzaFxuICogYWdhaW5zdCB0aGUgb25lIGl0IHdhcyBpbmRleGVkIGF0IGFuZCByZS1yZWFkcyBvbmx5IHRoZSBub3RlcyB0aGF0IGNoYW5nZWQuIFRoYXQgaXMgb25lIHByb3BlcnR5IGNvbXBhcmlzb25cbiAqIHBlciBub3RlIGFuZCBubyByZXNvbHV0aW9uIGF0IGFsbCwgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHNjYW4gT2JzaWRpYW4gaXRzZWxmIHJ1bnMgb24gZXZlcnkgcmVuYW1lXG4gKiAoYHVwZGF0ZVJlbGF0ZWRMaW5rc2ApLiBEZXBlbmRpbmcgb24gbm8gZXZlbnQgYWxzbyBtZWFucyBkZXBlbmRpbmcgb24gbm8gZXZlbnQgT1JERVIsIHdoaWNoIG1hdHRlcnMgYmVjYXVzZVxuICogcmVuYW1lIGhhbmRsZXJzIHF1ZXJ5IGZyb20gaW5zaWRlIHRoZSB2YXVsdCBgcmVuYW1lYCBldmVudC5cbiAqXG4gKiBUaGVyZSBpcyBvbmUgaW5kZXggcGVyIHJlbmRlcmVyIHJlYWxtLCBoZWxkIGluIHRoZSByZWFsbS1nbG9iYWwgc2hhcmVkLXN0YXRlIGJhZywgc28gZXZlcnkgcGx1Z2luIGJ1bmRsaW5nIHRoaXMgbGlicmFyeVxuICogc2hhcmVzIGl0IHJhdGhlciB0aGFuIGVhY2ggYnVpbGRpbmcgaXRzIG93bi4gV2hhdCBpcyBzdG9yZWQgdGhlcmUgaXMgcGxhaW4gZGF0YSByZWFkIHN0cnVjdHVyYWxseSAobWFwcyBhbmRcbiAqIHNldHMsIG5ldmVyIGEgY2xhc3MgaW5zdGFuY2UpLCBiZWNhdXNlIHRoZSBiYWcgY3Jvc3NlcyBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5IGF0IGRpZmZlcmVudCB2ZXJzaW9ucy4gVGhlIGtleVxuICogY2FycmllcyBhIHZlcnNpb246IGEgY2hhbmdlIHRvIHdoYXQgYSBrZXkgTUVBTlMgKGhvdyBhIG5hbWUga2V5IGlzIGRlcml2ZWQpIG11c3QgbW92ZSB0byBhIG5ldyBrZXksIHNvIGFuIG9sZGVyXG4gKiBjb3B5IG5ldmVyIHJlYWRzIGFuIGluZGV4IGJ1aWx0IGJ5IGRpZmZlcmVudCBydWxlcy5cbiAqXG4gKiBUaGUgYGxpbmtVcGRhdGVyc2Agc2lkZSBpcyBzdGlsbCB3YWxrZWQgaW4gZnVsbCBvbiBldmVyeSBxdWVyeS4gSW4gMS4xNC4yIHRoZSBvbmx5IHVwZGF0ZXIgaXMgdGhlIGNhbnZhc1xuICogb25lLCB3aG9zZSByZWZlcmVuY2VzIGxpdmUgaW4gdGhlIGNhbnZhcyBpbmRleCByYXRoZXIgdGhhbiBpbiBgZmlsZUNhY2hlYCwgc28gdGhlcmUgaXMgbm8gaGFzaCB0byBrZXkgdGhlbVxuICogYnk7IGEgdmF1bHQncyBjYW52YXNlcyBob2xkIGEgc21hbGwgZnJhY3Rpb24gb2YgaXRzIHJlZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDdXN0b21BcnJheURpY3QgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0JztcbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBDYWNoZWRNZXRhZGF0YSxcbiAgUmVmZXJlbmNlLFxuICBURmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcbmltcG9ydCB7IEN1c3RvbUFycmF5RGljdEltcGwgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIE9ic2lkaWFuJ3MgYG1ldGFkYXRhQ2FjaGUuaXRlcmF0ZUFsbFJlZnNgIHRha2VzLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRlUmVmZXJlbmNlc0NhbGxiYWNrID0gUGFyYW1ldGVyczxBcHBbJ21ldGFkYXRhQ2FjaGUnXVsnaXRlcmF0ZUFsbFJlZnMnXT5bMF07XG5cbmludGVyZmFjZSBCYWNrbGlua0luZGV4RGF0YSB7XG4gIHJlYWRvbmx5IGluZGV4ZWRIYXNoZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHJlYWRvbmx5IG5hbWVLZXlTb3VyY2VQYXRoczogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+O1xuICByZWFkb25seSBzb3VyY2VQYXRoTmFtZUtleXM6IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pjtcbn1cblxuY29uc3QgTUFSS0RPV05fU1VGRklYID0gJy5tZCc7XG5cbi8qKlxuICogVGhlIHNhbWUgYW5zd2VyIGFzIGBhcHAubWV0YWRhdGFDYWNoZS5nZXRCYWNrbGlua3NGb3JGaWxlKGZpbGUpYCAoT2JzaWRpYW4ncyBvd24sIHVucGF0Y2hlZCksIGZyb20gdGhlIGNhbmRpZGF0ZVxuICogbm90ZXMgb25seS4gU2VlIHRoZSBmaWxlIGhlYWRlciBmb3Igd2h5IHRoZSBhbnN3ZXIgaXMgZXhhY3QuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBmaWxlIHdob3NlIGJhY2tsaW5rcyB0byBmaW5kLiBJdCBtYXkgYmUgYSBub24tZXhpc3RpbmcgZmlsZSByZWdpc3RlcmVkIGZvciB0aGUgcXVlcnkuXG4gKiBAcmV0dXJucyBUaGUgcmVmZXJlbmNlcyB0aGF0IHJlc29sdmUgdG8gYGZpbGVgLCBrZXllZCBieSB0aGUgcGF0aCBvZiB0aGUgbm90ZSBvciBjYW52YXMgaG9sZGluZyB0aGVtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5kZXhlZEJhY2tsaW5rc0ZvckZpbGUoYXBwOiBBcHAsIGZpbGU6IFRGaWxlKTogQ3VzdG9tQXJyYXlEaWN0PFJlZmVyZW5jZT4ge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG1ldGFkYXRhQ2FjaGUgPSBhcHAubWV0YWRhdGFDYWNoZTtcbiAgY29uc3QgYmFja2xpbmtzID0gbmV3IEN1c3RvbUFycmF5RGljdEltcGw8UmVmZXJlbmNlPigpO1xuXG4gIC8vIFRoZSBmaWxlIGl0c2VsZiBpcyBhIGNhbmRpZGF0ZSBmb3IgaXRzIG93biBgW1sjSGVhZGluZ11dYCByZWZlcmVuY2VzLCB3aG9zZSBlbXB0eSBsaW5rcGF0aCBuYW1lcyBubyBzZWdtZW50LlxuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBnZXRUYXJnZXROYW1lS2V5cyhmaWxlLm5hbWUpKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgY29sbGVjdChzb3VyY2VQYXRoLCByZWZlcmVuY2UpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbGlua1VwZGF0ZXIgb2YgT2JqZWN0LnZhbHVlcyhtZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY29sbGVjdCk7XG4gIH1cblxuICByZXR1cm4gYmFja2xpbmtzO1xuXG4gIGZ1bmN0aW9uIGNvbGxlY3Qoc291cmNlUGF0aDogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IHZvaWQge1xuICAgIGlmIChtZXRhZGF0YUNhY2hlLmdldEZpcnN0TGlua3BhdGhEZXN0KGdldExpbmtwYXRoKHJlZmVyZW5jZS5saW5rKSwgc291cmNlUGF0aCkgPT09IGZpbGUpIHtcbiAgICAgIGJhY2tsaW5rcy5hZGQoc291cmNlUGF0aCwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBWaXNpdHMgdGhlIHJlZmVyZW5jZXMgYGFwcC5tZXRhZGF0YUNhY2hlLml0ZXJhdGVBbGxSZWZzYCB3b3VsZCB2aXNpdCwgbWludXMgZXZlcnkgcmVmZXJlbmNlIHdob3NlIHJlc29sdXRpb25cbiAqIGNhbm5vdCBjaGFuZ2Ugd2hlbiBgZmlsZWAgaXMgcmVuYW1lZCB0byBgbmV3UGF0aGAuXG4gKlxuICogT2JzaWRpYW4ncyBgRmlsZU1hbmFnZXIucnVuQXN5bmNMaW5rVXBkYXRlYCByZXNvbHZlcyBFVkVSWSByZWZlcmVuY2UgaW4gdGhlIHZhdWx0IGJlZm9yZSBlYWNoIHJlbmFtZSwgdG8gZGlmZlxuICogdGhlIHJlc29sdXRpb25zIGFmdGVyd2FyZHMgaW4gYHVwZGF0ZUFsbExpbmtzYDsgdGhhdCBpcyB0aGUgd2hvbGUgY29zdCBvZiBhIHJlbmFtZSBpbiBhIGxhcmdlIHZhdWx0LiBBIHJlZmVyZW5jZVxuICogY2FuIHJlc29sdmUgdG8gYGZpbGVgIG9ubHkgaWYgaXRzIGxpbmtwYXRoJ3MgbGFzdCBzZWdtZW50IG1hdGNoZXMgYGZpbGVgJ3MgbmFtZSBiZWZvcmUgdGhlIHJlbmFtZSBvciBpdHMgbmFtZVxuICogYWZ0ZXIgaXQgKHNlZSB0aGUgZmlsZSBoZWFkZXIpLCBhbmQgYSByZWZlcmVuY2UgdGhhdCByZXNvbHZlcyB0byBuZWl0aGVyIGtlZXBzIHJlc29sdmluZyB0byB3aGF0ZXZlciBpdCBkaWQuIFNvXG4gKiB0aGUgcmVmZXJlbmNlcyB0aGF0IGNhbiBjaGFuZ2UgYXJlIHRob3NlIG9mIHRoZSBpbmRleCdzIGNhbmRpZGF0ZXMgZm9yIGJvdGggbmFtZXMsIHBsdXMgdGhlIHJlZmVyZW5jZXMgaGVsZCBieVxuICogYGZpbGVgIGl0c2VsZiwgd2hvc2UgcmVsYXRpdmUgbGlua3MgcmVzb2x2ZSBmcm9tIGl0cyBuZXcgZm9sZGVyIGFmdGVyd2FyZHMuIGBsaW5rVXBkYXRlcnNgIHJlZmVyZW5jZXMgYXJlIHdhbGtlZFxuICogaW4gZnVsbCwgYXMgaW4ge0BsaW5rIGdldEluZGV4ZWRCYWNrbGlua3NGb3JGaWxlfS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmaWxlIC0gVGhlIGZpbGUgYmVpbmcgcmVuYW1lZCwgc3RpbGwgYXQgaXRzIG9sZCBwYXRoLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCBpdCBpcyBiZWluZyByZW5hbWVkIHRvLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gQ2FsbGVkIHdpdGggZWFjaCByZWZlcmVuY2UgYW5kIHRoZSBwYXRoIG9mIHRoZSBub3RlIGhvbGRpbmcgaXQuIFJldHVybmluZyBgdHJ1ZWAgc3RvcHMgdGhlXG4gKiAgIHdhbGsgb3ZlciB0aGF0IG5vdGUncyByZWZlcmVuY2VzLCBhcyBpbiBPYnNpZGlhbidzIG93biB3YWxrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0ZVJlZmVyZW5jZXNBZmZlY3RlZEJ5UmVuYW1lKFxuICBhcHA6IEFwcCxcbiAgZmlsZTogVEZpbGUsXG4gIG5ld1BhdGg6IHN0cmluZyxcbiAgY2FsbGJhY2s6IEl0ZXJhdGVSZWZlcmVuY2VzQ2FsbGJhY2tcbik6IHZvaWQge1xuICBjb25zdCBkYXRhID0gZ2V0QmFja2xpbmtJbmRleERhdGEoKTtcbiAgcmVmcmVzaChhcHAsIGRhdGEpO1xuXG4gIGNvbnN0IG5ld05hbWUgPSBuZXdQYXRoLnNsaWNlKG5ld1BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICBjb25zdCBjYW5kaWRhdGVTb3VyY2VQYXRocyA9IG5ldyBTZXQ8c3RyaW5nPihbZmlsZS5wYXRoXSk7XG4gIGZvciAoY29uc3QgbmFtZUtleSBvZiBbLi4uZ2V0VGFyZ2V0TmFtZUtleXMoZmlsZS5uYW1lKSwgLi4uZ2V0VGFyZ2V0TmFtZUtleXMobmV3TmFtZSldKSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VQYXRoIG9mIGRhdGEubmFtZUtleVNvdXJjZVBhdGhzLmdldChuYW1lS2V5KSA/PyBbXSkge1xuICAgICAgY2FuZGlkYXRlU291cmNlUGF0aHMuYWRkKHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBjYW5kaWRhdGVTb3VyY2VQYXRocykge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIGdldENhY2hlUmVmZXJlbmNlcyhnZXRDYWNoZWRNZXRhZGF0YShhcHAsIHNvdXJjZVBhdGgpKSkge1xuICAgICAgaWYgKGNhbGxiYWNrKHNvdXJjZVBhdGgsIHJlZmVyZW5jZSkgPT09IHRydWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBsaW5rVXBkYXRlciBvZiBPYmplY3QudmFsdWVzKGFwcC5tZXRhZGF0YUNhY2hlLmxpbmtVcGRhdGVycykpIHtcbiAgICBsaW5rVXBkYXRlcj8uaXRlcmF0ZVJlZmVyZW5jZXMoY2FsbGJhY2spO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEJhY2tsaW5rSW5kZXhEYXRhKCk6IEJhY2tsaW5rSW5kZXhEYXRhIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliU3RhdGU8QmFja2xpbmtJbmRleERhdGE+KCdiYWNrbGlua0luZGV4VjEnLCB7XG4gICAgaW5kZXhlZEhhc2hlczogbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSxcbiAgICBuYW1lS2V5U291cmNlUGF0aHM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKSxcbiAgICBzb3VyY2VQYXRoTmFtZUtleXM6IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKVxuICB9KS52YWx1ZTtcbn1cbmZ1bmN0aW9uIGdldENhY2hlZE1ldGFkYXRhKGFwcDogQXBwLCBzb3VyY2VQYXRoOiBzdHJpbmcpOiBDYWNoZWRNZXRhZGF0YSB8IG51bGwge1xuICBjb25zdCBoYXNoID0gYXBwLm1ldGFkYXRhQ2FjaGUuZmlsZUNhY2hlW3NvdXJjZVBhdGhdPy5oYXNoO1xuICByZXR1cm4gaGFzaCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGFwcC5tZXRhZGF0YUNhY2hlLm1ldGFkYXRhQ2FjaGVbaGFzaF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBMaXN0cyBhIGNhY2hlZCBub3RlJ3MgcmVmZXJlbmNlcyBpbiB0aGUgb3JkZXIgT2JzaWRpYW4ncyBvd24gd2FsayB2aXNpdHMgdGhlbTogYGZyb250bWF0dGVyTGlua3NgLCB0aGVuXG4gKiBgbGlua3NgLCB0aGVuIGBlbWJlZHNgLlxuICpcbiAqIEBwYXJhbSBjYWNoZSAtIFRoZSBub3RlJ3MgY2FjaGVkIG1ldGFkYXRhLlxuICogQHJldHVybnMgVGhlIG5vdGUncyByZWZlcmVuY2VzLlxuICovXG5mdW5jdGlvbiBnZXRDYWNoZVJlZmVyZW5jZXMoY2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IFJlZmVyZW5jZVtdIHtcbiAgcmV0dXJuIGNhY2hlID8gWy4uLmNhY2hlLmZyb250bWF0dGVyTGlua3MgPz8gW10sIC4uLmNhY2hlLmxpbmtzID8/IFtdLCAuLi5jYWNoZS5lbWJlZHMgPz8gW11dIDogW107XG59XG5cbi8qKlxuICogU3RyaXBzIHRoZSBzdWJwYXRoIGZyb20gYSBsaW5rLCB0aGUgd2F5IE9ic2lkaWFuJ3MgYGdldExpbmtwYXRoYCBkb2VzLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdGV4dCwgc3VjaCBhcyBgZm9sZGVyL05vdGUjSGVhZGluZ2AuXG4gKiBAcmV0dXJucyBUaGUgbGlua3BhdGgsIHN1Y2ggYXMgYGZvbGRlci9Ob3RlYC5cbiAqL1xuZnVuY3Rpb24gZ2V0TGlua3BhdGgobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaEluZGV4ID0gbGluay5pbmRleE9mKCcjJyk7XG4gIHJldHVybiBoYXNoSW5kZXggPT09IC0xID8gbGluayA6IGxpbmsuc2xpY2UoMCwgaGFzaEluZGV4KTtcbn1cblxuLyoqXG4gKiBUaGUga2V5IGEgcmVmZXJlbmNlIGlzIGluZGV4ZWQgdW5kZXI6IHRoZSBsb3dlcmNhc2VkIGxhc3QgYC9gIHNlZ21lbnQgb2YgaXRzIGxpbmtwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIHJlZmVyZW5jZSdzIGxpbmsgdGV4dC5cbiAqIEByZXR1cm5zIFRoZSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZmVyZW5jZU5hbWVLZXkobGluazogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGlua3BhdGggPSBnZXRMaW5rcGF0aChsaW5rKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbGlua3BhdGguc2xpY2UobGlua3BhdGgubGFzdEluZGV4T2YoJy8nKSArIDEpO1xufVxuXG4vKipcbiAqIFRoZSBrZXlzIHVuZGVyIHdoaWNoIGEgcmVmZXJlbmNlIHRvIGEgZmlsZSB3aXRoIHRoaXMgbmFtZSBjYW4gYmUgaW5kZXhlZC4gYGdldExpbmtwYXRoRGVzdGAgbWF0Y2hlcyBhXG4gKiBzZWdtZW50IGFnYWluc3QgdGhlIGZpbGUncyBuYW1lLCBhbmQgYWdhaW5zdCB0aGUgbmFtZSB3aXRoIGAubWRgIGFwcGVuZGVkLCBzbyBhIG5vdGUgbmFtZWQgYE5vdGUubWRgIGlzXG4gKiByZWFjaGFibGUgZnJvbSBib3RoIGBub3RlLm1kYCBhbmQgYG5vdGVgLlxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZSAtIFRoZSBmaWxlJ3MgbmFtZSwgZXh0ZW5zaW9uIGluY2x1ZGVkLlxuICogQHJldHVybnMgVGhlIGtleXMuXG4gKi9cbmZ1bmN0aW9uIGdldFRhcmdldE5hbWVLZXlzKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG5hbWVLZXkgPSBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbmFtZUtleS5lbmRzV2l0aChNQVJLRE9XTl9TVUZGSVgpID8gW25hbWVLZXksIG5hbWVLZXkuc2xpY2UoMCwgLU1BUktET1dOX1NVRkZJWC5sZW5ndGgpXSA6IFtuYW1lS2V5XTtcbn1cblxuZnVuY3Rpb24gaW5kZXhTb3VyY2UoYXBwOiBBcHAsIGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhLCBzb3VyY2VQYXRoOiBzdHJpbmcsIGhhc2g6IHN0cmluZyk6IHZvaWQge1xuICByZW1vdmVTb3VyY2UoZGF0YSwgc291cmNlUGF0aCk7XG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUubWV0YWRhdGFDYWNoZVtoYXNoXTtcbiAgLypcbiAgICogQSBub3RlJ3MgYGZpbGVDYWNoZWAgZW50cnkgY2FuIGNhcnJ5IGl0cyBuZXcgaGFzaCBiZWZvcmUgdGhlIG1ldGFkYXRhIGZvciB0aGF0IGhhc2ggaXMgc3RvcmVkLiBSZWNvcmRpbmdcbiAgICogdGhlIGhhc2ggdGhlbiB3b3VsZCBwaW4gdGhlIG5vdGUgYXQgXCJubyByZWZlcmVuY2VzXCIgdW50aWwgaXRzIGNvbnRlbnQgY2hhbmdlZCBhZ2Fpbiwgc28gbGVhdmUgaXRcbiAgICogdW5yZWNvcmRlZCBhbmQgbGV0IHRoZSBuZXh0IHF1ZXJ5IGxvb2sgYWdhaW4uXG4gICAqL1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbmFtZUtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgZ2V0Q2FjaGVSZWZlcmVuY2VzKGNhY2hlKSkge1xuICAgIG5hbWVLZXlzLmFkZChnZXRSZWZlcmVuY2VOYW1lS2V5KHJlZmVyZW5jZS5saW5rKSk7XG4gIH1cbiAgZm9yIChjb25zdCBuYW1lS2V5IG9mIG5hbWVLZXlzKSB7XG4gICAgbGV0IHNvdXJjZVBhdGhzID0gZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZ2V0KG5hbWVLZXkpO1xuICAgIGlmICghc291cmNlUGF0aHMpIHtcbiAgICAgIHNvdXJjZVBhdGhzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICBkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5zZXQobmFtZUtleSwgc291cmNlUGF0aHMpO1xuICAgIH1cbiAgICBzb3VyY2VQYXRocy5hZGQoc291cmNlUGF0aCk7XG4gIH1cbiAgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuc2V0KHNvdXJjZVBhdGgsIG5hbWVLZXlzKTtcbiAgZGF0YS5pbmRleGVkSGFzaGVzLnNldChzb3VyY2VQYXRoLCBoYXNoKTtcbn1cblxuLyoqXG4gKiBCcmluZ3MgdGhlIGluZGV4IGluIGxpbmUgd2l0aCBgbWV0YWRhdGFDYWNoZS5maWxlQ2FjaGVgLiBJdCBydW5zIG9uIGV2ZXJ5IHF1ZXJ5LCBzbyBpdCBpcyBvbmUgcGFzcyBvdmVyXG4gKiBgZmlsZUNhY2hlYCB3aXRoIG5vIGFsbG9jYXRpb24gcGVyIG5vdGUgKGEgcmVuYW1lIGluIGEgbGFyZ2UgdmF1bHQgcXVlcmllcyBzZXZlcmFsIHRpbWVzKSwgYW5kIHRoZSBwYXNzIG92ZXIgdGhlXG4gKiBpbmRleCB0aGF0IGZpbmRzIG5vdGVzIGdvbmUgZnJvbSBgZmlsZUNhY2hlYCBydW5zIG9ubHkgd2hlbiB0aGF0IGZpcnN0IHBhc3MgZGlkIG5vdCBzZWUgZXZlcnkgaW5kZXhlZCBub3RlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgaW5kZXguXG4gKi9cbmZ1bmN0aW9uIHJlZnJlc2goYXBwOiBBcHAsIGRhdGE6IEJhY2tsaW5rSW5kZXhEYXRhKTogdm9pZCB7XG4gIGNvbnN0IGZpbGVDYWNoZSA9IGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVDYWNoZTtcbiAgY29uc3QgaW5kZXhlZENvdW50QmVmb3JlID0gZGF0YS5pbmRleGVkSGFzaGVzLnNpemU7XG4gIGxldCBzZWVuSW5kZXhlZENvdW50ID0gMDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZ3VhcmQtZm9yLWluIC0tIGBPYmplY3QuaGFzT3duYCBiZWxvdyBpcyB0aGUgZ3VhcmQ7IGBmb3IuLi5pbmAgYXZvaWRzIGFuIGVudHJ5IGFycmF5IHBlciBub3RlLlxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggaW4gZmlsZUNhY2hlKSB7XG4gICAgY29uc3QgZW50cnkgPSBPYmplY3QuaGFzT3duKGZpbGVDYWNoZSwgc291cmNlUGF0aCkgPyBmaWxlQ2FjaGVbc291cmNlUGF0aF0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ZWRIYXNoID0gZGF0YS5pbmRleGVkSGFzaGVzLmdldChzb3VyY2VQYXRoKTtcbiAgICBpZiAoaW5kZXhlZEhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VlbkluZGV4ZWRDb3VudCsrO1xuICAgIH1cbiAgICBpZiAoaW5kZXhlZEhhc2ggIT09IGVudHJ5Lmhhc2gpIHtcbiAgICAgIGluZGV4U291cmNlKGFwcCwgZGF0YSwgc291cmNlUGF0aCwgZW50cnkuaGFzaCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHNlZW5JbmRleGVkQ291bnQgPT09IGluZGV4ZWRDb3VudEJlZm9yZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3Qgc291cmNlUGF0aCBvZiBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5rZXlzKCkpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oZmlsZUNhY2hlLCBzb3VyY2VQYXRoKSkge1xuICAgICAgcmVtb3ZlU291cmNlKGRhdGEsIHNvdXJjZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVTb3VyY2UoZGF0YTogQmFja2xpbmtJbmRleERhdGEsIHNvdXJjZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBmb3IgKGNvbnN0IG5hbWVLZXkgb2YgZGF0YS5zb3VyY2VQYXRoTmFtZUtleXMuZ2V0KHNvdXJjZVBhdGgpID8/IFtdKSB7XG4gICAgY29uc3Qgc291cmNlUGF0aHMgPSBlbnN1cmVOb25OdWxsYWJsZShkYXRhLm5hbWVLZXlTb3VyY2VQYXRocy5nZXQobmFtZUtleSkpO1xuICAgIHNvdXJjZVBhdGhzLmRlbGV0ZShzb3VyY2VQYXRoKTtcbiAgICBpZiAoc291cmNlUGF0aHMuc2l6ZSA9PT0gMCkge1xuICAgICAgZGF0YS5uYW1lS2V5U291cmNlUGF0aHMuZGVsZXRlKG5hbWVLZXkpO1xuICAgIH1cbiAgfVxuICBkYXRhLnNvdXJjZVBhdGhOYW1lS2V5cy5kZWxldGUoc291cmNlUGF0aCk7XG4gIGRhdGEuaW5kZXhlZEhhc2hlcy5kZWxldGUoc291cmNlUGF0aCk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdEQSx5QkFBa0M7QUFDbEMsNkJBQW9DO0FBRXBDLGdDQUFvQztBQWFwQyxNQUFNLGtCQUFrQjtBQVVqQixTQUFTLDJCQUEyQixLQUFVLE1BQXlDO0FBQzVGLFFBQU0sT0FBTyxxQkFBcUI7QUFDbEMsVUFBUSxLQUFLLElBQUk7QUFFakIsUUFBTSxnQkFBZ0IsSUFBSTtBQUMxQixRQUFNLFlBQVksSUFBSSwyQ0FBK0I7QUFHckQsUUFBTSx1QkFBdUIsb0JBQUksSUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDO0FBQ3hELGFBQVcsV0FBVyxrQkFBa0IsS0FBSyxJQUFJLEdB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