@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
@@ -38,6 +38,9 @@ import {
38
38
  } from "./data-store-replica.mjs";
39
39
  import { DataStoreTransport } from "./data-store-transport.mjs";
40
40
  const DEFAULT_ACTIVE_DEVICE_MILLISECONDS = 2592e6;
41
+ const OPEN_SEGMENT_BYTES = 65536;
42
+ const ACKNOWLEDGEMENT_REFRESH_MILLISECONDS = 864e5;
43
+ const ACKNOWLEDGEMENT_REFRESHES_PER_RETIREMENT = 4;
41
44
  const OWNER_PATH_INDEX = -2;
42
45
  const VECTOR_ENTRY_LENGTH = 2;
43
46
  const DEVICE_PATH_PARTS = 2;
@@ -72,6 +75,7 @@ class SharedDataStore {
72
75
  knownTransportRoots = /* @__PURE__ */ new Set();
73
76
  localRecords = /* @__PURE__ */ new Map();
74
77
  locations;
78
+ ownSegments = /* @__PURE__ */ new Map();
75
79
  replica;
76
80
  time = 0;
77
81
  vector = /* @__PURE__ */ new Map();
@@ -195,7 +199,7 @@ class SharedDataStore {
195
199
  await this.setMany([[key, value]]);
196
200
  }
197
201
  /**
198
- * Publishes a batch of register writes, split into bounded immutable segments.
202
+ * Publishes a batch of register writes, appended to this device's open journal segment and split into bounded ones.
199
203
  * Segments are individually durable; a failed batch can have a published prefix and can be retried safely.
200
204
  *
201
205
  * @param entries - Register writes or set additions.
@@ -299,19 +303,22 @@ class SharedDataStore {
299
303
  }
300
304
  for (const operation of operations) {
301
305
  if (!this.transport.fits([operation])) {
302
- await this.transport.write(`${this.deviceRoot()}/log-${String(operation.sequence)}${this.transport.extension}`, [operation]);
306
+ await this.transport.write(this.segmentPath(operation.sequence), [operation]);
303
307
  }
304
308
  }
305
- let batch = [];
309
+ let segment = this.openSegment();
306
310
  for (const operation of operations) {
307
- if (!this.transport.fits([...batch, operation])) {
308
- await this.publish(batch);
309
- batch = [];
311
+ if (segment && this.transport.fits([...segment.operations, ...segment.added, operation])) {
312
+ segment.added.push(operation);
313
+ continue;
314
+ }
315
+ if (segment && segment.added.length > 0) {
316
+ await this.publish(segment);
310
317
  }
311
- batch.push(operation);
318
+ segment = { added: [operation], operations: [], path: this.segmentPath(operation.sequence) };
312
319
  }
313
- if (batch.length > 0) {
314
- await this.publish(batch);
320
+ if (segment && segment.added.length > 0) {
321
+ await this.publish(segment);
315
322
  }
316
323
  await this.persist();
317
324
  });
@@ -397,6 +404,7 @@ class SharedDataStore {
397
404
  }
398
405
  const operations = [];
399
406
  const segments = files.filter((file) => /\/log-\d+\.(?:md|json)$/.test(file));
407
+ const ownSegments = [];
400
408
  for (const path of segments) {
401
409
  const segment = await transport.read(path);
402
410
  if (segment === void 0) {
@@ -409,8 +417,14 @@ class SharedDataStore {
409
417
  if (segment.some((operation) => operation.device !== owner)) {
410
418
  throw new Error("Journal segment has a different writer");
411
419
  }
420
+ const [firstOperation] = segment;
421
+ if (owner === this.device && firstOperation) {
422
+ ownSegments.push([firstOperation.sequence, { operations: segment, path }]);
423
+ }
412
424
  operations.push(...segment);
413
425
  }
426
+ ownSegments.sort(([first], [second]) => first - second);
427
+ this.ownSegments.set(transport.root, ownSegments.map(([, segment]) => segment));
414
428
  operations.sort((first, second) => first.device.localeCompare(second.device) || first.sequence - second.sequence);
415
429
  for (const operation of operations) {
416
430
  if (operation.sequence === (this.vector.get(operation.device) ?? 0) + 1) {
@@ -426,6 +440,23 @@ class SharedDataStore {
426
440
  this.counter = Math.max(this.counter, counter);
427
441
  }
428
442
  }
443
+ /**
444
+ * Picks the segment the next operation may extend: this device's newest one in the active transport, when it ends
445
+ * exactly at the device's last sequence and is still small enough that rewriting it stays cheap.
446
+ *
447
+ * @returns The open segment, or `null` when the next operation starts a new file.
448
+ */
449
+ openSegment() {
450
+ const newest = this.ownSegments.get(this.transport.root)?.at(-1);
451
+ if (!newest) {
452
+ return null;
453
+ }
454
+ const last = newest.operations.at(-1);
455
+ return last?.sequence !== this.vector.get(this.device) || this.transport.measure(newest.operations) >= this.openSegmentBytes() ? null : { added: [], operations: newest.operations, path: newest.path };
456
+ }
457
+ openSegmentBytes() {
458
+ return Math.min(OPEN_SEGMENT_BYTES, this.transport.maxFileBytes);
459
+ }
429
460
  async persist() {
430
461
  const checkpoint = this.checkpoint();
431
462
  const records = /* @__PURE__ */ new Map();
@@ -445,15 +476,38 @@ class SharedDataStore {
445
476
  await this.params.local.set("shared-unpublished-v1", false);
446
477
  this.hasUnpublishedChanges = false;
447
478
  }
448
- await this.transport.write(`${this.deviceRoot()}/have${this.transport.extension}`, { format: 1, time: Date.now(), vector: [...this.vector] });
479
+ await this.publishAcknowledgement();
449
480
  }
450
- async publish(operations) {
451
- const first = ensureNonNullable(operations[0]);
452
- await this.transport.writeImmutable(`${this.deviceRoot()}/log-${String(first.sequence)}${this.transport.extension}`, operations);
453
- for (const operation of operations) {
481
+ async publish(segment) {
482
+ await this.transport.writeAppendOnly(segment.path, [...segment.operations, ...segment.added]);
483
+ for (const operation of segment.added) {
454
484
  this.apply(operation);
455
485
  }
456
486
  }
487
+ /**
488
+ * Rewrites `have` only when another device's acknowledged sequence moved, or the stored copy is due a refresh.
489
+ * Other devices read only their own entry from it, so this device's own sequence never forces a write.
490
+ *
491
+ * @returns A promise that resolves once the acknowledgement is current.
492
+ */
493
+ async publishAcknowledgement() {
494
+ const path = `${this.deviceRoot()}/have${this.transport.extension}`;
495
+ const acknowledged = JSON.stringify(otherDevices([...this.vector], this.device));
496
+ let stored;
497
+ try {
498
+ stored = await this.transport.read(path);
499
+ } catch {
500
+ stored = void 0;
501
+ }
502
+ const refreshMilliseconds = Math.min(ACKNOWLEDGEMENT_REFRESH_MILLISECONDS, this.activeDeviceMilliseconds / ACKNOWLEDGEMENT_REFRESHES_PER_RETIREMENT);
503
+ if (isObject(stored) && stored["format"] === 1 && isVector(stored["vector"]) && typeof stored["time"] === "number" && JSON.stringify(otherDevices(stored["vector"], this.device)) === acknowledged && Date.now() - stored["time"] < refreshMilliseconds) {
504
+ return;
505
+ }
506
+ await this.transport.write(path, { format: 1, time: Date.now(), vector: [...this.vector] });
507
+ }
508
+ segmentPath(firstSequence) {
509
+ return `${this.deviceRoot()}/log-${String(firstSequence)}${this.transport.extension}`;
510
+ }
457
511
  }
458
512
  function isObject(value) {
459
513
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -463,7 +517,10 @@ function isVector(value) {
463
517
  (entry) => Array.isArray(entry) && entry.length === VECTOR_ENTRY_LENGTH && typeof entry[0] === "string" && /^[\w-]+$/.test(entry[0]) && Number.isSafeInteger(entry[1]) && Number(entry[1]) >= 0
464
518
  );
465
519
  }
520
+ function otherDevices(vector, device) {
521
+ return vector.filter(([entryDevice]) => entryDevice !== device).sort(([first], [second]) => first.localeCompare(second));
522
+ }
466
523
  export {
467
524
  SharedDataStore
468
525
  };
469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBNZXJnZWFibGUgcGx1Z2luIGRhdGEsIHRyYW5zcG9ydGVkIGFzIHNpbmdsZS13cml0ZXIgam91cm5hbCBzZWdtZW50cyBhbmQgY2h1bmtlZCBzbmFwc2hvdHMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgSnNvblZhbHVlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IERhdGFTdG9yZUxvY2F0aW9uIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIERhdGFTdG9yZU1lcmdlS2luZCxcbiAgRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB0eXBlIHsgTG9jYWxEYXRhU3RvcmUgfSBmcm9tICcuL2xvY2FsLWRhdGEtc3RvcmUudHMnO1xuXG5pbXBvcnQgeyBEYXRhU3RvcmVMb2NhdGlvbnMgfSBmcm9tICcuL2RhdGEtc3RvcmUtbG9jYXRpb25zLnRzJztcbmltcG9ydCB7XG4gIERhdGFTdG9yZVJlcGxpY2EsXG4gIGlzRGF0YVN0b3JlT3BlcmF0aW9uXG59IGZyb20gJy4vZGF0YS1zdG9yZS1yZXBsaWNhLnRzJztcbmltcG9ydCB7IERhdGFTdG9yZVRyYW5zcG9ydCB9IGZyb20gJy4vZGF0YS1zdG9yZS10cmFuc3BvcnQudHMnO1xuXG5jb25zdCBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTID0gMl81OTJfMDAwXzAwMDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IERFVklDRV9JRF9SRUdfRVhQID0gL15bXFx3LV0rJC87XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTmV3IGRvY3VtZW50IGVuY29kaW5nIGF0IHRoZSBwZXJtYW5lbnQgZGlzY292ZXJ5IGFuY2hvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogRW5hYmxlcyB2YXVsdCB0cmFuc3BvcnQuIERpc2FibGVkIHN0b3JlcyBtYWtlIG5vIGFkYXB0ZXIgY2FsbHMsIGluY2x1ZGluZyBkdXJpbmcgY29tcGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1N5bmNFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEltbXV0YWJsZSBtZXJnZSBydWxlOyBjaGFuZ2luZyBpdCByZXF1aXJlcyBhIG5ldyBzdG9yZSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBsb2NhbCBzdG9yZSBzY29wZWQgdG8gVEhJUyB2YXVsdCwgcGx1Z2luIGFuZCBzaGFyZWQtc3RvcmUgc2NoZW1hLiBUaGUgY2FsbGVyIG93bnMgaXRzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIHBlciBmaWxlLCB3cmFwcGVyIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYSByZWNvbnN0cnVjdGVkIHNuYXBzaG90IGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgcmVhZG9ubHkgY291bnRlcjogbnVtYmVyO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgLyoqXG4gIENvbmZpZ3VyZWQgYW5kIHJlbWVtYmVyZWQgcmVhZGVyIHJvb3RzLCBpbmNsdWRpbmcgcmV0YWluZWQgbWlncmF0aW9uIHNvdXJjZXMgd2hpbGUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSByb290cyBzdWl0YWJsZSBmb3IgbWV0YWRhdGEgZXhjbHVzaW9uIHdpdGhvdXQgYWRhcHRlciBhY2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydFJvb3RzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnRoaXMua25vd25UcmFuc3BvcnRSb290cywgLi4udGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cy5tYXAoKHRyYW5zcG9ydCkgPT4gdHJhbnNwb3J0LnJvb3QpXSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBoYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duVHJhbnNwb3J0Um9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25zO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2ZWN0b3IgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgZ2V0IHRyYW5zcG9ydCgpOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLmF0KC0xKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMubG9jYXRpb25zID0gbmV3IERhdGFTdG9yZUxvY2F0aW9ucyhwYXJhbXMpO1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHBhcmFtcy5pc1N5bmNFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EocGFyYW1zLmtpbmQpO1xuICAgIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID0gcGFyYW1zLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB8fCB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSByZXRpcmVtZW50IGludGVydmFsIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW5kIHN5bmNocm9uaXplcyBhIHN0b3JlLCByZXN0b3JpbmcgaXRzIGRldmljZSBpZGVudGl0eSBleGNsdXNpdmVseSBmcm9tIEluZGV4ZWREQi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcnNpc3RlbmNlLCB0cmFuc3BvcnQgYW5kIG1lcmdlIHBvbGljeS5cbiAgICogQHJldHVybnMgQSBzeW5jaHJvbml6ZWQgcXVlcnkgcmVwbGljYS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPFNoYXJlZERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHBhcmFtcy5sb2NhbC5nZXRPckNyZWF0ZSgnc2hhcmVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICBpZiAodHlwZW9mIGRldmljZSAhPT0gJ3N0cmluZycgfHwgIURFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIGRhdGEtc3RvcmUgaWRlbnRpdHknKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgU2hhcmVkRGF0YVN0b3JlKHBhcmFtcywgZGV2aWNlKTtcbiAgICBhd2FpdCBzdG9yZS5zeW5jaHJvbml6ZSgpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBjb21wbGV0ZSBjaHVua2VkIHNuYXBzaG90IGFuZCB0cmltcyBvbmx5IHRoaXMgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIGpvdXJuYWwgc2VnbWVudHMuXG4gICAqIFJldGlyZWQgZGV2aWNlcyByZWpvaW4gYnkgbWVyZ2luZyBzbmFwc2hvdHM7IHRvbWJzdG9uZXMgcmVtYWluIGluIHNuYXBzaG90cyB0byBwcmV2ZW50IHJlc3VycmVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb21wYWN0aW9uIGZpbmlzaGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YDtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlLCBwYXlsb2FkOiB0aGlzLmNoZWNrcG9pbnQoKSB9KTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBhd2FpdCB0aGlzLmFja25vd2xlZGdlbWVudHMoZmlsZXMpO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctYCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8ICFvcGVyYXRpb25zLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heCguLi5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uc2VxdWVuY2UpKTtcbiAgICAgICAgaWYgKGFja25vd2xlZGdlbWVudHMuZXZlcnkoKHZlY3RvcikgPT4gKHZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDApID49IGxhc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgY29tcGxldGUgbmV3IHNuYXBzaG90IGNvdmVycyBldmVyeSBlYXJsaWVyIHNuYXBzaG90IGZyb20gdGhpcyB3cml0ZXIuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIHRyYW5zcG9ydCBmaWxlcywgcm9vdHMsIGFuZCBhbmNlc3RvciBmb2xkZXIgb3BlcmF0aW9ucyBmb3IgY29uc3VtZXIgZXZlbnQgZmlsdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIG9yIGZvbGRlciBwYXRoLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXRoIGludGVyc2VjdHMgYW4gYWN0aXZlIG9yIHJldGFpbmVkIHRyYW5zcG9ydCByb290LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zVHJhbnNwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRSb290cy5zb21lKChyb290KSA9PiBwYXRoID09PSByb290IHx8IHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9gKSB8fCByb290LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9jYXRlcyBvbmx5IHRoaXMgcGx1Z2luL3N0b3JlIHN1YnRyZWU7IGtlZXAgb3BlbmluZyB3aXRoIHRoZSBvcmlnaW5hbCBhbmNob3IgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gTmV3IGZvbGRlciBhbmQgZG9jdW1lbnQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBoaXN0b3J5IGhhcyBiZWVuIGNvcGllZCBhbmQgdmVyaWZpZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuYWJsZSBkYXRhLXN0b3JlIHN5bmNocm9uaXphdGlvbiBiZWZvcmUgcmVsb2NhdGlvbicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVsb2NhdGUobG9jYXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIHJlZ2lzdGVyIHZhbHVlLCBvciBhZGRzIGEgbWVtYmVyIHRvIGFuIG9ic2VydmVkLXJlbW92ZSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5IG9yIHNldCBtZW1iZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZSAodXNlIGB0cnVlYCBmb3IgYSBzZXQpLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXRNYW55KFtba2V5LCB2YWx1ZV1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBiYXRjaCBvZiByZWdpc3RlciB3cml0ZXMsIHNwbGl0IGludG8gYm91bmRlZCBpbW11dGFibGUgc2VnbWVudHMuXG4gICAqIFNlZ21lbnRzIGFyZSBpbmRpdmlkdWFsbHkgZHVyYWJsZTsgYSBmYWlsZWQgYmF0Y2ggY2FuIGhhdmUgYSBwdWJsaXNoZWQgcHJlZml4IGFuZCBjYW4gYmUgcmV0cmllZCBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBlbnRyaWVzIC0gUmVnaXN0ZXIgd3JpdGVzIG9yIHNldCBhZGRpdGlvbnMuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIGpvdXJuYWwgcHVibGljYXRpb24gYW5kIGxvY2FsIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRNYW55KGVudHJpZXM6IHJlYWRvbmx5IChyZWFkb25seSBbc3RyaW5nLCBKc29uVmFsdWVdKVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsgZGVsZXRlZDogZmFsc2UsIGtleSwgdmFsdWUgfSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRyYW5zcG9ydCB3aXRob3V0IGNoYW5naW5nIGlkZW50aXR5IG9yIGNhdXNhbCBzdGF0ZS4gUGVyc2lzdCB0aGUgcHJlZmVyZW5jZSBpbiBjb25zdW1lciBzZXR0aW5ncy5cbiAgICogRW5hYmxpbmcgcHVibGlzaGVzIGEgY29tcGxldGUgY2hlY2twb2ludCBzbyBvZmZsaW5lIHNlcXVlbmNlcyBjYW5ub3QgbGVhdmUgZ2Fwcy5cbiAgICpcbiAgICogQHBhcmFtIGlzRW5hYmxlZCAtIFdoZXRoZXIgdG8gdXNlIHZhdWx0IHRyYW5zcG9ydCBmb3Igc3Vic2VxdWVudCBjYWxscyBvbiB0aGlzIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBzeW5jaHJvbml6YXRpb24gd2hlbiBlbmFibGluZy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXRTeW5jRW5hYmxlZChpc0VuYWJsZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IGlzRW5hYmxlZDtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIGNvbXBsZXRlIHNuYXBzaG90cyBhbmQgY29udGlndW91cyBqb3VybmFsIGhpc3RvcnksIHRoZW4gcHVibGlzaGVzIGl0cyBkdXJhYmxlIGFja25vd2xlZGdlbWVudC5cbiAgICogUGFydGlhbCBkZWxpdmVyaWVzIHJlbWFpbiBwZW5kaW5nOyBhIGxhdGVyIGNhbGwgcmV0cmllcyB0aGVtLiBObyBhY2tub3dsZWRnZW1lbnQgc2tpcHMgYSBtaXNzaW5nIHNlcXVlbmNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgbG9jYWwgY2hlY2twb2ludCBhbmQgYWNrbm93bGVkZ2VtZW50IGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW5jaHJvbml6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFja25vd2xlZGdlbWVudHMoZmlsZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBudW1iZXI+W10+IHtcbiAgICBjb25zdCBhY2tub3dsZWRnZW1lbnRzID0gW25ldyBNYXAodGhpcy52ZWN0b3IpXTtcbiAgICBjb25zdCBkZXZpY2VzUHJlZml4ID0gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gO1xuICAgIGNvbnN0IGRldmljZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGRldmljZXNQcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gT25seSBhIGZvbGRlciB1bmRlciBgZGV2aWNlcy9gIGlzIGEgZGV2aWNlOyBhIHN0cmF5IGZpbGUgdGhlcmUgKHN1Y2ggYXMgbWFjT1MgYC5EU19TdG9yZWApIG9yIGEgZm9sZGVyIHdob3NlXG4gICAgICAvLyBuYW1lIGlzIG5vdCBhIHZhbGlkIGRldmljZSBpZCBpcyBub3Qgb25lLCBhbmQgY291bnRpbmcgaXQgd291bGQgYmxvY2sgZXZlcnkgdHJpbSBiZWhpbmQgYW4gYWNrbm93bGVkZ2VtZW50XG4gICAgICAvLyB0aGF0IG5ldmVyIGFycml2ZXMuXG4gICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc2xpY2UoZGV2aWNlc1ByZWZpeC5sZW5ndGgpLnNwbGl0KCcvJyk7XG4gICAgICBjb25zdCBkZXZpY2UgPSBwYXJ0c1swXTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gREVWSUNFX1BBVEhfUEFSVFMgJiYgZGV2aWNlICE9PSB1bmRlZmluZWQgJiYgREVWSUNFX0lEX1JFR19FWFAudGVzdChkZXZpY2UpKSB7XG4gICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgIGlmIChkZXZpY2UgPT09IHRoaXMuZGV2aWNlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgaGF2ZSA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQoYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke2RldmljZX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWApO1xuICAgICAgaWYgKCFpc09iamVjdChoYXZlKSB8fCAhaXNWZWN0b3IoaGF2ZVsndmVjdG9yJ10pIHx8IHR5cGVvZiBoYXZlWyd0aW1lJ10gIT09ICdudW1iZXInKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKCkpO1xuICAgICAgfSBlbHNlIGlmIChEYXRlLm5vdygpIC0gaGF2ZVsndGltZSddIDw9IHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGFja25vd2xlZGdlbWVudHMucHVzaChuZXcgTWFwKGhhdmVbJ3ZlY3RvciddKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2tub3dsZWRnZW1lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseShvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbik6IHZvaWQge1xuICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIHRoaXMudmVjdG9yLnNldChvcGVyYXRpb24uZGV2aWNlLCBvcGVyYXRpb24uc2VxdWVuY2UpO1xuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKG9wZXJhdGlvbi50aW1lLCBvcGVyYXRpb24uY291bnRlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoYW5nZShjaGFuZ2VzOiByZWFkb25seSBDaGFuZ2VbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRMb2NhbCgpO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgY2FuZGlkYXRlID0gbmV3IERhdGFTdG9yZVJlcGxpY2EodGhpcy5wYXJhbXMua2luZCk7XG4gICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB0aGlzLnJlcGxpY2EuZXhwb3J0KCkpIHtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBsZXQgc2VxdWVuY2UgPSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDA7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuY291bnRlciA9IG5vdyA+IHRoaXMudGltZSA/IDAgOiB0aGlzLmNvdW50ZXIgKyAxO1xuICAgICAgICB0aGlzLnRpbWUgPSBNYXRoLm1heChub3csIHRoaXMudGltZSk7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbjogRGF0YVN0b3JlT3BlcmF0aW9uID0ge1xuICAgICAgICAgIC4uLmNoYW5nZSxcbiAgICAgICAgICBjb3VudGVyOiB0aGlzLmNvdW50ZXIsXG4gICAgICAgICAgZGV2aWNlOiB0aGlzLmRldmljZSxcbiAgICAgICAgICBzZXF1ZW5jZTogKytzZXF1ZW5jZSxcbiAgICAgICAgICB0YWdzOiBjYW5kaWRhdGUub2JzZXJ2ZWRUYWdzKGNoYW5nZS5rZXkpLFxuICAgICAgICAgIHRpbWU6IHRoaXMudGltZVxuICAgICAgICB9O1xuICAgICAgICBjYW5kaWRhdGUuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgb3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25zKSB7XG4gICAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFZhbGlkYXRlIGV2ZXJ5IHNpbmdsZSBvcGVyYXRpb24gYmVmb3JlIHB1Ymxpc2hpbmcgYW55IHByZWZpeCBvZiBhIGJhdGNoLlxuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoW29wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUoYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIFtvcGVyYXRpb25dKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IGJhdGNoOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoIXRoaXMudHJhbnNwb3J0LmZpdHMoWy4uLmJhdGNoLCBvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChiYXRjaCk7XG4gICAgICAgICAgYmF0Y2ggPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICBhd2FpdCB0aGlzLnB1Ymxpc2goYmF0Y2gpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5wZXJzaXN0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrcG9pbnQoKTogQ2hlY2twb2ludCB7XG4gICAgcmV0dXJuIHsgY291bnRlcjogdGhpcy5jb3VudGVyLCBmb3JtYXQ6IDEsIGtpbmQ6IHRoaXMucGFyYW1zLmtpbmQsIG9wZXJhdGlvbnM6IHRoaXMucmVwbGljYS5leHBvcnQoKSwgdGltZTogdGhpcy50aW1lLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgZGV2aWNlUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnRyYW5zcG9ydC5yb290fS9kZXZpY2VzLyR7dGhpcy5kZXZpY2V9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZExvY2FsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVwbGljYSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgIHRoaXMudmVjdG9yLmNsZWFyKCk7XG4gICAgdGhpcy50aW1lID0gMDtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMubG9jYWxSZWNvcmRzLmNsZWFyKCk7XG4gICAgdGhpcy5rbm93blRyYW5zcG9ydFJvb3RzLmNsZWFyKCk7XG4gICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZW50cmllcygpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHJlY29yZHMpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3NoYXJlZC1jaGVja3BvaW50LXYxJzoge1xuICAgICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHZhbHVlKTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnOiB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzdWZmaXggPSBgLyR7dGhpcy5wYXJhbXMucGx1Z2luSWR9LyR7dGhpcy5wYXJhbXMuc3RvcmVJZH1gO1xuICAgICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb290ICE9PSAnc3RyaW5nJyB8fCAhcm9vdC5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsb2NhbCBkYXRhLXN0b3JlIHRyYW5zcG9ydCByb290cycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVtZW1iZXJlZCBwYXRocyB3aXRob3V0IHJlYWRpbmcgdGhlIGFkYXB0ZXIgb3IgYWN0aXZhdGluZyBhIHdyaXRlci5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zcG9ydCA9IG5ldyBEYXRhU3RvcmVUcmFuc3BvcnQoeyAuLi50aGlzLnBhcmFtcywgZm9sZGVyOiByb290LnNsaWNlKDAsIC1zdWZmaXgubGVuZ3RoKSB9KTtcbiAgICAgICAgICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5hZGQodHJhbnNwb3J0LnJvb3QpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NoYXJlZC11bnB1Ymxpc2hlZC12MSc6IHtcbiAgICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHZhbHVlID09PSB0cnVlO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChSRUNPUkRfUFJFRklYKSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsaWNhLmFwcGx5KHZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMubG9jYWxSZWNvcmRzLnNldChrZXksIGVuc3VyZU5vbk51bGxhYmxlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGVja3BvaW50KHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIWlzT2JqZWN0KHZhbHVlKSB8fCB2YWx1ZVsnZm9ybWF0J10gIT09IDEgfHwgdmFsdWVbJ2tpbmQnXSAhPT0gdGhpcy5wYXJhbXMua2luZFxuICAgICAgfHwgIUFycmF5LmlzQXJyYXkodmFsdWVbJ29wZXJhdGlvbnMnXSkgfHwgIXZhbHVlWydvcGVyYXRpb25zJ10uZXZlcnkoaXNEYXRhU3RvcmVPcGVyYXRpb24pXG4gICAgICB8fCAhaXNWZWN0b3IodmFsdWVbJ3ZlY3RvciddKSB8fCAhTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWVbJ3RpbWUnXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWydjb3VudGVyJ10pXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBjaGVja3BvaW50IG9yIGluY29tcGF0aWJsZSBtZXJnZSBydWxlJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIHZhbHVlWydvcGVyYXRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVwbGljYS5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtkZXZpY2UsIHNlcXVlbmNlXSBvZiB2YWx1ZVsndmVjdG9yJ10pIHtcbiAgICAgIHRoaXMudmVjdG9yLnNldChkZXZpY2UsIE1hdGgubWF4KHNlcXVlbmNlLCB0aGlzLnZlY3Rvci5nZXQoZGV2aWNlKSA/PyAwKSk7XG4gICAgfVxuICAgIHRoaXMub2JzZXJ2ZUNsb2NrKE51bWJlcih2YWx1ZVsndGltZSddKSwgTnVtYmVyKHZhbHVlWydjb3VudGVyJ10pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLmxvY2F0aW9ucy5yZWZyZXNoKCk7XG4gICAgZm9yIChjb25zdCB0cmFuc3BvcnQgb2YgdGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cykge1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZVRyYW5zcG9ydCh0cmFuc3BvcnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0OiBEYXRhU3RvcmVUcmFuc3BvcnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbGxGaWxlcyA9IGF3YWl0IHRyYW5zcG9ydC5saXN0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhbGxGaWxlcy5maWx0ZXIoKHBhdGgpID0+IHBhdGguc3RhcnRzV2l0aChgJHt0cmFuc3BvcnQucm9vdH0vZGV2aWNlcy9gKSk7XG4gICAgY29uc3QgbWFuaWZlc3RzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvc25hcHNob3QtW1xcdy1dKy1tYW5pZmVzdFxcLig/Om1kfGpzb24pJC8udGVzdChmaWxlKSk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIG1hbmlmZXN0cykge1xuICAgICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCB0cmFuc3BvcnQucmVhZFNuYXBzaG90KHBhdGgpO1xuICAgICAgaWYgKHNuYXBzaG90ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5tZXJnZUNoZWNrcG9pbnQoc25hcHNob3QpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcGVyYXRpb25zOiBEYXRhU3RvcmVPcGVyYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZmlsZXMuZmlsdGVyKChmaWxlKSA9PiAvXFwvbG9nLVxcZCtcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBzZWdtZW50cykge1xuICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IHRyYW5zcG9ydC5yZWFkKHBhdGgpO1xuICAgICAgaWYgKHNlZ21lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzZWdtZW50KSB8fCAhc2VnbWVudC5ldmVyeShpc0RhdGFTdG9yZU9wZXJhdGlvbikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgam91cm5hbCBzZWdtZW50Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCBvd25lciA9IHBhdGguc3BsaXQoJy8nKS5hdChPV05FUl9QQVRIX0lOREVYKTtcbiAgICAgIGlmIChzZWdtZW50LnNvbWUoKG9wZXJhdGlvbikgPT4gb3BlcmF0aW9uLmRldmljZSAhPT0gb3duZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSm91cm5hbCBzZWdtZW50IGhhcyBhIGRpZmZlcmVudCB3cml0ZXInKTtcbiAgICAgIH1cbiAgICAgIG9wZXJhdGlvbnMucHVzaCguLi5zZWdtZW50KTtcbiAgICB9XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGVyc2lzdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjaGVja3BvaW50ID0gdGhpcy5jaGVja3BvaW50KCk7XG4gICAgY29uc3QgcmVjb3JkcyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhU3RvcmVPcGVyYXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY2hlY2twb2ludC5vcGVyYXRpb25zKSB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMucGFyYW1zLmtpbmQgPT09ICdvYnNlcnZlZC1yZW1vdmUtc2V0JyA/IGAke29wZXJhdGlvbi5kZXZpY2V9OiR7U3RyaW5nKG9wZXJhdGlvbi5zZXF1ZW5jZSl9YCA6IG9wZXJhdGlvbi5rZXk7XG4gICAgICByZWNvcmRzLnNldChgJHtSRUNPUkRfUFJFRklYfSR7aWRlbnRpdHl9YCwgb3BlcmF0aW9uKTtcbiAgICB9XG4gICAgY29uc3QgZW50cmllczogW3N0cmluZywgdW5rbm93bl1bXSA9IFsuLi5yZWNvcmRzXS5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4gdGhpcy5sb2NhbFJlY29yZHMuZ2V0KGtleSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSBbLi4udGhpcy5sb2NhbFJlY29yZHMua2V5cygpXS5maWx0ZXIoKGtleSkgPT4gIXJlY29yZHMuaGFzKGtleSkpO1xuICAgIGVudHJpZXMucHVzaChbJ3NoYXJlZC1jaGVja3BvaW50LXYxJywgeyAuLi5jaGVja3BvaW50LCBvcGVyYXRpb25zOiBbXSB9XSwgWydzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlc10sIFsnc2hhcmVkLXRyYW5zcG9ydC1yb290cy12MScsIHRoaXMudHJhbnNwb3J0Um9vdHNdKTtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5jb21taXQoeyBlbnRyaWVzLCByZW1vdmVkS2V5cyB9KTtcbiAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlOiBgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtJHt3aW5kb3cuY3J5cHRvLnJhbmRvbVVVSUQoKX0tbWFuaWZlc3RgLCBwYXlsb2FkOiBjaGVja3BvaW50IH0pO1xuICAgICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuc2V0KCdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnLCBmYWxzZSk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IGZhbHNlO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZShgJHt0aGlzLmRldmljZVJvb3QoKX0vaGF2ZSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIHsgZm9ybWF0OiAxLCB0aW1lOiBEYXRlLm5vdygpLCB2ZWN0b3I6IFsuLi50aGlzLnZlY3Rvcl0gfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2gob3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBmaXJzdCA9IGVuc3VyZU5vbk51bGxhYmxlKG9wZXJhdGlvbnNbMF0pO1xuICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlSW1tdXRhYmxlKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctJHtTdHJpbmcoZmlyc3Quc2VxdWVuY2UpfSR7dGhpcy50cmFuc3BvcnQuZXh0ZW5zaW9ufWAsIG9wZXJhdGlvbnMpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNWZWN0b3IodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBWZXJzaW9uVmVjdG9yIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChlbnRyeTogdW5rbm93bikgPT5cbiAgICBBcnJheS5pc0FycmF5KGVudHJ5KSAmJiBlbnRyeS5sZW5ndGggPT09IFZFQ1RPUl9FTlRSWV9MRU5HVEhcbiAgICAmJiB0eXBlb2YgZW50cnlbMF0gPT09ICdzdHJpbmcnICYmIC9eW1xcdy1dKyQvLnRlc3QoZW50cnlbMF0pICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKGVudHJ5WzFdKSAmJiBOdW1iZXIoZW50cnlbMV0pID49IDBcbiAgKTtcbn1cblxuLyogZXNsaW50LWVuYWJsZSBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGhlc2UgYXJlIE9ic2lkaWFuIHJlbmRlcmVyIFdlYiBBUElzLCBub3QgTm9kZSBidWlsdGlucy4gKi9cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLHlCQUF5QjtBQVNsQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBRW5DLE1BQU0scUNBQXFDO0FBRTNDLE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sZ0JBQWdCO0FBcUZmLE1BQU0sZ0JBQWdCO0FBQUEsRUEwQm5CLFlBQStCLFFBQXNELFFBQWdCO0FBQXRFO0FBQXNEO0FBQzNGLFNB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
526
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0b3Jlcy9zaGFyZWQtZGF0YS1zdG9yZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogTWVyZ2VhYmxlIHBsdWdpbiBkYXRhLCB0cmFuc3BvcnRlZCBhcyBzaW5nbGUtd3JpdGVyIGpvdXJuYWwgc2VnbWVudHMgYW5kIGNodW5rZWQgc25hcHNob3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGF0YUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IEpzb25WYWx1ZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHR5cGUgeyBEYXRhU3RvcmVMb2NhdGlvbiB9IGZyb20gJy4vZGF0YS1zdG9yZS1sb2NhdGlvbnMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBEYXRhU3RvcmVNZXJnZUtpbmQsXG4gIERhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgdHlwZSB7IExvY2FsRGF0YVN0b3JlIH0gZnJvbSAnLi9sb2NhbC1kYXRhLXN0b3JlLnRzJztcblxuaW1wb3J0IHsgRGF0YVN0b3JlTG9jYXRpb25zIH0gZnJvbSAnLi9kYXRhLXN0b3JlLWxvY2F0aW9ucy50cyc7XG5pbXBvcnQge1xuICBEYXRhU3RvcmVSZXBsaWNhLFxuICBpc0RhdGFTdG9yZU9wZXJhdGlvblxufSBmcm9tICcuL2RhdGEtc3RvcmUtcmVwbGljYS50cyc7XG5pbXBvcnQgeyBEYXRhU3RvcmVUcmFuc3BvcnQgfSBmcm9tICcuL2RhdGEtc3RvcmUtdHJhbnNwb3J0LnRzJztcblxuY29uc3QgREVGQVVMVF9BQ1RJVkVfREVWSUNFX01JTExJU0VDT05EUyA9IDJfNTkyXzAwMF8wMDA7XG5cbi8qKlxuICogQSBzZWdtZW50IHRoaXMgbGFyZ2UgaXMgc2VhbGVkOiB0aGUgbmV4dCBiYXRjaCBvcGVucyBhIG5ldyBmaWxlLCBzbyBlYWNoIHJld3JpdGUgb2YgdGhlIG9wZW4gb25lIHN0YXlzIHNtYWxsLlxuICovXG5jb25zdCBPUEVOX1NFR01FTlRfQllURVMgPSA2NV81MzY7XG5cbi8qKlxuICogQW4gdW5jaGFuZ2VkIGFja25vd2xlZGdlbWVudCBpcyBzdGlsbCByZXdyaXR0ZW4gdGhpcyBvZnRlbiwgc28gb3RoZXIgZGV2aWNlcyBrZWVwIHNlZWluZyB0aGlzIG9uZSBhcyBhY3RpdmUuXG4gKi9cbmNvbnN0IEFDS05PV0xFREdFTUVOVF9SRUZSRVNIX01JTExJU0VDT05EUyA9IDg2XzQwMF8wMDA7XG5jb25zdCBBQ0tOT1dMRURHRU1FTlRfUkVGUkVTSEVTX1BFUl9SRVRJUkVNRU5UID0gNDtcblxuY29uc3QgT1dORVJfUEFUSF9JTkRFWCA9IC0yO1xuXG5jb25zdCBWRUNUT1JfRU5UUllfTEVOR1RIID0gMjtcbmNvbnN0IERFVklDRV9QQVRIX1BBUlRTID0gMjtcbmNvbnN0IERFVklDRV9JRF9SRUdfRVhQID0gL15bXFx3LV0rJC87XG5jb25zdCBSRUNPUkRfUFJFRklYID0gJ3NoYXJlZC1yZWNvcmQtdjE6JztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciBvcGVuaW5nIGEgc2hhcmVkIHN0b3JlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMge1xuICAvKipcbiAgICogRGV2aWNlIHJldGlyZW1lbnQgaW50ZXJ2YWwsIG1lYXN1cmVkIGZyb20gaXRzIGxhc3QgYWNrbm93bGVkZ2VtZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMjU5MjAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGFjdGl2ZURldmljZU1pbGxpc2Vjb25kcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFZhdWx0IGFkYXB0ZXIuXG4gICAqL1xuICByZWFkb25seSBhZGFwdGVyOiBEYXRhQWRhcHRlcjtcbiAgLyoqXG4gICAqIFZhdWx0LXJlbGF0aXZlIGZvbGRlci4gSGlkZGVuIHNlZ21lbnRzIGFyZSBhbGxvd2VkOyBjYWxsZXJzIG11c3QgYXJyYW5nZSB0aGVpciBzeW5jaHJvbml6YXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnUGx1Z2luIGRhdGEnYFxuICAgKi9cbiAgcmVhZG9ubHkgZm9sZGVyPzogc3RyaW5nO1xuICAvKipcbiAgICogTmV3IGRvY3VtZW50IGVuY29kaW5nIGF0IHRoZSBwZXJtYW5lbnQgZGlzY292ZXJ5IGFuY2hvci5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdtYXJrZG93bidgXG4gICAqL1xuICByZWFkb25seSBmb3JtYXQ/OiAnanNvbicgfCAnbWFya2Rvd24nO1xuICAvKipcbiAgICogRW5hYmxlcyB2YXVsdCB0cmFuc3BvcnQuIERpc2FibGVkIHN0b3JlcyBtYWtlIG5vIGFkYXB0ZXIgY2FsbHMsIGluY2x1ZGluZyBkdXJpbmcgY29tcGFjdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc1N5bmNFbmFibGVkPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEltbXV0YWJsZSBtZXJnZSBydWxlOyBjaGFuZ2luZyBpdCByZXF1aXJlcyBhIG5ldyBzdG9yZSBpZC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgLyoqXG4gICAqIERlZGljYXRlZCBsb2NhbCBzdG9yZSBzY29wZWQgdG8gVEhJUyB2YXVsdCwgcGx1Z2luIGFuZCBzaGFyZWQtc3RvcmUgc2NoZW1hLiBUaGUgY2FsbGVyIG93bnMgaXRzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBsb2NhbDogTG9jYWxEYXRhU3RvcmU7XG4gIC8qKlxuICAgKiBNYXhpbXVtIFVURi04IGJ5dGVzIHBlciBmaWxlLCB3cmFwcGVyIGluY2x1ZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZpbGVCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIE1heGltdW0gVVRGLTggYnl0ZXMgaW4gYSByZWNvbnN0cnVjdGVkIHNuYXBzaG90IGJlZm9yZSBKU09OIHBhcnNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2NDAwMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQbHVnaW4gbWFuaWZlc3QgaWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICAvKipcbiAgICogU3RvcmUgaWQgaW5jbHVkaW5nIHRoZSBjb25zdW1lcidzIHNjaGVtYSB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmVJZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2hhbmdlIHtcbiAgcmVhZG9ubHkgZGVsZXRlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbHVlOiBKc29uVmFsdWU7XG59XG5cbmludGVyZmFjZSBDaGVja3BvaW50IHtcbiAgcmVhZG9ubHkgY291bnRlcjogbnVtYmVyO1xuICByZWFkb25seSBmb3JtYXQ6IDE7XG4gIHJlYWRvbmx5IGtpbmQ6IERhdGFTdG9yZU1lcmdlS2luZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW107XG4gIHJlYWRvbmx5IHRpbWU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdmVjdG9yOiBWZXJzaW9uVmVjdG9yO1xufVxuXG5pbnRlcmZhY2UgSm91cm5hbFNlZ21lbnQgZXh0ZW5kcyBKb3VybmFsU2VnbWVudEZpbGUge1xuICByZWFkb25seSBhZGRlZDogRGF0YVN0b3JlT3BlcmF0aW9uW107XG59XG5cbmludGVyZmFjZSBKb3VybmFsU2VnbWVudEZpbGUge1xuICByZWFkb25seSBvcGVyYXRpb25zOiByZWFkb25seSBEYXRhU3RvcmVPcGVyYXRpb25bXTtcbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xufVxuXG50eXBlIFZlcnNpb25WZWN0b3IgPSBbc3RyaW5nLCBudW1iZXJdW107XG5cbi8qKlxuICogQSBkZXZpY2UtbG9jYWwgcXVlcnkgcmVwbGljYSBiYWNrZWQgYnkgdmF1bHQgZmlsZXMuIENhbGwgYHN5bmNocm9uaXplYCBhZnRlciB0cmFuc3BvcnQgY2hhbmdlcyBvciBwZXJpb2RpY2FsbHkuXG4gKiBObyB0aW1lciBvciBldmVudCBoYW5kbGVyIG91dGxpdmVzIHRoZSBjb25zdW1lcjogdGhlIGNvbnN1bWVyIHNjaGVkdWxlcyBzeW5jaHJvbml6YXRpb24gYW5kIG93bnMgdW5sb2FkaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2hhcmVkRGF0YVN0b3JlIHtcbiAgLyoqXG4gIENvbmZpZ3VyZWQgYW5kIHJlbWVtYmVyZWQgcmVhZGVyIHJvb3RzLCBpbmNsdWRpbmcgcmV0YWluZWQgbWlncmF0aW9uIHNvdXJjZXMgd2hpbGUgZGlzYWJsZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSByb290cyBzdWl0YWJsZSBmb3IgbWV0YWRhdGEgZXhjbHVzaW9uIHdpdGhvdXQgYWRhcHRlciBhY2Nlc3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRyYW5zcG9ydFJvb3RzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoWy4uLnRoaXMua25vd25UcmFuc3BvcnRSb290cywgLi4udGhpcy5sb2NhdGlvbnMudHJhbnNwb3J0cy5tYXAoKHRyYW5zcG9ydCkgPT4gdHJhbnNwb3J0LnJvb3QpXSldO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEZXZpY2VNaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgcHJpdmF0ZSBoYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc1N5bmNFbmFibGVkOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IGtub3duVHJhbnNwb3J0Um9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uczogRGF0YVN0b3JlTG9jYXRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IG93blNlZ21lbnRzID0gbmV3IE1hcDxzdHJpbmcsIEpvdXJuYWxTZWdtZW50RmlsZVtdPigpO1xuICBwcml2YXRlIHJlcGxpY2E6IERhdGFTdG9yZVJlcGxpY2E7XG4gIHByaXZhdGUgdGltZSA9IDA7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2ZWN0b3IgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIHByaXZhdGUgZ2V0IHRyYW5zcG9ydCgpOiBEYXRhU3RvcmVUcmFuc3BvcnQge1xuICAgIHJldHVybiBlbnN1cmVOb25OdWxsYWJsZSh0aGlzLmxvY2F0aW9ucy50cmFuc3BvcnRzLmF0KC0xKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMsIHByb3RlY3RlZCByZWFkb25seSBkZXZpY2U6IHN0cmluZykge1xuICAgIHRoaXMubG9jYXRpb25zID0gbmV3IERhdGFTdG9yZUxvY2F0aW9ucyhwYXJhbXMpO1xuICAgIHRoaXMuaXNTeW5jRW5hYmxlZCA9IHBhcmFtcy5pc1N5bmNFbmFibGVkID8/IHRydWU7XG4gICAgdGhpcy5yZXBsaWNhID0gbmV3IERhdGFTdG9yZVJlcGxpY2EocGFyYW1zLmtpbmQpO1xuICAgIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzID0gcGFyYW1zLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0FDVElWRV9ERVZJQ0VfTUlMTElTRUNPTkRTO1xuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzKSB8fCB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldmljZSByZXRpcmVtZW50IGludGVydmFsIG11c3QgYmUgcG9zaXRpdmUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW5kIHN5bmNocm9uaXplcyBhIHN0b3JlLCByZXN0b3JpbmcgaXRzIGRldmljZSBpZGVudGl0eSBleGNsdXNpdmVseSBmcm9tIEluZGV4ZWREQi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFBlcnNpc3RlbmNlLCB0cmFuc3BvcnQgYW5kIG1lcmdlIHBvbGljeS5cbiAgICogQHJldHVybnMgQSBzeW5jaHJvbml6ZWQgcXVlcnkgcmVwbGljYS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3BlbihwYXJhbXM6IFNoYXJlZERhdGFTdG9yZU9wZW5QYXJhbXMpOiBQcm9taXNlPFNoYXJlZERhdGFTdG9yZT4ge1xuICAgIGNvbnN0IGRldmljZSA9IGF3YWl0IHBhcmFtcy5sb2NhbC5nZXRPckNyZWF0ZSgnc2hhcmVkLWRldmljZS12MScsIHdpbmRvdy5jcnlwdG8ucmFuZG9tVVVJRCgpKTtcbiAgICBpZiAodHlwZW9mIGRldmljZSAhPT0gJ3N0cmluZycgfHwgIURFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxvY2FsIGRhdGEtc3RvcmUgaWRlbnRpdHknKTtcbiAgICB9XG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgU2hhcmVkRGF0YVN0b3JlKHBhcmFtcywgZGV2aWNlKTtcbiAgICBhd2FpdCBzdG9yZS5zeW5jaHJvbml6ZSgpO1xuICAgIHJldHVybiBzdG9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBjb21wbGV0ZSBjaHVua2VkIHNuYXBzaG90IGFuZCB0cmltcyBvbmx5IHRoaXMgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIGpvdXJuYWwgc2VnbWVudHMuXG4gICAqIFJldGlyZWQgZGV2aWNlcyByZWpvaW4gYnkgbWVyZ2luZyBzbmFwc2hvdHM7IHRvbWJzdG9uZXMgcmVtYWluIGluIHNuYXBzaG90cyB0byBwcmV2ZW50IHJlc3VycmVjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjb21wYWN0aW9uIGZpbmlzaGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNvbXBhY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5saXN0KCk7XG4gICAgICBjb25zdCBiYXNlID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YDtcbiAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlU25hcHNob3QoeyBiYXNlLCBwYXlsb2FkOiB0aGlzLmNoZWNrcG9pbnQoKSB9KTtcbiAgICAgIGNvbnN0IGFja25vd2xlZGdlbWVudHMgPSBhd2FpdCB0aGlzLmFja25vd2xlZGdlbWVudHMoZmlsZXMpO1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmICghcGF0aC5zdGFydHNXaXRoKGAke3RoaXMuZGV2aWNlUm9vdCgpfS9sb2ctYCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc3BvcnQucmVhZChwYXRoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wZXJhdGlvbnMpIHx8ICFvcGVyYXRpb25zLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxhc3QgPSBNYXRoLm1heCguLi5vcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uc2VxdWVuY2UpKTtcbiAgICAgICAgaWYgKGFja25vd2xlZGdlbWVudHMuZXZlcnkoKHZlY3RvcikgPT4gKHZlY3Rvci5nZXQodGhpcy5kZXZpY2UpID8/IDApID49IGxhc3QpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50cmFuc3BvcnQucmVtb3ZlKHBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgY29tcGxldGUgbmV3IHNuYXBzaG90IGNvdmVycyBldmVyeSBlYXJsaWVyIHNuYXBzaG90IGZyb20gdGhpcyB3cml0ZXIuXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2YgZmlsZXMpIHtcbiAgICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHt0aGlzLmRldmljZVJvb3QoKX0vc25hcHNob3QtYCkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZW1vdmUocGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIHRyYW5zcG9ydCBmaWxlcywgcm9vdHMsIGFuZCBhbmNlc3RvciBmb2xkZXIgb3BlcmF0aW9ucyBmb3IgY29uc3VtZXIgZXZlbnQgZmlsdGVycy5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBWYXVsdC1yZWxhdGl2ZSBmaWxlIG9yIGZvbGRlciBwYXRoLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwYXRoIGludGVyc2VjdHMgYW4gYWN0aXZlIG9yIHJldGFpbmVkIHRyYW5zcG9ydCByb290LlxuICAgKi9cbiAgcHVibGljIGNvbnRhaW5zVHJhbnNwb3J0UGF0aChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRSb290cy5zb21lKChyb290KSA9PiBwYXRoID09PSByb290IHx8IHBhdGguc3RhcnRzV2l0aChgJHtyb290fS9gKSB8fCByb290LnN0YXJ0c1dpdGgoYCR7cGF0aH0vYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSByZWdpc3RlciBvciByZW1vdmVzIHRoZSBjdXJyZW50bHkgb2JzZXJ2ZWQgYWRkaXRpb25zIG9mIGEgc2V0IG1lbWJlci5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci4gTWluL21heCByZWdpc3RlcnMgZGVsaWJlcmF0ZWx5IGNhbm5vdCBiZSBkZWxldGVkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jaGFuZ2UoW3sgZGVsZXRlZDogdHJ1ZSwga2V5LCB2YWx1ZTogbnVsbCB9XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHJldHVybnMgRGV0YWNoZWQga2V5L3ZhbHVlIHBhaXJzIGluIGRldGVybWluaXN0aWMgb3JkZXIuXG4gICAqL1xuICBwdWJsaWMgZW50cmllcygpOiBbc3RyaW5nLCB1bmtub3duXVtdIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmVudHJpZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHJlZ2lzdGVyIG9yIHNldCBtZW1iZXJzaGlwIGZyb20gdGhlIGN1cnJlbnQgbG9jYWwgcXVlcnkgcmVwbGljYS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFJlY29yZCBrZXkgb3Igc2V0IG1lbWJlci5cbiAgICogQHJldHVybnMgQSBkZXRhY2hlZCB2YWx1ZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQgb3IgZGVsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5yZXBsaWNhLmdldChrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbG9jYXRlcyBvbmx5IHRoaXMgcGx1Z2luL3N0b3JlIHN1YnRyZWU7IGtlZXAgb3BlbmluZyB3aXRoIHRoZSBvcmlnaW5hbCBhbmNob3IgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHBhcmFtIGxvY2F0aW9uIC0gTmV3IGZvbGRlciBhbmQgZG9jdW1lbnQgZm9ybWF0LlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBoaXN0b3J5IGhhcyBiZWVuIGNvcGllZCBhbmQgdmVyaWZpZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVsb2NhdGUobG9jYXRpb246IERhdGFTdG9yZUxvY2F0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBpZiAoIXRoaXMuaXNTeW5jRW5hYmxlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0VuYWJsZSBkYXRhLXN0b3JlIHN5bmNocm9uaXphdGlvbiBiZWZvcmUgcmVsb2NhdGlvbicpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVsb2NhdGUobG9jYXRpb24pO1xuICAgICAgYXdhaXQgdGhpcy5tZXJnZUZpbGVzKCk7XG4gICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICBhd2FpdCB0aGlzLnBlcnNpc3QoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgb25lIHJlZ2lzdGVyIHZhbHVlLCBvciBhZGRzIGEgbWVtYmVyIHRvIGFuIG9ic2VydmVkLXJlbW92ZSBzZXQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBSZWNvcmQga2V5IG9yIHNldCBtZW1iZXIuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIEpTT04tY29tcGF0aWJsZSB2YWx1ZSAodXNlIGB0cnVlYCBmb3IgYSBzZXQpLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogSnNvblZhbHVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXRNYW55KFtba2V5LCB2YWx1ZV1dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaXNoZXMgYSBiYXRjaCBvZiByZWdpc3RlciB3cml0ZXMsIGFwcGVuZGVkIHRvIHRoaXMgZGV2aWNlJ3Mgb3BlbiBqb3VybmFsIHNlZ21lbnQgYW5kIHNwbGl0IGludG8gYm91bmRlZCBvbmVzLlxuICAgKiBTZWdtZW50cyBhcmUgaW5kaXZpZHVhbGx5IGR1cmFibGU7IGEgZmFpbGVkIGJhdGNoIGNhbiBoYXZlIGEgcHVibGlzaGVkIHByZWZpeCBhbmQgY2FuIGJlIHJldHJpZWQgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gZW50cmllcyAtIFJlZ2lzdGVyIHdyaXRlcyBvciBzZXQgYWRkaXRpb25zLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciBqb3VybmFsIHB1YmxpY2F0aW9uIGFuZCBsb2NhbCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0TWFueShlbnRyaWVzOiByZWFkb25seSAocmVhZG9ubHkgW3N0cmluZywgSnNvblZhbHVlXSlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2hhbmdlKGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+ICh7IGRlbGV0ZWQ6IGZhbHNlLCBrZXksIHZhbHVlIH0pKSk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0cmFuc3BvcnQgd2l0aG91dCBjaGFuZ2luZyBpZGVudGl0eSBvciBjYXVzYWwgc3RhdGUuIFBlcnNpc3QgdGhlIHByZWZlcmVuY2UgaW4gY29uc3VtZXIgc2V0dGluZ3MuXG4gICAqIEVuYWJsaW5nIHB1Ymxpc2hlcyBhIGNvbXBsZXRlIGNoZWNrcG9pbnQgc28gb2ZmbGluZSBzZXF1ZW5jZXMgY2Fubm90IGxlYXZlIGdhcHMuXG4gICAqXG4gICAqIEBwYXJhbSBpc0VuYWJsZWQgLSBXaGV0aGVyIHRvIHVzZSB2YXVsdCB0cmFuc3BvcnQgZm9yIHN1YnNlcXVlbnQgY2FsbHMgb24gdGhpcyBpbnN0YW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgc3luY2hyb25pemF0aW9uIHdoZW4gZW5hYmxpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2V0U3luY0VuYWJsZWQoaXNFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICB0aGlzLmlzU3luY0VuYWJsZWQgPSBpc0VuYWJsZWQ7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlcyBjb21wbGV0ZSBzbmFwc2hvdHMgYW5kIGNvbnRpZ3VvdXMgam91cm5hbCBoaXN0b3J5LCB0aGVuIHB1Ymxpc2hlcyBpdHMgZHVyYWJsZSBhY2tub3dsZWRnZW1lbnQuXG4gICAqIFBhcnRpYWwgZGVsaXZlcmllcyByZW1haW4gcGVuZGluZzsgYSBsYXRlciBjYWxsIHJldHJpZXMgdGhlbS4gTm8gYWNrbm93bGVkZ2VtZW50IHNraXBzIGEgbWlzc2luZyBzZXF1ZW5jZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGxvY2FsIGNoZWNrcG9pbnQgYW5kIGFja25vd2xlZGdlbWVudCBjb21taXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3luY2hyb25pemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuZXhjbHVzaXZlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZExvY2FsKCk7XG4gICAgICBhd2FpdCB0aGlzLm1lcmdlRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY2tub3dsZWRnZW1lbnRzKGZpbGVzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8TWFwPHN0cmluZywgbnVtYmVyPltdPiB7XG4gICAgY29uc3QgYWNrbm93bGVkZ2VtZW50cyA9IFtuZXcgTWFwKHRoaXMudmVjdG9yKV07XG4gICAgY29uc3QgZGV2aWNlc1ByZWZpeCA9IGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvYDtcbiAgICBjb25zdCBkZXZpY2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGZpbGVzKSB7XG4gICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChkZXZpY2VzUHJlZml4KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgYSBmb2xkZXIgdW5kZXIgYGRldmljZXMvYCBpcyBhIGRldmljZTsgYSBzdHJheSBmaWxlIHRoZXJlIChzdWNoIGFzIG1hY09TIGAuRFNfU3RvcmVgKSBvciBhIGZvbGRlciB3aG9zZVxuICAgICAgLy8gbmFtZSBpcyBub3QgYSB2YWxpZCBkZXZpY2UgaWQgaXMgbm90IG9uZSwgYW5kIGNvdW50aW5nIGl0IHdvdWxkIGJsb2NrIGV2ZXJ5IHRyaW0gYmVoaW5kIGFuIGFja25vd2xlZGdlbWVudFxuICAgICAgLy8gdGhhdCBuZXZlciBhcnJpdmVzLlxuICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNsaWNlKGRldmljZXNQcmVmaXgubGVuZ3RoKS5zcGxpdCgnLycpO1xuICAgICAgY29uc3QgZGV2aWNlID0gcGFydHNbMF07XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IERFVklDRV9QQVRIX1BBUlRTICYmIGRldmljZSAhPT0gdW5kZWZpbmVkICYmIERFVklDRV9JRF9SRUdfRVhQLnRlc3QoZGV2aWNlKSkge1xuICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICBpZiAoZGV2aWNlID09PSB0aGlzLmRldmljZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhhdmUgPSBhd2FpdCB0aGlzLnRyYW5zcG9ydC5yZWFkKGAke3RoaXMudHJhbnNwb3J0LnJvb3R9L2RldmljZXMvJHtkZXZpY2V9L2hhdmUke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gKTtcbiAgICAgIGlmICghaXNPYmplY3QoaGF2ZSkgfHwgIWlzVmVjdG9yKGhhdmVbJ3ZlY3RvciddKSB8fCB0eXBlb2YgaGF2ZVsndGltZSddICE9PSAnbnVtYmVyJykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoRGF0ZS5ub3coKSAtIGhhdmVbJ3RpbWUnXSA8PSB0aGlzLmFjdGl2ZURldmljZU1pbGxpc2Vjb25kcykge1xuICAgICAgICBhY2tub3dsZWRnZW1lbnRzLnB1c2gobmV3IE1hcChoYXZlWyd2ZWN0b3InXSkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYWNrbm93bGVkZ2VtZW50cztcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHkob3BlcmF0aW9uOiBEYXRhU3RvcmVPcGVyYXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB0aGlzLnZlY3Rvci5zZXQob3BlcmF0aW9uLmRldmljZSwgb3BlcmF0aW9uLnNlcXVlbmNlKTtcbiAgICB0aGlzLm9ic2VydmVDbG9jayhvcGVyYXRpb24udGltZSwgb3BlcmF0aW9uLmNvdW50ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2UoY2hhbmdlczogcmVhZG9ubHkgQ2hhbmdlW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnBhcmFtcy5sb2NhbC5leGNsdXNpdmUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkTG9jYWwoKTtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VGaWxlcygpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG5ldyBEYXRhU3RvcmVSZXBsaWNhKHRoaXMucGFyYW1zLmtpbmQpO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgdGhpcy5yZXBsaWNhLmV4cG9ydCgpKSB7XG4gICAgICAgIGNhbmRpZGF0ZS5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgbGV0IHNlcXVlbmNlID0gdGhpcy52ZWN0b3IuZ2V0KHRoaXMuZGV2aWNlKSA/PyAwO1xuICAgICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgY2hhbmdlcykge1xuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSBub3cgPiB0aGlzLnRpbWUgPyAwIDogdGhpcy5jb3VudGVyICsgMTtcbiAgICAgICAgdGhpcy50aW1lID0gTWF0aC5tYXgobm93LCB0aGlzLnRpbWUpO1xuICAgICAgICBjb25zdCBvcGVyYXRpb246IERhdGFTdG9yZU9wZXJhdGlvbiA9IHtcbiAgICAgICAgICAuLi5jaGFuZ2UsXG4gICAgICAgICAgY291bnRlcjogdGhpcy5jb3VudGVyLFxuICAgICAgICAgIGRldmljZTogdGhpcy5kZXZpY2UsXG4gICAgICAgICAgc2VxdWVuY2U6ICsrc2VxdWVuY2UsXG4gICAgICAgICAgdGFnczogY2FuZGlkYXRlLm9ic2VydmVkVGFncyhjaGFuZ2Uua2V5KSxcbiAgICAgICAgICB0aW1lOiB0aGlzLnRpbWVcbiAgICAgICAgfTtcbiAgICAgICAgY2FuZGlkYXRlLmFwcGx5KG9wZXJhdGlvbik7XG4gICAgICAgIG9wZXJhdGlvbnMucHVzaChvcGVyYXRpb24pO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICAgIHRoaXMuYXBwbHkob3BlcmF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhc1VucHVibGlzaGVkQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBWYWxpZGF0ZSBldmVyeSBzaW5nbGUgb3BlcmF0aW9uIGJlZm9yZSBwdWJsaXNoaW5nIGFueSBwcmVmaXggb2YgYSBiYXRjaC5cbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wZXJhdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRyYW5zcG9ydC5maXRzKFtvcGVyYXRpb25dKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMudHJhbnNwb3J0LndyaXRlKHRoaXMuc2VnbWVudFBhdGgob3BlcmF0aW9uLnNlcXVlbmNlKSwgW29wZXJhdGlvbl0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBHcm93IHRoaXMgZGV2aWNlJ3Mgb3BlbiBzZWdtZW50IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGZpbGUgcGVyIGJhdGNoOyBhIHNlYWxlZCBvciBtaXNzaW5nIG9uZSBzdGFydHMgYSBuZXcgZmlsZS5cbiAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5vcGVuU2VnbWVudCgpO1xuICAgICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgICBpZiAoc2VnbWVudCAmJiB0aGlzLnRyYW5zcG9ydC5maXRzKFsuLi5zZWdtZW50Lm9wZXJhdGlvbnMsIC4uLnNlZ21lbnQuYWRkZWQsIG9wZXJhdGlvbl0pKSB7XG4gICAgICAgICAgc2VnbWVudC5hZGRlZC5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlZ21lbnQgJiYgc2VnbWVudC5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wdWJsaXNoKHNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNlZ21lbnQgPSB7IGFkZGVkOiBbb3BlcmF0aW9uXSwgb3BlcmF0aW9uczogW10sIHBhdGg6IHRoaXMuc2VnbWVudFBhdGgob3BlcmF0aW9uLnNlcXVlbmNlKSB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlZ21lbnQgJiYgc2VnbWVudC5hZGRlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHVibGlzaChzZWdtZW50KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMucGVyc2lzdCgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja3BvaW50KCk6IENoZWNrcG9pbnQge1xuICAgIHJldHVybiB7IGNvdW50ZXI6IHRoaXMuY291bnRlciwgZm9ybWF0OiAxLCBraW5kOiB0aGlzLnBhcmFtcy5raW5kLCBvcGVyYXRpb25zOiB0aGlzLnJlcGxpY2EuZXhwb3J0KCksIHRpbWU6IHRoaXMudGltZSwgdmVjdG9yOiBbLi4udGhpcy52ZWN0b3JdIH07XG4gIH1cblxuICBwcml2YXRlIGRldmljZVJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy50cmFuc3BvcnQucm9vdH0vZGV2aWNlcy8ke3RoaXMuZGV2aWNlfWA7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRMb2NhbCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcGxpY2EgPSBuZXcgRGF0YVN0b3JlUmVwbGljYSh0aGlzLnBhcmFtcy5raW5kKTtcbiAgICB0aGlzLnZlY3Rvci5jbGVhcigpO1xuICAgIHRoaXMudGltZSA9IDA7XG4gICAgdGhpcy5jb3VudGVyID0gMDtcbiAgICB0aGlzLmxvY2FsUmVjb3Jkcy5jbGVhcigpO1xuICAgIHRoaXMua25vd25UcmFuc3BvcnRSb290cy5jbGVhcigpO1xuICAgIHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLmVudHJpZXMoKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiByZWNvcmRzKSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdzaGFyZWQtY2hlY2twb2ludC12MSc6IHtcbiAgICAgICAgICB0aGlzLm1lcmdlQ2hlY2twb2ludCh2YWx1ZSk7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzaGFyZWQtdHJhbnNwb3J0LXJvb3RzLXYxJzoge1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSB0cmFuc3BvcnQgcm9vdHMnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc3VmZml4ID0gYC8ke3RoaXMucGFyYW1zLnBsdWdpbklkfS8ke3RoaXMucGFyYW1zLnN0b3JlSWR9YDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygcm9vdCAhPT0gJ3N0cmluZycgfHwgIXJvb3QuZW5kc1dpdGgoc3VmZml4KSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbG9jYWwgZGF0YS1zdG9yZSB0cmFuc3BvcnQgcm9vdHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIHJlbWVtYmVyZWQgcGF0aHMgd2l0aG91dCByZWFkaW5nIHRoZSBhZGFwdGVyIG9yIGFjdGl2YXRpbmcgYSB3cml0ZXIuXG4gICAgICAgICAgICBjb25zdCB0cmFuc3BvcnQgPSBuZXcgRGF0YVN0b3JlVHJhbnNwb3J0KHsgLi4udGhpcy5wYXJhbXMsIGZvbGRlcjogcm9vdC5zbGljZSgwLCAtc3VmZml4Lmxlbmd0aCkgfSk7XG4gICAgICAgICAgICB0aGlzLmtub3duVHJhbnNwb3J0Um9vdHMuYWRkKHRyYW5zcG9ydC5yb290KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzaGFyZWQtdW5wdWJsaXNoZWQtdjEnOiB7XG4gICAgICAgICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSB2YWx1ZSA9PT0gdHJ1ZTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoUkVDT1JEX1BSRUZJWCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGljYS5hcHBseSh2YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmxvY2FsUmVjb3Jkcy5zZXQoa2V5LCBlbnN1cmVOb25OdWxsYWJsZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lcmdlQ2hlY2twb2ludCh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFpc09iamVjdCh2YWx1ZSkgfHwgdmFsdWVbJ2Zvcm1hdCddICE9PSAxIHx8IHZhbHVlWydraW5kJ10gIT09IHRoaXMucGFyYW1zLmtpbmRcbiAgICAgIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlWydvcGVyYXRpb25zJ10pIHx8ICF2YWx1ZVsnb3BlcmF0aW9ucyddLmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKVxuICAgICAgfHwgIWlzVmVjdG9yKHZhbHVlWyd2ZWN0b3InXSkgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlWyd0aW1lJ10pIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZVsnY291bnRlciddKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRhdGEtc3RvcmUgY2hlY2twb2ludCBvciBpbmNvbXBhdGlibGUgbWVyZ2UgcnVsZScpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB2YWx1ZVsnb3BlcmF0aW9ucyddKSB7XG4gICAgICB0aGlzLnJlcGxpY2EuYXBwbHkob3BlcmF0aW9uKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbZGV2aWNlLCBzZXF1ZW5jZV0gb2YgdmFsdWVbJ3ZlY3RvciddKSB7XG4gICAgICB0aGlzLnZlY3Rvci5zZXQoZGV2aWNlLCBNYXRoLm1heChzZXF1ZW5jZSwgdGhpcy52ZWN0b3IuZ2V0KGRldmljZSkgPz8gMCkpO1xuICAgIH1cbiAgICB0aGlzLm9ic2VydmVDbG9jayhOdW1iZXIodmFsdWVbJ3RpbWUnXSksIE51bWJlcih2YWx1ZVsnY291bnRlciddKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlRmlsZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2NhdGlvbnMucmVmcmVzaCgpO1xuICAgIGZvciAoY29uc3QgdHJhbnNwb3J0IG9mIHRoaXMubG9jYXRpb25zLnRyYW5zcG9ydHMpIHtcbiAgICAgIGF3YWl0IHRoaXMubWVyZ2VUcmFuc3BvcnQodHJhbnNwb3J0KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1lcmdlVHJhbnNwb3J0KHRyYW5zcG9ydDogRGF0YVN0b3JlVHJhbnNwb3J0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRmlsZXMgPSBhd2FpdCB0cmFuc3BvcnQubGlzdCgpO1xuICAgIGNvbnN0IGZpbGVzID0gYWxsRmlsZXMuZmlsdGVyKChwYXRoKSA9PiBwYXRoLnN0YXJ0c1dpdGgoYCR7dHJhbnNwb3J0LnJvb3R9L2RldmljZXMvYCkpO1xuICAgIGNvbnN0IG1hbmlmZXN0cyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gL1xcL3NuYXBzaG90LVtcXHctXSstbWFuaWZlc3RcXC4oPzptZHxqc29uKSQvLnRlc3QoZmlsZSkpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiBtYW5pZmVzdHMpIHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdHJhbnNwb3J0LnJlYWRTbmFwc2hvdChwYXRoKTtcbiAgICAgIGlmIChzbmFwc2hvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWVyZ2VDaGVja3BvaW50KHNuYXBzaG90KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3BlcmF0aW9uczogRGF0YVN0b3JlT3BlcmF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzZWdtZW50cyA9IGZpbGVzLmZpbHRlcigoZmlsZSkgPT4gL1xcL2xvZy1cXGQrXFwuKD86bWR8anNvbikkLy50ZXN0KGZpbGUpKTtcbiAgICBjb25zdCBvd25TZWdtZW50czogW251bWJlciwgSm91cm5hbFNlZ21lbnRGaWxlXVtdID0gW107XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHNlZ21lbnRzKSB7XG4gICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgdHJhbnNwb3J0LnJlYWQocGF0aCk7XG4gICAgICBpZiAoc2VnbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNlZ21lbnQpIHx8ICFzZWdtZW50LmV2ZXJ5KGlzRGF0YVN0b3JlT3BlcmF0aW9uKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGF0YS1zdG9yZSBqb3VybmFsIHNlZ21lbnQnKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG93bmVyID0gcGF0aC5zcGxpdCgnLycpLmF0KE9XTkVSX1BBVEhfSU5ERVgpO1xuICAgICAgaWYgKHNlZ21lbnQuc29tZSgob3BlcmF0aW9uKSA9PiBvcGVyYXRpb24uZGV2aWNlICE9PSBvd25lcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdKb3VybmFsIHNlZ21lbnQgaGFzIGEgZGlmZmVyZW50IHdyaXRlcicpO1xuICAgICAgfVxuICAgICAgY29uc3QgW2ZpcnN0T3BlcmF0aW9uXSA9IHNlZ21lbnQ7XG4gICAgICBpZiAob3duZXIgPT09IHRoaXMuZGV2aWNlICYmIGZpcnN0T3BlcmF0aW9uKSB7XG4gICAgICAgIG93blNlZ21lbnRzLnB1c2goW2ZpcnN0T3BlcmF0aW9uLnNlcXVlbmNlLCB7IG9wZXJhdGlvbnM6IHNlZ21lbnQsIHBhdGggfV0pO1xuICAgICAgfVxuICAgICAgb3BlcmF0aW9ucy5wdXNoKC4uLnNlZ21lbnQpO1xuICAgIH1cbiAgICBvd25TZWdtZW50cy5zb3J0KChbZmlyc3RdLCBbc2Vjb25kXSkgPT4gZmlyc3QgLSBzZWNvbmQpO1xuICAgIHRoaXMub3duU2VnbWVudHMuc2V0KHRyYW5zcG9ydC5yb290LCBvd25TZWdtZW50cy5tYXAoKFssIHNlZ21lbnRdKSA9PiBzZWdtZW50KSk7XG4gICAgb3BlcmF0aW9ucy5zb3J0KChmaXJzdCwgc2Vjb25kKSA9PiBmaXJzdC5kZXZpY2UubG9jYWxlQ29tcGFyZShzZWNvbmQuZGV2aWNlKSB8fCBmaXJzdC5zZXF1ZW5jZSAtIHNlY29uZC5zZXF1ZW5jZSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgICAgaWYgKG9wZXJhdGlvbi5zZXF1ZW5jZSA9PT0gKHRoaXMudmVjdG9yLmdldChvcGVyYXRpb24uZGV2aWNlKSA/PyAwKSArIDEpIHtcbiAgICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb2JzZXJ2ZUNsb2NrKHRpbWU6IG51bWJlciwgY291bnRlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRpbWUgPiB0aGlzLnRpbWUpIHtcbiAgICAgIHRoaXMudGltZSA9IHRpbWU7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBjb3VudGVyO1xuICAgIH0gZWxzZSBpZiAodGltZSA9PT0gdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLmNvdW50ZXIgPSBNYXRoLm1heCh0aGlzLmNvdW50ZXIsIGNvdW50ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQaWNrcyB0aGUgc2VnbWVudCB0aGUgbmV4dCBvcGVyYXRpb24gbWF5IGV4dGVuZDogdGhpcyBkZXZpY2UncyBuZXdlc3Qgb25lIGluIHRoZSBhY3RpdmUgdHJhbnNwb3J0LCB3aGVuIGl0IGVuZHNcbiAgICogZXhhY3RseSBhdCB0aGUgZGV2aWNlJ3MgbGFzdCBzZXF1ZW5jZSBhbmQgaXMgc3RpbGwgc21hbGwgZW5vdWdoIHRoYXQgcmV3cml0aW5nIGl0IHN0YXlzIGNoZWFwLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgb3BlbiBzZWdtZW50LCBvciBgbnVsbGAgd2hlbiB0aGUgbmV4dCBvcGVyYXRpb24gc3RhcnRzIGEgbmV3IGZpbGUuXG4gICAqL1xuICBwcml2YXRlIG9wZW5TZWdtZW50KCk6IEpvdXJuYWxTZWdtZW50IHwgbnVsbCB7XG4gICAgY29uc3QgbmV3ZXN0ID0gdGhpcy5vd25TZWdtZW50cy5nZXQodGhpcy50cmFuc3BvcnQucm9vdCk/LmF0KC0xKTtcbiAgICBpZiAoIW5ld2VzdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGxhc3QgPSBuZXdlc3Qub3BlcmF0aW9ucy5hdCgtMSk7XG4gICAgcmV0dXJuIGxhc3Q/LnNlcXVlbmNlICE9PSB0aGlzLnZlY3Rvci5nZXQodGhpcy5kZXZpY2UpIHx8IHRoaXMudHJhbnNwb3J0Lm1lYXN1cmUobmV3ZXN0Lm9wZXJhdGlvbnMpID49IHRoaXMub3BlblNlZ21lbnRCeXRlcygpID8gbnVsbCA6IHsgYWRkZWQ6IFtdLCBvcGVyYXRpb25zOiBuZXdlc3Qub3BlcmF0aW9ucywgcGF0aDogbmV3ZXN0LnBhdGggfTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNlZ21lbnRCeXRlcygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbihPUEVOX1NFR01FTlRfQllURVMsIHRoaXMudHJhbnNwb3J0Lm1heEZpbGVCeXRlcyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2hlY2twb2ludCA9IHRoaXMuY2hlY2twb2ludCgpO1xuICAgIGNvbnN0IHJlY29yZHMgPSBuZXcgTWFwPHN0cmluZywgRGF0YVN0b3JlT3BlcmF0aW9uPigpO1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIGNoZWNrcG9pbnQub3BlcmF0aW9ucykge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLnBhcmFtcy5raW5kID09PSAnb2JzZXJ2ZWQtcmVtb3ZlLXNldCcgPyBgJHtvcGVyYXRpb24uZGV2aWNlfToke1N0cmluZyhvcGVyYXRpb24uc2VxdWVuY2UpfWAgOiBvcGVyYXRpb24ua2V5O1xuICAgICAgcmVjb3Jkcy5zZXQoYCR7UkVDT1JEX1BSRUZJWH0ke2lkZW50aXR5fWAsIG9wZXJhdGlvbik7XG4gICAgfVxuICAgIGNvbnN0IGVudHJpZXM6IFtzdHJpbmcsIHVua25vd25dW10gPSBbLi4ucmVjb3Jkc10uZmlsdGVyKChba2V5LCB2YWx1ZV0pID0+IHRoaXMubG9jYWxSZWNvcmRzLmdldChrZXkpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgIGNvbnN0IHJlbW92ZWRLZXlzID0gWy4uLnRoaXMubG9jYWxSZWNvcmRzLmtleXMoKV0uZmlsdGVyKChrZXkpID0+ICFyZWNvcmRzLmhhcyhrZXkpKTtcbiAgICBlbnRyaWVzLnB1c2goWydzaGFyZWQtY2hlY2twb2ludC12MScsIHsgLi4uY2hlY2twb2ludCwgb3BlcmF0aW9uczogW10gfV0sIFsnc2hhcmVkLXVucHVibGlzaGVkLXYxJywgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXNdLCBbJ3NoYXJlZC10cmFuc3BvcnQtcm9vdHMtdjEnLCB0aGlzLnRyYW5zcG9ydFJvb3RzXSk7XG4gICAgYXdhaXQgdGhpcy5wYXJhbXMubG9jYWwuY29tbWl0KHsgZW50cmllcywgcmVtb3ZlZEtleXMgfSk7XG4gICAgaWYgKCF0aGlzLmlzU3luY0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFzVW5wdWJsaXNoZWRDaGFuZ2VzKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZVNuYXBzaG90KHsgYmFzZTogYCR7dGhpcy5kZXZpY2VSb290KCl9L3NuYXBzaG90LSR7d2luZG93LmNyeXB0by5yYW5kb21VVUlEKCl9LW1hbmlmZXN0YCwgcGF5bG9hZDogY2hlY2twb2ludCB9KTtcbiAgICAgIGF3YWl0IHRoaXMucGFyYW1zLmxvY2FsLnNldCgnc2hhcmVkLXVucHVibGlzaGVkLXYxJywgZmFsc2UpO1xuICAgICAgdGhpcy5oYXNVbnB1Ymxpc2hlZENoYW5nZXMgPSBmYWxzZTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5wdWJsaXNoQWNrbm93bGVkZ2VtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1Ymxpc2goc2VnbWVudDogSm91cm5hbFNlZ21lbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnRyYW5zcG9ydC53cml0ZUFwcGVuZE9ubHkoc2VnbWVudC5wYXRoLCBbLi4uc2VnbWVudC5vcGVyYXRpb25zLCAuLi5zZWdtZW50LmFkZGVkXSk7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygc2VnbWVudC5hZGRlZCkge1xuICAgICAgdGhpcy5hcHBseShvcGVyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXdyaXRlcyBgaGF2ZWAgb25seSB3aGVuIGFub3RoZXIgZGV2aWNlJ3MgYWNrbm93bGVkZ2VkIHNlcXVlbmNlIG1vdmVkLCBvciB0aGUgc3RvcmVkIGNvcHkgaXMgZHVlIGEgcmVmcmVzaC5cbiAgICogT3RoZXIgZGV2aWNlcyByZWFkIG9ubHkgdGhlaXIgb3duIGVudHJ5IGZyb20gaXQsIHNvIHRoaXMgZGV2aWNlJ3Mgb3duIHNlcXVlbmNlIG5ldmVyIGZvcmNlcyBhIHdyaXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBhY2tub3dsZWRnZW1lbnQgaXMgY3VycmVudC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHVibGlzaEFja25vd2xlZGdlbWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXRoID0gYCR7dGhpcy5kZXZpY2VSb290KCl9L2hhdmUke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gO1xuICAgIGNvbnN0IGFja25vd2xlZGdlZCA9IEpTT04uc3RyaW5naWZ5KG90aGVyRGV2aWNlcyhbLi4udGhpcy52ZWN0b3JdLCB0aGlzLmRldmljZSkpO1xuICAgIGxldCBzdG9yZWQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHN0b3JlZCA9IGF3YWl0IHRoaXMudHJhbnNwb3J0LnJlYWQocGF0aCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBzdG9yZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZnJlc2hNaWxsaXNlY29uZHMgPSBNYXRoLm1pbihBQ0tOT1dMRURHRU1FTlRfUkVGUkVTSF9NSUxMSVNFQ09ORFMsIHRoaXMuYWN0aXZlRGV2aWNlTWlsbGlzZWNvbmRzIC8gQUNLTk9XTEVER0VNRU5UX1JFRlJFU0hFU19QRVJfUkVUSVJFTUVOVCk7XG4gICAgaWYgKFxuICAgICAgaXNPYmplY3Qoc3RvcmVkKSAmJiBzdG9yZWRbJ2Zvcm1hdCddID09PSAxICYmIGlzVmVjdG9yKHN0b3JlZFsndmVjdG9yJ10pICYmIHR5cGVvZiBzdG9yZWRbJ3RpbWUnXSA9PT0gJ251bWJlcidcbiAgICAgICYmIEpTT04uc3RyaW5naWZ5KG90aGVyRGV2aWNlcyhzdG9yZWRbJ3ZlY3RvciddLCB0aGlzLmRldmljZSkpID09PSBhY2tub3dsZWRnZWRcbiAgICAgICYmIERhdGUubm93KCkgLSBzdG9yZWRbJ3RpbWUnXSA8IHJlZnJlc2hNaWxsaXNlY29uZHNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy50cmFuc3BvcnQud3JpdGUocGF0aCwgeyBmb3JtYXQ6IDEsIHRpbWU6IERhdGUubm93KCksIHZlY3RvcjogWy4uLnRoaXMudmVjdG9yXSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2VnbWVudFBhdGgoZmlyc3RTZXF1ZW5jZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5kZXZpY2VSb290KCl9L2xvZy0ke1N0cmluZyhmaXJzdFNlcXVlbmNlKX0ke3RoaXMudHJhbnNwb3J0LmV4dGVuc2lvbn1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzVmVjdG9yKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVmVyc2lvblZlY3RvciB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoZW50cnk6IHVua25vd24pID0+XG4gICAgQXJyYXkuaXNBcnJheShlbnRyeSkgJiYgZW50cnkubGVuZ3RoID09PSBWRUNUT1JfRU5UUllfTEVOR1RIXG4gICAgJiYgdHlwZW9mIGVudHJ5WzBdID09PSAnc3RyaW5nJyAmJiAvXltcXHctXSskLy50ZXN0KGVudHJ5WzBdKSAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcihlbnRyeVsxXSkgJiYgTnVtYmVyKGVudHJ5WzFdKSA+PSAwXG4gICk7XG59XG5cbmZ1bmN0aW9uIG90aGVyRGV2aWNlcyh2ZWN0b3I6IFZlcnNpb25WZWN0b3IsIGRldmljZTogc3RyaW5nKTogVmVyc2lvblZlY3RvciB7XG4gIHJldHVybiB2ZWN0b3IuZmlsdGVyKChbZW50cnlEZXZpY2VdKSA9PiBlbnRyeURldmljZSAhPT0gZGV2aWNlKS5zb3J0KChbZmlyc3RdLCBbc2Vjb25kXSkgPT4gZmlyc3QubG9jYWxlQ29tcGFyZShzZWNvbmQpKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSxTQUFTLHlCQUF5QjtBQVNsQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMEJBQTBCO0FBRW5DLE1BQU0scUNBQXFDO0FBSzNDLE1BQU0scUJBQXFCO0FBSzNCLE1BQU0sdUNBQXVDO0FBQzdDLE1BQU0sMkNBQTJDO0FBRWpELE1BQU0sbUJBQW1CO0FBRXpCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sZ0JBQWdCO0FBOEZmLE1BQU0sZ0JBQWdCO0FBQUEsRUEyQm5CLFlBQStCLFFBQXNELFFBQWdCO0FBQXRFO0FBQXNEO0FBQzNGLFNBQUssWUFBWSxJQUFJLG1CQUFtQixNQUFNO0FBQzlDLFNBQUssZ0JBQWdCLE9BQU8saUJBQWlCO0FBQzdDLFNBQUssVUFBVSxJQUFJLGlCQUFpQixP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
@@ -10,6 +10,7 @@ import type { DataviewInlineApi as DataviewInlineApiOriginal } from '@mnaoumov/o
10
10
  import type { Promisable } from 'type-fest';
11
11
  import type { PathOrFile } from './file-system.mjs';
12
12
  import type { CombinedFrontmatter } from './frontmatter.mjs';
13
+ import type { ThirdPartyPluginAdapter } from './plugin/third-party-plugin.mjs';
13
14
  /**
14
15
  * Export DateTime and Link types from the `Dataview` API.
15
16
  */
@@ -83,6 +84,19 @@ export type PageFiles = ArrayOrDataArray<PageFile>;
83
84
  interface ContainerInfo {
84
85
  readonly container?: HTMLElement;
85
86
  }
87
+ /**
88
+ * `Dataview`'s plugin id, as its manifest declares it.
89
+ */
90
+ export declare const DATAVIEW_PLUGIN_ID = "dataview";
91
+ /**
92
+ * The {@link ThirdPartyPluginAdapter} of `Dataview`, for `watchThirdPartyPluginApi`, the waits and
93
+ * `createThirdPartyPluginDependency`.
94
+ *
95
+ * It reads `plugin.api`, the same object `Dataview` installs as the `DataviewAPI` global, and verifies the
96
+ * query entry points (`page`, `pages`, `query`) before handing it over typed as {@link DataviewApi}, whose
97
+ * declarations come from `@mnaoumov/obsidian-dataview`.
98
+ */
99
+ export declare const DATAVIEW_PLUGIN_ADAPTER: ThirdPartyPluginAdapter<DataviewApi>;
86
100
  /**
87
101
  * Reloads the current file cache using the `Dataview` API.
88
102
  *
@@ -39,12 +39,28 @@ import {
39
39
  } from "./file-system.mjs";
40
40
  import { t } from "./i18n/i18n.mjs";
41
41
  import { relativePathToResourceUrl } from "./resource-url.mjs";
42
+ const DATAVIEW_PLUGIN_ID = "dataview";
43
+ const DATAVIEW_PLUGIN_ADAPTER = {
44
+ getApi: getDataviewApiFromPlugin,
45
+ pluginId: DATAVIEW_PLUGIN_ID,
46
+ pluginName: "Dataview"
47
+ };
42
48
  async function reloadCurrentFileCache(dv) {
43
49
  await activeWindow.DataviewAPI?.index.reload(getFile({
44
50
  app: dv.app,
45
51
  pathOrFile: dv.current().file.path
46
52
  }));
47
53
  }
54
+ function getDataviewApiFromPlugin(plugin) {
55
+ if (!("api" in plugin)) {
56
+ return null;
57
+ }
58
+ const api = plugin.api;
59
+ return isDataviewApi(api) ? api : null;
60
+ }
61
+ function isDataviewApi(value) {
62
+ return typeof value === "object" && value !== null && "page" in value && typeof value.page === "function" && "pages" in value && typeof value.pages === "function" && "query" in value && typeof value.query === "function";
63
+ }
48
64
  const paginationCss = `
49
65
  .pagination .page-link.disabled {
50
66
  pointer-events: none;
@@ -261,6 +277,8 @@ async function renderPaginated(params) {
261
277
  }
262
278
  }
263
279
  export {
280
+ DATAVIEW_PLUGIN_ADAPTER,
281
+ DATAVIEW_PLUGIN_ID,
264
282
  getRenderedContainer,
265
283
  insertCodeBlock,
266
284
  reloadCurrentFileCache,
@@ -268,4 +286,4 @@ export {
268
286
  renderPaginatedList,
269
287
  renderPaginatedTable
270
288
  };
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhdmlldy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBgRGF0YXZpZXdgIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGF0YUFycmF5LFxuICBEYXRhdmlld0FwaSxcbiAgU01hcmtkb3duUGFnZVxufSBmcm9tICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGF0YXZpZXcnO1xuaW1wb3J0IHR5cGUgeyBEYXRhdmlld0lubGluZUFwaSBhcyBEYXRhdmlld0lubGluZUFwaU9yaWdpbmFsIH0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWRhdGF2aWV3L2FwaS9pbmxpbmUtYXBpJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcbmltcG9ydCB7IGVuc3VyZU5vbk51bGxhYmxlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUtZ3VhcmRzJztcblxuaW1wb3J0IHR5cGUgeyBQYXRoT3JGaWxlIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkRnJvbnRtYXR0ZXIgfSBmcm9tICcuL2Zyb250bWF0dGVyLnRzJztcblxuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aFxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQgeyByZWxhdGl2ZVBhdGhUb1Jlc291cmNlVXJsIH0gZnJvbSAnLi9yZXNvdXJjZS11cmwudHMnO1xuXG4vKipcbiAqIEV4cG9ydCBEYXRlVGltZSBhbmQgTGluayB0eXBlcyBmcm9tIHRoZSBgRGF0YXZpZXdgIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUge1xuICBEYXRlVGltZSxcbiAgTGlua1xufSBmcm9tICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGF0YXZpZXcnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8qKlxuICAgKiBBIHtAbGluayBEYXRhdmlld0FwaX0gb2JqZWN0IHJlcHJlc2VudHMgdGhlIEFQSSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBgRGF0YXZpZXdgIGluIE9ic2lkaWFuLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhcnMtb24tdG9wIC0tIEl0IGlzIGEgYHZhcmAgaW4gbW9kdWxlIGRlY2xhcmF0aW9uLiBFU0xpbnQgbWlzdGFrZW5seSBjb25mdXNlcyBpdCB3aXRoIGB2YXJgIGFzIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uXG4gIHZhciBEYXRhdmlld0FQSTogRGF0YXZpZXdBcGkgfCB1bmRlZmluZWQ7XG5cbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgLyoqXG4gICAgICogVGhlIGdsb2JhbCB7QGxpbmsgRGF0YXZpZXdBcGl9IG9iamVjdCBgRGF0YXZpZXdgIGluc3RhbGxzIG9uIGV2ZXJ5IHdpbmRvdy5cbiAgICAgKi9cbiAgICByZWFkb25seSBEYXRhdmlld0FQST86IERhdGF2aWV3QXBpO1xuICB9XG59XG5cbi8qKlxuICogQSBjb21iaW5lZCBwYWdlIHR5cGUsIHdoaWNoIGluY2x1ZGVzIHRoZSBmcm9udCBtYXR0ZXIgYW5kIHRoZSBTTWFya2Rvd25QYWdlLlxuICpcbiAqIEB0eXBlUGFyYW0gQ3VzdG9tRnJvbnRtYXR0ZXIgLSBUaGUgdHlwZSBvZiB0aGUgY3VzdG9tIGZyb250IG1hdHRlci5cbiAqL1xuZXhwb3J0IHR5cGUgQ29tYmluZWRQYWdlPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4gPSBDb21iaW5lZEZyb250bWF0dGVyPEN1c3RvbUZyb250bWF0dGVyPiAmIFNNYXJrZG93blBhZ2U7XG5cbi8qKlxuICogRXh0ZW5kZWQgaW50ZXJmYWNlIGZvciB0aGUgYERhdGF2aWV3YCBJbmxpbmUgQVBJLCBwcm92aWRpbmcgYWRkaXRpb25hbCBtZXRob2RzIGZvciBjdXN0b20gcGFnZSB0eXBlcyBhbmQgYXJyYXkgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YXZpZXdJbmxpbmVBcGkgZXh0ZW5kcyBEYXRhdmlld0lubGluZUFwaU9yaWdpbmFsIHtcbiAgLyoqXG4gICAqIFdyYXBzIGFuIGFycmF5IG9mIGl0ZW1zIGludG8gYSB7QGxpbmsgRGF0YUFycmF5fSBvYmplY3QuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXkuXG4gICAqIEBwYXJhbSBhcnJheSAtIFRoZSBhcnJheSBvZiBpdGVtcyB0byB3cmFwLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEYXRhQXJyYXl9IGNvbnRhaW5pbmcgdGhlIGl0ZW1zLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJyYXk6IDxUPihhcnJheTogVFtdKSA9PiBEYXRhQXJyYXk8VD47XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwYWdlLCB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBwYWdlIHR5cGUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQ3VzdG9tUGFnZSAtIFRoZSB0eXBlIG9mIHRoZSBjdXN0b20gcGFnZS4gRGVmYXVsdHMgdG8gYFNNYXJrZG93blBhZ2VgLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudDogPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4oKSA9PiBDb21iaW5lZFBhZ2U8Q3VzdG9tRnJvbnRtYXR0ZXI+O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgcGFnZXMgYmFzZWQgb24gYW4gb3B0aW9uYWwgcXVlcnksIHdpdGggYW4gb3B0aW9uYWwgY3VzdG9tIHBhZ2UgdHlwZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBDdXN0b21QYWdlIC0gVGhlIHR5cGUgb2YgdGhlIGN1c3RvbSBwYWdlLiBEZWZhdWx0cyB0byBgU01hcmtkb3duUGFnZWAuXG4gICAqIEBwYXJhbSBxdWVyeSAtIEFuIG9wdGlvbmFsIHN0cmluZyBxdWVyeSB0byBmaWx0ZXIgdGhlIHBhZ2VzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBEYXRhQXJyYXl9IG9mIHBhZ2VzIG1hdGNoaW5nIHRoZSBxdWVyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBhZ2VzOiA8Q3VzdG9tRnJvbnRtYXR0ZXIgPSB1bmtub3duPihxdWVyeT86IHN0cmluZykgPT4gRGF0YUFycmF5PENvbWJpbmVkUGFnZTxDdXN0b21Gcm9udG1hdHRlcj4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyYWdyYXBoIEhUTUwgZWxlbWVudCB3aXRoIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCBvcHRpb25hbCBET00gZWxlbWVudCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRoZSBjb250ZW50IG9mIHRoZSBwYXJhZ3JhcGguXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgRE9NIGVsZW1lbnQgb3B0aW9ucywgaW5jbHVkaW5nIGFuIG9wdGlvbmFsIGNvbnRhaW5lci5cbiAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgSFRNTCBwYXJhZ3JhcGggZWxlbWVudC5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFncmFwaDogKFxuICAgIHRleHQ6IHVua25vd24sXG4gICAgb3B0aW9ucz86IERvbUVsZW1lbnRJbmZvV2l0aENvbnRhaW5lclxuICApID0+IEhUTUxQYXJhZ3JhcGhFbGVtZW50O1xufVxuXG4vKipcbiAqIERvbUVsZW1lbnRJbmZvIHdpdGggYW4gb3B0aW9uYWwgY29udGFpbmVyLlxuICovXG5leHBvcnQgdHlwZSBEb21FbGVtZW50SW5mb1dpdGhDb250YWluZXIgPSBDb250YWluZXJJbmZvICYgRG9tRWxlbWVudEluZm87XG5cbi8qKlxuICogQSBjb21iaW5lZCBmaWxlIHR5cGUsIHdoaWNoIGluY2x1ZGVzIHRoZSBmcm9udCBtYXR0ZXIgYW5kIHRoZSBTTWFya2Rvd25GaWxlLlxuICovXG5leHBvcnQgdHlwZSBQYWdlRmlsZSA9IFNNYXJrZG93blBhZ2VbJ2ZpbGUnXTtcblxuLyoqXG4gKiBMaXN0IG9mIHBhZ2UgZmlsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFBhZ2VGaWxlcyA9IEFycmF5T3JEYXRhQXJyYXk8UGFnZUZpbGU+O1xuXG5pbnRlcmZhY2UgQ29udGFpbmVySW5mbyB7XG4gIHJlYWRvbmx5IGNvbnRhaW5lcj86IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFJlbG9hZHMgdGhlIGN1cnJlbnQgZmlsZSBjYWNoZSB1c2luZyB0aGUgYERhdGF2aWV3YCBBUEkuXG4gKlxuICogQHBhcmFtIGR2IC0gVGhlIERhdGF2aWV3SW5saW5lQXBpIGluc3RhbmNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjYWNoZSBpcyByZWxvYWRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbG9hZEN1cnJlbnRGaWxlQ2FjaGUoZHY6IERhdGF2aWV3SW5saW5lQXBpKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFjdGl2ZVdpbmRvdy5EYXRhdmlld0FQST8uaW5kZXgucmVsb2FkKGdldEZpbGUoe1xuICAgIGFwcDogZHYuYXBwLFxuICAgIHBhdGhPckZpbGU6IGR2LmN1cnJlbnQoKS5maWxlLnBhdGhcbiAgfSkpO1xufVxuXG5jb25zdCBwYWdpbmF0aW9uQ3NzID0gYFxuLnBhZ2luYXRpb24gLnBhZ2UtbGluay5kaXNhYmxlZCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBjb2xvcjogZ3JheTtcbn1cblxuLnBhZ2luYXRpb24gLnBhZ2UtbGluayB7XG4gIG1hcmdpbjogMCA1cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogYmx1ZTtcbn1cblxuLnBhZ2luYXRpb24gLnBhZ2UtbGluazpob3Zlcjpub3QoLmRpc2FibGVkKSB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLnBhZ2luYXRpb24gLnBhZ2UtbGluay5jdXJyZW50IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4ucGFnaW5hdGlvbiBzZWxlY3QsXG4ucGFnaW5hdGlvbiBpbnB1dCB7XG4gIG1hcmdpbjogMCA1cHg7XG59XG5gO1xuXG4vKipcbiAqIEFycmF5IG9yIERhdGFBcnJheSB0eXBlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJyYXlPckRhdGFBcnJheTxUPiA9IERhdGFBcnJheTxUPiB8IFRbXTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zZXJ0Q29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvZGUgY29udGVudCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UgdG8gaW5zZXJ0IHRoZSBjb2RlIGJsb2NrIGludG8uXG4gICAqL1xuICByZWFkb25seSBkdjogRGF0YXZpZXdJbmxpbmVBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZvciB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbmRlcklmcmFtZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVySWZyYW1lUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogQSBoZWlnaHQgb2YgdGhlIGlmcmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCc2MDBweCdgXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcmVzb3VyY2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBpZnJhbWUuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgd2lkdGggb2YgdGhlIGlmcmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcxMDAlJ2BcbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZW5kZXJQYWdpbmF0ZWRMaXN0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgbGlzdCBpdGVtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQYWdpbmF0ZWRMaXN0UGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgaXRlbXMgcGVyIHBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbMTAsIDIwLCA1MCwgMTAwXWBcbiAgICovXG4gIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGl0ZW1zIHRvIHBhZ2luYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm93czogQXJyYXlPckRhdGFBcnJheTxUPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVuZGVyUGFnaW5hdGVkfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgdG8gcGFnaW5hdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUGFnaW5hdGVkUGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgaXRlbXMgcGVyIHBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbMTAsIDIwLCA1MCwgMTAwXWBcbiAgICovXG4gIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgcGFnaW5hdGVkIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dzRm9yT25lUGFnZSAtIFRoZSByb3dzIHRvIHJlbmRlci5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb250ZW50IGlzIHJlbmRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyZXI6IChyb3dzRm9yT25lUGFnZTogQXJyYXlPckRhdGFBcnJheTxUPikgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogUm93cyB0byBwYWdpbmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvd3M6IEFycmF5T3JEYXRhQXJyYXk8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbmRlclBhZ2luYXRlZFRhYmxlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdGFibGUgcm93IGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUGFnaW5hdGVkVGFibGVQYXJhbXM8VD4ge1xuICAvKipcbiAgICogQSB7QGxpbmsgRGF0YXZpZXdJbmxpbmVBcGl9IGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZHY6IERhdGF2aWV3SW5saW5lQXBpO1xuXG4gIC8qKlxuICAgKiBBIGhlYWRlcnMgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIGl0ZW1zIHBlciBwYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWzEwLCAyMCwgNTAsIDEwMF1gXG4gICAqL1xuICByZWFkb25seSBpdGVtc1BlclBhZ2VPcHRpb25zPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFJvd3Mgb2YgdGhlIHRhYmxlIHRvIHBhZ2luYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm93czogQXJyYXlPckRhdGFBcnJheTxUPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUGFnZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgQ3JlYXRlUGFnZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhZ2UgbnVtYmVyIHRoZSBsaW5rIHBvaW50cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRQYWdlTnVtYmVyOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgaXMgZGlzYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbnRlbnQgdXNpbmcgdGhlIHByb3ZpZGVkIHJlbmRlcmVyIGZ1bmN0aW9uIGluIGEgdGVtcG9yYXJ5IGNvbnRhaW5lcixcbiAqIGFuZCB0aGVuIHJldHVybnMgdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBAcGFyYW0gZHYgLSBUaGUgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcmVuZGVyZXIgLSBUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIHJlbmRlcmluZyB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIEhUTUwgcGFyYWdyYXBoIGVsZW1lbnRcbiAqIHRoYXQgd2FzIHVzZWQgYXMgdGhlIHRlbXBvcmFyeSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlZENvbnRhaW5lcihkdjogRGF0YXZpZXdJbmxpbmVBcGksIHJlbmRlcmVyOiAoKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTxIVE1MUGFyYWdyYXBoRWxlbWVudD4ge1xuICBjb25zdCBvbGRDb250YWluZXIgPSBkdi5jb250YWluZXI7XG4gIGNvbnN0IHRlbXBvcmFyeUNvbnRhaW5lciA9IGR2LnBhcmFncmFwaCgnJyk7XG4gIGR2LmNvbnRhaW5lciA9IHRlbXBvcmFyeUNvbnRhaW5lcjtcbiAgZHYuY29udGFpbmVyLmVtcHR5KCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZW5kZXJlcigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGR2LnBhcmFncmFwaChg4p2MJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBZZXMsIGl0IGlzIGEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLCBidXQgSSBkb24ndCBhbiBlbGVnYW50IHdheSB0byBmaXggaXQuXG4gICAgZHYuY29udGFpbmVyID0gb2xkQ29udGFpbmVyO1xuICAgIHRlbXBvcmFyeUNvbnRhaW5lci5yZW1vdmUoKTtcbiAgfVxuXG4gIHJldHVybiB0ZW1wb3JhcnlDb250YWluZXI7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBhIGNvZGUgYmxvY2sgaW50byB0aGUgc3BlY2lmaWVkIGBEYXRhdmlld2AgaW5zdGFuY2UgdXNpbmcgdGhlIHByb3ZpZGVkIGxhbmd1YWdlIGFuZCBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgaW5zZXJ0aW5nIHRoZSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0Q29kZUJsb2NrKHBhcmFtczogSW5zZXJ0Q29kZUJsb2NrUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBjb2RlLFxuICAgIGR2LFxuICAgIGxhbmd1YWdlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IE1JTl9GRU5DRV9MRU5HVEggPSAzO1xuICBjb25zdCBmZW5jZVJlZ0V4cCA9IG5ldyBSZWdFeHAoYF5cXGB7JHtTdHJpbmcoTUlOX0ZFTkNFX0xFTkdUSCl9LH1gLCAnZ20nKTtcbiAgY29uc3QgZmVuY2VNYXRjaGVzID0gY29kZS5tYXRjaEFsbChmZW5jZVJlZ0V4cCk7XG4gIGNvbnN0IGZlbmNlTGVuZ3RocyA9IFsuLi5mZW5jZU1hdGNoZXNdLm1hcCgoZmVuY2VNYXRjaCkgPT4gZmVuY2VNYXRjaFswXS5sZW5ndGgpO1xuICBjb25zdCBtYXhGZW5jZUxlbmd0aCA9IE1hdGgubWF4KDAsIC4uLmZlbmNlTGVuZ3Rocyk7XG4gIGNvbnN0IHJlc3VsdEZlbmNlTGVuZ3RoID0gTWF0aC5tYXgoTUlOX0ZFTkNFX0xFTkdUSCwgbWF4RmVuY2VMZW5ndGggKyAxKTtcbiAgY29uc3QgcmVzdWx0RmVuY2UgPSAnYCcucmVwZWF0KHJlc3VsdEZlbmNlTGVuZ3RoKTtcblxuICBkdi5wYXJhZ3JhcGgoYCR7cmVzdWx0RmVuY2V9JHtsYW5ndWFnZX1cbiR7Y29kZX1cbiR7cmVzdWx0RmVuY2V9YCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpZnJhbWUgaW4gdGhlIGBEYXRhdmlld2AgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBwYXRoLCB3aWR0aCwgYW5kIGhlaWdodC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgaWZyYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySWZyYW1lKHBhcmFtczogUmVuZGVySWZyYW1lUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICBoZWlnaHQgPSAnNjAwcHgnLFxuICAgIHJlbGF0aXZlUGF0aE9yRmlsZSxcbiAgICB3aWR0aCA9ICcxMDAlJ1xuICB9ID0gcGFyYW1zO1xuICBkdi5lbCgnaWZyYW1lJywgJycsIHtcbiAgICBhdHRyOiB7XG4gICAgICBoZWlnaHQsXG4gICAgICBzcmM6IHJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmwoe1xuICAgICAgICBhcHA6IGR2LmFwcCxcbiAgICAgICAgbm90ZVBhdGg6IGR2LmN1cnJlbnQoKS5maWxlLnBhdGgsXG4gICAgICAgIHJlbGF0aXZlUGF0aDogZ2V0UGF0aChkdi5hcHAsIHJlbGF0aXZlUGF0aE9yRmlsZSlcbiAgICAgIH0pLFxuICAgICAgd2lkdGhcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwYWdpbmF0ZWQgbGlzdCB1c2luZyB0aGUgcHJvdmlkZWQgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIGxpc3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIHBhZ2luYXRlZCBsaXN0LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlzdCBpcyByZW5kZXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclBhZ2luYXRlZExpc3Q8VD4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRMaXN0UGFyYW1zPFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHJlbmRlclBhZ2luYXRlZCh7XG4gICAgZHYsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9ucyxcbiAgICByZW5kZXJlcjogYXN5bmMgKHJvd3NGb3JPbmVQYWdlOiBBcnJheU9yRGF0YUFycmF5PFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBkdi5saXN0KHJvd3NGb3JPbmVQYWdlKTtcbiAgICB9LFxuICAgIHJvd3NcbiAgfSk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBhZ2luYXRlZCB0YWJsZSB1c2luZyB0aGUgcHJvdmlkZWQgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIHRhYmxlIHJvd3MuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIHBhZ2luYXRlZCB0YWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhYmxlIGlzIHJlbmRlcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyUGFnaW5hdGVkVGFibGU8VCBleHRlbmRzIHVua25vd25bXT4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRUYWJsZVBhcmFtczxUPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgZHYsXG4gICAgaGVhZGVycyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHJlbmRlclBhZ2luYXRlZCh7XG4gICAgZHYsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9ucyxcbiAgICByZW5kZXJlcjogYXN5bmMgKHJvd3NGb3JPbmVQYWdlOiBBcnJheU9yRGF0YUFycmF5PFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBkdi50YWJsZShoZWFkZXJzLCByb3dzRm9yT25lUGFnZSk7XG4gICAgfSxcbiAgICByb3dzXG4gIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZW5kZXIgcGFnaW5hdGVkIGNvbnRlbnQgdXNpbmcgdGhlIHNwZWNpZmllZCByZW5kZXJlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBpdGVtcyB0byBwYWdpbmF0ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgcGFnaW5hdGVkIGNvbnRlbnQuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb250ZW50IGlzIHJlbmRlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZW5kZXJQYWdpbmF0ZWQ8VD4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRQYXJhbXM8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgU0VDT05EX1BBR0VfTlVNQkVSID0gMjtcbiAgY29uc3QgTU9SRV9QQUdFX05VTUJFUiA9IDM7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgIGR2LnBhcmFncmFwaCgnTm8gaXRlbXMgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY29udGFpbmVyID0gZHYuY29udGFpbmVyO1xuICBsZXQgaXRlbXNQZXJQYWdlID0gZW5zdXJlTm9uTnVsbGFibGUoaXRlbXNQZXJQYWdlT3B0aW9uc1swXSwgJ0l0ZW1zIHBlciBwYWdlIG9wdGlvbnMgYXJlIGVtcHR5Jyk7XG4gIGxldCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHJvd3MubGVuZ3RoIC8gaXRlbXNQZXJQYWdlKTtcbiAgYXdhaXQgcmVuZGVyUGFnZSgxKTtcblxuICBmdW5jdGlvbiBjcmVhdGVQYWdpbmF0aW9uQ29udHJvbHMocGFnZU51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFnaW5hdGlvbkRpdiA9IGNvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdwYWdpbmF0aW9uJyB9KTtcbiAgICBjb25zdCBwYWdpbmF0aW9uUm93MURpdiA9IHBhZ2luYXRpb25EaXYuY3JlYXRlRGl2KCk7XG5cbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiAxLCBkaXNhYmxlZDogcGFnZU51bWJlciA9PT0gMSwgdGV4dDogJ0ZpcnN0JyB9KTtcbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiBwYWdlTnVtYmVyIC0gMSwgZGlzYWJsZWQ6IHBhZ2VOdW1iZXIgPT09IDEsIHRleHQ6ICdQcmV2JyB9KTtcblxuICAgIGlmIChwYWdlTnVtYmVyID4gTU9SRV9QQUdFX05VTUJFUikge1xuICAgICAgcGFnaW5hdGlvblJvdzFEaXYuY3JlYXRlU3Bhbih7IHRleHQ6ICcuLi4nIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gTWF0aC5tYXgoMSwgcGFnZU51bWJlciAtIFNFQ09ORF9QQUdFX05VTUJFUik7IGluZGV4IDw9IE1hdGgubWluKHRvdGFsUGFnZXMsIHBhZ2VOdW1iZXIgKyBTRUNPTkRfUEFHRV9OVU1CRVIpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwYWdlTGluayA9IGNyZWF0ZVBhZ2VMaW5rKHsgY3VycmVudFBhZ2VOdW1iZXI6IGluZGV4LCBkaXNhYmxlZDogaW5kZXggPT09IHBhZ2VOdW1iZXIsIHRleHQ6IFN0cmluZyhpbmRleCkgfSk7XG4gICAgICBpZiAoaW5kZXggPT09IHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgcGFnZUxpbmsuYWRkQ2xhc3MoJ2N1cnJlbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFnZU51bWJlciA8IHRvdGFsUGFnZXMgLSBTRUNPTkRfUEFHRV9OVU1CRVIpIHtcbiAgICAgIHBhZ2luYXRpb25Sb3cxRGl2LmNyZWF0ZVNwYW4oeyB0ZXh0OiAnLi4uJyB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiBwYWdlTnVtYmVyICsgMSwgZGlzYWJsZWQ6IHBhZ2VOdW1iZXIgPT09IHRvdGFsUGFnZXMsIHRleHQ6ICdOZXh0JyB9KTtcbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiB0b3RhbFBhZ2VzLCBkaXNhYmxlZDogcGFnZU51bWJlciA9PT0gdG90YWxQYWdlcywgdGV4dDogJ0xhc3QnIH0pO1xuXG4gICAgY29uc3QgcGFnaW5hdGlvblJvdzJEaXYgPSBwYWdpbmF0aW9uRGl2LmNyZWF0ZURpdigpO1xuXG4gICAgcGFnaW5hdGlvblJvdzJEaXYuY3JlYXRlU3Bhbih7IHRleHQ6IGAgJHt0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmRhdGF2aWV3Lml0ZW1zUGVyUGFnZSl9IGAgfSk7XG5cbiAgICBjb25zdCBpdGVtc1BlclBhZ2VTZWxlY3QgPSBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVFbCgnc2VsZWN0Jyk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgaXRlbXNQZXJQYWdlT3B0aW9ucykge1xuICAgICAgaXRlbXNQZXJQYWdlU2VsZWN0LmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6IFN0cmluZyhvcHRpb24pLCB2YWx1ZTogU3RyaW5nKG9wdGlvbikgfSk7XG4gICAgfVxuICAgIGl0ZW1zUGVyUGFnZVNlbGVjdC52YWx1ZSA9IFN0cmluZyhpdGVtc1BlclBhZ2UpO1xuICAgIGl0ZW1zUGVyUGFnZVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpdGVtc1BlclBhZ2UgPSBwYXJzZUludChpdGVtc1BlclBhZ2VTZWxlY3QudmFsdWUsIDEwKTtcbiAgICAgICAgdG90YWxQYWdlcyA9IE1hdGguY2VpbChyb3dzLmxlbmd0aCAvIGl0ZW1zUGVyUGFnZSk7XG4gICAgICAgIGF3YWl0IHJlbmRlclBhZ2UoMSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVTcGFuKHsgdGV4dDogYCAke3QoKCQpID0+ICQub2JzaWRpYW5MaWIuZGF0YXZpZXcuanVtcFRvUGFnZSl9IGAgfSk7XG5cbiAgICBjb25zdCBqdW1wVG9QYWdlSW5wdXQgPSBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVFbCgnaW5wdXQnLCB7IGF0dHI6IHsgbWF4OiB0b3RhbFBhZ2VzLCBtaW46IDEgfSwgdHlwZTogJ251bWJlcicgfSk7XG4gICAganVtcFRvUGFnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAna2V5ZG93bicsXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoJGV2ZW50LmtleSAhPT0gJ0VudGVyJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChqdW1wVG9QYWdlSW5wdXQudmFsdWUsIDEwKTtcbiAgICAgICAgaWYgKHBhZ2UgPj0gMSAmJiBwYWdlIDw9IHRvdGFsUGFnZXMpIHtcbiAgICAgICAgICBhd2FpdCByZW5kZXJQYWdlKHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVTcGFuKHsgdGV4dDogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5kYXRhdmlldy5wYWdlSGVhZGVyLCB7IHBhZ2VOdW1iZXIsIHRvdGFsSXRlbXM6IHJvd3MubGVuZ3RoLCB0b3RhbFBhZ2VzIH0pIH0pO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFnZUxpbmsocGFyYW1zMjogQ3JlYXRlUGFnZUxpbmtQYXJhbXMpOiBIVE1MQW5jaG9yRWxlbWVudCB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGN1cnJlbnRQYWdlTnVtYmVyLFxuICAgICAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgICAgICB0ZXh0XG4gICAgICB9ID0gcGFyYW1zMjtcbiAgICAgIGNvbnN0IGxpbmsgPSBwYWdpbmF0aW9uUm93MURpdi5jcmVhdGVFbCgnYScsIHsgY2xzOiAncGFnZS1saW5rJywgaHJlZjogYCMke1N0cmluZyhjdXJyZW50UGFnZU51bWJlcil9YCwgdGV4dCB9KTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBsaW5rLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItYWRkLWV2ZW50LWxpc3RlbmVyIC0tIFRoZSBoYW5kbGVyIGlzIGFzc2lnbmVkIHRvIGBvbmNsaWNrYCBzbyBpdCBzdGF5cyByZWFkYWJsZSBiYWNrIG9mZiB0aGUgZWxlbWVudCwgd2hpY2ggaXMgaG93IGl0IGlzIGludm9rZWQgaW4gdGVzdHMgYW5kIGhvdyBhIGxhdGVyIGFzc2lnbm1lbnQgY2FuIHJlcGxhY2UgaXQuXG4gICAgICAgIGxpbmsub25jbGljayA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1hZGQtZXZlbnQtbGlzdGVuZXIgLS0gVGhlIGhhbmRsZXIgaXMgYXNzaWduZWQgdG8gYG9uY2xpY2tgIHNvIGl0IHN0YXlzIHJlYWRhYmxlIGJhY2sgb2ZmIHRoZSBlbGVtZW50LCB3aGljaCBpcyBob3cgaXQgaXMgaW52b2tlZCBpbiB0ZXN0cyBhbmQgaG93IGEgbGF0ZXIgYXNzaWdubWVudCBjYW4gcmVwbGFjZSBpdC5cbiAgICAgICAgbGluay5vbmNsaWNrID0gY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgkZXZlbnQ6IE1vdXNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXJQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGluaztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJQYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWZvcmJpZGRlbi1lbGVtZW50cyAtLSBXZSBuZWVkIHRvIGNyZWF0ZSBhIHN0eWxlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHBhZ2luYXRpb24gQ1NTLlxuICAgIGNvbnRhaW5lci5jcmVhdGVFbCgnc3R5bGUnLCB7IHRleHQ6IHBhZ2luYXRpb25Dc3MgfSk7XG5cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHBhZ2VOdW1iZXIgLSAxKSAqIGl0ZW1zUGVyUGFnZTtcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBpdGVtc1BlclBhZ2U7XG4gICAgY29uc3Qgcm93c0ZvckN1cnJlbnRQYWdlID0gcm93cy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG5cbiAgICBjb25zdCBvbGRDb250YWluZXIgPSBkdi5jb250YWluZXI7XG5cbiAgICBkdi5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBhcmFtcy5yZW5kZXJlcihyb3dzRm9yQ3VycmVudFBhZ2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkdi5wYXJhZ3JhcGgoYOKdjCR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGR2LmNvbnRhaW5lciA9IG9sZENvbnRhaW5lcjtcbiAgICB9XG5cbiAgICBjcmVhdGVQYWdpbmF0aW9uQ29udHJvbHMocGFnZU51bWJlcik7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFjQSxTQUFTLDBCQUEwQjtBQUNuQyxTQUFTLHFCQUFxQjtBQUM5QixTQUFTLHlCQUF5QjtBQUtsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsU0FBUztBQUNsQixTQUFTLGlDQUFpQztBQW9HMUMsZUFBc0IsdUJBQXVCLElBQXNDO0FBQ2pGLFFBQU0sYUFBYSxhQUFhLE1BQU0sT0FBTyxRQUFRO0FBQUEsSUFDbkQsS0FBSyxHQUFHO0FBQUEsSUFDUixZQUFZLEdBQUcsUUFBUSxFQUFFLEtBQUs7QUFBQSxFQUNoQyxDQUFDLENBQUM7QUFDSjtBQUVBLE1BQU0sZ0JBQWdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxTXRCLGVBQXNCLHFCQUFxQixJQUF1QixVQUFpRTtBQUNqSSxRQUFNLGVBQWUsR0FBRztBQUN4QixRQUFNLHFCQUFxQixHQUFHLFVBQVUsRUFBRTtBQUMxQyxLQUFHLFlBQVk7QUFDZixLQUFHLFVBQVUsTUFBTTtBQUVuQixNQUFJO0FBQ0YsVUFBTSxTQUFTO0FBQUEsRUFDakIsU0FBUyxPQUFPO0FBQ2QsT0FBRyxVQUFVLFNBQUksY0FBYyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQ3pDLFVBQUU7QUFFQSxPQUFHLFlBQVk7QUFDZix1QkFBbUIsT0FBTztBQUFBLEVBQzVCO0FBRUEsU0FBTztBQUNUO0FBT08sU0FBUyxnQkFBZ0IsUUFBcUM7QUFDbkUsUUFBTTtBQUFBLElBQ0o7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
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhdmlldy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBgRGF0YXZpZXdgIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRGF0YUFycmF5LFxuICBEYXRhdmlld0FwaSxcbiAgU01hcmtkb3duUGFnZVxufSBmcm9tICdAbW5hb3Vtb3Yvb2JzaWRpYW4tZGF0YXZpZXcnO1xuaW1wb3J0IHR5cGUgeyBEYXRhdmlld0lubGluZUFwaSBhcyBEYXRhdmlld0lubGluZUFwaU9yaWdpbmFsIH0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWRhdGF2aWV3L2FwaS9pbmxpbmUtYXBpJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvZXJyb3InO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuXG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRGcm9udG1hdHRlciB9IGZyb20gJy4vZnJvbnRtYXR0ZXIudHMnO1xuaW1wb3J0IHR5cGUgeyBUaGlyZFBhcnR5UGx1Z2luQWRhcHRlciB9IGZyb20gJy4vcGx1Z2luL3RoaXJkLXBhcnR5LXBsdWdpbi50cyc7XG5cbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldFBhdGhcbn0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgcmVsYXRpdmVQYXRoVG9SZXNvdXJjZVVybCB9IGZyb20gJy4vcmVzb3VyY2UtdXJsLnRzJztcblxuLyoqXG4gKiBFeHBvcnQgRGF0ZVRpbWUgYW5kIExpbmsgdHlwZXMgZnJvbSB0aGUgYERhdGF2aWV3YCBBUEkuXG4gKi9cbmV4cG9ydCB0eXBlIHtcbiAgRGF0ZVRpbWUsXG4gIExpbmtcbn0gZnJvbSAnQG1uYW91bW92L29ic2lkaWFuLWRhdGF2aWV3JztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAvKipcbiAgICogQSB7QGxpbmsgRGF0YXZpZXdBcGl9IG9iamVjdCByZXByZXNlbnRzIHRoZSBBUEkgZm9yIGludGVyYWN0aW5nIHdpdGggYERhdGF2aWV3YCBpbiBPYnNpZGlhbi5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YXJzLW9uLXRvcCAtLSBJdCBpcyBhIGB2YXJgIGluIG1vZHVsZSBkZWNsYXJhdGlvbi4gRVNMaW50IG1pc3Rha2VubHkgY29uZnVzZXMgaXQgd2l0aCBgdmFyYCBhcyBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLlxuICB2YXIgRGF0YXZpZXdBUEk6IERhdGF2aWV3QXBpIHwgdW5kZWZpbmVkO1xuXG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIC8qKlxuICAgICAqIFRoZSBnbG9iYWwge0BsaW5rIERhdGF2aWV3QXBpfSBvYmplY3QgYERhdGF2aWV3YCBpbnN0YWxscyBvbiBldmVyeSB3aW5kb3cuXG4gICAgICovXG4gICAgcmVhZG9ubHkgRGF0YXZpZXdBUEk/OiBEYXRhdmlld0FwaTtcbiAgfVxufVxuXG4vKipcbiAqIEEgY29tYmluZWQgcGFnZSB0eXBlLCB3aGljaCBpbmNsdWRlcyB0aGUgZnJvbnQgbWF0dGVyIGFuZCB0aGUgU01hcmtkb3duUGFnZS5cbiAqXG4gKiBAdHlwZVBhcmFtIEN1c3RvbUZyb250bWF0dGVyIC0gVGhlIHR5cGUgb2YgdGhlIGN1c3RvbSBmcm9udCBtYXR0ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIENvbWJpbmVkUGFnZTxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+ID0gQ29tYmluZWRGcm9udG1hdHRlcjxDdXN0b21Gcm9udG1hdHRlcj4gJiBTTWFya2Rvd25QYWdlO1xuXG4vKipcbiAqIEV4dGVuZGVkIGludGVyZmFjZSBmb3IgdGhlIGBEYXRhdmlld2AgSW5saW5lIEFQSSwgcHJvdmlkaW5nIGFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgY3VzdG9tIHBhZ2UgdHlwZXMgYW5kIGFycmF5IGhhbmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGF2aWV3SW5saW5lQXBpIGV4dGVuZHMgRGF0YXZpZXdJbmxpbmVBcGlPcmlnaW5hbCB7XG4gIC8qKlxuICAgKiBXcmFwcyBhbiBhcnJheSBvZiBpdGVtcyBpbnRvIGEge0BsaW5rIERhdGFBcnJheX0gb2JqZWN0LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgaW4gdGhlIGFycmF5LlxuICAgKiBAcGFyYW0gYXJyYXkgLSBUaGUgYXJyYXkgb2YgaXRlbXMgdG8gd3JhcC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGF0YUFycmF5fSBjb250YWluaW5nIHRoZSBpdGVtcy5cbiAgICovXG4gIHJlYWRvbmx5IGFycmF5OiA8VD4oYXJyYXk6IFRbXSkgPT4gRGF0YUFycmF5PFQ+O1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgcGFnZSwgd2l0aCBhbiBvcHRpb25hbCBjdXN0b20gcGFnZSB0eXBlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEN1c3RvbVBhZ2UgLSBUaGUgdHlwZSBvZiB0aGUgY3VzdG9tIHBhZ2UuIERlZmF1bHRzIHRvIGBTTWFya2Rvd25QYWdlYC5cbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgcGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnQ6IDxDdXN0b21Gcm9udG1hdHRlciA9IHVua25vd24+KCkgPT4gQ29tYmluZWRQYWdlPEN1c3RvbUZyb250bWF0dGVyPjtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHBhZ2VzIGJhc2VkIG9uIGFuIG9wdGlvbmFsIHF1ZXJ5LCB3aXRoIGFuIG9wdGlvbmFsIGN1c3RvbSBwYWdlIHR5cGUuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQ3VzdG9tUGFnZSAtIFRoZSB0eXBlIG9mIHRoZSBjdXN0b20gcGFnZS4gRGVmYXVsdHMgdG8gYFNNYXJrZG93blBhZ2VgLlxuICAgKiBAcGFyYW0gcXVlcnkgLSBBbiBvcHRpb25hbCBzdHJpbmcgcXVlcnkgdG8gZmlsdGVyIHRoZSBwYWdlcy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGF0YUFycmF5fSBvZiBwYWdlcyBtYXRjaGluZyB0aGUgcXVlcnkuXG4gICAqL1xuICByZWFkb25seSBwYWdlczogPEN1c3RvbUZyb250bWF0dGVyID0gdW5rbm93bj4ocXVlcnk/OiBzdHJpbmcpID0+IERhdGFBcnJheTxDb21iaW5lZFBhZ2U8Q3VzdG9tRnJvbnRtYXR0ZXI+PjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhcmFncmFwaCBIVE1MIGVsZW1lbnQgd2l0aCB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgb3B0aW9uYWwgRE9NIGVsZW1lbnQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHRleHQgLSBUaGUgY29udGVudCBvZiB0aGUgcGFyYWdyYXBoLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIERPTSBlbGVtZW50IG9wdGlvbnMsIGluY2x1ZGluZyBhbiBvcHRpb25hbCBjb250YWluZXIuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIEhUTUwgcGFyYWdyYXBoIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwYXJhZ3JhcGg6IChcbiAgICB0ZXh0OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBEb21FbGVtZW50SW5mb1dpdGhDb250YWluZXJcbiAgKSA9PiBIVE1MUGFyYWdyYXBoRWxlbWVudDtcbn1cblxuLyoqXG4gKiBEb21FbGVtZW50SW5mbyB3aXRoIGFuIG9wdGlvbmFsIGNvbnRhaW5lci5cbiAqL1xuZXhwb3J0IHR5cGUgRG9tRWxlbWVudEluZm9XaXRoQ29udGFpbmVyID0gQ29udGFpbmVySW5mbyAmIERvbUVsZW1lbnRJbmZvO1xuXG4vKipcbiAqIEEgY29tYmluZWQgZmlsZSB0eXBlLCB3aGljaCBpbmNsdWRlcyB0aGUgZnJvbnQgbWF0dGVyIGFuZCB0aGUgU01hcmtkb3duRmlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgUGFnZUZpbGUgPSBTTWFya2Rvd25QYWdlWydmaWxlJ107XG5cbi8qKlxuICogTGlzdCBvZiBwYWdlIGZpbGVzLlxuICovXG5leHBvcnQgdHlwZSBQYWdlRmlsZXMgPSBBcnJheU9yRGF0YUFycmF5PFBhZ2VGaWxlPjtcblxuaW50ZXJmYWNlIENvbnRhaW5lckluZm8ge1xuICByZWFkb25seSBjb250YWluZXI/OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBgRGF0YXZpZXdgJ3MgcGx1Z2luIGlkLCBhcyBpdHMgbWFuaWZlc3QgZGVjbGFyZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBEQVRBVklFV19QTFVHSU5fSUQgPSAnZGF0YXZpZXcnO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgVGhpcmRQYXJ0eVBsdWdpbkFkYXB0ZXJ9IG9mIGBEYXRhdmlld2AsIGZvciBgd2F0Y2hUaGlyZFBhcnR5UGx1Z2luQXBpYCwgdGhlIHdhaXRzIGFuZFxuICogYGNyZWF0ZVRoaXJkUGFydHlQbHVnaW5EZXBlbmRlbmN5YC5cbiAqXG4gKiBJdCByZWFkcyBgcGx1Z2luLmFwaWAsIHRoZSBzYW1lIG9iamVjdCBgRGF0YXZpZXdgIGluc3RhbGxzIGFzIHRoZSBgRGF0YXZpZXdBUElgIGdsb2JhbCwgYW5kIHZlcmlmaWVzIHRoZVxuICogcXVlcnkgZW50cnkgcG9pbnRzIChgcGFnZWAsIGBwYWdlc2AsIGBxdWVyeWApIGJlZm9yZSBoYW5kaW5nIGl0IG92ZXIgdHlwZWQgYXMge0BsaW5rIERhdGF2aWV3QXBpfSwgd2hvc2VcbiAqIGRlY2xhcmF0aW9ucyBjb21lIGZyb20gYEBtbmFvdW1vdi9vYnNpZGlhbi1kYXRhdmlld2AuXG4gKi9cbmV4cG9ydCBjb25zdCBEQVRBVklFV19QTFVHSU5fQURBUFRFUjogVGhpcmRQYXJ0eVBsdWdpbkFkYXB0ZXI8RGF0YXZpZXdBcGk+ID0ge1xuICBnZXRBcGk6IGdldERhdGF2aWV3QXBpRnJvbVBsdWdpbixcbiAgcGx1Z2luSWQ6IERBVEFWSUVXX1BMVUdJTl9JRCxcbiAgcGx1Z2luTmFtZTogJ0RhdGF2aWV3J1xufTtcblxuLyoqXG4gKiBSZWxvYWRzIHRoZSBjdXJyZW50IGZpbGUgY2FjaGUgdXNpbmcgdGhlIGBEYXRhdmlld2AgQVBJLlxuICpcbiAqIEBwYXJhbSBkdiAtIFRoZSBEYXRhdmlld0lubGluZUFwaSBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2FjaGUgaXMgcmVsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWRDdXJyZW50RmlsZUNhY2hlKGR2OiBEYXRhdmlld0lubGluZUFwaSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby1vcHRpb25hbC1jaGFpbmluZy1vbi11bmRlY2xhcmVkLXZhcmlhYmxlIC0tIGBhY3RpdmVXaW5kb3dgIGlzIGEgZ2xvYmFsIE9ic2lkaWFuIGFsd2F5cyBkZWNsYXJlczsgb25seSBgRGF0YXZpZXdBUElgIG1heSBiZSBtaXNzaW5nLlxuICBhd2FpdCBhY3RpdmVXaW5kb3cuRGF0YXZpZXdBUEk/LmluZGV4LnJlbG9hZChnZXRGaWxlKHtcbiAgICBhcHA6IGR2LmFwcCxcbiAgICBwYXRoT3JGaWxlOiBkdi5jdXJyZW50KCkuZmlsZS5wYXRoXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YXZpZXdBcGlGcm9tUGx1Z2luKHBsdWdpbjogUGx1Z2luKTogRGF0YXZpZXdBcGkgfCBudWxsIHtcbiAgaWYgKCEoJ2FwaScgaW4gcGx1Z2luKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgYXBpOiB1bmtub3duID0gcGx1Z2luLmFwaTtcbiAgcmV0dXJuIGlzRGF0YXZpZXdBcGkoYXBpKSA/IGFwaSA6IG51bGw7XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgYSB2YWx1ZSBpcyBgRGF0YXZpZXdgJ3MgQVBJLCBieSBpdHMgcXVlcnkgZW50cnkgcG9pbnRzLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjYW5kaWRhdGUgYGFwaWAgb2JqZWN0LlxuICogQHJldHVybnMgV2hldGhlciBpdCBjYXJyaWVzIGBwYWdlYCwgYHBhZ2VzYCBhbmQgYHF1ZXJ5YC5cbiAqL1xuZnVuY3Rpb24gaXNEYXRhdmlld0FwaSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIERhdGF2aWV3QXBpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiAncGFnZScgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnBhZ2UgPT09ICdmdW5jdGlvbidcbiAgICAmJiAncGFnZXMnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5wYWdlcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmICdxdWVyeScgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnF1ZXJ5ID09PSAnZnVuY3Rpb24nO1xufVxuXG5jb25zdCBwYWdpbmF0aW9uQ3NzID0gYFxuLnBhZ2luYXRpb24gLnBhZ2UtbGluay5kaXNhYmxlZCB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICBjb2xvcjogZ3JheTtcbn1cblxuLnBhZ2luYXRpb24gLnBhZ2UtbGluayB7XG4gIG1hcmdpbjogMCA1cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogYmx1ZTtcbn1cblxuLnBhZ2luYXRpb24gLnBhZ2UtbGluazpob3Zlcjpub3QoLmRpc2FibGVkKSB7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuLnBhZ2luYXRpb24gLnBhZ2UtbGluay5jdXJyZW50IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4ucGFnaW5hdGlvbiBzZWxlY3QsXG4ucGFnaW5hdGlvbiBpbnB1dCB7XG4gIG1hcmdpbjogMCA1cHg7XG59XG5gO1xuXG4vKipcbiAqIEFycmF5IG9yIERhdGFBcnJheSB0eXBlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJyYXlPckRhdGFBcnJheTxUPiA9IERhdGFBcnJheTxUPiB8IFRbXTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaW5zZXJ0Q29kZUJsb2NrfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnNlcnRDb2RlQmxvY2tQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNvZGUgY29udGVudCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb2RlIGJsb2NrLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UgdG8gaW5zZXJ0IHRoZSBjb2RlIGJsb2NrIGludG8uXG4gICAqL1xuICByZWFkb25seSBkdjogRGF0YXZpZXdJbmxpbmVBcGk7XG5cbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZvciB0aGUgY29kZSBibG9jay5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbmRlcklmcmFtZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVySWZyYW1lUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogQSBoZWlnaHQgb2YgdGhlIGlmcmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCc2MDBweCdgXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgcmVzb3VyY2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBpZnJhbWUuXG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgd2lkdGggb2YgdGhlIGlmcmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCcxMDAlJ2BcbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayByZW5kZXJQYWdpbmF0ZWRMaXN0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgbGlzdCBpdGVtcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJQYWdpbmF0ZWRMaXN0UGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgaXRlbXMgcGVyIHBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbMTAsIDIwLCA1MCwgMTAwXWBcbiAgICovXG4gIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogQSBsaXN0IG9mIGl0ZW1zIHRvIHBhZ2luYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm93czogQXJyYXlPckRhdGFBcnJheTxUPjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgcmVuZGVyUGFnaW5hdGVkfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgdG8gcGFnaW5hdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUGFnaW5hdGVkUGFyYW1zPFQ+IHtcbiAgLyoqXG4gICAqIEEge0BsaW5rIERhdGF2aWV3SW5saW5lQXBpfSBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGR2OiBEYXRhdmlld0lubGluZUFwaTtcblxuICAvKipcbiAgICogT3B0aW9ucyBmb3IgaXRlbXMgcGVyIHBhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbMTAsIDIwLCA1MCwgMTAwXWBcbiAgICovXG4gIHJlYWRvbmx5IGl0ZW1zUGVyUGFnZU9wdGlvbnM/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogRGlzcGxheSB0aGUgcGFnaW5hdGVkIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSByb3dzRm9yT25lUGFnZSAtIFRoZSByb3dzIHRvIHJlbmRlci5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb250ZW50IGlzIHJlbmRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyZXI6IChyb3dzRm9yT25lUGFnZTogQXJyYXlPckRhdGFBcnJheTxUPikgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuICAvKipcbiAgICogUm93cyB0byBwYWdpbmF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvd3M6IEFycmF5T3JEYXRhQXJyYXk8VD47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlbmRlclBhZ2luYXRlZFRhYmxlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdGFibGUgcm93IGRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVuZGVyUGFnaW5hdGVkVGFibGVQYXJhbXM8VD4ge1xuICAvKipcbiAgICogQSB7QGxpbmsgRGF0YXZpZXdJbmxpbmVBcGl9IGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZHY6IERhdGF2aWV3SW5saW5lQXBpO1xuXG4gIC8qKlxuICAgKiBBIGhlYWRlcnMgb2YgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhZGVyczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIGl0ZW1zIHBlciBwYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgWzEwLCAyMCwgNTAsIDEwMF1gXG4gICAqL1xuICByZWFkb25seSBpdGVtc1BlclBhZ2VPcHRpb25zPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFJvd3Mgb2YgdGhlIHRhYmxlIHRvIHBhZ2luYXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgcm93czogQXJyYXlPckRhdGFBcnJheTxUPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUGFnZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgQ3JlYXRlUGFnZUxpbmtQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBhZ2UgbnVtYmVyIHRoZSBsaW5rIHBvaW50cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRQYWdlTnVtYmVyOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgaXMgZGlzYWJsZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbnRlbnQgdXNpbmcgdGhlIHByb3ZpZGVkIHJlbmRlcmVyIGZ1bmN0aW9uIGluIGEgdGVtcG9yYXJ5IGNvbnRhaW5lcixcbiAqIGFuZCB0aGVuIHJldHVybnMgdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBAcGFyYW0gZHYgLSBUaGUgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcmVuZGVyZXIgLSBUaGUgZnVuY3Rpb24gcmVzcG9uc2libGUgZm9yIHJlbmRlcmluZyB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIEhUTUwgcGFyYWdyYXBoIGVsZW1lbnRcbiAqIHRoYXQgd2FzIHVzZWQgYXMgdGhlIHRlbXBvcmFyeSBjb250YWluZXIuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZW5kZXJlZENvbnRhaW5lcihkdjogRGF0YXZpZXdJbmxpbmVBcGksIHJlbmRlcmVyOiAoKSA9PiBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTxIVE1MUGFyYWdyYXBoRWxlbWVudD4ge1xuICBjb25zdCBvbGRDb250YWluZXIgPSBkdi5jb250YWluZXI7XG4gIGNvbnN0IHRlbXBvcmFyeUNvbnRhaW5lciA9IGR2LnBhcmFncmFwaCgnJyk7XG4gIGR2LmNvbnRhaW5lciA9IHRlbXBvcmFyeUNvbnRhaW5lcjtcbiAgZHYuY29udGFpbmVyLmVtcHR5KCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCByZW5kZXJlcigpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGR2LnBhcmFncmFwaChg4p2MJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlcyAtLSBZZXMsIGl0IGlzIGEgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uLCBidXQgSSBkb24ndCBhbiBlbGVnYW50IHdheSB0byBmaXggaXQuXG4gICAgZHYuY29udGFpbmVyID0gb2xkQ29udGFpbmVyO1xuICAgIHRlbXBvcmFyeUNvbnRhaW5lci5yZW1vdmUoKTtcbiAgfVxuXG4gIHJldHVybiB0ZW1wb3JhcnlDb250YWluZXI7XG59XG5cbi8qKlxuICogSW5zZXJ0cyBhIGNvZGUgYmxvY2sgaW50byB0aGUgc3BlY2lmaWVkIGBEYXRhdmlld2AgaW5zdGFuY2UgdXNpbmcgdGhlIHByb3ZpZGVkIGxhbmd1YWdlIGFuZCBjb2RlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgaW5zZXJ0aW5nIHRoZSBjb2RlIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0Q29kZUJsb2NrKHBhcmFtczogSW5zZXJ0Q29kZUJsb2NrUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBjb2RlLFxuICAgIGR2LFxuICAgIGxhbmd1YWdlXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IE1JTl9GRU5DRV9MRU5HVEggPSAzO1xuICBjb25zdCBmZW5jZVJlZ0V4cCA9IG5ldyBSZWdFeHAoYF5cXGB7JHtTdHJpbmcoTUlOX0ZFTkNFX0xFTkdUSCl9LH1gLCAnZ20nKTtcbiAgY29uc3QgZmVuY2VNYXRjaGVzID0gY29kZS5tYXRjaEFsbChmZW5jZVJlZ0V4cCk7XG4gIGNvbnN0IGZlbmNlTGVuZ3RocyA9IFsuLi5mZW5jZU1hdGNoZXNdLm1hcCgoZmVuY2VNYXRjaCkgPT4gZmVuY2VNYXRjaFswXS5sZW5ndGgpO1xuICBjb25zdCBtYXhGZW5jZUxlbmd0aCA9IE1hdGgubWF4KDAsIC4uLmZlbmNlTGVuZ3Rocyk7XG4gIGNvbnN0IHJlc3VsdEZlbmNlTGVuZ3RoID0gTWF0aC5tYXgoTUlOX0ZFTkNFX0xFTkdUSCwgbWF4RmVuY2VMZW5ndGggKyAxKTtcbiAgY29uc3QgcmVzdWx0RmVuY2UgPSAnYCcucmVwZWF0KHJlc3VsdEZlbmNlTGVuZ3RoKTtcblxuICBkdi5wYXJhZ3JhcGgoYCR7cmVzdWx0RmVuY2V9JHtsYW5ndWFnZX1cbiR7Y29kZX1cbiR7cmVzdWx0RmVuY2V9YCk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhbiBpZnJhbWUgaW4gdGhlIGBEYXRhdmlld2AgY29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBwYXRoLCB3aWR0aCwgYW5kIGhlaWdodC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgaWZyYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySWZyYW1lKHBhcmFtczogUmVuZGVySWZyYW1lUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICBoZWlnaHQgPSAnNjAwcHgnLFxuICAgIHJlbGF0aXZlUGF0aE9yRmlsZSxcbiAgICB3aWR0aCA9ICcxMDAlJ1xuICB9ID0gcGFyYW1zO1xuICBkdi5lbCgnaWZyYW1lJywgJycsIHtcbiAgICBhdHRyOiB7XG4gICAgICBoZWlnaHQsXG4gICAgICBzcmM6IHJlbGF0aXZlUGF0aFRvUmVzb3VyY2VVcmwoe1xuICAgICAgICBhcHA6IGR2LmFwcCxcbiAgICAgICAgbm90ZVBhdGg6IGR2LmN1cnJlbnQoKS5maWxlLnBhdGgsXG4gICAgICAgIHJlbGF0aXZlUGF0aDogZ2V0UGF0aChkdi5hcHAsIHJlbGF0aXZlUGF0aE9yRmlsZSlcbiAgICAgIH0pLFxuICAgICAgd2lkdGhcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBwYWdpbmF0ZWQgbGlzdCB1c2luZyB0aGUgcHJvdmlkZWQgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIGxpc3QuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIHBhZ2luYXRlZCBsaXN0LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbGlzdCBpcyByZW5kZXJlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlclBhZ2luYXRlZExpc3Q8VD4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRMaXN0UGFyYW1zPFQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHJlbmRlclBhZ2luYXRlZCh7XG4gICAgZHYsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9ucyxcbiAgICByZW5kZXJlcjogYXN5bmMgKHJvd3NGb3JPbmVQYWdlOiBBcnJheU9yRGF0YUFycmF5PFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBkdi5saXN0KHJvd3NGb3JPbmVQYWdlKTtcbiAgICB9LFxuICAgIHJvd3NcbiAgfSk7XG59XG5cbi8qKlxuICogUmVuZGVycyBhIHBhZ2luYXRlZCB0YWJsZSB1c2luZyB0aGUgcHJvdmlkZWQgRGF0YXZpZXdJbmxpbmVBcGkgaW5zdGFuY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgaXRlbXMgaW4gdGhlIHRhYmxlIHJvd3MuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciByZW5kZXJpbmcgdGhlIHBhZ2luYXRlZCB0YWJsZS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhYmxlIGlzIHJlbmRlcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyUGFnaW5hdGVkVGFibGU8VCBleHRlbmRzIHVua25vd25bXT4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRUYWJsZVBhcmFtczxUPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgZHYsXG4gICAgaGVhZGVycyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGF3YWl0IHJlbmRlclBhZ2luYXRlZCh7XG4gICAgZHYsXG4gICAgaXRlbXNQZXJQYWdlT3B0aW9ucyxcbiAgICByZW5kZXJlcjogYXN5bmMgKHJvd3NGb3JPbmVQYWdlOiBBcnJheU9yRGF0YUFycmF5PFQ+KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBhd2FpdCBkdi50YWJsZShoZWFkZXJzLCByb3dzRm9yT25lUGFnZSk7XG4gICAgfSxcbiAgICByb3dzXG4gIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byByZW5kZXIgcGFnaW5hdGVkIGNvbnRlbnQgdXNpbmcgdGhlIHNwZWNpZmllZCByZW5kZXJlci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBpdGVtcyB0byBwYWdpbmF0ZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHJlbmRlcmluZyB0aGUgcGFnaW5hdGVkIGNvbnRlbnQuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb250ZW50IGlzIHJlbmRlcmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZW5kZXJQYWdpbmF0ZWQ8VD4ocGFyYW1zOiBSZW5kZXJQYWdpbmF0ZWRQYXJhbXM8VD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgU0VDT05EX1BBR0VfTlVNQkVSID0gMjtcbiAgY29uc3QgTU9SRV9QQUdFX05VTUJFUiA9IDM7XG4gIGNvbnN0IHtcbiAgICBkdixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVycyAtLSBFeHRyYWN0aW5nIG1hZ2ljIG51bWJlciBhcyBhIGNvbnN0YW50IHdvdWxkIGJlIHJlcGV0aXRpdmUsIGFzIHRoZSB2YWx1ZSBpcyB1c2VkIG9ubHkgb25jZSBhbmQgaXRzIG5hbWUgd291bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHByb3BlcnR5LlxuICAgIGl0ZW1zUGVyUGFnZU9wdGlvbnMgPSBbMTAsIDIwLCA1MCwgMTAwXSxcbiAgICByb3dzXG4gIH0gPSBwYXJhbXM7XG4gIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkge1xuICAgIGR2LnBhcmFncmFwaCgnTm8gaXRlbXMgZm91bmQnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgY29udGFpbmVyID0gZHYuY29udGFpbmVyO1xuICBsZXQgaXRlbXNQZXJQYWdlID0gZW5zdXJlTm9uTnVsbGFibGUoaXRlbXNQZXJQYWdlT3B0aW9uc1swXSwgJ0l0ZW1zIHBlciBwYWdlIG9wdGlvbnMgYXJlIGVtcHR5Jyk7XG4gIGxldCB0b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHJvd3MubGVuZ3RoIC8gaXRlbXNQZXJQYWdlKTtcbiAgYXdhaXQgcmVuZGVyUGFnZSgxKTtcblxuICBmdW5jdGlvbiBjcmVhdGVQYWdpbmF0aW9uQ29udHJvbHMocGFnZU51bWJlcjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcGFnaW5hdGlvbkRpdiA9IGNvbnRhaW5lci5jcmVhdGVEaXYoeyBjbHM6ICdwYWdpbmF0aW9uJyB9KTtcbiAgICBjb25zdCBwYWdpbmF0aW9uUm93MURpdiA9IHBhZ2luYXRpb25EaXYuY3JlYXRlRGl2KCk7XG5cbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiAxLCBkaXNhYmxlZDogcGFnZU51bWJlciA9PT0gMSwgdGV4dDogJ0ZpcnN0JyB9KTtcbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiBwYWdlTnVtYmVyIC0gMSwgZGlzYWJsZWQ6IHBhZ2VOdW1iZXIgPT09IDEsIHRleHQ6ICdQcmV2JyB9KTtcblxuICAgIGlmIChwYWdlTnVtYmVyID4gTU9SRV9QQUdFX05VTUJFUikge1xuICAgICAgcGFnaW5hdGlvblJvdzFEaXYuY3JlYXRlU3Bhbih7IHRleHQ6ICcuLi4nIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGluZGV4ID0gTWF0aC5tYXgoMSwgcGFnZU51bWJlciAtIFNFQ09ORF9QQUdFX05VTUJFUik7IGluZGV4IDw9IE1hdGgubWluKHRvdGFsUGFnZXMsIHBhZ2VOdW1iZXIgKyBTRUNPTkRfUEFHRV9OVU1CRVIpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwYWdlTGluayA9IGNyZWF0ZVBhZ2VMaW5rKHsgY3VycmVudFBhZ2VOdW1iZXI6IGluZGV4LCBkaXNhYmxlZDogaW5kZXggPT09IHBhZ2VOdW1iZXIsIHRleHQ6IFN0cmluZyhpbmRleCkgfSk7XG4gICAgICBpZiAoaW5kZXggPT09IHBhZ2VOdW1iZXIpIHtcbiAgICAgICAgcGFnZUxpbmsuYWRkQ2xhc3MoJ2N1cnJlbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFnZU51bWJlciA8IHRvdGFsUGFnZXMgLSBTRUNPTkRfUEFHRV9OVU1CRVIpIHtcbiAgICAgIHBhZ2luYXRpb25Sb3cxRGl2LmNyZWF0ZVNwYW4oeyB0ZXh0OiAnLi4uJyB9KTtcbiAgICB9XG5cbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiBwYWdlTnVtYmVyICsgMSwgZGlzYWJsZWQ6IHBhZ2VOdW1iZXIgPT09IHRvdGFsUGFnZXMsIHRleHQ6ICdOZXh0JyB9KTtcbiAgICBjcmVhdGVQYWdlTGluayh7IGN1cnJlbnRQYWdlTnVtYmVyOiB0b3RhbFBhZ2VzLCBkaXNhYmxlZDogcGFnZU51bWJlciA9PT0gdG90YWxQYWdlcywgdGV4dDogJ0xhc3QnIH0pO1xuXG4gICAgY29uc3QgcGFnaW5hdGlvblJvdzJEaXYgPSBwYWdpbmF0aW9uRGl2LmNyZWF0ZURpdigpO1xuXG4gICAgcGFnaW5hdGlvblJvdzJEaXYuY3JlYXRlU3Bhbih7IHRleHQ6IGAgJHt0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmRhdGF2aWV3Lml0ZW1zUGVyUGFnZSl9IGAgfSk7XG5cbiAgICBjb25zdCBpdGVtc1BlclBhZ2VTZWxlY3QgPSBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVFbCgnc2VsZWN0Jyk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgaXRlbXNQZXJQYWdlT3B0aW9ucykge1xuICAgICAgaXRlbXNQZXJQYWdlU2VsZWN0LmNyZWF0ZUVsKCdvcHRpb24nLCB7IHRleHQ6IFN0cmluZyhvcHRpb24pLCB2YWx1ZTogU3RyaW5nKG9wdGlvbikgfSk7XG4gICAgfVxuICAgIGl0ZW1zUGVyUGFnZVNlbGVjdC52YWx1ZSA9IFN0cmluZyhpdGVtc1BlclBhZ2UpO1xuICAgIGl0ZW1zUGVyUGFnZVNlbGVjdC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgJ2NoYW5nZScsXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpdGVtc1BlclBhZ2UgPSBwYXJzZUludChpdGVtc1BlclBhZ2VTZWxlY3QudmFsdWUsIDEwKTtcbiAgICAgICAgdG90YWxQYWdlcyA9IE1hdGguY2VpbChyb3dzLmxlbmd0aCAvIGl0ZW1zUGVyUGFnZSk7XG4gICAgICAgIGF3YWl0IHJlbmRlclBhZ2UoMSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVTcGFuKHsgdGV4dDogYCAke3QoKCQpID0+ICQub2JzaWRpYW5MaWIuZGF0YXZpZXcuanVtcFRvUGFnZSl9IGAgfSk7XG5cbiAgICBjb25zdCBqdW1wVG9QYWdlSW5wdXQgPSBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVFbCgnaW5wdXQnLCB7IGF0dHI6IHsgbWF4OiB0b3RhbFBhZ2VzLCBtaW46IDEgfSwgdHlwZTogJ251bWJlcicgfSk7XG4gICAganVtcFRvUGFnZUlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAna2V5ZG93bicsXG4gICAgICBjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCRldmVudDogS2V5Ym9hcmRFdmVudCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBpZiAoJGV2ZW50LmtleSAhPT0gJ0VudGVyJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2UgPSBwYXJzZUludChqdW1wVG9QYWdlSW5wdXQudmFsdWUsIDEwKTtcbiAgICAgICAgaWYgKHBhZ2UgPj0gMSAmJiBwYWdlIDw9IHRvdGFsUGFnZXMpIHtcbiAgICAgICAgICBhd2FpdCByZW5kZXJQYWdlKHBhZ2UpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBwYWdpbmF0aW9uUm93MkRpdi5jcmVhdGVTcGFuKHsgdGV4dDogdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5kYXRhdmlldy5wYWdlSGVhZGVyLCB7IHBhZ2VOdW1iZXIsIHRvdGFsSXRlbXM6IHJvd3MubGVuZ3RoLCB0b3RhbFBhZ2VzIH0pIH0pO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlUGFnZUxpbmsocGFyYW1zMjogQ3JlYXRlUGFnZUxpbmtQYXJhbXMpOiBIVE1MQW5jaG9yRWxlbWVudCB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGN1cnJlbnRQYWdlTnVtYmVyLFxuICAgICAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgICAgICB0ZXh0XG4gICAgICB9ID0gcGFyYW1zMjtcbiAgICAgIGNvbnN0IGxpbmsgPSBwYWdpbmF0aW9uUm93MURpdi5jcmVhdGVFbCgnYScsIHsgY2xzOiAncGFnZS1saW5rJywgaHJlZjogYCMke1N0cmluZyhjdXJyZW50UGFnZU51bWJlcil9YCwgdGV4dCB9KTtcbiAgICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgICBsaW5rLmFkZENsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItYWRkLWV2ZW50LWxpc3RlbmVyIC0tIFRoZSBoYW5kbGVyIGlzIGFzc2lnbmVkIHRvIGBvbmNsaWNrYCBzbyBpdCBzdGF5cyByZWFkYWJsZSBiYWNrIG9mZiB0aGUgZWxlbWVudCwgd2hpY2ggaXMgaG93IGl0IGlzIGludm9rZWQgaW4gdGVzdHMgYW5kIGhvdyBhIGxhdGVyIGFzc2lnbm1lbnQgY2FuIHJlcGxhY2UgaXQuXG4gICAgICAgIGxpbmsub25jbGljayA9ICgkZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1hZGQtZXZlbnQtbGlzdGVuZXIgLS0gVGhlIGhhbmRsZXIgaXMgYXNzaWduZWQgdG8gYG9uY2xpY2tgIHNvIGl0IHN0YXlzIHJlYWRhYmxlIGJhY2sgb2ZmIHRoZSBlbGVtZW50LCB3aGljaCBpcyBob3cgaXQgaXMgaW52b2tlZCBpbiB0ZXN0cyBhbmQgaG93IGEgbGF0ZXIgYXNzaWdubWVudCBjYW4gcmVwbGFjZSBpdC5cbiAgICAgICAgbGluay5vbmNsaWNrID0gY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgkZXZlbnQ6IE1vdXNlRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBhd2FpdCByZW5kZXJQYWdlKGN1cnJlbnRQYWdlTnVtYmVyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGluaztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJQYWdlKHBhZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL25vLWZvcmJpZGRlbi1lbGVtZW50cyAtLSBXZSBuZWVkIHRvIGNyZWF0ZSBhIHN0eWxlIGVsZW1lbnQgdG8gYXBwbHkgdGhlIHBhZ2luYXRpb24gQ1NTLlxuICAgIGNvbnRhaW5lci5jcmVhdGVFbCgnc3R5bGUnLCB7IHRleHQ6IHBhZ2luYXRpb25Dc3MgfSk7XG5cbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHBhZ2VOdW1iZXIgLSAxKSAqIGl0ZW1zUGVyUGFnZTtcbiAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBpdGVtc1BlclBhZ2U7XG4gICAgY29uc3Qgcm93c0ZvckN1cnJlbnRQYWdlID0gcm93cy5zbGljZShzdGFydEluZGV4LCBlbmRJbmRleCk7XG5cbiAgICBjb25zdCBvbGRDb250YWluZXIgPSBkdi5jb250YWluZXI7XG5cbiAgICBkdi5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBhcmFtcy5yZW5kZXJlcihyb3dzRm9yQ3VycmVudFBhZ2UpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBkdi5wYXJhZ3JhcGgoYOKdjCR7ZXJyb3JUb1N0cmluZyhlcnJvcil9YCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFllcywgaXQgaXMgYSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24sIGJ1dCBJIGRvbid0IGFuIGVsZWdhbnQgd2F5IHRvIGZpeCBpdC5cbiAgICAgIGR2LmNvbnRhaW5lciA9IG9sZENvbnRhaW5lcjtcbiAgICB9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
@@ -27,6 +27,9 @@
27
27
  * has the same layout even when the vault ships no invocable scripts — the vaults themselves commit no
28
28
  * empty folder for it.
29
29
  *
30
+ * Before enabling `CodeScript Toolkit` it trusts the vault's startup script and invocable scripts folder on this
31
+ * device, so the vault opens with no trust prompt and its buttons run on the first click.
32
+ *
30
33
  * It then installs the `Folder Notes` plugin, configured to treat `README.md` as a folder's own note. A
31
34
  * demo vault that has outgrown a flat note list groups its notes into folders, and a group folder only
32
35
  * says what it is for if it has a note of its own — `README.md`, because that is also the file GitHub
@@ -54,8 +57,9 @@ export interface BootstrapDemoVaultParams {
54
57
  * popout's animation frame, and writing the settings BEFORE enabling so a fresh enable loads it already configured, with no
55
58
  * reload. If `CodeScript Toolkit` is already enabled but the settings just changed, it is reloaded
56
59
  * (disabled then enabled) so it re-reads `data.json`; when the settings were already in place, nothing is
57
- * reloaded (so a routine vault re-open does not re-run `CodeScript Toolkit`'s startup). `CodeScript Toolkit`
58
- * then runs the vault's `startup.ts`. `Folder Notes` is installed next, configured to treat `README.md` as
60
+ * reloaded (so a routine vault re-open does not re-run `CodeScript Toolkit`'s startup). Before that enable it
61
+ * trusts the vault's startup script and invocable scripts folder on this device, so `CodeScript Toolkit` asks about
62
+ * neither. `CodeScript Toolkit` then runs the vault's `startup.ts`. `Folder Notes` is installed next, configured to treat `README.md` as
59
63
  * a folder's own note, so a vault whose notes are grouped into folders describes each group in the file
60
64
  * explorer. Finally it closes Settings again (so the notice cannot be raised inside the settings popout) and
61
65
  * raises the sandbox notice describing the opened vault as a throwaway copy.