@mnaoumov/obsidian-lib 10.11.0 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/worker-component/package.json +6 -0
  5. package/components/worker-pool-component/package.json +6 -0
  6. package/components/workspace-layout-state-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +477 -285
  8. package/dist/lib/cjs/__merged.d.cts +26 -10
  9. package/dist/lib/cjs/anchored-suggest.cjs +1 -1
  10. package/dist/lib/cjs/app.cjs +2 -2
  11. package/dist/lib/cjs/async-with-notice.cjs +4 -4
  12. package/dist/lib/cjs/attachment-path.cjs +9 -9
  13. package/dist/lib/cjs/attachment-path.d.cts +3 -3
  14. package/dist/lib/cjs/attachment-unit-folder.cjs +2 -2
  15. package/dist/lib/cjs/backlink-index.cjs +5 -5
  16. package/dist/lib/cjs/backlink.cjs +7 -7
  17. package/dist/lib/cjs/bases-view-registrar.cjs +1 -1
  18. package/dist/lib/cjs/broken-link-candidates.cjs +1 -1
  19. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  20. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  21. package/dist/lib/cjs/bug-report.cjs +38 -12
  22. package/dist/lib/cjs/bug-report.d.cts +65 -0
  23. package/dist/lib/cjs/bulk-operation-progress.cjs +1 -1
  24. package/dist/lib/cjs/bulk-operation.cjs +2 -2
  25. package/dist/lib/cjs/callout.cjs +6 -6
  26. package/dist/lib/cjs/canvas.cjs +11 -9
  27. package/dist/lib/cjs/canvas.d.cts +13 -0
  28. package/dist/lib/cjs/case-insensitive-file-index.cjs +3 -3
  29. package/dist/lib/cjs/code-block-render-handoff.cjs +5 -5
  30. package/dist/lib/cjs/codemirror/editor-mode-extension.cjs +4 -4
  31. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +2 -2
  32. package/dist/lib/cjs/codemirror/index.cjs +7 -7
  33. package/dist/lib/cjs/codemirror/inline-token-widgets.cjs +5 -5
  34. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +2 -2
  35. package/dist/lib/cjs/codemirror/settings-facet.cjs +1 -1
  36. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +17 -17
  37. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +13 -13
  38. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +2 -2
  39. package/dist/lib/cjs/command-handlers/command-handler.cjs +2 -2
  40. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +10 -10
  41. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +7 -7
  42. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +3 -3
  43. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +3 -3
  44. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +2 -2
  45. package/dist/lib/cjs/command-handlers/index.cjs +15 -15
  46. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +95 -4
  47. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  48. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +2 -2
  49. package/dist/lib/cjs/command-handlers/open-discussion-command-handler.cjs +2 -2
  50. package/dist/lib/cjs/command-handlers/open-feature-request-command-handler.cjs +2 -2
  51. package/dist/lib/cjs/command-handlers/open-git-hub-command-handler.cjs +1 -1
  52. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +2 -2
  53. package/dist/lib/cjs/command-handlers/undo-bulk-operation-command-handler.cjs +2 -2
  54. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +1 -1
  55. package/dist/lib/cjs/community-plugins.cjs +3 -3
  56. package/dist/lib/cjs/components/abort-signal-component.cjs +2 -2
  57. package/dist/lib/cjs/components/all-windows-event-component.cjs +5 -5
  58. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  59. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  60. package/dist/lib/cjs/components/async-error-handler-component.cjs +5 -5
  61. package/dist/lib/cjs/components/async-events-component.cjs +1 -1
  62. package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +12 -12
  63. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +2 -2
  64. package/dist/lib/cjs/components/component-ex.cjs +21 -11
  65. package/dist/lib/cjs/components/component-ex.d.cts +11 -0
  66. package/dist/lib/cjs/components/console-debug-component.cjs +2 -2
  67. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +2 -2
  68. package/dist/lib/cjs/components/disposable-component.cjs +2 -2
  69. package/dist/lib/cjs/components/embed-extensions-component.cjs +21 -4
  70. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  71. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +24 -10
  72. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  73. package/dist/lib/cjs/components/file-explorer-root-menu-component.cjs +7 -7
  74. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +2 -2
  75. package/dist/lib/cjs/components/incremental-file-index-component.cjs +4 -4
  76. package/dist/lib/cjs/components/index.cjs +54 -39
  77. package/dist/lib/cjs/components/index.d.cts +5 -0
  78. package/dist/lib/cjs/components/layout-ready-component.cjs +3 -3
  79. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +2 -2
  80. package/dist/lib/cjs/components/monkey-around-component.cjs +3 -3
  81. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +5 -5
  82. package/dist/lib/cjs/components/plugin-context-component.cjs +5 -5
  83. package/dist/lib/cjs/components/plugin-gate-component.cjs +69 -36
  84. package/dist/lib/cjs/components/plugin-gate-component.d.cts +36 -13
  85. package/dist/lib/cjs/components/plugin-notice-component.cjs +39 -33
  86. package/dist/lib/cjs/components/plugin-notice-component.d.cts +4 -3
  87. package/dist/lib/cjs/components/plugin-settings-component.cjs +119 -18
  88. package/dist/lib/cjs/components/plugin-settings-component.d.cts +35 -5
  89. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +2 -2
  90. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +8 -8
  91. package/dist/lib/cjs/components/pointer-position-component.cjs +2 -2
  92. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +3 -3
  93. package/dist/lib/cjs/components/registry-component.cjs +2 -2
  94. package/dist/lib/cjs/components/release-notes-component.cjs +6 -6
  95. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +25 -25
  96. package/dist/lib/cjs/components/rmdir-guard-component.cjs +2 -2
  97. package/dist/lib/cjs/components/settings-facet-component.cjs +1 -1
  98. package/dist/lib/cjs/components/settings-migration-component.cjs +5 -5
  99. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  100. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  101. package/dist/lib/cjs/components/style-sheet-component.cjs +3 -3
  102. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +3 -3
  103. package/dist/lib/cjs/components/templates-language-component.cjs +1 -1
  104. package/dist/lib/cjs/components/worker-component.cjs +363 -0
  105. package/dist/lib/cjs/components/worker-component.d.cts +156 -0
  106. package/dist/lib/cjs/components/worker-pool-component.cjs +185 -0
  107. package/dist/lib/cjs/components/worker-pool-component.d.cts +102 -0
  108. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  109. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  110. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +5 -5
  111. package/dist/lib/cjs/constructors/index.cjs +1 -1
  112. package/dist/lib/cjs/css-class.cjs +5 -1
  113. package/dist/lib/cjs/css-class.d.cts +16 -0
  114. package/dist/lib/cjs/data-handler.cjs +264 -6
  115. package/dist/lib/cjs/data-handler.d.cts +219 -2
  116. package/dist/lib/cjs/data-stores/data-store-locations.cjs +82 -24
  117. package/dist/lib/cjs/data-stores/data-store-locations.d.cts +15 -0
  118. package/dist/lib/cjs/data-stores/data-store-replica.cjs +33 -5
  119. package/dist/lib/cjs/data-stores/data-store-seeds.cjs +6 -6
  120. package/dist/lib/cjs/data-stores/data-store-seeds.d.cts +2 -2
  121. package/dist/lib/cjs/data-stores/data-store-transport.cjs +81 -8
  122. package/dist/lib/cjs/data-stores/data-store-transport.d.cts +30 -1
  123. package/dist/lib/cjs/data-stores/index.cjs +6 -6
  124. package/dist/lib/cjs/data-stores/local-data-store.cjs +74 -10
  125. package/dist/lib/cjs/data-stores/local-data-store.d.cts +58 -1
  126. package/dist/lib/cjs/data-stores/shared-data-store.cjs +76 -19
  127. package/dist/lib/cjs/data-stores/shared-data-store.d.cts +18 -1
  128. package/dist/lib/cjs/dataview-link.cjs +2 -2
  129. package/dist/lib/cjs/dataview.cjs +27 -7
  130. package/dist/lib/cjs/dataview.d.cts +14 -0
  131. package/dist/lib/cjs/debug.cjs +3 -3
  132. package/dist/lib/cjs/demo-vault-helper.cjs +34 -6
  133. package/dist/lib/cjs/demo-vault-helper.d.cts +6 -2
  134. package/dist/lib/cjs/desktop-bulk-operation-git.cjs +10 -10
  135. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +13 -13
  136. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  137. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  138. package/dist/lib/cjs/desktop-operating-system.cjs +1 -1
  139. package/dist/lib/cjs/desktop-request-url-stream.cjs +8 -14
  140. package/dist/lib/cjs/desktop-trusted-input.cjs +2 -2
  141. package/dist/lib/cjs/disposable.cjs +150 -0
  142. package/dist/lib/cjs/disposable.d.cts +39 -0
  143. package/dist/lib/cjs/editor-extension-registrar.cjs +1 -1
  144. package/dist/lib/cjs/editor-suggest-registrar.cjs +2 -2
  145. package/dist/lib/cjs/editor-suggest.cjs +1 -1
  146. package/dist/lib/cjs/editor.cjs +6 -6
  147. package/dist/lib/cjs/events.cjs +2 -2
  148. package/dist/lib/cjs/extensions-registrar.cjs +1 -1
  149. package/dist/lib/cjs/feature-request.cjs +1 -1
  150. package/dist/lib/cjs/file-change.cjs +10 -10
  151. package/dist/lib/cjs/file-explorer.cjs +2 -2
  152. package/dist/lib/cjs/file-manager.cjs +5 -5
  153. package/dist/lib/cjs/file-system.cjs +10 -10
  154. package/dist/lib/cjs/folder-note.cjs +4 -4
  155. package/dist/lib/cjs/frontmatter-formatting.cjs +7 -6
  156. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +1 -1
  157. package/dist/lib/cjs/frontmatter.cjs +5 -5
  158. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  159. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  160. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  161. package/dist/lib/cjs/hotkey.cjs +1 -1
  162. package/dist/lib/cjs/hover-link-source-registrar.cjs +1 -1
  163. package/dist/lib/cjs/html-element.cjs +2 -2
  164. package/dist/lib/cjs/i18n/custom-type-options.cjs +1 -1
  165. package/dist/lib/cjs/i18n/default-translations.cjs +1 -1
  166. package/dist/lib/cjs/i18n/i18n.cjs +7 -7
  167. package/dist/lib/cjs/i18n/index.cjs +4 -4
  168. package/dist/lib/cjs/i18n/locales/en.cjs +27 -1
  169. package/dist/lib/cjs/i18n/locales/en.d.cts +26 -0
  170. package/dist/lib/cjs/i18n/locales/index.cjs +2 -2
  171. package/dist/lib/cjs/i18n/locales/translations-map.cjs +1 -1
  172. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +26 -0
  173. package/dist/lib/cjs/index.cjs +147 -126
  174. package/dist/lib/cjs/index.d.cts +7 -0
  175. package/dist/lib/cjs/inline-token-renderer.cjs +2 -2
  176. package/dist/lib/cjs/is-in-obsidian.cjs +1 -1
  177. package/dist/lib/cjs/library-styles.cjs +3 -3
  178. package/dist/lib/cjs/link-and-tag-input-suggest.cjs +2 -2
  179. package/dist/lib/cjs/link.cjs +76 -56
  180. package/dist/lib/cjs/link.d.cts +20 -14
  181. package/dist/lib/cjs/logger.cjs +4 -4
  182. package/dist/lib/cjs/loop.cjs +10 -16
  183. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +17 -2
  184. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +7 -0
  185. package/dist/lib/cjs/markdown-code-block-processor.cjs +13 -13
  186. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +2 -2
  187. package/dist/lib/cjs/markdown-view.cjs +191 -3
  188. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  189. package/dist/lib/cjs/markdown.cjs +12 -12
  190. package/dist/lib/cjs/metadata-cache.cjs +23 -23
  191. package/dist/lib/cjs/metadata-cache.d.cts +5 -4
  192. package/dist/lib/cjs/misplaced-attachment.cjs +297 -0
  193. package/dist/lib/cjs/misplaced-attachment.d.cts +228 -0
  194. package/dist/lib/cjs/mobile-app-info.cjs +1 -1
  195. package/dist/lib/cjs/modals/alert.cjs +4 -4
  196. package/dist/lib/cjs/modals/code-block-builder.cjs +7 -7
  197. package/dist/lib/cjs/modals/confirm.cjs +4 -4
  198. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  199. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  200. package/dist/lib/cjs/modals/index.cjs +17 -11
  201. package/dist/lib/cjs/modals/index.d.cts +2 -0
  202. package/dist/lib/cjs/modals/minimizable-modal.cjs +6 -6
  203. package/dist/lib/cjs/modals/modal-command-builder.cjs +3 -3
  204. package/dist/lib/cjs/modals/modal.cjs +3 -3
  205. package/dist/lib/cjs/modals/prompt.cjs +10 -10
  206. package/dist/lib/cjs/modals/prompt.d.cts +1 -1
  207. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  208. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  209. package/dist/lib/cjs/modals/select-item.cjs +6 -6
  210. package/dist/lib/cjs/modals/select-option.cjs +3 -3
  211. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +1 -1
  212. package/dist/lib/cjs/note-priority.cjs +2 -2
  213. package/dist/lib/cjs/notebook-navigator.cjs +12 -2
  214. package/dist/lib/cjs/notebook-navigator.d.cts +6 -0
  215. package/dist/lib/cjs/obsidian-lib-state.cjs +1 -1
  216. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +1 -1
  217. package/dist/lib/cjs/obsidian-settings.cjs +1 -1
  218. package/dist/lib/cjs/obsidian-word-characters.cjs +1 -1
  219. package/dist/lib/cjs/parse-link.cjs +14 -14
  220. package/dist/lib/cjs/path-compatibility.cjs +368 -0
  221. package/dist/lib/cjs/path-compatibility.d.cts +263 -0
  222. package/dist/lib/cjs/path-settings.cjs +3 -3
  223. package/dist/lib/cjs/pdf.cjs +2 -2
  224. package/dist/lib/cjs/plugin/index.cjs +18 -12
  225. package/dist/lib/cjs/plugin/index.d.cts +2 -0
  226. package/dist/lib/cjs/plugin/plugin-api.cjs +21 -12
  227. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  228. package/dist/lib/cjs/plugin/plugin-async-cleanup.cjs +6 -3
  229. package/dist/lib/cjs/plugin/plugin-async-cleanup.d.cts +5 -0
  230. package/dist/lib/cjs/plugin/plugin-context.cjs +10 -9
  231. package/dist/lib/cjs/plugin/plugin-event-source.cjs +1 -1
  232. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +4 -4
  233. package/dist/lib/cjs/plugin/plugin-install-state.cjs +49 -4
  234. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  235. package/dist/lib/cjs/plugin/plugin-instance.cjs +450 -0
  236. package/dist/lib/cjs/plugin/plugin-instance.d.cts +258 -0
  237. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +1 -1
  238. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +6 -4
  239. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +15 -15
  240. package/dist/lib/cjs/plugin/plugin.cjs +133 -34
  241. package/dist/lib/cjs/plugin/plugin.d.cts +35 -5
  242. package/dist/lib/cjs/plugin/settings-migration-api.cjs +1 -1
  243. package/dist/lib/cjs/plugin/third-party-plugin.cjs +231 -0
  244. package/dist/lib/cjs/plugin/third-party-plugin.d.cts +244 -0
  245. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +2 -2
  246. package/dist/lib/cjs/popovers/field-popover.cjs +4 -4
  247. package/dist/lib/cjs/popovers/index.cjs +3 -3
  248. package/dist/lib/cjs/popovers/popover-anchor.cjs +1 -1
  249. package/dist/lib/cjs/popovers/popover.cjs +5 -5
  250. package/dist/lib/cjs/queue.cjs +8 -8
  251. package/dist/lib/cjs/react/app-context.cjs +3 -3
  252. package/dist/lib/cjs/react/index.cjs +1 -1
  253. package/dist/lib/cjs/reference-definition.cjs +1 -1
  254. package/dist/lib/cjs/reference.cjs +3 -3
  255. package/dist/lib/cjs/release-asset.cjs +5 -5
  256. package/dist/lib/cjs/rendered-markdown.cjs +4 -4
  257. package/dist/lib/cjs/request-url.cjs +4 -4
  258. package/dist/lib/cjs/resource-lock.cjs +46 -42
  259. package/dist/lib/cjs/resource-lock.d.cts +8 -7
  260. package/dist/lib/cjs/resource-url.cjs +3 -3
  261. package/dist/lib/cjs/ribbon-icon-registrar.cjs +1 -1
  262. package/dist/lib/cjs/setting-components/checkbox-component.cjs +3 -3
  263. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +7 -7
  264. package/dist/lib/cjs/setting-components/date-component.cjs +4 -4
  265. package/dist/lib/cjs/setting-components/date-time-component.cjs +4 -4
  266. package/dist/lib/cjs/setting-components/email-component.cjs +2 -2
  267. package/dist/lib/cjs/setting-components/file-component.cjs +2 -2
  268. package/dist/lib/cjs/setting-components/folder-list-component.cjs +3 -3
  269. package/dist/lib/cjs/setting-components/hotkey-component.cjs +5 -5
  270. package/dist/lib/cjs/setting-components/index.cjs +30 -30
  271. package/dist/lib/cjs/setting-components/list-component.cjs +5 -5
  272. package/dist/lib/cjs/setting-components/month-component.cjs +4 -4
  273. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +3 -3
  274. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +2 -2
  275. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +3 -3
  276. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +9 -6
  277. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +4 -1
  278. package/dist/lib/cjs/setting-components/number-component.cjs +2 -2
  279. package/dist/lib/cjs/setting-components/password-component.cjs +2 -2
  280. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +3 -3
  281. package/dist/lib/cjs/setting-components/tag-list-component.cjs +4 -4
  282. package/dist/lib/cjs/setting-components/telephone-component.cjs +2 -2
  283. package/dist/lib/cjs/setting-components/text-based-component.cjs +1 -1
  284. package/dist/lib/cjs/setting-components/time-component.cjs +3 -3
  285. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +3 -3
  286. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +3 -3
  287. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +4 -4
  288. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +1 -1
  289. package/dist/lib/cjs/setting-components/typed-text-component.cjs +3 -3
  290. package/dist/lib/cjs/setting-components/url-component.cjs +2 -2
  291. package/dist/lib/cjs/setting-components/validator-component.cjs +4 -4
  292. package/dist/lib/cjs/setting-components/week-component.cjs +4 -4
  293. package/dist/lib/cjs/setting-ex.cjs +26 -26
  294. package/dist/lib/cjs/setting-group-ex.cjs +2 -2
  295. package/dist/lib/cjs/settings-recovery.cjs +217 -0
  296. package/dist/lib/cjs/settings-recovery.d.cts +178 -0
  297. package/dist/lib/cjs/settings-tabs.cjs +5 -5
  298. package/dist/lib/cjs/status-bar-item-registrar.cjs +1 -1
  299. package/dist/lib/cjs/templater.cjs +14 -4
  300. package/dist/lib/cjs/templater.d.cts +6 -0
  301. package/dist/lib/cjs/transformers/duration-transformer.cjs +2 -2
  302. package/dist/lib/cjs/transformers/index.cjs +1 -1
  303. package/dist/lib/cjs/trusted-input.cjs +1 -1
  304. package/dist/lib/cjs/validation.cjs +4 -4
  305. package/dist/lib/cjs/vault-delete.cjs +6 -6
  306. package/dist/lib/cjs/vault-transaction.cjs +5 -5
  307. package/dist/lib/cjs/vault.cjs +12 -12
  308. package/dist/lib/cjs/view-registrar.cjs +1 -1
  309. package/dist/lib/cjs/virtual-file.cjs +16 -14
  310. package/dist/lib/cjs/virtual-file.d.cts +2 -1
  311. package/dist/lib/cjs/wasm.cjs +119 -0
  312. package/dist/lib/cjs/wasm.d.cts +54 -0
  313. package/dist/lib/cjs/worker-protocol.cjs +209 -0
  314. package/dist/lib/cjs/worker-protocol.d.cts +282 -0
  315. package/dist/lib/cjs/workspace.cjs +1 -1
  316. package/dist/lib/esm/__merged.d.mts +26 -10
  317. package/dist/lib/esm/__merged.mjs +215 -5
  318. package/dist/lib/esm/app.mjs +2 -2
  319. package/dist/lib/esm/attachment-path.d.mts +3 -3
  320. package/dist/lib/esm/attachment-path.mjs +2 -2
  321. package/dist/lib/esm/backlink-index.mjs +2 -2
  322. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  323. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  324. package/dist/lib/esm/bug-report.d.mts +65 -0
  325. package/dist/lib/esm/bug-report.mjs +33 -10
  326. package/dist/lib/esm/canvas.d.mts +13 -0
  327. package/dist/lib/esm/canvas.mjs +6 -5
  328. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +13 -13
  329. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +14 -14
  330. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +7 -7
  331. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +8 -8
  332. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  333. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  334. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  335. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  336. package/dist/lib/esm/components/component-ex.d.mts +11 -0
  337. package/dist/lib/esm/components/component-ex.mjs +19 -6
  338. package/dist/lib/esm/components/disposable-component.mjs +1 -1
  339. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  340. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  341. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  342. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  343. package/dist/lib/esm/components/index.d.mts +5 -0
  344. package/dist/lib/esm/components/index.mjs +12 -2
  345. package/dist/lib/esm/components/plugin-gate-component.d.mts +36 -13
  346. package/dist/lib/esm/components/plugin-gate-component.mjs +61 -26
  347. package/dist/lib/esm/components/plugin-notice-component.d.mts +4 -3
  348. package/dist/lib/esm/components/plugin-notice-component.mjs +30 -21
  349. package/dist/lib/esm/components/plugin-settings-component.d.mts +35 -5
  350. package/dist/lib/esm/components/plugin-settings-component.mjs +105 -4
  351. package/dist/lib/esm/components/rename-delete-handler-component.mjs +2 -2
  352. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  353. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  354. package/dist/lib/esm/components/worker-component.d.mts +156 -0
  355. package/dist/lib/esm/components/worker-component.mjs +279 -0
  356. package/dist/lib/esm/components/worker-pool-component.d.mts +102 -0
  357. package/dist/lib/esm/components/worker-pool-component.mjs +95 -0
  358. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  359. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  360. package/dist/lib/esm/css-class.d.mts +16 -0
  361. package/dist/lib/esm/css-class.mjs +5 -1
  362. package/dist/lib/esm/data-handler.d.mts +219 -2
  363. package/dist/lib/esm/data-handler.mjs +262 -5
  364. package/dist/lib/esm/data-stores/data-store-locations.d.mts +15 -0
  365. package/dist/lib/esm/data-stores/data-store-locations.mjs +80 -22
  366. package/dist/lib/esm/data-stores/data-store-replica.mjs +33 -5
  367. package/dist/lib/esm/data-stores/data-store-seeds.d.mts +2 -2
  368. package/dist/lib/esm/data-stores/data-store-seeds.mjs +4 -4
  369. package/dist/lib/esm/data-stores/data-store-transport.d.mts +30 -1
  370. package/dist/lib/esm/data-stores/data-store-transport.mjs +78 -5
  371. package/dist/lib/esm/data-stores/local-data-store.d.mts +58 -1
  372. package/dist/lib/esm/data-stores/local-data-store.mjs +71 -9
  373. package/dist/lib/esm/data-stores/shared-data-store.d.mts +18 -1
  374. package/dist/lib/esm/data-stores/shared-data-store.mjs +72 -15
  375. package/dist/lib/esm/dataview.d.mts +14 -0
  376. package/dist/lib/esm/dataview.mjs +19 -1
  377. package/dist/lib/esm/demo-vault-helper.d.mts +6 -2
  378. package/dist/lib/esm/demo-vault-helper.mjs +29 -1
  379. package/dist/lib/esm/desktop-demo-vault-opener.mjs +1 -1
  380. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  381. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  382. package/dist/lib/esm/desktop-request-url-stream.mjs +4 -10
  383. package/dist/lib/esm/disposable.d.mts +39 -0
  384. package/dist/lib/esm/disposable.mjs +64 -0
  385. package/dist/lib/esm/file-system.mjs +2 -2
  386. package/dist/lib/esm/frontmatter-formatting.mjs +2 -1
  387. package/dist/lib/esm/generated-during-build.mjs +2 -2
  388. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  389. package/dist/lib/esm/git-rename-history.mjs +1 -1
  390. package/dist/lib/esm/i18n/locales/en.d.mts +26 -0
  391. package/dist/lib/esm/i18n/locales/en.mjs +27 -1
  392. package/dist/lib/esm/i18n/locales/translations-map.d.mts +26 -0
  393. package/dist/lib/esm/index.d.mts +7 -0
  394. package/dist/lib/esm/index.mjs +15 -1
  395. package/dist/lib/esm/link.d.mts +20 -14
  396. package/dist/lib/esm/link.mjs +57 -38
  397. package/dist/lib/esm/loop.mjs +2 -8
  398. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +7 -0
  399. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +16 -1
  400. package/dist/lib/esm/markdown-view.d.mts +48 -1
  401. package/dist/lib/esm/markdown-view.mjs +192 -2
  402. package/dist/lib/esm/metadata-cache.d.mts +5 -4
  403. package/dist/lib/esm/metadata-cache.mjs +6 -6
  404. package/dist/lib/esm/misplaced-attachment.d.mts +228 -0
  405. package/dist/lib/esm/misplaced-attachment.mjs +212 -0
  406. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  407. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  408. package/dist/lib/esm/modals/index.d.mts +2 -0
  409. package/dist/lib/esm/modals/index.mjs +5 -1
  410. package/dist/lib/esm/modals/prompt.d.mts +1 -1
  411. package/dist/lib/esm/modals/prompt.mjs +1 -1
  412. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  413. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  414. package/dist/lib/esm/notebook-navigator.d.mts +6 -0
  415. package/dist/lib/esm/notebook-navigator.mjs +11 -2
  416. package/dist/lib/esm/parse-link.mjs +4 -4
  417. package/dist/lib/esm/path-compatibility.d.mts +263 -0
  418. package/dist/lib/esm/path-compatibility.mjs +277 -0
  419. package/dist/lib/esm/plugin/index.d.mts +2 -0
  420. package/dist/lib/esm/plugin/index.mjs +6 -2
  421. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  422. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  423. package/dist/lib/esm/plugin/plugin-async-cleanup.d.mts +5 -0
  424. package/dist/lib/esm/plugin/plugin-async-cleanup.mjs +3 -1
  425. package/dist/lib/esm/plugin/plugin-context.mjs +2 -1
  426. package/dist/lib/esm/plugin/plugin-event-source.d.mts +4 -4
  427. package/dist/lib/esm/plugin/plugin-event-source.mjs +1 -1
  428. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  429. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  430. package/dist/lib/esm/plugin/plugin-instance.d.mts +258 -0
  431. package/dist/lib/esm/plugin/plugin-instance.mjs +367 -0
  432. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +6 -4
  433. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +1 -1
  434. package/dist/lib/esm/plugin/plugin.d.mts +35 -5
  435. package/dist/lib/esm/plugin/plugin.mjs +118 -9
  436. package/dist/lib/esm/plugin/third-party-plugin.d.mts +244 -0
  437. package/dist/lib/esm/plugin/third-party-plugin.mjs +147 -0
  438. package/dist/lib/esm/release-asset.mjs +1 -1
  439. package/dist/lib/esm/resource-lock.d.mts +8 -7
  440. package/dist/lib/esm/resource-lock.mjs +31 -26
  441. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +4 -1
  442. package/dist/lib/esm/setting-components/multiple-text-component.mjs +6 -3
  443. package/dist/lib/esm/settings-recovery.d.mts +178 -0
  444. package/dist/lib/esm/settings-recovery.mjs +125 -0
  445. package/dist/lib/esm/settings-tabs.mjs +2 -2
  446. package/dist/lib/esm/templater.d.mts +6 -0
  447. package/dist/lib/esm/templater.mjs +11 -2
  448. package/dist/lib/esm/vault.mjs +1 -1
  449. package/dist/lib/esm/virtual-file.d.mts +2 -1
  450. package/dist/lib/esm/virtual-file.mjs +7 -5
  451. package/dist/lib/esm/wasm.d.mts +54 -0
  452. package/dist/lib/esm/wasm.mjs +30 -0
  453. package/dist/lib/esm/worker-protocol.d.mts +282 -0
  454. package/dist/lib/esm/worker-protocol.mjs +113 -0
  455. package/dist/styles.css +16 -1
  456. package/modals/copy-text-manually/package.json +6 -0
  457. package/modals/review-bug-report-diagnostics/package.json +6 -0
  458. package/package.json +10 -8
  459. package/plugin/plugin-instance/package.json +6 -0
  460. package/plugin/third-party-plugin/package.json +6 -0
@@ -125,14 +125,14 @@ __export(plugin_api_exports, {
125
125
  watchPluginApi: () => watchPluginApi
126
126
  });
127
127
  module.exports = __toCommonJS(plugin_api_exports);
128
- var import_array = require('@mnaoumov/typescript-lib/array');
129
- var import_async = require('@mnaoumov/typescript-lib/async');
130
- var import_async_events = require('@mnaoumov/typescript-lib/async-events');
131
- var import_debug_switches = require('@mnaoumov/typescript-lib/debug-switches');
132
- var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
133
- var import_compare_versions = require('compare-versions');
134
- var import_debug = require('../debug.cjs');
135
- var import_obsidian_lib_state = require('../obsidian-lib-state.cjs');
128
+ var import_array = require("@mnaoumov/typescript-lib/array");
129
+ var import_async = require("@mnaoumov/typescript-lib/async");
130
+ var import_async_events = require("@mnaoumov/typescript-lib/async-events");
131
+ var import_debug_switches = require("@mnaoumov/typescript-lib/debug-switches");
132
+ var import_object_utils = require("@mnaoumov/typescript-lib/object-utils");
133
+ var import_compare_versions = require("compare-versions");
134
+ var import_debug = require("../debug.cjs");
135
+ var import_obsidian_lib_state = require("../obsidian-lib-state.cjs");
136
136
  const PLUGIN_API_DEBUGGER_NAMESPACE = "PluginApi";
137
137
  const PLUGIN_API_REGISTRY_STATE_KEY = "pluginApiRegistry";
138
138
  const VALIDATE_PLUGIN_API_PAYLOADS_DEBUG_SWITCH_DEFINITION = {
@@ -142,6 +142,7 @@ const VALIDATE_PLUGIN_API_PAYLOADS_DEBUG_SWITCH_DEFINITION = {
142
142
  name: "Validate plugin-API payloads"
143
143
  };
144
144
  const DEFAULT_WHEN_AVAILABLE_TIMEOUT_IN_MILLISECONDS = 1e4;
145
+ const recordPublishers = /* @__PURE__ */ new WeakMap();
145
146
  var PluginApiPayloadKind = /* @__PURE__ */ ((PluginApiPayloadKind2) => {
146
147
  PluginApiPayloadKind2["Input"] = "input";
147
148
  PluginApiPayloadKind2["Output"] = "output";
@@ -316,11 +317,15 @@ function publishPluginApi(params) {
316
317
  getValidatePluginApiPayloadsDebugSwitch();
317
318
  const pluginId = params.plugin.manifest.id;
318
319
  const registry = getRegistry();
320
+ const existingRecord = registry.records[pluginId]?.find((record2) => record2.apiVersion === params.apiVersion);
321
+ if (existingRecord) {
322
+ if (!isStaleRecord(existingRecord, params.plugin)) {
323
+ throw new Error(`The plugin "${pluginId}" has already published the API version "${params.apiVersion}".`);
324
+ }
325
+ revokeRecord(existingRecord);
326
+ }
319
327
  const records = registry.records[pluginId] ?? [];
320
328
  registry.records[pluginId] = records;
321
- if (records.some((record2) => record2.apiVersion === params.apiVersion)) {
322
- throw new Error(`The plugin "${pluginId}" has already published the API version "${params.apiVersion}".`);
323
- }
324
329
  const record = {
325
330
  api: params.api,
326
331
  apiVersion: params.apiVersion,
@@ -329,6 +334,7 @@ function publishPluginApi(params) {
329
334
  pluginId
330
335
  };
331
336
  records.push(record);
337
+ recordPublishers.set(record, params.plugin);
332
338
  notifySubscribers();
333
339
  (params.component ?? params.plugin).register(() => {
334
340
  revokeRecord(record);
@@ -443,6 +449,9 @@ function getRegistry() {
443
449
  registry.subscribers ??= [];
444
450
  return (0, import_object_utils.castTo)(registry);
445
451
  }
452
+ function isStaleRecord(record, plugin) {
453
+ return recordPublishers.get(record) !== plugin && plugin.app.plugins.plugins[plugin.manifest.id] === plugin;
454
+ }
446
455
  function notifySubscribers() {
447
456
  for (const subscriber of (0, import_array.snapshot)(getRegistry().subscribers)) {
448
457
  subscriber();
@@ -522,4 +531,4 @@ function validatePayload(params) {
522
531
  publishPluginApi,
523
532
  watchPluginApi
524
533
  });
525
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWFwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIOKAlCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IOKAlCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwg4oCUIHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUg4oCUIGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgZGVidWcgc3dpdGNoIGlzIG9uIChvZmYgYnkgZGVmYXVsdCwgc2VlXG4gKiB7QGxpbmsgZ2V0VmFsaWRhdGVQbHVnaW5BcGlQYXlsb2Fkc0RlYnVnU3dpdGNofSksIHNvIHByb2R1Y3Rpb24gcGF5cyBub3RoaW5nLiBUaGUgYG9ic2lkaWFuLWxpYjpQbHVnaW5BcGlgXG4gKiBkZWJ1Z2dlciBjb250cm9scyBsb2dnaW5nIG9ubHk6IHR1cm5pbmcgaXQgb24gY2hhbmdlcyBubyBiZWhhdmlvci5cbiAqXG4gKiBUaGUgY29udHJhY3QgaXRzZWxmIOKAlCBpdHMgdHlwZXMgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnMg4oCUIGlzIG5vdCBPYnNpZGlhbi1zcGVjaWZpYyBhbmQgbGl2ZXMgaW5cbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXBpLWNvbnRyYWN0YCAoYEFwaUNvbnRyYWN0YCwgYGNyZWF0ZUFyZ3VtZW50c1NjaGVtYWAsIGBjcmVhdGVUeXBlR3VhcmRTY2hlbWFgLFxuICogYGRlZmluZUFwaUNvbnRyYWN0YCkuIFRoaXMgbW9kdWxlIG93bnMgd2hhdCBpczogdGhlIHJlZ2lzdHJ5IGtleWVkIGJ5IHBsdWdpbiBpZCwgdGhlIHJldm9jYWJsZSBoYW5kbGVzLCB0aGVcbiAqIGRlYnVnIHN3aXRjaCBhbmQgdGhlIHZhbGlkYXRpb24gZXJyb3JzLiBBIGNvbnRyYWN0J3MgS0VZUyBkcml2ZSB0aGUgc2hhcGUgY2hlY2sgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBwdWJsaXNoZWRcbiAqIHJlY29yZCBpcyB1c2FibGUgYXQgYWxsOyBpdHMgc2NoZW1hcyBhcmUgb25seSBldmVyIGNvbnN1bHRlZCB3aGlsZSB0aGUgc3dpdGNoIGlzIG9uLlxuICpcbiAqIFdoeSB0aGUgc2hhcGUgY2hlY2sgaXMgYSBgdHlwZW9mYCByYXRoZXIgdGhhbiBhIHNjaGVtYSBvdmVyIHRoZSB3aG9sZSBBUEkgb2JqZWN0LiBJbiB6b2QgNCBgei5mdW5jdGlvbigpYFxuICogcmV0dXJucyBhIGZ1bmN0aW9uIEZBQ1RPUlksIG5vdCBhIHNjaGVtYSwgc28gaXQgY2Fubm90IGJlIGEgYHoub2JqZWN0KClgIG1lbWJlciBkaXJlY3RseS4gVGhlcmUgaXMgYSBrbm93blxuICogd29ya2Fyb3VuZCAoem9kIzQxNDMpIOKAlCBgei5jdXN0b20oKGZuKSA9PiBmdW5jdGlvblNjaGVtYS5pbXBsZW1lbnQoZm4pKWAg4oCUIGFuZCBpdCBkb2VzIGJ1eSBjb3JyZWN0XG4gKiBgei5pbmZlcmAgdHlwZXMgZm9yIGEgZnVuY3Rpb24gbWVtYmVyLiBJdCBkb2VzIG5vdCBidXkgcnVudGltZSB2YWxpZGF0aW9uIGhlcmUsIHRob3VnaDogYHouY3VzdG9tYCBpcyBhXG4gKiBib29sZWFuIHByZWRpY2F0ZSB0aGF0IHJldHVybnMgaXRzIGlucHV0IHVuY2hhbmdlZCwgc28gdGhlIHZhbGlkYXRpbmcgd3JhcHBlciBgaW1wbGVtZW50YCBidWlsZHMgaXNcbiAqIGRpc2NhcmRlZCBhbmQgdGhlIGNoZWNrIGNvbGxhcHNlcyBiYWNrIHRvIFwiaXMgaXQgY2FsbGFibGVcIi4gS2VlcGluZyB0aGF0IHdyYXBwZXIgd291bGQgbmVlZCBhIGZ1cnRoZXJcbiAqIGAudHJhbnNmb3JtKClgLCBhbmQgd291bGQgdGhlbiBtb3ZlIHZhbGlkYXRpb24gb250byBldmVyeSBjYWxsIGluc3RlYWQgb2YgYmVoaW5kIHRoZSBkZWJ1ZyBzd2l0Y2gsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIHRoaXMgbGlicmFyeSwgc28gYSByZWdpc3RyeSByZWNvcmQgaXMgYSB3aXJlIGZvcm1hdCBiZXR3ZWVuXG4gKiBkaWZmZXJlbnQgbGlicmFyeSB2ZXJzaW9ucyBhbmQgbXVzdCBzdGF5IGJhY2t3YXJkLWNvbXBhdGlibGUgZm9yZXZlci4gTm90aGluZyBjcm9zc2luZyBpdCBtYXkgYmVcbiAqIGBpbnN0YW5jZW9mYC1jaGVja2VkIOKAlCByZWFkcyBhcmUgc3RydWN0dXJhbCwgYW5kIG9ubHkgcGxhaW4gZGF0YSBvYmplY3RzIGFuZCBwbGFpbiBmdW5jdGlvbnMgYXJlIHN0b3JlZC5cbiAqXG4gKiBUaGF0IHdpcmUgZm9ybWF0IGlzIGFsc28gUFVCTElTSEVELCBhcyBvZiB0aGUgYFBsdWdpbiBBUEkgcHJvdG9jb2xgIGd1aWRlOiBhIHBsdWdpbiB0aGF0IGRvZXMgbm90IHVzZVxuICogdGhpcyBsaWJyYXJ5IHJlYWNoZXMgYW4gQVBJIGJ5IHJlYWRpbmdcbiAqIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5MaWIucGx1Z2luQXBpUmVnaXN0cnkudmFsdWUucmVjb3Jkc1twbHVnaW5JZF1gIGFuZCBhcHBseWluZyB0aGUgc2VsZWN0aW9uIHJ1bGVcbiAqIHtAbGluayBzZWxlY3RSZWNvcmR9IGltcGxlbWVudHMuIFNvIHtAbGluayBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmR9J3MgZmllbGQgbmFtZXMsIHRoZSBzdGF0ZSBrZXksIGFuZFxuICogXCJoaWdoZXN0IGxpdmUgcmVjb3JkIHNhdGlzZnlpbmcgdGhlIHJhbmdlIHdpbnNcIiBhcmUgYSBkb2N1bWVudGVkIGNvbnRyYWN0IHdpdGggYW4gYXVkaWVuY2Ugb3V0c2lkZSB0aGlzXG4gKiByZXBvc2l0b3J5LCBhbmQgdGhlIGd1aWRlIGhhcyB0byBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIGNoYW5nZSBhcyBhbnkgb2YgdGhlbS4gT25seSBgcGx1Z2luQXBpUmVnaXN0cnlgXG4gKiBpcyBwdWJsaWMgd2l0aGluIHRoZSBzaGFyZWQtc3RhdGUgYmFnOyB0aGUgcmVzdCBvZiBpdCBzdGF5cyBpbnRlcm5hbC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwaUNvbnRyYWN0LFxuICBBcGlNZXRob2RDb250cmFjdFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXBpLWNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgQXN5bmNFdmVudFNvdXJjZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYy1ldmVudHMnO1xuaW1wb3J0IHR5cGUge1xuICBEZWJ1Z1N3aXRjaCxcbiAgRGVidWdTd2l0Y2hEZWZpbml0aW9uXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kZWJ1Zy1zd2l0Y2hlcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYXJkU2NoZW1hVjEgfSBmcm9tICdAc3RhbmRhcmQtc2NoZW1hL3NwZWMnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENvbXBvbmVudCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgeyByZWdpc3RlckRlYnVnU3dpdGNoIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnLXN3aXRjaGVzJztcbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG5jb25zdCBQTFVHSU5fQVBJX0RFQlVHR0VSX05BTUVTUEFDRSA9ICdQbHVnaW5BcGknO1xuY29uc3QgUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVkgPSAncGx1Z2luQXBpUmVnaXN0cnknO1xuXG5jb25zdCBWQUxJREFURV9QTFVHSU5fQVBJX1BBWUxPQURTX0RFQlVHX1NXSVRDSF9ERUZJTklUSU9OOiBEZWJ1Z1N3aXRjaERlZmluaXRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiAnVmFsaWRhdGUgZXZlcnkgcGx1Z2luLUFQSSBjYWxsXFwncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZSBhZ2FpbnN0IHRoZSBjb250cmFjdCB0aGUgQVBJIGRlY2xhcmVzLCBhbmQgdGhyb3cgb24gYSBtaXNtYXRjaC4nLFxuICBpZDogJ29ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzJyxcbiAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSxcbiAgbmFtZTogJ1ZhbGlkYXRlIHBsdWdpbi1BUEkgcGF5bG9hZHMnXG59O1xuXG4vKipcbiAqIEhvdyBsb25nIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gd2FpdHMgYmVmb3JlIGdpdmluZyB1cCBhbmQgY2xhc3NpZnlpbmcgdGhlIGZhaWx1cmUuXG4gKi9cbmNvbnN0IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogV2hpY2ggaGFsZiBvZiBhIG1ldGhvZCBjYWxsIGEgdmFsaWRhdGlvbiBmYWlsdXJlIGNhbWUgZnJvbS5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luQXBpUGF5bG9hZEtpbmQge1xuICAvKipcbiAgICogVGhlIG1ldGhvZCdzIGFyZ3VtZW50cy5cbiAgICovXG4gIElucHV0ID0gJ2lucHV0JyxcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIE91dHB1dCA9ICdvdXRwdXQnXG59XG5cbi8qKlxuICogVGhlIHJlYXNvbiBhIHBsdWdpbiBBUEkgY291bGQgbm90IGJlIGhhbmRlZCBvdmVyLlxuICpcbiAqIFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgZW51bSBpcyB0aGF0IHRoZXNlIGFyZSB0b2xkIGFwYXJ0LiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAgY2Fubm90IHRlbGwgYW55IG9mIHRoZW1cbiAqIGFwYXJ0LCBhbmQgbm90IHVuaWZvcm1seTogYE5vdEluc3RhbGxlZGAgLyBgTm90RW5hYmxlZGAgLyBgTm90UHVibGlzaGVkYCBhbGwgcmVkdWNlIHRvIG9uZSBgTm90aWNlYCBwbHVzXG4gKiBgdW5kZWZpbmVkYCwgd2hpbGUgYFZlcnNpb25NaXNtYXRjaGAgLyBgU2hhcGVNaXNtYXRjaGAgcHJvZHVjZSBOTyBzaWduYWwgYXQgYWxsIOKAlCBpdCBuZXZlciBleGFtaW5lcyB3aGF0IGl0XG4gKiBmb3VuZCwgc28gaXQgaGFuZHMgdGhlIG9iamVjdCBvdmVyIGFuZCB0aGUgbWlzbWF0Y2ggc3VyZmFjZXMgbGF0ZXIsIHNvbWV3aGVyZSBlbHNlLCBhcyBzb21lYm9keSBlbHNlJ3NcbiAqIGBUeXBlRXJyb3JgLlxuICpcbiAqIEByZW1hcmtzXG4gKiB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGNhbiByZXBvcnQgdGhlIGZpcnN0IGZpdmU7IHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5SZXZva2VkfVxuICogaXMgbm90IG9uZSBvZiB0aGVtLCBiZWNhdXNlIGl0IGRlc2NyaWJlcyBhIGhhbmRsZSB0aGF0IFdBUyB2YWxpZCBhbmQgaXMgY2FycmllZCBieVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGVudW0gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24ge1xuICAvKipcbiAgICogVGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgYnV0IG5vdCBlbmFibGVkLlxuICAgKi9cbiAgTm90RW5hYmxlZCA9ICdub3RFbmFibGVkJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpcyBub3QgaW5zdGFsbGVkIGluIHRoaXMgdmF1bHQuXG4gICAqL1xuICBOb3RJbnN0YWxsZWQgPSAnbm90SW5zdGFsbGVkJyxcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBpcyBpbnN0YWxsZWQgYW5kIGVuYWJsZWQgYnV0IGhhcyBub3QgcHVibGlzaGVkIGFueSBBUEkuXG4gICAqL1xuICBOb3RQdWJsaXNoZWQgPSAnbm90UHVibGlzaGVkJyxcblxuICAvKipcbiAgICogVGhlIGhhbmRsZSB3YXMgdmFsaWQgYnV0IHRoZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQsIHNvIGl0IGhhcyBiZWVuIHJldm9rZWQuXG4gICAqL1xuICBSZXZva2VkID0gJ3Jldm9rZWQnLFxuXG4gIC8qKlxuICAgKiBBIHJlY29yZCBzYXRpc2ZpZXMgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIHJhbmdlLCBidXQgdGhlIEFQSSBvYmplY3QgaXMgbWlzc2luZyBhIG1ldGhvZCB0aGUgY29udHJhY3RcbiAgICogZGVjbGFyZXMg4oCUIHRoZSBwcm92aWRlcidzIHNoaXBwZWQgc2hhcGUgYW5kIGl0cyBkZWNsYXJlZCBzaGFwZSBkaXNhZ3JlZS5cbiAgICovXG4gIFNoYXBlTWlzbWF0Y2ggPSAnc2hhcGVNaXNtYXRjaCcsXG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcHVibGlzaGVkIGFuIEFQSSwgYnV0IG5vIHB1Ymxpc2hlZCBjb250cmFjdCB2ZXJzaW9uIHNhdGlzZmllcyB0aGUgcmVxdWVzdGVkIHJhbmdlLlxuICAgKi9cbiAgVmVyc2lvbk1pc21hdGNoID0gJ3ZlcnNpb25NaXNtYXRjaCdcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZmluZFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCB3aGljaCBhIHR5cGVkIGNvbnRyYWN0IGlzIGNoZWNrZWQgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgY29udHJhY3QgdmVyc2lvbnMgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuIFRoZSBzYW1lIHJ1bGVzIGFzXG4gICAqIHtAbGluayBXYXRjaFBsdWdpbkFwaVBhcmFtcy5hcGlWZXJzaW9uUmFuZ2V9IGFwcGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gV2hlbiBzdXBwbGllZCwgaXQgd2lucyBvdmVyIHRoZSBwcm92aWRlcidzIHB1Ymxpc2hlZCBjb250cmFjdCwgYXMgaW5cbiAgICoge0BsaW5rIFdhdGNoUGx1Z2luQXBpUGFyYW1zLmNvbnRyYWN0fS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyYWN0PzogQXBpQ29udHJhY3Q8VEFwaT47XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgQVBJIGEgcGx1Z2luIGV4cG9zZXM6IHRoZSBvYmplY3QsIHRoZSBjb250cmFjdCB2ZXJzaW9uIGl0IHNhdGlzZmllcywgYW5kIG9wdGlvbmFsbHkgdGhlIGNvbnRyYWN0XG4gKiBpdHNlbGYuIFRoaXMgaXMge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXN9IHdpdGhvdXQgdGhlIHB1Ymxpc2hpbmcgcGx1Z2luLCBzbyBhIHBsdWdpbiBjYW4gREVDTEFSRSB3aGF0XG4gKiBpdCBleHBvc2VzIHdpdGhvdXQgYWxzbyBzdGF0aW5nIHdobyBpcyBwdWJsaXNoaW5nIGl0IOKAlCB3aGljaCBpcyB3aGF0IGxldHMgYFBsdWdpbkJhc2UuZ2V0UGx1Z2luQXBpc2AgY29sbGVjdFxuICogdGhlIGRlY2xhcmF0aW9ucyBhbmQgZG8gdGhlIHB1Ymxpc2hpbmcgaXRzZWxmLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBkZWNsYXJlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5BcGlEZWNsYXJhdGlvbjxUQXBpIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgQVBJIG9iamVjdCB0byBwdWJsaXNoLiBJdHMgbWV0aG9kcyBhcmUgaGFuZGVkIHRvIGNvbnN1bWVycyB0aHJvdWdoIGEgcmV2b2NhYmxlIGhhbmRsZSwgYW5kIHRoZXkgYXJlXG4gICAqIGFsd2F5cyBpbnZva2VkIHdpdGggdGhpcyBvYmplY3QgYXMgdGhlaXIgYHRoaXNgLCBzbyBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzIGZpZWxkcyBrZWVwc1xuICAgKiB3b3JraW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpOiBUQXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgQ09OVFJBQ1QgdmVyc2lvbiwgaW4gc2VtdmVyIGZvcm0g4oCUIGluZGVwZW5kZW50IG9mIHRoZSBwbHVnaW4ncyBvd24gdmVyc2lvbi4gUGx1Z2luIGAxLjQuN2AgbWF5XG4gICAqIHBlcmZlY3RseSB3ZWxsIGV4cG9zZSBBUEkgYDIuMC4wYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbnRyYWN0IHRoaXMgdmVyc2lvbiBvZiB0aGUgQVBJIHNhdGlzZmllcy4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbm8gc2hhcGUgY2hlY2sgaXMgcGVyZm9ybWVkIG9uXG4gICAqIHRoZSBwcm92aWRlcidzIGJlaGFsZiBhbmQgdGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0IChpZiBhbnkpIGlzIHVzZWQgaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyYWN0PzogQXBpQ29udHJhY3Q8VEFwaT47XG59XG5cbi8qKlxuICogQSBsaXZlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBsdWdpbidzIEFQSS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSByZWYgaXMgdGhlIFdIT0xFIGNvbnN1bWVyIHN1cmZhY2UsIGRlbGliZXJhdGVseS4gQSBwbGFpbiB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IG1vZGVsIHRoaXMgYmVjYXVzZSBpdFxuICogc2V0dGxlcyBvbmNlLCB3aGVyZWFzIGF2YWlsYWJpbGl0eSBpcyBhIHJlcGVhdGluZyBzaWduYWwgKGF2YWlsYWJsZSDihpIgZ29uZSDihpIgYXZhaWxhYmxlIGFnYWluIGFjcm9zcyBhXG4gKiBkaXNhYmxlL2VuYWJsZSBjeWNsZSkg4oCUIHdoaWNoIGlzIHdoeSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IGlzIGEgbWV0aG9kIE9OIHRoZSByZWYgcmF0aGVyIHRoYW5cbiAqIHRoZSB0aGluZyBoYW5kZWQgYmFjay4gVGhlIGBjaGFuZ2VgIGV2ZW50IGV4aXN0cyBmb3IgY29uc3VtZXJzIHRoYXQgbXVzdCByZWFjdCByYXRoZXIgdGhhbiByZWFkLCBhbmQgaXNcbiAqIHNlY29uZGFyeTogaXQgaW1wb3NlcyBubyBjZXJlbW9ueSBvbiB0aGUgY29tbW9uIGNhc2UsIHdoaWNoIGlzIHJlYWRpbmcge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5BcGlSZWZFdmVudE1hcD4ge1xuICAvKipcbiAgICogV2h5IHRoZSBBUEkgaXMgbm90IGF2YWlsYWJsZSByaWdodCBub3csIG9yIGBudWxsYCB3aGlsZSBpdCBpcy5cbiAgICpcbiAgICogQ2xhc3NpZmllZCBhdCB0aGUgbW9tZW50IG9mIHJlYWRpbmcsIGJ5IHRoZSBzYW1lIHByb2JlIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gdXNlcyBmb3IgaXRzXG4gICAqIGVycm9yLCBzbyBhIGNhbGxlciB0aGF0IG11c3QgZGVjaWRlIHN5bmNocm9ub3VzbHkg4oCUIHdoaWNoIG1lc3NhZ2UgdG8gc2hvdywgd2hpY2ggYnV0dG9uIHRvIG9mZmVyIOKAlCBjYW5cbiAgICogdGVsbCBcIm5vdCBpbnN0YWxsZWRcIiBmcm9tIFwidG9vIG9sZFwiIHdpdGhvdXQgd2FpdGluZyBmb3IgYSB0aW1lb3V0LiBMaWtlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LCBpdFxuICAgKiBkZXNjcmliZXMgbm93OiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIGEgcHJvdmlkZXIgdGhhdCBoYXMgbm90IGxvYWRlZCB5ZXQgcmVhZHMgYXNcbiAgICoge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLk5vdFB1Ymxpc2hlZH0uXG4gICAqL1xuICByZWFkb25seSB1bmF2YWlsYWJpbGl0eVJlYXNvbjogbnVsbCB8IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBUaGUgQVBJLCBvciBgbnVsbGAgd2hlbiBpdCBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS5cbiAgICpcbiAgICogQWx3YXlzIGN1cnJlbnQsIHN5bmNocm9ub3VzLCBhbmQgZnJlZSDigJQgdGhlIHJlZiBtYWludGFpbnMgaXQsIHNvIHRoZXJlIGlzIG5vIHJlZ2lzdHJ5IGxvb2t1cCBwZXIgcmVhZC5cbiAgICogYG51bGxgIGhlcmUgbWVhbnMgXCJub3QgYXZhaWxhYmxlIHJpZ2h0IG5vd1wiLCBOT1QgXCJub3QgaW5zdGFsbGVkXCI6IGR1cmluZyBhIGNvbnN1bWVyJ3MgYG9ubG9hZGAgdGhlXG4gICAqIHByb3ZpZGVyIG1heSBzaW1wbHkgbm90IGhhdmUgbG9hZGVkIHlldCwgYW5kIHRoZSB2YWx1ZSBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBudWxsIHwgVEFwaTtcblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBBUEkgdG8gYmVjb21lIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIHdhaXQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgQVBJLlxuICAgKiBAdGhyb3dzIEEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IHdob3NlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yLnJlYXNvbn0gc2F5cyB3aGljaCBvZlxuICAgKiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZCwgaWYgdGhlIEFQSSBkb2VzIG5vdCBiZWNvbWUgYXZhaWxhYmxlIGJlZm9yZSB0aGUgdGltZW91dCBlbGFwc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgd2hlbkF2YWlsYWJsZTogKG9wdGlvbnM/OiBXaGVuQXZhaWxhYmxlUGx1Z2luQXBpT3B0aW9ucykgPT4gUHJvbWlzZTxUQXBpPjtcbn1cblxuLyoqXG4gKiBUaGUgZXZlbnRzIGEge0BsaW5rIFBsdWdpbkFwaVJlZn0gZmlyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpUmVmRXZlbnRNYXAge1xuICAvKipcbiAgICogRmlyZWQgd2hlbmV2ZXIge0BsaW5rIFBsdWdpbkFwaVJlZi52YWx1ZX0gY2hhbmdlcyDigJQgaW5jbHVkaW5nIHdoZW4gaXQgYmVjb21lcyBgbnVsbGAgYmVjYXVzZSB0aGUgcHJvdmlkZXJcbiAgICogdW5sb2FkZWQuXG4gICAqL1xuICByZWFkb25seSBjaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGV4cGxpY2l0IG1lc3NhZ2UuIFdoZW4gb21pdHRlZCwgb25lIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgcmVhc29uLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgaW5wdXQgb3IgdGhlIG91dHB1dCBmYWlsZWQuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcHVibGlzaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGkgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaT4ge1xuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB3aG9zZSB1bmxvYWQgcmV2b2tlcyB0aGUgcmVjb3JkLiBEZWZhdWx0cyB0byB7QGxpbmsgUHVibGlzaFBsdWdpbkFwaVBhcmFtcy5wbHVnaW59LCB3aGljaCBpc1xuICAgKiB0aGUgcmlnaHQgb3duZXIgZm9yIGFuIEFQSSBwdWJsaXNoZWQgZm9yIGFzIGxvbmcgYXMgdGhlIHBsdWdpbiBydW5zLlxuICAgKlxuICAgKiBQYXNzIGEgbmFycm93ZXIgb25lIHdoZW4gdGhlIEFQSSBpcyBvbmx5IHZhbGlkIGZvciBwYXJ0IG9mIHRoZSBwbHVnaW4ncyBsaWZlIOKAlCBhIHBsdWdpbiB3aG9zZSBmZWF0dXJlXG4gICAqIHN1cmZhY2UgaXMgdG9ybiBkb3duIGFuZCByZWJ1aWx0IHdoaWxlIHRoZSBwbHVnaW4gaXRzZWxmIHN0YXlzIGxvYWRlZCBtdXN0IHJldm9rZSB3aXRoIHRoZSBzdXJmYWNlLCBvciBpdFxuICAgKiBsZWF2ZXMgY29uc3VtZXJzIGhvbGRpbmcgaGFuZGxlcyBpbnRvIGNvZGUgdGhhdCBpcyBubyBsb25nZXIgdGhlcmUuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ/OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBwdWJsaXNoaW5nIHBsdWdpbi4gVGhlIHJlY29yZCBpcyBrZXllZCBieSBpdHMgYG1hbmlmZXN0LmlkYCBhbmQgcmV2b2tlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpblxuICAgKiB1bmxvYWRzLCB2aWEgYHBsdWdpbi5yZWdpc3RlcigpYC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3YXRjaFBsdWdpbkFwaX0uXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCB3aGljaCBhIHR5cGVkIGNvbnRyYWN0IGlzIGNoZWNrZWQgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC4gVGhlIGhpZ2hlc3QgcHVibGlzaGVkXG4gICAqIHZlcnNpb24gc2F0aXNmeWluZyBpdCB3aW5zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBUaGUgcmFuZ2UgaXMgZXZhbHVhdGVkIGJ5IGBjb21wYXJlLXZlcnNpb25zYCwgd2hpY2ggYWNjZXB0cyBgXmAsIGB+YCwgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGFuZCBgeGBcbiAgICogd2lsZGNhcmRzIOKAlCBidXQgTk9UIGEgYmFyZSBgKmAuIFNwZWxsIFwiYW55IHZlcnNpb25cIiBhcyBgJz49MC4wLjAnYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLCB1c2VkIHRvIGNsYXNzaWZ5IGEgZmFpbHVyZSBhcyBub3QtaW5zdGFsbGVkIHZzIG5vdC1lbmFibGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgb3duaW5nIHRoZSBzdWJzY3JpcHRpb24uIFRoZSB3YXRjaCBpcyB0b3JuIGRvd24gd2hlbiBpdCB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGUgQ09OU1VNRVIgZXhwZWN0cy4gT3B0aW9uYWwsIGFuZCBpdCB3aW5zIG92ZXIgdGhlIHByb3ZpZGVyJ3MgcHVibGlzaGVkIGNvbnRyYWN0IHdoZW5cbiAgICogc3VwcGxpZWQg4oCUIGl0IGlzIHRoZSBjb25zdW1lcidzIG93biBjb21waWxlZC1hZ2FpbnN0IGV4cGVjdGF0aW9uLCBzbyBpdCBpcyB0aGUgb25lIHdob3NlIHZpb2xhdGlvbiBpc1xuICAgKiB0aGUgY29uc3VtZXIncyBwcm9ibGVtLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udHJhY3Q/OiBBcGlDb250cmFjdDxUQXBpPjtcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMge1xuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwIGFuZCBjbGFzc2lmeWluZyB0aGUgZmFpbHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTWV0aG9kV3JhcHBlcn0uXG4gKi9cbmludGVyZmFjZSBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kQ29udHJhY3Q6IEFwaU1ldGhvZENvbnRyYWN0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgaHVtYW4tcmVhZGFibGUgbmFtZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZyBvdXRwdXQuIE5PVCBhIGtleSDigJQgc2VlIHtAbGluayBwcm9wZXJ0eUtleX0uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGtleSB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IHJlYWQgYnksIHdoaWNoIG1heSBiZSBhIHN5bWJvbC5cbiAgICovXG4gIHJlYWRvbmx5IHByb3BlcnR5S2V5OiBQcm9wZXJ0eUtleTtcblxuICByZWFkb25seSB0YXJnZXQ6IG9iamVjdDtcbn1cblxuLyoqXG4gKiBUaGUgcmVhbG0tZ2xvYmFsIHJlZ2lzdHJ5IHNoYXJlZCBieSBldmVyeSBjb3B5IG9mIHRoaXMgbGlicmFyeSBpbiB0aGUgcmVuZGVyZXIuXG4gKi9cbmludGVyZmFjZSBQbHVnaW5BcGlSZWdpc3RyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIFJlZ2lzdHJ5IGluaXRpYWxpemF0aW9uIHJlcGFpcnMgYSBtaXNzaW5nIHJlY29yZHMgY29sbGVjdGlvbi5cbiAgcmVjb3JkczogUmVjb3JkPHN0cmluZywgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10+O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBSZWdpc3RyeSBpbml0aWFsaXphdGlvbiByZXBhaXJzIGEgbWlzc2luZyBzdWJzY3JpYmVycyBjb2xsZWN0aW9uLlxuICBzdWJzY3JpYmVyczogKCgpID0+IHZvaWQpW107XG59XG5cbi8qKlxuICogQSByZWNvcmQgYXMgaXQgc2l0cyBpbiB0aGUgc2hhcmVkIHJlZ2lzdHJ5LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHRoZSBXSVJFIEZPUk1BVCBiZXR3ZWVuIGRpZmZlcmVudCBjb3BpZXMgb2YgdGhpcyBsaWJyYXJ5LCBzbyBpdCBob2xkcyBub3RoaW5nIGJ1dCBwbGFpbiBkYXRhXG4gKiBhbmQgcGxhaW4gZnVuY3Rpb25zLCBhbmQgZXZlcnkgcmVhZCBvZiBpdCBlbHNld2hlcmUgaW4gdGhpcyBmaWxlIGlzIHN0cnVjdHVyYWwuXG4gKlxuICogVW5leHBvcnRlZCBhbmQgbm9uZXRoZWxlc3MgUFVCTElDOiB0aGUgYFBsdWdpbiBBUEkgcHJvdG9jb2xgIGd1aWRlIGRvY3VtZW50cyB0aGVzZSBmaXZlIGZpZWxkIG5hbWVzIGZvclxuICogdGhpcmQtcGFydHkgcGx1Z2lucyB0aGF0IHJlYWQgdGhlIHJlZ2lzdHJ5IHdpdGhvdXQgdGhpcyBsaWJyYXJ5LCBhbmQgcmVwcm9kdWNlcyB0aGUgaW50ZXJmYWNlIHZlcmJhdGltXG4gKiBmb3IgdGhlbSB0byBwYXN0ZS4gSXQgc3RheXMgdW5leHBvcnRlZCBiZWNhdXNlIG5vIGNvbnN1bWVyIE9GIHRoaXMgbGlicmFyeSBldmVyIHRvdWNoZXMgYSByZWNvcmQg4oCUXG4gKiB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9IGlzIHRoZWlyIHdob2xlIHN1cmZhY2Ug4oCUIHNvIGV4cG9ydGluZyBpdCB3b3VsZCB3aWRlbiB0aGUgcGFja2FnZSdzIEFQSSBmb3IgYW5cbiAqIGF1ZGllbmNlIHRoYXQgZG9lcyBub3QgaW1wb3J0IHRoZSBwYWNrYWdlLiBSZW5hbWluZyBhIGZpZWxkIGhlcmUgaXMgYSBicmVha2luZyBjaGFuZ2UgdG8gdGhlIGd1aWRlLlxuICovXG5pbnRlcmZhY2UgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkIHtcbiAgcmVhZG9ubHkgYXBpOiBvYmplY3Q7XG4gIHJlYWRvbmx5IGFwaVZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgY29udHJhY3Q6IEFwaUNvbnRyYWN0O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBSZW1vdmluZyBhIHB1Ymxpc2hlZCBBUEkgbWFya3MgaXRzIGV4aXN0aW5nIHNoYXJlZCByZWNvcmQgYXMgcmV2b2tlZC5cbiAgaXNSZXZva2VkOiBib29sZWFuO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB2YWxpZGF0ZVBheWxvYWR9LlxuICovXG5pbnRlcmZhY2UgVmFsaWRhdGVQYXlsb2FkUGFyYW1zIHtcbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQ7XG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjaGVtYTogU3RhbmRhcmRTY2hlbWFWMTtcbiAgcmVhZG9ubHkgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogSG9sZHMgd2hhdCBhIHdhdGNoIG5lZWRzIHJlZ2FyZGxlc3Mgb2YgdGhlIEFQSSB0eXBlIGl0IGlzIHR5cGVkIGFnYWluc3QsIHNvIHRoZSB7QGxpbmsgbWl4aW5Bc3luY0V2ZW50c31cbiAqIG1peGluIGhhcyBhIHJlYWwgYmFzZSB0byBleHRlbmQuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFBsdWdpbkFwaVdhdGNoQmFzZSB7XG4gIHByb3RlY3RlZCBoYW5kbGU6IG51bGwgfCBvYmplY3QgPSBudWxsO1xuXG4gIHByb3RlY3RlZCByZWNvcmQ6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSBudWxsO1xuXG4gIC8vIEEgYHByb3RlY3RlZGAgY29uc3RydWN0b3IgaXMgbm90IGFzc2lnbmFibGUgdG8gYEFic3RyYWN0Q29uc3RydWN0b3I8b2JqZWN0PmAsIHdoaWNoIGlzIHdoYXRcbiAgLy8gYG1peGluQXN5bmNFdmVudHNgIGFjY2VwdHMsIHNvIHRoaXMgc3RheXMgcHVibGljIGV2ZW4gdGhvdWdoIG9ubHkgdGhlIHN1YmNsYXNzIGJlbG93IGNhbGxzIGl0LlxuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXMpIHt9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZXJyb3IgZGVzY3JpYmluZyB3aHkgdGhlIEFQSSBpcyBub3QgYXZhaWxhYmxlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGNsYXNzaWZpZWQgZXJyb3IuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpOiBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ioe1xuICAgICAgcGx1Z2luSWQ6IHRoaXMucGFyYW1zLnBsdWdpbklkLFxuICAgICAgcmVhc29uOiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cblxuY2xhc3MgUGx1Z2luQXBpUmVmSW1wbDxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIG1peGluQXN5bmNFdmVudHM8UGx1Z2luQXBpUmVmRXZlbnRNYXA+KCkoUGx1Z2luQXBpV2F0Y2hCYXNlKSBpbXBsZW1lbnRzIFBsdWdpbkFwaVJlZjxUQXBpPiB7XG4gIHB1YmxpYyBnZXQgdW5hdmFpbGFiaWxpdHlSZWFzb24oKTogbnVsbCB8IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGUgPT09IG51bGwgPyByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24odGhpcy5wYXJhbXMpIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogbnVsbCB8IFRBcGkge1xuICAgIHJldHVybiBjYXN0VG88bnVsbCB8IFRBcGk+KHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbXB1dGVzIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHJlZ2lzdHJ5LCBmaXJpbmcgYGNoYW5nZWAgb25seSB3aGVuIGl0IGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQodGhpcy5wYXJhbXMpO1xuICAgIGlmIChyZWNvcmQgPT09IHRoaXMucmVjb3JkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvcmQgPSByZWNvcmQ7XG4gICAgdGhpcy5oYW5kbGUgPSByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgdGhpcy5wYXJhbXMuY29udHJhY3QpO1xuICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgd2hlbkF2YWlsYWJsZShvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpOiBQcm9taXNlPFRBcGk+IHtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChjdXJyZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBjdXJyZW50VmFsdWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5XaXRoVGltZW91dDxUQXBpPih7XG4gICAgICAgIG9wZXJhdGlvbkZ1bmN0aW9uOiBhc3luYyAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKTogUHJvbWlzZTxUQXBpPiA9PiBhd2FpdCB0aGlzLndhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbCksXG4gICAgICAgIG9wZXJhdGlvbk5hbWU6IGB3YXRjaFBsdWdpbkFwaShcIiR7dGhpcy5wYXJhbXMucGx1Z2luSWR9XCIpLndoZW5BdmFpbGFibGVgLFxuICAgICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1dIRU5fQVZBSUxBQkxFX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IHRoaXMuY3JlYXRlVW5hdmFpbGFibGVFcnJvcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclZhbHVlKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4ge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxUQXBpPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBUaGUgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCBGSVJTVCBhbmQgaW52b2tlZCB0aHJvdWdoIGEgdGh1bmssIHNvIGBldmVudFJlZmAgaXMgYWxyZWFkeSBib3VuZCBieSB0aGVcbiAgICAgIC8vIHRpbWUgYW55dGhpbmcgY2FuIHJlYWNoIGl0IOKAlCB3aGljaCBpcyB3aGF0IGxldHMgYGNsZWFuVXBgIGJlIHVuY29uZGl0aW9uYWwgcmF0aGVyIHRoYW4gbnVsbC1ndWFyZGVkLlxuICAgICAgY29uc3QgZXZlbnRSZWYgPSB0aGlzLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNsZWFuVXAoKTogdm9pZCB7XG4gICAgICAgIGV2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgICAgYWJvcnRTaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCk6IHZvaWQge1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlamVjdChhYm9ydFNpZ25hbC5yZWFzb24gYXMgRXJyb3IpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgIH07XG5cbiAgICAgIGFib3J0U2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgaGFuZGxlQ2hhbmdlKCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHBsdWdpbiBBUEkgY2Fubm90IGJlIGhhbmRlZCBvdmVyLCBjYXJyeWluZyB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29ufSB0aGF0IHNheXNcbiAqIHdoeS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmVxdWVzdGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIG9jY3VycmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zLm1lc3NhZ2UgPz8gYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIHVuYXZhaWxhYmxlOiAke3BhcmFtcy5yZWFzb259LmApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yJztcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICAgIHRoaXMucmVhc29uID0gcGFyYW1zLnJlYXNvbjtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHJvcGVydHkgaXMgcmVhZCBmcm9tIGEgaGFuZGxlIHdob3NlIHByb3ZpZGVyIGhhcyBzaW5jZSB1bmxvYWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBoYW5kaW5nIG91dCBhIHJldm9jYWJsZSBoYW5kbGUgcmF0aGVyIHRoYW4gdGhlIHJhdyBvYmplY3Q6IGEgY29uc3VtZXIgdGhhdCBjYWNoZWQgdGhlXG4gKiBBUEkgaW4gYSBmaWVsZCBhbmQga2VwdCB1c2luZyBpdCBhY3Jvc3MgYSBkaXNhYmxlIGdldHMgYW4gZXJyb3IgbmFtaW5nIHRoZSBwcm92aWRlciwgaW5zdGVhZCBvZlxuICogYENhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgdW5kZWZpbmVkYCBzb21ld2hlcmUgZGVlcCBpbnNpZGUgYSB0b3JuLWRvd24gcGx1Z2luLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpUmV2b2tlZEVycm9yIGV4dGVuZHMgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXZva2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBgVGhlIEFQSSBvZiB0aGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYmVlbiByZXZva2VkLCBiZWNhdXNlIHRoZSBwbHVnaW4gd2FzIHVubG9hZGVkLmAsXG4gICAgICBwbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZFxuICAgIH0pO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlSZXZva2VkRXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaXNoZWQgQVBJJ3MgcGF5bG9hZCBmYWlscyB0aGUgc2NoZW1hIGl0cyBjb250cmFjdCBkZWNsYXJlcy5cbiAqXG4gKiBPbmx5IGV2ZXIgdGhyb3duIHdoaWxlIHRoZSBgb2JzaWRpYW4tbGliOnZhbGlkYXRlLXBsdWdpbi1hcGktcGF5bG9hZHNgIGRlYnVnIHN3aXRjaCBpcyBvbiAoc2VlXG4gKiB7QGxpbmsgZ2V0VmFsaWRhdGVQbHVnaW5BcGlQYXlsb2Fkc0RlYnVnU3dpdGNofSkg4oCUIG90aGVyd2lzZSBubyBwYXlsb2FkIGlzIHZhbGlkYXRlZCBhdCBhbGwuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBUaGUgaXNzdWVzIHRoZSBzY2hlbWEgcmVwb3J0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW107XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgd2hvc2UgcGF5bG9hZCBmYWlsZWQgdmFsaWRhdGlvbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZXJyb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKFxuICAgICAgYFRoZSAke3BhcmFtcy5wYXlsb2FkS2luZH0gb2YgXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBBUEkgbWV0aG9kIFwiJHtwYXJhbXMubWV0aG9kTmFtZX1cIiBmYWlsZWQgdmFsaWRhdGlvbjogJHtmb3JtYXRJc3N1ZXMocGFyYW1zLmlzc3Vlcyl9YFxuICAgICk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkFwaVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5pc3N1ZXMgPSBwYXJhbXMuaXNzdWVzO1xuICAgIHRoaXMubWV0aG9kTmFtZSA9IHBhcmFtcy5tZXRob2ROYW1lO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29rcyBhbm90aGVyIHBsdWdpbidzIEFQSSB1cCBPTkNFLCBhbmQgYW5zd2VycyBmb3IgdGhpcyBtb21lbnQgb25seS5cbiAqXG4gKiBJdCBhcHBsaWVzIHRoZSBzYW1lIHNlbGVjdGlvbiBydWxlIGFzIHtAbGluayB3YXRjaFBsdWdpbkFwaX0gYW5kIGhhbmRzIG91dCB0aGUgc2FtZSByZXZvY2FibGUgaGFuZGxlLCBidXQgaXRcbiAqIHN1YnNjcmliZXMgdG8gbm90aGluZywgc28gaXQgbmV2ZXIgbGVhcm5zIHRoYXQgdGhlIGFuc3dlciBjaGFuZ2VkLiBUaGF0IG1ha2VzIGl0IHRoZSByaWdodCBzaGFwZSBmb3IgYSBmcmVlXG4gKiBmdW5jdGlvbiB0aGF0IGhhcyBubyBjb21wb25lbnQgdG8gb3duIGEgd2F0Y2ggYW5kIHJ1bnMgb24gYSB1c2VyLWRyaXZlbiBwYXRoLCBzdWNoIGFzIGEgYmFja2xpbmsgbG9va3VwIG1hZGVcbiAqIHdoaWxlIGEgcmVuYW1lIGlzIGhhbmRsZWQuIEl0IGlzIHRoZSB3cm9uZyBzaGFwZSBmb3IgYG9ubG9hZGA6IHBsdWdpbnMgbG9hZCBpbiBhbiB1bnNwZWNpZmllZCBvcmRlciwgc28gYVxuICogYG51bGxgIHRoZXJlIG1lYW5zIFwibm90IHlldFwiIGFzIG9mdGVuIGFzIFwibm90IGluc3RhbGxlZFwiLiBDb2RlIHRoYXQgaGFzIGEgY29tcG9uZW50IGFuZCByZWFkcyB0aGUgQVBJIG1vcmVcbiAqIHRoYW4gb25jZSBzaG91bGQgaG9sZCBhIHtAbGluayB3YXRjaFBsdWdpbkFwaX0gcmVmIGluc3RlYWQuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgbG9va3VwLlxuICogQHJldHVybnMgVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gbm8gbGl2ZSByZWNvcmQgc2F0aXNmaWVzIHRoZSByYW5nZSBhbmQgdGhlIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IEZpbmRQbHVnaW5BcGlQYXJhbXM8Tm9JbmZlcjxUQXBpPj4pOiBudWxsIHwgVEFwaSB7XG4gIGdldFZhbGlkYXRlUGx1Z2luQXBpUGF5bG9hZHNEZWJ1Z1N3aXRjaCgpO1xuICBjb25zdCByZWNvcmQgPSBzZWxlY3RSZWNvcmQocGFyYW1zKTtcbiAgcmV0dXJuIHJlY29yZCA9PT0gbnVsbCA/IG51bGwgOiBjYXN0VG88VEFwaT4oY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgZGVidWcgc3dpdGNoIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgcGx1Z2luLUFQSSBjYWxsJ3MgcGF5bG9hZHMgYXJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBjb250cmFjdC5cbiAqXG4gKiBJdHMgaWQgaXMgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBhbmQgaXQgaXMgb2ZmIGJ5IGRlZmF1bHQuIFdoaWxlIGl0IGlzIG9uLCBldmVyeSBjYWxsXG4gKiB0aHJvdWdoIGEgaGFuZGxlIGZyb20ge0BsaW5rIHdhdGNoUGx1Z2luQXBpfSBvciB7QGxpbmsgZmluZFBsdWdpbkFwaX0gY2hlY2tzIGl0cyBhcmd1bWVudHMgYW5kIGl0cyByZXR1cm4gdmFsdWVcbiAqIGFnYWluc3QgdGhlIG1ldGhvZCdzIGRlY2xhcmVkIHNjaGVtYXMgYW5kIHRocm93cyBhIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IG9uIGEgbWlzbWF0Y2guIFRoZVxuICogYG9ic2lkaWFuLWxpYjpQbHVnaW5BcGlgIGRlYnVnZ2VyIGRvZXMgbm90IGFmZmVjdCBpdDogdGhhdCBvbmx5IGxvZ3MuXG4gKlxuICogVGhlIHN3aXRjaCBpcyByZWdpc3RlcmVkIG9uIGV2ZXJ5IHJlYWQsIHdoaWNoIGlzIGlkZW1wb3RlbnQsIGFuZCB3aGVuZXZlciBhbiBBUEkgaXMgcHVibGlzaGVkLCB3YXRjaGVkIG9yIGxvb2tlZFxuICogdXAsIHNvIGEgZGVidWctc2V0dGluZ3MgVUkgbGlzdHMgaXQgYXMgc29vbiBhcyBhbnkgcGx1Z2luIEFQSSBpcyBpbiBwbGF5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWJ1ZyBzd2l0Y2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0ZVBsdWdpbkFwaVBheWxvYWRzRGVidWdTd2l0Y2goKTogRGVidWdTd2l0Y2gge1xuICByZXR1cm4gcmVnaXN0ZXJEZWJ1Z1N3aXRjaChWQUxJREFURV9QTFVHSU5fQVBJX1BBWUxPQURTX0RFQlVHX1NXSVRDSF9ERUZJTklUSU9OKTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSBwbHVnaW4ncyBBUEkgc28gb3RoZXIgcGx1Z2lucyBjYW4gY29uc3VtZSBpdCwga2V5ZWQgYnkgdGhlIHBsdWdpbidzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMuXG4gKlxuICogU2V2ZXJhbCBjb250cmFjdCB2ZXJzaW9ucyBtYXkgYmUgcHVibGlzaGVkIHNpZGUgYnkgc2lkZSwgc28gYSBwcm92aWRlciBjYW4gbW92ZSB0byBgMi4wLjBgIHdpdGhvdXQgYnJlYWtpbmdcbiAqIGNvbnN1bWVycyBzdGlsbCBwaW5uZWQgdG8gYF4xYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgcHVibGlzaGVkLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBwdWJsaXNoaW5nLlxuICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoaXMgcGx1Z2luIGhhcyBhbHJlYWR5IHB1Ymxpc2hlZCB0aGlzIGV4YWN0IGBhcGlWZXJzaW9uYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zPFRBcGk+KTogdm9pZCB7XG4gIGdldFZhbGlkYXRlUGx1Z2luQXBpUGF5bG9hZHNEZWJ1Z1N3aXRjaCgpO1xuICBjb25zdCBwbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW4ubWFuaWZlc3QuaWQ7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID8/IFtdO1xuICByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA9IHJlY29yZHM7XG5cbiAgaWYgKHJlY29yZHMuc29tZSgocmVjb3JkKSA9PiByZWNvcmQuYXBpVmVyc2lvbiA9PT0gcGFyYW1zLmFwaVZlcnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYWxyZWFkeSBwdWJsaXNoZWQgdGhlIEFQSSB2ZXJzaW9uIFwiJHtwYXJhbXMuYXBpVmVyc2lvbn1cIi5gKTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZDogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkID0ge1xuICAgIGFwaTogcGFyYW1zLmFwaSxcbiAgICBhcGlWZXJzaW9uOiBwYXJhbXMuYXBpVmVyc2lvbixcbiAgICBjb250cmFjdDogcGFyYW1zLmNvbnRyYWN0ID8/IHt9LFxuICAgIGlzUmV2b2tlZDogZmFsc2UsXG4gICAgcGx1Z2luSWRcbiAgfTtcbiAgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gIG5vdGlmeVN1YnNjcmliZXJzKCk7XG5cbiAgKHBhcmFtcy5jb21wb25lbnQgPz8gcGFyYW1zLnBsdWdpbikucmVnaXN0ZXIoKCkgPT4ge1xuICAgIHJldm9rZVJlY29yZChyZWNvcmQpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBXYXRjaGVzIGFub3RoZXIgcGx1Z2luJ3MgQVBJIGFuZCByZXR1cm5zIGEgbGl2ZSB7QGxpbmsgUGx1Z2luQXBpUmVmfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpUmVmLnZhbHVlfSBzdGF5c1xuICogY29ycmVjdCBhY3Jvc3MgdGhlIHByb3ZpZGVyJ3MgbG9hZCwgdW5sb2FkLCBhbmQgcmUtZW5hYmxlLlxuICpcbiAqIFRoaXMgaXMgdGhlIGNvbnN1bWVyIHN1cmZhY2UgZm9yIGFueXRoaW5nIHRoYXQgaGFzIGEgY29tcG9uZW50LiBJdHMgb25lLXNob3Qgc2libGluZyB7QGxpbmsgZmluZFBsdWdpbkFwaX1cbiAqIG9ubHkgYW5zd2VycyBcIm5vd1wiIGFuZCBuZXZlciB0ZWxscyB5b3Ugd2hlbiBcIm5vd1wiIGNoYW5nZWQsIHNvIGNhbGxpbmcgaXQgZHVyaW5nIGBvbmxvYWRgIHJlYWRzIGBudWxsYCBhbmRcbiAqIGludml0ZXMgdGhlIGNvbmNsdXNpb24gXCJub3QgaW5zdGFsbGVkXCIuIEEgY29uc3VtZXIgdGhhdCBuZWVkcyBhIHN5bmNocm9ub3VzIGFuc3dlciBpbnNpZGUgYSBjYWxsYmFjayB3aG9zZVxuICogc2lnbmF0dXJlIGZvcmJpZHMgYGF3YWl0YCDigJQgYGNoZWNrQ2FsbGJhY2soaXNDaGVja2luZyk6IGJvb2xlYW5gLCBgY2FuRXhlY3V0ZSgpYCwgYSBzZXR0aW5ncy1yb3cgYHZpc2libGVgXG4gKiBwcmVkaWNhdGUg4oCUIGhvbGRzIHRoZSByZWYgKG9yIHRoZSB2YWx1ZSBpdCBtYWludGFpbnMpIGluIGEgZmllbGQgYW5kIHJlYWRzIHRoYXQsIHdoaWNoIGlzIGJvdGggY2hlYXBlciBhbmRcbiAqIGNvcnJlY3QgYWNyb3NzIEJPVEggZWRnZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd2F0Y2guXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWZlcmVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3YXRjaFBsdWdpbkFwaTxUQXBpIGV4dGVuZHMgb2JqZWN0PihwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zPE5vSW5mZXI8VEFwaT4+KTogUGx1Z2luQXBpUmVmPFRBcGk+IHtcbiAgZ2V0VmFsaWRhdGVQbHVnaW5BcGlQYXlsb2Fkc0RlYnVnU3dpdGNoKCk7XG4gIGNvbnN0IHJlZiA9IG5ldyBQbHVnaW5BcGlSZWZJbXBsPFRBcGk+KHBhcmFtcyk7XG4gIGNvbnN0IHVuc3Vic2NyaWJlID0gc3Vic2NyaWJlKCgpID0+IHtcbiAgICByZWYucmVmcmVzaCgpO1xuICB9KTtcbiAgcGFyYW1zLmNvbXBvbmVudC5yZWdpc3Rlcih1bnN1YnNjcmliZSk7XG4gIHJlZi5yZWZyZXNoKCk7XG4gIHJldHVybiByZWY7XG59XG5cbi8qKlxuICogU3RydWN0dXJhbGx5IGRldGVjdHMgYSB0aGVuYWJsZS4gQSBjcm9zcy1jb3B5IHZhbHVlIG1heSBjb21lIGZyb20gYW5vdGhlciByZWFsbSwgc28gYGluc3RhbmNlb2YgUHJvbWlzZWAgaXNcbiAqIG5vdCB1c2FibGUgaGVyZSDigJQgdGhlIHNhbWUgZGlzY2lwbGluZSB0aGUgcmVnaXN0cnkgcmVjb3JkcyBmb2xsb3cuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHZhbHVlIHRoZSB0aGVuYWJsZSByZXNvbHZlcyB0by5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB0ZXN0LlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHZhbHVlIGlzIHRoZW5hYmxlLlxuICovXG5mdW5jdGlvbiBjaGVja0lzUHJvbWlzZUxpa2U8VD4odmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm9taXNlTGlrZTxUPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgJiYgdmFsdWUgIT09IG51bGxcbiAgICAmJiAndGhlbicgaW4gdmFsdWVcbiAgICAmJiB0eXBlb2YgKHZhbHVlIGFzIFByb21pc2VMaWtlPFQ+KS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGF0IGV2ZXJ5IG1ldGhvZCB0aGUgZWZmZWN0aXZlIGNvbnRyYWN0IGRlY2xhcmVzIGlzIGFjdHVhbGx5IHByZXNlbnQgb24gdGhlIHB1Ymxpc2hlZCBBUEkuXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSBwdWJsaXNoZWQgcmVjb3JkLlxuICogQHBhcmFtIGNvbnN1bWVyQ29udHJhY3QgLSBUaGUgY29uc3VtZXIncyBvd24gY29udHJhY3QsIHdoaWNoIHdpbnMgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBzaGFwZSBtYXRjaGVzLlxuICovXG5mdW5jdGlvbiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZDogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkLCBjb25zdW1lckNvbnRyYWN0PzogQXBpQ29udHJhY3QpOiBib29sZWFuIHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbnRyYWN0KS5ldmVyeSgobWV0aG9kTmFtZSkgPT4gdHlwZW9mIGdldE1lbWJlcihyZWNvcmQuYXBpLCBtZXRob2ROYW1lKSA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBmdW5jdGlvbiBhIGNvbnN1bWVyIGFjdHVhbGx5IGNhbGxzOiBpdCBhbHdheXMgaW52b2tlcyB0aGUgb3JpZ2luYWwgd2l0aCB0aGUgcmF3IEFQSSBvYmplY3QgYXNcbiAqIGB0aGlzYCwgYW5kIOKAlCBvbmx5IHdoaWxlIHRoZSBgb2JzaWRpYW4tbGliOnZhbGlkYXRlLXBsdWdpbi1hcGktcGF5bG9hZHNgIGRlYnVnIHN3aXRjaCBpcyBvbiDigJQgdmFsaWRhdGVzIHRoZVxuICogZGVjbGFyZWQgcGF5bG9hZHMgYXJvdW5kIGl0LlxuICpcbiAqIFRoZSBzd2l0Y2ggaXMgY29uc3VsdGVkIHBlciBjYWxsIHJhdGhlciB0aGFuIHBlciB3cmFwLCBzbyB0b2dnbGluZyBpdCBhdCBydW50aW1lIHRha2VzIGVmZmVjdCB3aXRob3V0XG4gKiByZS1hY3F1aXJpbmcgdGhlIGhhbmRsZSwgd2hpbGUgdGhlIHdyYXBwZXIncyBpZGVudGl0eSBzdGF5cyBzdGFibGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgd3JhcHBlci5cbiAqIEByZXR1cm5zIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBjcmVhdGVNZXRob2RXcmFwcGVyKHBhcmFtczogQ3JlYXRlTWV0aG9kV3JhcHBlclBhcmFtcyk6ICguLi4kYXJndW1lbnRzOiB1bmtub3duW10pID0+IHVua25vd24ge1xuICByZXR1cm4gZnVuY3Rpb24gcGx1Z2luQXBpTWV0aG9kKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSk6IHVua25vd24ge1xuICAgIC8vIFJlYWQgYnkgdGhlIE9SSUdJTkFMIGtleSwgbm90IGJ5IHRoZSBkaXNwbGF5IG5hbWU6IGBTdHJpbmcoc3ltYm9sKWAgaXMgYCdTeW1ib2woeCknYCwgd2hpY2ggaXMgbm90IGFcbiAgICAvLyBrZXkgdGhlIEFQSSBvYmplY3QgaGFzLlxuICAgIGNvbnN0IG1ldGhvZCA9IGNhc3RUbzwoLi4uJGlubmVyQXJndW1lbnRzOiB1bmtub3duW10pID0+IHVua25vd24+KGdldE1lbWJlcihwYXJhbXMudGFyZ2V0LCBwYXJhbXMucHJvcGVydHlLZXkpKTtcbiAgICBjb25zdCBtZXRob2RDb250cmFjdCA9IHBhcmFtcy5tZXRob2RDb250cmFjdDtcblxuICAgIGlmIChtZXRob2RDb250cmFjdCA9PT0gdW5kZWZpbmVkIHx8ICFnZXRWYWxpZGF0ZVBsdWdpbkFwaVBheWxvYWRzRGVidWdTd2l0Y2goKS5pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kQ29udHJhY3QuaW5wdXQpIHtcbiAgICAgIHZhbGlkYXRlUGF5bG9hZCh7XG4gICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuSW5wdXQsXG4gICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgIHNjaGVtYTogbWV0aG9kQ29udHJhY3QuaW5wdXQsXG4gICAgICAgIHZhbHVlOiAkYXJndW1lbnRzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG1ldGhvZC5hcHBseShwYXJhbXMudGFyZ2V0LCAkYXJndW1lbnRzKTtcbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBtZXRob2RDb250cmFjdC5vdXRwdXQ7XG4gICAgaWYgKCFvdXRwdXRTY2hlbWEpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hlY2tJc1Byb21pc2VMaWtlKHJldHVyblZhbHVlKSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlLnRoZW4oKHJlc29sdmVkVmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgICBtZXRob2ROYW1lOiBwYXJhbXMubWV0aG9kTmFtZSxcbiAgICAgICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgc2NoZW1hOiBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgdmFsdWU6IHJlc29sdmVkVmFsdWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlZFZhbHVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kLk91dHB1dCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsXG4gICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgIHZhbHVlOiByZXR1cm5WYWx1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBXcmFwcyBhIHB1Ymxpc2hlZCBBUEkgaW4gYSByZXZvY2FibGUgaGFuZGxlLlxuICpcbiAqIEEgZmxhZy1jaGVja2luZyBgZ2V0YCB0cmFwIGlzIHVzZWQgcmF0aGVyIHRoYW4gYFByb3h5LnJldm9jYWJsZWAsIGJlY2F1c2UgdGhlIGxhdHRlciB0aHJvd3MgYSBiYXJlXG4gKiBgVHlwZUVycm9yYCB3aG9zZSBtZXNzYWdlIHdlIGNhbm5vdCBwaHJhc2Ug4oCUIGFuZCB0aGUgd2hvbGUgdmFsdWUgb2YgcmV2b2tpbmcgaXMgdGhhdCB0aGUgZXJyb3IgbmFtZXMgdGhlXG4gKiBwcm92aWRlci5cbiAqXG4gKiBNZXRob2RzIGFyZSBib3VuZCB0byB0aGUgUkFXIGFwaSBvYmplY3QgcmF0aGVyIHRoYW4gdG8gdGhlIHByb3h5OiBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBwcml2YXRlIGNsYXNzXG4gKiBmaWVsZHMgKGAjZmllbGRgKSB0aHJvd3MgaWYgaXRzIGB0aGlzYCBpcyBhIHByb3h5LlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcHVibGlzaGVkIHJlY29yZC5cbiAqIEBwYXJhbSBjb25zdW1lckNvbnRyYWN0IC0gVGhlIGNvbnN1bWVyJ3Mgb3duIGNvbnRyYWN0LCB3aGljaCB3aW5zIG92ZXIgdGhlIHB1Ymxpc2hlZCBvbmUgd2hlbiBzdXBwbGllZC5cbiAqIEByZXR1cm5zIFRoZSBoYW5kbGUuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQ6IFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgY29uc3VtZXJDb250cmFjdD86IEFwaUNvbnRyYWN0KTogb2JqZWN0IHtcbiAgY29uc3QgY29udHJhY3QgPSBjb25zdW1lckNvbnRyYWN0ID8/IHJlY29yZC5jb250cmFjdDtcbiAgY29uc3QgbWV0aG9kQ2FjaGUgPSBuZXcgTWFwPFByb3BlcnR5S2V5PigpO1xuXG4gIHJldHVybiBuZXcgUHJveHkocmVjb3JkLmFwaSwge1xuICAgIGdldCh0YXJnZXQ6IG9iamVjdCwgcHJvcGVydHlLZXk6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gICAgICBpZiAocmVjb3JkLmlzUmV2b2tlZCkge1xuICAgICAgICB0aHJvdyBuZXcgUGx1Z2luQXBpUmV2b2tlZEVycm9yKHJlY29yZC5wbHVnaW5JZCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gZ2V0TWVtYmVyKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RDYWNoZS5nZXQocHJvcGVydHlLZXkpO1xuICAgICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1ldGhvZCA9IGNyZWF0ZU1ldGhvZFdyYXBwZXIoe1xuICAgICAgICAgIG1ldGhvZENvbnRyYWN0OiB0eXBlb2YgcHJvcGVydHlLZXkgPT09ICdzdHJpbmcnID8gY29udHJhY3RbcHJvcGVydHlLZXldIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IFN0cmluZyhwcm9wZXJ0eUtleSksXG4gICAgICAgICAgcGx1Z2luSWQ6IHJlY29yZC5wbHVnaW5JZCxcbiAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgfSk7XG4gICAgICAgIG1ldGhvZENhY2hlLnNldChwcm9wZXJ0eUtleSwgbWV0aG9kKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHNjaGVtYSBpc3N1ZXMgaW50byBhIHNpbmdsZSByZWFkYWJsZSBsaW5lLlxuICpcbiAqIEBwYXJhbSBpc3N1ZXMgLSBUaGUgaXNzdWVzIHRvIHJlbmRlci5cbiAqIEByZXR1cm5zIFRoZSByZW5kZXJlZCBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzXG4gICAgLm1hcCgoaXNzdWUpID0+IHtcbiAgICAgIGNvbnN0IHBhdGggPSBpc3N1ZS5wYXRoPy5tYXAoKHNlZ21lbnQpID0+IFN0cmluZyh0eXBlb2Ygc2VnbWVudCA9PT0gJ29iamVjdCcgPyBzZWdtZW50LmtleSA6IHNlZ21lbnQpKS5qb2luKCcuJyk7XG4gICAgICByZXR1cm4gcGF0aCA/IGAke3BhdGh9OiAke2lzc3VlLm1lc3NhZ2V9YCA6IGlzc3VlLm1lc3NhZ2U7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWNvcmRzIGEgcGx1Z2luIGN1cnJlbnRseSBoYXMgcHVibGlzaGVkLCBleGNsdWRpbmcgYW55IHRoYXQgaGF2ZSBiZWVuIHJldm9rZWQuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHByb3ZpZGluZyBwbHVnaW4uXG4gKiBAcmV0dXJucyBUaGUgbGl2ZSByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBnZXRMaXZlUmVjb3JkcyhwbHVnaW5JZDogc3RyaW5nKTogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkW10ge1xuICByZXR1cm4gKGdldFJlZ2lzdHJ5KCkucmVjb3Jkc1twbHVnaW5JZF0gPz8gW10pLmZpbHRlcigocmVjb3JkKSA9PiAhcmVjb3JkLmlzUmV2b2tlZCk7XG59XG5cbi8qKlxuICogUmVhZHMgYSBtZW1iZXIgb2ZmIGEgcHVibGlzaGVkIEFQSSBvYmplY3Qgd2l0aG91dCBuYXJyb3dpbmcgaXQg4oCUIHRoZSBBUEkgY3Jvc3NlcyBhIGxpYnJhcnktdmVyc2lvbiBib3VuZGFyeSxcbiAqIHNvIG5vdGhpbmcgYWJvdXQgaXRzIHNoYXBlIG1heSBiZSBhc3N1bWVkLlxuICpcbiAqIEBwYXJhbSBhcGkgLSBUaGUgcHVibGlzaGVkIEFQSSBvYmplY3QuXG4gKiBAcGFyYW0gbWV0aG9kTmFtZSAtIFRoZSBtZW1iZXIgdG8gcmVhZC5cbiAqIEByZXR1cm5zIFRoZSBtZW1iZXIncyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWVtYmVyKGFwaTogb2JqZWN0LCBtZXRob2ROYW1lOiBQcm9wZXJ0eUtleSk6IHVua25vd24ge1xuICByZXR1cm4gUmVmbGVjdC5nZXQoYXBpLCBtZXRob2ROYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgZGVidWdnZXIgdGhhdCBsb2dzIGFuIGFzeW5jaHJvbm91cyBwYXlsb2FkIHZhbGlkYXRpb24gZmFpbHVyZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVidWdnZXIuXG4gKi9cbmZ1bmN0aW9uIGdldFBsdWdpbkFwaURlYnVnZ2VyKCk6IFJldHVyblR5cGU8dHlwZW9mIGdldE9ic2lkaWFuTGliRGVidWdnZXI+IHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuTGliRGVidWdnZXIoUExVR0lOX0FQSV9ERUJVR0dFUl9OQU1FU1BBQ0UpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2hhcmVkIHJlZ2lzdHJ5LCB0b2xlcmF0aW5nIGEgYmFnIHdyaXR0ZW4gYnkgYSBESUZGRVJFTlQgY29weSBvZiB0aGlzIGxpYnJhcnkgdGhhdCBtYXlcbiAqIHByZWRhdGUgb25lIG9mIGl0cyBmaWVsZHMuXG4gKlxuICogQHJldHVybnMgVGhlIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBnZXRSZWdpc3RyeSgpOiBQbHVnaW5BcGlSZWdpc3RyeSB7XG4gIGNvbnN0IHdyYXBwZXIgPSBnZXRPYnNpZGlhbkxpYlN0YXRlPFBhcnRpYWw8UGx1Z2luQXBpUmVnaXN0cnk+PihQTFVHSU5fQVBJX1JFR0lTVFJZX1NUQVRFX0tFWSwge30pO1xuICBjb25zdCByZWdpc3RyeSA9IHdyYXBwZXIudmFsdWU7XG4gIHJlZ2lzdHJ5LnJlY29yZHMgPz89IHt9O1xuICByZWdpc3RyeS5zdWJzY3JpYmVycyA/Pz0gW107XG4gIHJldHVybiBjYXN0VG88UGx1Z2luQXBpUmVnaXN0cnk+KHJlZ2lzdHJ5KTtcbn1cblxuLyoqXG4gKiBOb3RpZmllcyBldmVyeSBzdWJzY3JpYmVyLCBvdmVyIGEgU05BUFNIT1Qgb2YgdGhlIGxpc3Qg4oCUIGEgY2FsbGJhY2sgaXMgZnJlZSB0byB1bnN1YnNjcmliZSAob3Igc3Vic2NyaWJlKVxuICogd2hpbGUgdGhlIHN3ZWVwIGlzIHJ1bm5pbmcuXG4gKi9cbmZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHN1YnNjcmliZXIgb2Ygc25hcHNob3QoZ2V0UmVnaXN0cnkoKS5zdWJzY3JpYmVycykpIHtcbiAgICBzdWJzY3JpYmVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIGFwcGxpZXMsIHByb2JpbmcgdGhlIGNhdXNlcyBmcm9tIHRoZSBvdXRlcm1vc3QgaW53YXJkcyBzbyB0aGUgbW9zdFxuICogYWN0aW9uYWJsZSBvbmUgd2lucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcmVhc29uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24ocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKHBhcmFtcy5hcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBhcmFtcy5wbHVnaW5JZCkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90SW5zdGFsbGVkO1xuICB9XG5cbiAgaWYgKCFwYXJhbXMuYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBhcmFtcy5wbHVnaW5JZCkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90RW5hYmxlZDtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZHMgPSBnZXRMaXZlUmVjb3JkcyhwYXJhbXMucGx1Z2luSWQpO1xuICBpZiAocmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90UHVibGlzaGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlY29yZHMuZXZlcnkoKHJlY29yZCkgPT4gIXNhdGlzZmllc1ZlcnNpb24ocmVjb3JkLmFwaVZlcnNpb24sIHBhcmFtcy5hcGlWZXJzaW9uUmFuZ2UpKSA/IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlZlcnNpb25NaXNtYXRjaCA6IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCDigJQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGxvb2t1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHdpbm5pbmcgcmVjb3JkLCBvciBgbnVsbGAgd2hlbiBub25lIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0UmVjb3JkKHBhcmFtczogRmluZFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCDigJQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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QXFELE1BQU0sR0FBRztBQUNoRSx3Q0FBa0IsWUFBWTtBQUM1QixZQUFNLGNBQWMsTUFBTTtBQUMxQixVQUFJLFlBQVksUUFBUTtBQUN0Qiw2QkFBcUI7QUFBQSxVQUNuQjtBQUFBLFVBQ0EsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsT0FBTztBQUFBLFVBQ1AsYUFBYSxZQUFZLE1BQU07QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUM7QUFDRDtBQUFBLEVBQ0Y7QUFFQSxNQUFJLE9BQU8sUUFBUTtBQUNqQixVQUFNLElBQUkseUJBQXlCO0FBQUEsTUFDakMsUUFBUSxPQUFPO0FBQUEsTUFDZixZQUFZLE9BQU87QUFBQSxNQUNuQixhQUFhLE9BQU87QUFBQSxNQUNwQixVQUFVLE9BQU87QUFBQSxJQUNuQixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsIm5hbWVzIjpbIlBsdWdpbkFwaVBheWxvYWRLaW5kIiwiUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24iLCJyZWNvcmQiLCJzYXRpc2ZpZXNWZXJzaW9uIl19
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWFwaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQSB0eXBlZCwgdmVyc2lvbmVkLCBsaWZlY3ljbGUtYXdhcmUgcmVnaXN0cnkgZm9yIGNyb3NzLXBsdWdpbiBBUElzIOKAlCB0aGUgYWR2YW5jZWQgc3VjY2Vzc29yIHRvXG4gKiBgQHZhbmFrYXQvcGx1Z2luLWFwaWAuXG4gKlxuICogQSBwcm92aWRlciBwdWJsaXNoZXMgaXRzIEFQSSBvbmNlLCB1bmRlciBhIGNvbnRyYWN0IHZlcnNpb24gdGhhdCBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcGx1Z2luIHZlcnNpb246XG4gKlxuICogYGBgdHNcbiAqIHB1Ymxpc2hQbHVnaW5BcGkoe1xuICogICBhcGk6IG5ldyBNeUFwaSh0aGlzKSxcbiAqICAgYXBpVmVyc2lvbjogJzIuMS4wJyxcbiAqICAgY29udHJhY3Q6IE1ZX0FQSV9DT05UUkFDVF9WMixcbiAqICAgcGx1Z2luOiB0aGlzXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEEgY29uc3VtZXIgZ2V0cyBhIExJVkUgUkVGIHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGlzIGFsd2F5cyBjdXJyZW50IOKAlCBgbnVsbGAgYmVmb3JlIHRoZVxuICogcHJvdmlkZXIgbG9hZHMsIHRoZSBBUEkgb25jZSBpdCBwdWJsaXNoZXMsIGBudWxsYCBhZ2FpbiBvbmNlIGl0IHVubG9hZHMsIGFuZCB0aGUgQVBJIGFnYWluIGFmdGVyIGFcbiAqIHJlLWVuYWJsZTpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgcmVmID0gd2F0Y2hQbHVnaW5BcGk8TXlBcGk+KHtcbiAqICAgYXBpVmVyc2lvblJhbmdlOiAnXjInLFxuICogICBhcHA6IHRoaXMuYXBwLFxuICogICBjb21wb25lbnQ6IHRoaXMsXG4gKiAgIHBsdWdpbklkOiAnbXktcHJvdmlkZXInXG4gKiB9KTtcbiAqXG4gKiByZWYudmFsdWU7ICAgICAgICAgICAgICAgICAgICAvLyBNeUFwaSB8IG51bGwg4oCUIHN5bmMsIGZyZWUsIGFsd2F5cyBjb3JyZWN0XG4gKiBhd2FpdCByZWYud2hlbkF2YWlsYWJsZSgpOyAgICAvLyBvbmUtc2hvdCBmbG93czsgcmVqZWN0cyB3aXRoIGEgdHlwZWQsIGNsYXNzaWZpZWQgZXJyb3JcbiAqIHJlZi5vbignY2hhbmdlJywgKCkgPT4geyB9KTsgLy8gZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgUkVBQ1QgcmF0aGVyIHRoYW4gcmVhZFxuICogYGBgXG4gKlxuICogV2hhdCB0aGlzIGZpeGVzLCByZWxhdGl2ZSB0byBwdWJsaXNoaW5nIGEgYmFyZSBvYmplY3Qgb24gYHdpbmRvdy5QbHVnaW5BcGlgOlxuICpcbiAqIC0gKipMb2FkIG9yZGVyLioqIFRoZSByZWYgc3Vic2NyaWJlczsgaXQgZG9lcyBub3Qgc2FtcGxlLiBSZWFkaW5nIGBudWxsYCBkdXJpbmcgYG9ubG9hZGAgbWVhbnMgXCJub3QgeWV0XCIsXG4gKiAgIGFuZCBpdCBiZWNvbWVzIG5vbi1gbnVsbGAgb24gaXRzIG93bi5cbiAqIC0gKipWZXJzaW9uIG5lZ290aWF0aW9uLioqIFRoZSBwcm92aWRlciBkZWNsYXJlcyBhIGNvbnRyYWN0IHZlcnNpb247IHRoZSBjb25zdW1lciBkZWNsYXJlcyB0aGUgcmFuZ2UgaXRcbiAqICAgY29tcGlsZWQgYWdhaW5zdDsgdGhlIGhpZ2hlc3Qgc2F0aXNmeWluZyByZWNvcmQgd2lucy5cbiAqIC0gKipTdGFsZSBoYW5kbGVzLioqIFRoZSB2YWx1ZSBpcyBhIHJldm9jYWJsZSBoYW5kbGUg4oCUIGFmdGVyIHRoZSBwcm92aWRlciB1bmxvYWRzLCBhIHByb3BlcnR5IHJlYWQgdGhyb3dzXG4gKiAgIGEge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0gbmFtaW5nIHRoZSBwcm92aWRlciBpbnN0ZWFkIG9mIGEgbnVsbCBkZXJlZiBkZWVwIGluIHNvbWVvbmUgZWxzZSdzIHN0YWNrLlxuICogLSAqKkZyZWUtc3RyaW5nIG5hbWVzLioqIFJlY29yZHMgYXJlIGtleWVkIGJ5IGBwbHVnaW4ubWFuaWZlc3QuaWRgLCB3aGljaCBPYnNpZGlhbiBhbHJlYWR5IGtlZXBzIHVuaXF1ZS5cbiAqIC0gKipMZWdpYmxlIGZhaWx1cmUuKioge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSByZWplY3RzIHdpdGggYVxuICogICB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcn0gY2FycnlpbmcgYSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb259LCBzbyB0aGUgZml2ZSBkaXN0aW5jdFxuICogICBjYXVzZXMgYXJlIHRvbGQgYXBhcnQuXG4gKlxuICogUGF5bG9hZCB2YWxpZGF0aW9uIGlzIG9wdC1pbiBwZXIgbWV0aG9kIHRocm91Z2gge0BsaW5rIGh0dHBzOi8vc3RhbmRhcmRzY2hlbWEuZGV2IHwgU3RhbmRhcmQgU2NoZW1hfSwgc29cbiAqIHpvZCAvIHZhbGlib3QgLyBhcmt0eXBlIC8gYSBoYW5kLXdyaXR0ZW4gdmFsaWRhdG9yIGFsbCBwbHVnIGluIGFuZCBub25lIG9mIHRoZW0gaXMgYSBkZXBlbmRlbmN5IGhlcmUuIEl0XG4gKiBydW5zIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgZGVidWcgc3dpdGNoIGlzIG9uIChvZmYgYnkgZGVmYXVsdCwgc2VlXG4gKiB7QGxpbmsgZ2V0VmFsaWRhdGVQbHVnaW5BcGlQYXlsb2Fkc0RlYnVnU3dpdGNofSksIHNvIHByb2R1Y3Rpb24gcGF5cyBub3RoaW5nLiBUaGUgYG9ic2lkaWFuLWxpYjpQbHVnaW5BcGlgXG4gKiBkZWJ1Z2dlciBjb250cm9scyBsb2dnaW5nIG9ubHk6IHR1cm5pbmcgaXQgb24gY2hhbmdlcyBubyBiZWhhdmlvci5cbiAqXG4gKiBUaGUgY29udHJhY3QgaXRzZWxmIOKAlCBpdHMgdHlwZXMgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnMg4oCUIGlzIG5vdCBPYnNpZGlhbi1zcGVjaWZpYyBhbmQgbGl2ZXMgaW5cbiAqIGBAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXBpLWNvbnRyYWN0YCAoYEFwaUNvbnRyYWN0YCwgYGNyZWF0ZUFyZ3VtZW50c1NjaGVtYWAsIGBjcmVhdGVUeXBlR3VhcmRTY2hlbWFgLFxuICogYGRlZmluZUFwaUNvbnRyYWN0YCkuIFRoaXMgbW9kdWxlIG93bnMgd2hhdCBpczogdGhlIHJlZ2lzdHJ5IGtleWVkIGJ5IHBsdWdpbiBpZCwgdGhlIHJldm9jYWJsZSBoYW5kbGVzLCB0aGVcbiAqIGRlYnVnIHN3aXRjaCBhbmQgdGhlIHZhbGlkYXRpb24gZXJyb3JzLiBBIGNvbnRyYWN0J3MgS0VZUyBkcml2ZSB0aGUgc2hhcGUgY2hlY2sgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBwdWJsaXNoZWRcbiAqIHJlY29yZCBpcyB1c2FibGUgYXQgYWxsOyBpdHMgc2NoZW1hcyBhcmUgb25seSBldmVyIGNvbnN1bHRlZCB3aGlsZSB0aGUgc3dpdGNoIGlzIG9uLlxuICpcbiAqIFdoeSB0aGUgc2hhcGUgY2hlY2sgaXMgYSBgdHlwZW9mYCByYXRoZXIgdGhhbiBhIHNjaGVtYSBvdmVyIHRoZSB3aG9sZSBBUEkgb2JqZWN0LiBJbiB6b2QgNCBgei5mdW5jdGlvbigpYFxuICogcmV0dXJucyBhIGZ1bmN0aW9uIEZBQ1RPUlksIG5vdCBhIHNjaGVtYSwgc28gaXQgY2Fubm90IGJlIGEgYHoub2JqZWN0KClgIG1lbWJlciBkaXJlY3RseS4gVGhlcmUgaXMgYSBrbm93blxuICogd29ya2Fyb3VuZCAoem9kIzQxNDMpIOKAlCBgei5jdXN0b20oKGZuKSA9PiBmdW5jdGlvblNjaGVtYS5pbXBsZW1lbnQoZm4pKWAg4oCUIGFuZCBpdCBkb2VzIGJ1eSBjb3JyZWN0XG4gKiBgei5pbmZlcmAgdHlwZXMgZm9yIGEgZnVuY3Rpb24gbWVtYmVyLiBJdCBkb2VzIG5vdCBidXkgcnVudGltZSB2YWxpZGF0aW9uIGhlcmUsIHRob3VnaDogYHouY3VzdG9tYCBpcyBhXG4gKiBib29sZWFuIHByZWRpY2F0ZSB0aGF0IHJldHVybnMgaXRzIGlucHV0IHVuY2hhbmdlZCwgc28gdGhlIHZhbGlkYXRpbmcgd3JhcHBlciBgaW1wbGVtZW50YCBidWlsZHMgaXNcbiAqIGRpc2NhcmRlZCBhbmQgdGhlIGNoZWNrIGNvbGxhcHNlcyBiYWNrIHRvIFwiaXMgaXQgY2FsbGFibGVcIi4gS2VlcGluZyB0aGF0IHdyYXBwZXIgd291bGQgbmVlZCBhIGZ1cnRoZXJcbiAqIGAudHJhbnNmb3JtKClgLCBhbmQgd291bGQgdGhlbiBtb3ZlIHZhbGlkYXRpb24gb250byBldmVyeSBjYWxsIGluc3RlYWQgb2YgYmVoaW5kIHRoZSBkZWJ1ZyBzd2l0Y2gsIGFuZCBiaW5kXG4gKiB0aGUgY29udHJhY3QgdG8gem9kIHNwZWNpZmljYWxseSDigJQgd2hpY2ggaXMgZXhhY3RseSB3aGF0IHJlYWNoaW5nIHRocm91Z2ggU3RhbmRhcmQgU2NoZW1hIGF2b2lkcy4gU28gdGhlXG4gKiBkZWNsYXJlZCBtZXRob2QgbmFtZXMgYXJlIGNoZWNrZWQgd2l0aCBgdHlwZW9mYCwgYW5kIHRoZSBwYXlsb2FkcyBhcmUgdmFsaWRhdGVkIHBlciBtZXRob2QgaW5zdGVhZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogRXZlcnkgcGx1Z2luIGJ1bmRsZXMgaXRzIE9XTiBjb3B5IG9mIHRoaXMgbGlicmFyeSwgc28gYSByZWdpc3RyeSByZWNvcmQgaXMgYSB3aXJlIGZvcm1hdCBiZXR3ZWVuXG4gKiBkaWZmZXJlbnQgbGlicmFyeSB2ZXJzaW9ucyBhbmQgbXVzdCBzdGF5IGJhY2t3YXJkLWNvbXBhdGlibGUgZm9yZXZlci4gTm90aGluZyBjcm9zc2luZyBpdCBtYXkgYmVcbiAqIGBpbnN0YW5jZW9mYC1jaGVja2VkIOKAlCByZWFkcyBhcmUgc3RydWN0dXJhbCwgYW5kIG9ubHkgcGxhaW4gZGF0YSBvYmplY3RzIGFuZCBwbGFpbiBmdW5jdGlvbnMgYXJlIHN0b3JlZC5cbiAqXG4gKiBUaGF0IHdpcmUgZm9ybWF0IGlzIGFsc28gUFVCTElTSEVELCBhcyBvZiB0aGUgYFBsdWdpbiBBUEkgcHJvdG9jb2xgIGd1aWRlOiBhIHBsdWdpbiB0aGF0IGRvZXMgbm90IHVzZVxuICogdGhpcyBsaWJyYXJ5IHJlYWNoZXMgYW4gQVBJIGJ5IHJlYWRpbmdcbiAqIGBnbG9iYWxUaGlzLl9fb2JzaWRpYW5MaWIucGx1Z2luQXBpUmVnaXN0cnkudmFsdWUucmVjb3Jkc1twbHVnaW5JZF1gIGFuZCBhcHBseWluZyB0aGUgc2VsZWN0aW9uIHJ1bGVcbiAqIHtAbGluayBzZWxlY3RSZWNvcmR9IGltcGxlbWVudHMuIFNvIHtAbGluayBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmR9J3MgZmllbGQgbmFtZXMsIHRoZSBzdGF0ZSBrZXksIGFuZFxuICogXCJoaWdoZXN0IGxpdmUgcmVjb3JkIHNhdGlzZnlpbmcgdGhlIHJhbmdlIHdpbnNcIiBhcmUgYSBkb2N1bWVudGVkIGNvbnRyYWN0IHdpdGggYW4gYXVkaWVuY2Ugb3V0c2lkZSB0aGlzXG4gKiByZXBvc2l0b3J5LCBhbmQgdGhlIGd1aWRlIGhhcyB0byBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIGNoYW5nZSBhcyBhbnkgb2YgdGhlbS4gT25seSBgcGx1Z2luQXBpUmVnaXN0cnlgXG4gKiBpcyBwdWJsaWMgd2l0aGluIHRoZSBzaGFyZWQtc3RhdGUgYmFnOyB0aGUgcmVzdCBvZiBpdCBzdGF5cyBpbnRlcm5hbC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwaUNvbnRyYWN0LFxuICBBcGlNZXRob2RDb250cmFjdFxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXBpLWNvbnRyYWN0JztcbmltcG9ydCB0eXBlIHsgQXN5bmNFdmVudFNvdXJjZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYy1ldmVudHMnO1xuaW1wb3J0IHR5cGUge1xuICBEZWJ1Z1N3aXRjaCxcbiAgRGVidWdTd2l0Y2hEZWZpbml0aW9uXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kZWJ1Zy1zd2l0Y2hlcyc7XG5pbXBvcnQgdHlwZSB7IFN0YW5kYXJkU2NoZW1hVjEgfSBmcm9tICdAc3RhbmRhcmQtc2NoZW1hL3NwZWMnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENvbXBvbmVudCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgc25hcHNob3QgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXJyYXknO1xuaW1wb3J0IHtcbiAgaW52b2tlQXN5bmNTYWZlbHksXG4gIHJ1bldpdGhUaW1lb3V0XG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBtaXhpbkFzeW5jRXZlbnRzIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgeyByZWdpc3RlckRlYnVnU3dpdGNoIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnLXN3aXRjaGVzJztcbmltcG9ydCB7IGNhc3RUbyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9vYmplY3QtdXRpbHMnO1xuaW1wb3J0IHtcbiAgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlciB9IGZyb20gJy4uL2RlYnVnLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuTGliU3RhdGUgfSBmcm9tICcuLi9vYnNpZGlhbi1saWItc3RhdGUudHMnO1xuXG5jb25zdCBQTFVHSU5fQVBJX0RFQlVHR0VSX05BTUVTUEFDRSA9ICdQbHVnaW5BcGknO1xuY29uc3QgUExVR0lOX0FQSV9SRUdJU1RSWV9TVEFURV9LRVkgPSAncGx1Z2luQXBpUmVnaXN0cnknO1xuXG5jb25zdCBWQUxJREFURV9QTFVHSU5fQVBJX1BBWUxPQURTX0RFQlVHX1NXSVRDSF9ERUZJTklUSU9OOiBEZWJ1Z1N3aXRjaERlZmluaXRpb24gPSB7XG4gIGRlc2NyaXB0aW9uOiAnVmFsaWRhdGUgZXZlcnkgcGx1Z2luLUFQSSBjYWxsXFwncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZSBhZ2FpbnN0IHRoZSBjb250cmFjdCB0aGUgQVBJIGRlY2xhcmVzLCBhbmQgdGhyb3cgb24gYSBtaXNtYXRjaC4nLFxuICBpZDogJ29ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzJyxcbiAgaXNFbmFibGVkQnlEZWZhdWx0OiBmYWxzZSxcbiAgbmFtZTogJ1ZhbGlkYXRlIHBsdWdpbi1BUEkgcGF5bG9hZHMnXG59O1xuXG4vKipcbiAqIEhvdyBsb25nIHtAbGluayBQbHVnaW5BcGlSZWYud2hlbkF2YWlsYWJsZX0gd2FpdHMgYmVmb3JlIGdpdmluZyB1cCBhbmQgY2xhc3NpZnlpbmcgdGhlIGZhaWx1cmUuXG4gKi9cbmNvbnN0IERFRkFVTFRfV0hFTl9BVkFJTEFCTEVfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogVGhlIHBsdWdpbiBpbnN0YW5jZSB0aGF0IHB1Ymxpc2hlZCBlYWNoIHJlY29yZCB0aHJvdWdoIFRISVMgY29weSBvZiB0aGUgbGlicmFyeS5cbiAqXG4gKiBNb2R1bGUtcHJpdmF0ZSByYXRoZXIgdGhhbiBhIHJlY29yZCBmaWVsZCwgc28gdGhlIHdpcmUgZm9ybWF0IHN0YXlzIHVuY2hhbmdlZC4gQSByZWNvcmQgYW5vdGhlciBjb3B5IHB1Ymxpc2hlZFxuICogaXMgYWJzZW50IGhlcmUsIHdoaWNoIGlzIHN0aWxsIGVub3VnaCB0byBqdWRnZSBpdDogb25lIHBsdWdpbiBpbnN0YW5jZSBidW5kbGVzIG9uZSBjb3B5LCBzbyBhIHJlY29yZCB0aGlzIGNvcHlcbiAqIGRvZXMgbm90IGtub3cgd2FzIHB1Ymxpc2hlZCBieSBhIGRpZmZlcmVudCBpbnN0YW5jZS5cbiAqL1xuY29uc3QgcmVjb3JkUHVibGlzaGVycyA9IG5ldyBXZWFrTWFwPFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCwgUGx1Z2luPigpO1xuXG4vKipcbiAqIFdoaWNoIGhhbGYgb2YgYSBtZXRob2QgY2FsbCBhIHZhbGlkYXRpb24gZmFpbHVyZSBjYW1lIGZyb20uXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkFwaVBheWxvYWRLaW5kIHtcbiAgLyoqXG4gICAqIFRoZSBtZXRob2QncyBhcmd1bWVudHMuXG4gICAqL1xuICBJbnB1dCA9ICdpbnB1dCcsXG5cbiAgLyoqXG4gICAqIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBPdXRwdXQgPSAnb3V0cHV0J1xufVxuXG4vKipcbiAqIFRoZSByZWFzb24gYSBwbHVnaW4gQVBJIGNvdWxkIG5vdCBiZSBoYW5kZWQgb3Zlci5cbiAqXG4gKiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhlIGVudW0gaXMgdGhhdCB0aGVzZSBhcmUgdG9sZCBhcGFydC4gYEB2YW5ha2F0L3BsdWdpbi1hcGlgIGNhbm5vdCB0ZWxsIGFueSBvZiB0aGVtXG4gKiBhcGFydCwgYW5kIG5vdCB1bmlmb3JtbHk6IGBOb3RJbnN0YWxsZWRgIC8gYE5vdEVuYWJsZWRgIC8gYE5vdFB1Ymxpc2hlZGAgYWxsIHJlZHVjZSB0byBvbmUgYE5vdGljZWAgcGx1c1xuICogYHVuZGVmaW5lZGAsIHdoaWxlIGBWZXJzaW9uTWlzbWF0Y2hgIC8gYFNoYXBlTWlzbWF0Y2hgIHByb2R1Y2UgTk8gc2lnbmFsIGF0IGFsbCDigJQgaXQgbmV2ZXIgZXhhbWluZXMgd2hhdCBpdFxuICogZm91bmQsIHNvIGl0IGhhbmRzIHRoZSBvYmplY3Qgb3ZlciBhbmQgdGhlIG1pc21hdGNoIHN1cmZhY2VzIGxhdGVyLCBzb21ld2hlcmUgZWxzZSwgYXMgc29tZWJvZHkgZWxzZSdzXG4gKiBgVHlwZUVycm9yYC5cbiAqXG4gKiBAcmVtYXJrc1xuICoge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBjYW4gcmVwb3J0IHRoZSBmaXJzdCBmaXZlOyB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uUmV2b2tlZH1cbiAqIGlzIG5vdCBvbmUgb2YgdGhlbSwgYmVjYXVzZSBpdCBkZXNjcmliZXMgYSBoYW5kbGUgdGhhdCBXQVMgdmFsaWQgYW5kIGlzIGNhcnJpZWQgYnlcbiAqIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9IGluc3RlYWQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uIHtcbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkIGJ1dCBub3QgZW5hYmxlZC5cbiAgICovXG4gIE5vdEVuYWJsZWQgPSAnbm90RW5hYmxlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaXMgbm90IGluc3RhbGxlZCBpbiB0aGlzIHZhdWx0LlxuICAgKi9cbiAgTm90SW5zdGFsbGVkID0gJ25vdEluc3RhbGxlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkIGJ1dCBoYXMgbm90IHB1Ymxpc2hlZCBhbnkgQVBJLlxuICAgKi9cbiAgTm90UHVibGlzaGVkID0gJ25vdFB1Ymxpc2hlZCcsXG5cbiAgLyoqXG4gICAqIFRoZSBoYW5kbGUgd2FzIHZhbGlkIGJ1dCB0aGUgcHJvdmlkZXIgaGFzIHNpbmNlIHVubG9hZGVkLCBzbyBpdCBoYXMgYmVlbiByZXZva2VkLlxuICAgKi9cbiAgUmV2b2tlZCA9ICdyZXZva2VkJyxcblxuICAvKipcbiAgICogQSByZWNvcmQgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYnV0IHRoZSBBUEkgb2JqZWN0IGlzIG1pc3NpbmcgYSBtZXRob2QgdGhlIGNvbnRyYWN0XG4gICAqIGRlY2xhcmVzIOKAlCB0aGUgcHJvdmlkZXIncyBzaGlwcGVkIHNoYXBlIGFuZCBpdHMgZGVjbGFyZWQgc2hhcGUgZGlzYWdyZWUuXG4gICAqL1xuICBTaGFwZU1pc21hdGNoID0gJ3NoYXBlTWlzbWF0Y2gnLFxuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHB1Ymxpc2hlZCBhbiBBUEksIGJ1dCBubyBwdWJsaXNoZWQgY29udHJhY3QgdmVyc2lvbiBzYXRpc2ZpZXMgdGhlIHJlcXVlc3RlZCByYW5nZS5cbiAgICovXG4gIFZlcnNpb25NaXNtYXRjaCA9ICd2ZXJzaW9uTWlzbWF0Y2gnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSB0aGUgY29uc3VtZXIgY29tcGlsZWQgYWdhaW5zdCwgd2hpY2ggYSB0eXBlZCBjb250cmFjdCBpcyBjaGVja2VkIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmluZFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0ID0gb2JqZWN0PiB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIGNvbnRyYWN0IHZlcnNpb25zIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LiBUaGUgc2FtZSBydWxlcyBhc1xuICAgKiB7QGxpbmsgV2F0Y2hQbHVnaW5BcGlQYXJhbXMuYXBpVmVyc2lvblJhbmdlfSBhcHBseS5cbiAgICovXG4gIHJlYWRvbmx5IGFwaVZlcnNpb25SYW5nZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhlIENPTlNVTUVSIGV4cGVjdHMuIFdoZW4gc3VwcGxpZWQsIGl0IHdpbnMgb3ZlciB0aGUgcHJvdmlkZXIncyBwdWJsaXNoZWQgY29udHJhY3QsIGFzIGluXG4gICAqIHtAbGluayBXYXRjaFBsdWdpbkFwaVBhcmFtcy5jb250cmFjdH0uXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IEFwaUNvbnRyYWN0PFRBcGk+O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIEFQSSBhIHBsdWdpbiBleHBvc2VzOiB0aGUgb2JqZWN0LCB0aGUgY29udHJhY3QgdmVyc2lvbiBpdCBzYXRpc2ZpZXMsIGFuZCBvcHRpb25hbGx5IHRoZSBjb250cmFjdFxuICogaXRzZWxmLiBUaGlzIGlzIHtAbGluayBQdWJsaXNoUGx1Z2luQXBpUGFyYW1zfSB3aXRob3V0IHRoZSBwdWJsaXNoaW5nIHBsdWdpbiwgc28gYSBwbHVnaW4gY2FuIERFQ0xBUkUgd2hhdFxuICogaXQgZXhwb3NlcyB3aXRob3V0IGFsc28gc3RhdGluZyB3aG8gaXMgcHVibGlzaGluZyBpdCDigJQgd2hpY2ggaXMgd2hhdCBsZXRzIGBQbHVnaW5CYXNlLmdldFBsdWdpbkFwaXNgIGNvbGxlY3RcbiAqIHRoZSBkZWNsYXJhdGlvbnMgYW5kIGRvIHRoZSBwdWJsaXNoaW5nIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgYmVpbmcgZGVjbGFyZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQXBpRGVjbGFyYXRpb248VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIEFQSSBvYmplY3QgdG8gcHVibGlzaC4gSXRzIG1ldGhvZHMgYXJlIGhhbmRlZCB0byBjb25zdW1lcnMgdGhyb3VnaCBhIHJldm9jYWJsZSBoYW5kbGUsIGFuZCB0aGV5IGFyZVxuICAgKiBhbHdheXMgaW52b2tlZCB3aXRoIHRoaXMgb2JqZWN0IGFzIHRoZWlyIGB0aGlzYCwgc28gYW4gaW1wbGVtZW50YXRpb24gdXNpbmcgcHJpdmF0ZSBjbGFzcyBmaWVsZHMga2VlcHNcbiAgICogd29ya2luZy5cbiAgICovXG4gIHJlYWRvbmx5IGFwaTogVEFwaTtcblxuICAvKipcbiAgICogVGhlIENPTlRSQUNUIHZlcnNpb24sIGluIHNlbXZlciBmb3JtIOKAlCBpbmRlcGVuZGVudCBvZiB0aGUgcGx1Z2luJ3Mgb3duIHZlcnNpb24uIFBsdWdpbiBgMS40LjdgIG1heVxuICAgKiBwZXJmZWN0bHkgd2VsbCBleHBvc2UgQVBJIGAyLjAuMGAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250cmFjdCB0aGlzIHZlcnNpb24gb2YgdGhlIEFQSSBzYXRpc2ZpZXMuIE9wdGlvbmFsOiB3aGVuIG9taXR0ZWQsIG5vIHNoYXBlIGNoZWNrIGlzIHBlcmZvcm1lZCBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBiZWhhbGYgYW5kIHRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCAoaWYgYW55KSBpcyB1c2VkIGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBjb250cmFjdD86IEFwaUNvbnRyYWN0PFRBcGk+O1xufVxuXG4vKipcbiAqIEEgbGl2ZSByZWZlcmVuY2UgdG8gYW5vdGhlciBwbHVnaW4ncyBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIHRoZSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0LlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgcmVmIGlzIHRoZSBXSE9MRSBjb25zdW1lciBzdXJmYWNlLCBkZWxpYmVyYXRlbHkuIEEgcGxhaW4ge0BsaW5rIFByb21pc2V9IGNhbm5vdCBtb2RlbCB0aGlzIGJlY2F1c2UgaXRcbiAqIHNldHRsZXMgb25jZSwgd2hlcmVhcyBhdmFpbGFiaWxpdHkgaXMgYSByZXBlYXRpbmcgc2lnbmFsIChhdmFpbGFibGUg4oaSIGdvbmUg4oaSIGF2YWlsYWJsZSBhZ2FpbiBhY3Jvc3MgYVxuICogZGlzYWJsZS9lbmFibGUgY3ljbGUpIOKAlCB3aGljaCBpcyB3aHkge0BsaW5rIFBsdWdpbkFwaVJlZi53aGVuQXZhaWxhYmxlfSBpcyBhIG1ldGhvZCBPTiB0aGUgcmVmIHJhdGhlciB0aGFuXG4gKiB0aGUgdGhpbmcgaGFuZGVkIGJhY2suIFRoZSBgY2hhbmdlYCBldmVudCBleGlzdHMgZm9yIGNvbnN1bWVycyB0aGF0IG11c3QgcmVhY3QgcmF0aGVyIHRoYW4gcmVhZCwgYW5kIGlzXG4gKiBzZWNvbmRhcnk6IGl0IGltcG9zZXMgbm8gY2VyZW1vbnkgb24gdGhlIGNvbW1vbiBjYXNlLCB3aGljaCBpcyByZWFkaW5nIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZjxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8UGx1Z2luQXBpUmVmRXZlbnRNYXA+IHtcbiAgLyoqXG4gICAqIFdoeSB0aGUgQVBJIGlzIG5vdCBhdmFpbGFibGUgcmlnaHQgbm93LCBvciBgbnVsbGAgd2hpbGUgaXQgaXMuXG4gICAqXG4gICAqIENsYXNzaWZpZWQgYXQgdGhlIG1vbWVudCBvZiByZWFkaW5nLCBieSB0aGUgc2FtZSBwcm9iZSB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9IHVzZXMgZm9yIGl0c1xuICAgKiBlcnJvciwgc28gYSBjYWxsZXIgdGhhdCBtdXN0IGRlY2lkZSBzeW5jaHJvbm91c2x5IOKAlCB3aGljaCBtZXNzYWdlIHRvIHNob3csIHdoaWNoIGJ1dHRvbiB0byBvZmZlciDigJQgY2FuXG4gICAqIHRlbGwgXCJub3QgaW5zdGFsbGVkXCIgZnJvbSBcInRvbyBvbGRcIiB3aXRob3V0IHdhaXRpbmcgZm9yIGEgdGltZW91dC4gTGlrZSB7QGxpbmsgUGx1Z2luQXBpUmVmLnZhbHVlfSwgaXRcbiAgICogZGVzY3JpYmVzIG5vdzogZHVyaW5nIGEgY29uc3VtZXIncyBgb25sb2FkYCBhIHByb3ZpZGVyIHRoYXQgaGFzIG5vdCBsb2FkZWQgeWV0IHJlYWRzIGFzXG4gICAqIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5Ob3RQdWJsaXNoZWR9LlxuICAgKi9cbiAgcmVhZG9ubHkgdW5hdmFpbGFiaWxpdHlSZWFzb246IG51bGwgfCBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbjtcblxuICAvKipcbiAgICogVGhlIEFQSSwgb3IgYG51bGxgIHdoZW4gaXQgaXMgbm90IGN1cnJlbnRseSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEFsd2F5cyBjdXJyZW50LCBzeW5jaHJvbm91cywgYW5kIGZyZWUg4oCUIHRoZSByZWYgbWFpbnRhaW5zIGl0LCBzbyB0aGVyZSBpcyBubyByZWdpc3RyeSBsb29rdXAgcGVyIHJlYWQuXG4gICAqIGBudWxsYCBoZXJlIG1lYW5zIFwibm90IGF2YWlsYWJsZSByaWdodCBub3dcIiwgTk9UIFwibm90IGluc3RhbGxlZFwiOiBkdXJpbmcgYSBjb25zdW1lcidzIGBvbmxvYWRgIHRoZVxuICAgKiBwcm92aWRlciBtYXkgc2ltcGx5IG5vdCBoYXZlIGxvYWRlZCB5ZXQsIGFuZCB0aGUgdmFsdWUgYmVjb21lcyBub24tYG51bGxgIG9uIGl0cyBvd24uXG4gICAqL1xuICByZWFkb25seSB2YWx1ZTogbnVsbCB8IFRBcGk7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgQVBJIHRvIGJlY29tZSBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3YWl0LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIEFQSS5cbiAgICogQHRocm93cyBBIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yfSB3aG9zZSB7QGxpbmsgUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvci5yZWFzb259IHNheXMgd2hpY2ggb2ZcbiAgICogdGhlIGZpdmUgZmFpbHVyZXMgb2NjdXJyZWQsIGlmIHRoZSBBUEkgZG9lcyBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy5cbiAgICovXG4gIHJlYWRvbmx5IHdoZW5BdmFpbGFibGU6IChvcHRpb25zPzogV2hlbkF2YWlsYWJsZVBsdWdpbkFwaU9wdGlvbnMpID0+IFByb21pc2U8VEFwaT47XG59XG5cbi8qKlxuICogVGhlIGV2ZW50cyBhIHtAbGluayBQbHVnaW5BcGlSZWZ9IGZpcmVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVJlZkV2ZW50TWFwIHtcbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IGNoYW5nZXMg4oCUIGluY2x1ZGluZyB3aGVuIGl0IGJlY29tZXMgYG51bGxgIGJlY2F1c2UgdGhlIHByb3ZpZGVyXG4gICAqIHVubG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBleHBsaWNpdCBtZXNzYWdlLiBXaGVuIG9taXR0ZWQsIG9uZSBpcyBkZXJpdmVkIGZyb20gdGhlIHBsdWdpbiBpZCBhbmQgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4gd2hvc2UgQVBJIHdhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb247XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3J9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpc3N1ZXMgdGhlIHNjaGVtYSByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IG9yIHRoZSBvdXRwdXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHB1Ymxpc2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSBiZWluZyBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIFBsdWdpbkFwaURlY2xhcmF0aW9uPFRBcGk+IHtcbiAgLyoqXG4gICAqIFRoZSBjb21wb25lbnQgd2hvc2UgdW5sb2FkIHJldm9rZXMgdGhlIHJlY29yZC4gRGVmYXVsdHMgdG8ge0BsaW5rIFB1Ymxpc2hQbHVnaW5BcGlQYXJhbXMucGx1Z2lufSwgd2hpY2ggaXNcbiAgICogdGhlIHJpZ2h0IG93bmVyIGZvciBhbiBBUEkgcHVibGlzaGVkIGZvciBhcyBsb25nIGFzIHRoZSBwbHVnaW4gcnVucy5cbiAgICpcbiAgICogUGFzcyBhIG5hcnJvd2VyIG9uZSB3aGVuIHRoZSBBUEkgaXMgb25seSB2YWxpZCBmb3IgcGFydCBvZiB0aGUgcGx1Z2luJ3MgbGlmZSDigJQgYSBwbHVnaW4gd2hvc2UgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGlzIHRvcm4gZG93biBhbmQgcmVidWlsdCB3aGlsZSB0aGUgcGx1Z2luIGl0c2VsZiBzdGF5cyBsb2FkZWQgbXVzdCByZXZva2Ugd2l0aCB0aGUgc3VyZmFjZSwgb3IgaXRcbiAgICogbGVhdmVzIGNvbnN1bWVycyBob2xkaW5nIGhhbmRsZXMgaW50byBjb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIHRoZXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50PzogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHVibGlzaGluZyBwbHVnaW4uIFRoZSByZWNvcmQgaXMga2V5ZWQgYnkgaXRzIGBtYW5pZmVzdC5pZGAgYW5kIHJldm9rZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBwbHVnaW5cbiAgICogdW5sb2FkcywgdmlhIGBwbHVnaW4ucmVnaXN0ZXIoKWAuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSB0aGUgY29uc3VtZXIgY29tcGlsZWQgYWdhaW5zdCwgd2hpY2ggYSB0eXBlZCBjb250cmFjdCBpcyBjaGVja2VkIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hQbHVnaW5BcGlQYXJhbXM8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4ge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBjb250cmFjdCB2ZXJzaW9ucyB0aGUgY29uc3VtZXIgY29tcGlsZWQgYWdhaW5zdCwgZS5nLiBgJ14yJ2AuIFRoZSBoaWdoZXN0IHB1Ymxpc2hlZFxuICAgKiB2ZXJzaW9uIHNhdGlzZnlpbmcgaXQgd2lucy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhlIHJhbmdlIGlzIGV2YWx1YXRlZCBieSBgY29tcGFyZS12ZXJzaW9uc2AsIHdoaWNoIGFjY2VwdHMgYF5gLCBgfmAsIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBhbmQgYHhgXG4gICAqIHdpbGRjYXJkcyDigJQgYnV0IE5PVCBhIGJhcmUgYCpgLiBTcGVsbCBcImFueSB2ZXJzaW9uXCIgYXMgYCc+PTAuMC4wJ2AuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZSwgdXNlZCB0byBjbGFzc2lmeSBhIGZhaWx1cmUgYXMgbm90LWluc3RhbGxlZCB2cyBub3QtZW5hYmxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IG93bmluZyB0aGUgc3Vic2NyaXB0aW9uLiBUaGUgd2F0Y2ggaXMgdG9ybiBkb3duIHdoZW4gaXQgdW5sb2Fkcy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgY29udHJhY3QgdGhlIENPTlNVTUVSIGV4cGVjdHMuIE9wdGlvbmFsLCBhbmQgaXQgd2lucyBvdmVyIHRoZSBwcm92aWRlcidzIHB1Ymxpc2hlZCBjb250cmFjdCB3aGVuXG4gICAqIHN1cHBsaWVkIOKAlCBpdCBpcyB0aGUgY29uc3VtZXIncyBvd24gY29tcGlsZWQtYWdhaW5zdCBleHBlY3RhdGlvbiwgc28gaXQgaXMgdGhlIG9uZSB3aG9zZSB2aW9sYXRpb24gaXNcbiAgICogdGhlIGNvbnN1bWVyJ3MgcHJvYmxlbS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRyYWN0PzogQXBpQ29udHJhY3Q8VEFwaT47XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwcm92aWRpbmcgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luQXBpUmVmLndoZW5BdmFpbGFibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBhbmQgY2xhc3NpZnlpbmcgdGhlIGZhaWx1cmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwMDAwXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZU1ldGhvZFdyYXBwZXJ9LlxuICovXG5pbnRlcmZhY2UgQ3JlYXRlTWV0aG9kV3JhcHBlclBhcmFtcyB7XG4gIHJlYWRvbmx5IG1ldGhvZENvbnRyYWN0OiBBcGlNZXRob2RDb250cmFjdCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGh1bWFuLXJlYWRhYmxlIG5hbWUgdXNlZCBpbiBlcnJvciBtZXNzYWdlcyBhbmQgZGVidWcgb3V0cHV0LiBOT1QgYSBrZXkg4oCUIHNlZSB7QGxpbmsgcHJvcGVydHlLZXl9LlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBrZXkgdGhlIG1ldGhvZCBpcyBhY3R1YWxseSByZWFkIGJ5LCB3aGljaCBtYXkgYmUgYSBzeW1ib2wuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0eUtleTogUHJvcGVydHlLZXk7XG5cbiAgcmVhZG9ubHkgdGFyZ2V0OiBvYmplY3Q7XG59XG5cbi8qKlxuICogVGhlIHJlYWxtLWdsb2JhbCByZWdpc3RyeSBzaGFyZWQgYnkgZXZlcnkgY29weSBvZiB0aGlzIGxpYnJhcnkgaW4gdGhlIHJlbmRlcmVyLlxuICovXG5pbnRlcmZhY2UgUGx1Z2luQXBpUmVnaXN0cnkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC1kZXYtdG9vbGtpdC9yZWFkb25seS1pbnRlcmZhY2UtbWVtYmVycyAtLSBSZWdpc3RyeSBpbml0aWFsaXphdGlvbiByZXBhaXJzIGEgbWlzc2luZyByZWNvcmRzIGNvbGxlY3Rpb24uXG4gIHJlY29yZHM6IFJlY29yZDxzdHJpbmcsIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZFtdPjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gUmVnaXN0cnkgaW5pdGlhbGl6YXRpb24gcmVwYWlycyBhIG1pc3Npbmcgc3Vic2NyaWJlcnMgY29sbGVjdGlvbi5cbiAgc3Vic2NyaWJlcnM6ICgoKSA9PiB2b2lkKVtdO1xufVxuXG4vKipcbiAqIEEgcmVjb3JkIGFzIGl0IHNpdHMgaW4gdGhlIHNoYXJlZCByZWdpc3RyeS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBpcyB0aGUgV0lSRSBGT1JNQVQgYmV0d2VlbiBkaWZmZXJlbnQgY29waWVzIG9mIHRoaXMgbGlicmFyeSwgc28gaXQgaG9sZHMgbm90aGluZyBidXQgcGxhaW4gZGF0YVxuICogYW5kIHBsYWluIGZ1bmN0aW9ucywgYW5kIGV2ZXJ5IHJlYWQgb2YgaXQgZWxzZXdoZXJlIGluIHRoaXMgZmlsZSBpcyBzdHJ1Y3R1cmFsLlxuICpcbiAqIFVuZXhwb3J0ZWQgYW5kIG5vbmV0aGVsZXNzIFBVQkxJQzogdGhlIGBQbHVnaW4gQVBJIHByb3RvY29sYCBndWlkZSBkb2N1bWVudHMgdGhlc2UgZml2ZSBmaWVsZCBuYW1lcyBmb3JcbiAqIHRoaXJkLXBhcnR5IHBsdWdpbnMgdGhhdCByZWFkIHRoZSByZWdpc3RyeSB3aXRob3V0IHRoaXMgbGlicmFyeSwgYW5kIHJlcHJvZHVjZXMgdGhlIGludGVyZmFjZSB2ZXJiYXRpbVxuICogZm9yIHRoZW0gdG8gcGFzdGUuIEl0IHN0YXlzIHVuZXhwb3J0ZWQgYmVjYXVzZSBubyBjb25zdW1lciBPRiB0aGlzIGxpYnJhcnkgZXZlciB0b3VjaGVzIGEgcmVjb3JkIOKAlFxuICoge0BsaW5rIHdhdGNoUGx1Z2luQXBpfSBpcyB0aGVpciB3aG9sZSBzdXJmYWNlIOKAlCBzbyBleHBvcnRpbmcgaXQgd291bGQgd2lkZW4gdGhlIHBhY2thZ2UncyBBUEkgZm9yIGFuXG4gKiBhdWRpZW5jZSB0aGF0IGRvZXMgbm90IGltcG9ydCB0aGUgcGFja2FnZS4gUmVuYW1pbmcgYSBmaWVsZCBoZXJlIGlzIGEgYnJlYWtpbmcgY2hhbmdlIHRvIHRoZSBndWlkZS5cbiAqL1xuaW50ZXJmYWNlIFB1Ymxpc2hlZFBsdWdpbkFwaVJlY29yZCB7XG4gIHJlYWRvbmx5IGFwaTogb2JqZWN0O1xuICByZWFkb25seSBhcGlWZXJzaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbnRyYWN0OiBBcGlDb250cmFjdDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gUmVtb3ZpbmcgYSBwdWJsaXNoZWQgQVBJIG1hcmtzIGl0cyBleGlzdGluZyBzaGFyZWQgcmVjb3JkIGFzIHJldm9rZWQuXG4gIGlzUmV2b2tlZDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdmFsaWRhdGVQYXlsb2FkfS5cbiAqL1xuaW50ZXJmYWNlIFZhbGlkYXRlUGF5bG9hZFBhcmFtcyB7XG4gIHJlYWRvbmx5IG1ldGhvZE5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgcGF5bG9hZEtpbmQ6IFBsdWdpbkFwaVBheWxvYWRLaW5kO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzY2hlbWE6IFN0YW5kYXJkU2NoZW1hVjE7XG4gIHJlYWRvbmx5IHZhbHVlOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEhvbGRzIHdoYXQgYSB3YXRjaCBuZWVkcyByZWdhcmRsZXNzIG9mIHRoZSBBUEkgdHlwZSBpdCBpcyB0eXBlZCBhZ2FpbnN0LCBzbyB0aGUge0BsaW5rIG1peGluQXN5bmNFdmVudHN9XG4gKiBtaXhpbiBoYXMgYSByZWFsIGJhc2UgdG8gZXh0ZW5kLlxuICovXG5hYnN0cmFjdCBjbGFzcyBQbHVnaW5BcGlXYXRjaEJhc2Uge1xuICBwcm90ZWN0ZWQgaGFuZGxlOiBudWxsIHwgb2JqZWN0ID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgcmVjb3JkOiBudWxsIHwgUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkID0gbnVsbDtcblxuICAvLyBBIGBwcm90ZWN0ZWRgIGNvbnN0cnVjdG9yIGlzIG5vdCBhc3NpZ25hYmxlIHRvIGBBYnN0cmFjdENvbnN0cnVjdG9yPG9iamVjdD5gLCB3aGljaCBpcyB3aGF0XG4gIC8vIGBtaXhpbkFzeW5jRXZlbnRzYCBhY2NlcHRzLCBzbyB0aGlzIHN0YXlzIHB1YmxpYyBldmVuIHRob3VnaCBvbmx5IHRoZSBzdWJjbGFzcyBiZWxvdyBjYWxscyBpdC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwYXJhbXM6IFdhdGNoUGx1Z2luQXBpUGFyYW1zKSB7fVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGVycm9yIGRlc2NyaWJpbmcgd2h5IHRoZSBBUEkgaXMgbm90IGF2YWlsYWJsZSByaWdodCBub3cuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBjbGFzc2lmaWVkIGVycm9yLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVVuYXZhaWxhYmxlRXJyb3IoKTogUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yKHtcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHJlYXNvbjogcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHRoaXMucGFyYW1zKVxuICAgIH0pO1xuICB9XG59XG5cbmNsYXNzIFBsdWdpbkFwaVJlZkltcGw8VEFwaSBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPFBsdWdpbkFwaVJlZkV2ZW50TWFwPigpKFBsdWdpbkFwaVdhdGNoQmFzZSkgaW1wbGVtZW50cyBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBwdWJsaWMgZ2V0IHVuYXZhaWxhYmlsaXR5UmVhc29uKCk6IG51bGwgfCBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlID09PSBudWxsID8gcmVzb2x2ZVVuYXZhaWxhYmlsaXR5UmVhc29uKHRoaXMucGFyYW1zKSA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IG51bGwgfCBUQXBpIHtcbiAgICByZXR1cm4gY2FzdFRvPG51bGwgfCBUQXBpPih0aGlzLmhhbmRsZSk7XG4gIH1cblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb21wdXRlcyB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSByZWdpc3RyeSwgZmlyaW5nIGBjaGFuZ2VgIG9ubHkgd2hlbiBpdCBhY3R1YWxseSBjaGFuZ2VkLlxuICAgKi9cbiAgcHVibGljIHJlZnJlc2goKTogdm9pZCB7XG4gICAgY29uc3QgcmVjb3JkID0gc2VsZWN0UmVjb3JkKHRoaXMucGFyYW1zKTtcbiAgICBpZiAocmVjb3JkID09PSB0aGlzLnJlY29yZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVjb3JkID0gcmVjb3JkO1xuICAgIHRoaXMuaGFuZGxlID0gcmVjb3JkID09PSBudWxsID8gbnVsbCA6IGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQsIHRoaXMucGFyYW1zLmNvbnRyYWN0KTtcbiAgICB0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHdoZW5BdmFpbGFibGUob3B0aW9ucz86IFdoZW5BdmFpbGFibGVQbHVnaW5BcGlPcHRpb25zKTogUHJvbWlzZTxUQXBpPiB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoY3VycmVudFZhbHVlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcnVuV2l0aFRpbWVvdXQ8VEFwaT4oe1xuICAgICAgICBvcGVyYXRpb25GdW5jdGlvbjogYXN5bmMgKGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VEFwaT4gPT4gYXdhaXQgdGhpcy53YWl0Rm9yVmFsdWUoYWJvcnRTaWduYWwpLFxuICAgICAgICBvcGVyYXRpb25OYW1lOiBgd2F0Y2hQbHVnaW5BcGkoXCIke3RoaXMucGFyYW1zLnBsdWdpbklkfVwiKS53aGVuQXZhaWxhYmxlYCxcbiAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy50aW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9XSEVOX0FWQUlMQUJMRV9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyB0aGlzLmNyZWF0ZVVuYXZhaWxhYmxlRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JWYWx1ZShhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPFRBcGk+IHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8VEFwaT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgLy8gVGhlIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgRklSU1QgYW5kIGludm9rZWQgdGhyb3VnaCBhIHRodW5rLCBzbyBgZXZlbnRSZWZgIGlzIGFscmVhZHkgYm91bmQgYnkgdGhlXG4gICAgICAvLyB0aW1lIGFueXRoaW5nIGNhbiByZWFjaCBpdCDigJQgd2hpY2ggaXMgd2hhdCBsZXRzIGBjbGVhblVwYCBiZSB1bmNvbmRpdGlvbmFsIHJhdGhlciB0aGFuIG51bGwtZ3VhcmRlZC5cbiAgICAgIGNvbnN0IGV2ZW50UmVmID0gdGhpcy5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICBoYW5kbGVDaGFuZ2UoKTtcbiAgICAgIH0pO1xuXG4gICAgICBmdW5jdGlvbiBjbGVhblVwKCk6IHZvaWQge1xuICAgICAgICBldmVudFJlZi5hc3luY0V2ZW50U291cmNlLm9mZnJlZihldmVudFJlZik7XG4gICAgICAgIGFib3J0U2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBoYW5kbGVBYm9ydCgpOiB2b2lkIHtcbiAgICAgICAgY2xlYW5VcCgpO1xuICAgICAgICByZWplY3QoYWJvcnRTaWduYWwucmVhc29uIGFzIEVycm9yKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFuZGxlQ2hhbmdlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsZWFuVXAoKTtcbiAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9O1xuXG4gICAgICBhYm9ydFNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGhhbmRsZUFib3J0KTtcbiAgICAgIGhhbmRsZUNoYW5nZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwbHVnaW4gQVBJIGNhbm5vdCBiZSBoYW5kZWQgb3ZlciwgY2FycnlpbmcgdGhlIHtAbGluayBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbn0gdGhhdCBzYXlzXG4gKiB3aHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5BcGlVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIHBsdWdpbiB3aG9zZSBBUEkgd2FzIHJlcXVlc3RlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgZml2ZSBmYWlsdXJlcyBvY2N1cnJlZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBlcnJvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5tZXNzYWdlID8/IGBUaGUgQVBJIG9mIHRoZSBwbHVnaW4gXCIke3BhcmFtcy5wbHVnaW5JZH1cIiBpcyB1bmF2YWlsYWJsZTogJHtwYXJhbXMucmVhc29ufS5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgICB0aGlzLnJlYXNvbiA9IHBhcmFtcy5yZWFzb247XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHByb3BlcnR5IGlzIHJlYWQgZnJvbSBhIGhhbmRsZSB3aG9zZSBwcm92aWRlciBoYXMgc2luY2UgdW5sb2FkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgcG9pbnQgb2YgaGFuZGluZyBvdXQgYSByZXZvY2FibGUgaGFuZGxlIHJhdGhlciB0aGFuIHRoZSByYXcgb2JqZWN0OiBhIGNvbnN1bWVyIHRoYXQgY2FjaGVkIHRoZVxuICogQVBJIGluIGEgZmllbGQgYW5kIGtlcHQgdXNpbmcgaXQgYWNyb3NzIGEgZGlzYWJsZSBnZXRzIGFuIGVycm9yIG5hbWluZyB0aGUgcHJvdmlkZXIsIGluc3RlYWQgb2ZcbiAqIGBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIHVuZGVmaW5lZGAgc29tZXdoZXJlIGRlZXAgaW5zaWRlIGEgdG9ybi1kb3duIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkFwaVJldm9rZWRFcnJvciBleHRlbmRzIFBsdWdpbkFwaVVuYXZhaWxhYmxlRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBQbHVnaW5BcGlSZXZva2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luIHdob3NlIEFQSSB3YXMgcmV2b2tlZC5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogYFRoZSBBUEkgb2YgdGhlIHBsdWdpbiBcIiR7cGx1Z2luSWR9XCIgaGFzIGJlZW4gcmV2b2tlZCwgYmVjYXVzZSB0aGUgcGx1Z2luIHdhcyB1bmxvYWRlZC5gLFxuICAgICAgcGx1Z2luSWQsXG4gICAgICByZWFzb246IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlJldm9rZWRcbiAgICB9KTtcbiAgICB0aGlzLm5hbWUgPSAnUGx1Z2luQXBpUmV2b2tlZEVycm9yJztcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcHVibGlzaGVkIEFQSSdzIHBheWxvYWQgZmFpbHMgdGhlIHNjaGVtYSBpdHMgY29udHJhY3QgZGVjbGFyZXMuXG4gKlxuICogT25seSBldmVyIHRocm93biB3aGlsZSB0aGUgYG9ic2lkaWFuLWxpYjp2YWxpZGF0ZS1wbHVnaW4tYXBpLXBheWxvYWRzYCBkZWJ1ZyBzd2l0Y2ggaXMgb24gKHNlZVxuICoge0BsaW5rIGdldFZhbGlkYXRlUGx1Z2luQXBpUGF5bG9hZHNEZWJ1Z1N3aXRjaH0pIOKAlCBvdGhlcndpc2Ugbm8gcGF5bG9hZCBpcyB2YWxpZGF0ZWQgYXQgYWxsLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIGlzc3VlcyB0aGUgc2NoZW1hIHJlcG9ydGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzc3VlczogcmVhZG9ubHkgU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdob3NlIHBheWxvYWQgZmFpbGVkIHZhbGlkYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0aG9kTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFBsdWdpbkFwaVZhbGlkYXRpb25FcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGVycm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihcbiAgICAgIGBUaGUgJHtwYXJhbXMucGF5bG9hZEtpbmR9IG9mIFwiJHtwYXJhbXMucGx1Z2luSWR9XCIgQVBJIG1ldGhvZCBcIiR7cGFyYW1zLm1ldGhvZE5hbWV9XCIgZmFpbGVkIHZhbGlkYXRpb246ICR7Zm9ybWF0SXNzdWVzKHBhcmFtcy5pc3N1ZXMpfWBcbiAgICApO1xuICAgIHRoaXMubmFtZSA9ICdQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3InO1xuICAgIHRoaXMuaXNzdWVzID0gcGFyYW1zLmlzc3VlcztcbiAgICB0aGlzLm1ldGhvZE5hbWUgPSBwYXJhbXMubWV0aG9kTmFtZTtcbiAgICB0aGlzLnBsdWdpbklkID0gcGFyYW1zLnBsdWdpbklkO1xuICB9XG59XG5cbi8qKlxuICogTG9va3MgYW5vdGhlciBwbHVnaW4ncyBBUEkgdXAgT05DRSwgYW5kIGFuc3dlcnMgZm9yIHRoaXMgbW9tZW50IG9ubHkuXG4gKlxuICogSXQgYXBwbGllcyB0aGUgc2FtZSBzZWxlY3Rpb24gcnVsZSBhcyB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9IGFuZCBoYW5kcyBvdXQgdGhlIHNhbWUgcmV2b2NhYmxlIGhhbmRsZSwgYnV0IGl0XG4gKiBzdWJzY3JpYmVzIHRvIG5vdGhpbmcsIHNvIGl0IG5ldmVyIGxlYXJucyB0aGF0IHRoZSBhbnN3ZXIgY2hhbmdlZC4gVGhhdCBtYWtlcyBpdCB0aGUgcmlnaHQgc2hhcGUgZm9yIGEgZnJlZVxuICogZnVuY3Rpb24gdGhhdCBoYXMgbm8gY29tcG9uZW50IHRvIG93biBhIHdhdGNoIGFuZCBydW5zIG9uIGEgdXNlci1kcml2ZW4gcGF0aCwgc3VjaCBhcyBhIGJhY2tsaW5rIGxvb2t1cCBtYWRlXG4gKiB3aGlsZSBhIHJlbmFtZSBpcyBoYW5kbGVkLiBJdCBpcyB0aGUgd3Jvbmcgc2hhcGUgZm9yIGBvbmxvYWRgOiBwbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWQgb3JkZXIsIHNvIGFcbiAqIGBudWxsYCB0aGVyZSBtZWFucyBcIm5vdCB5ZXRcIiBhcyBvZnRlbiBhcyBcIm5vdCBpbnN0YWxsZWRcIi4gQ29kZSB0aGF0IGhhcyBhIGNvbXBvbmVudCBhbmQgcmVhZHMgdGhlIEFQSSBtb3JlXG4gKiB0aGFuIG9uY2Ugc2hvdWxkIGhvbGQgYSB7QGxpbmsgd2F0Y2hQbHVnaW5BcGl9IHJlZiBpbnN0ZWFkLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdHlwZSB0aGUgY29uc3VtZXIgY29tcGlsZWQgYWdhaW5zdC5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGxvb2t1cC5cbiAqIEByZXR1cm5zIFRoZSBBUEksIG9yIGBudWxsYCB3aGVuIG5vIGxpdmUgcmVjb3JkIHNhdGlzZmllcyB0aGUgcmFuZ2UgYW5kIHRoZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQbHVnaW5BcGk8VEFwaSBleHRlbmRzIG9iamVjdD4ocGFyYW1zOiBGaW5kUGx1Z2luQXBpUGFyYW1zPE5vSW5mZXI8VEFwaT4+KTogbnVsbCB8IFRBcGkge1xuICBnZXRWYWxpZGF0ZVBsdWdpbkFwaVBheWxvYWRzRGVidWdTd2l0Y2goKTtcbiAgY29uc3QgcmVjb3JkID0gc2VsZWN0UmVjb3JkKHBhcmFtcyk7XG4gIHJldHVybiByZWNvcmQgPT09IG51bGwgPyBudWxsIDogY2FzdFRvPFRBcGk+KGNyZWF0ZVJldm9jYWJsZUhhbmRsZShyZWNvcmQsIHBhcmFtcy5jb250cmFjdCkpO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGRlYnVnIHN3aXRjaCB0aGF0IGRlY2lkZXMgd2hldGhlciBhIHBsdWdpbi1BUEkgY2FsbCdzIHBheWxvYWRzIGFyZSB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgY29udHJhY3QuXG4gKlxuICogSXRzIGlkIGlzIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgYW5kIGl0IGlzIG9mZiBieSBkZWZhdWx0LiBXaGlsZSBpdCBpcyBvbiwgZXZlcnkgY2FsbFxuICogdGhyb3VnaCBhIGhhbmRsZSBmcm9tIHtAbGluayB3YXRjaFBsdWdpbkFwaX0gb3Ige0BsaW5rIGZpbmRQbHVnaW5BcGl9IGNoZWNrcyBpdHMgYXJndW1lbnRzIGFuZCBpdHMgcmV0dXJuIHZhbHVlXG4gKiBhZ2FpbnN0IHRoZSBtZXRob2QncyBkZWNsYXJlZCBzY2hlbWFzIGFuZCB0aHJvd3MgYSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBvbiBhIG1pc21hdGNoLiBUaGVcbiAqIGBvYnNpZGlhbi1saWI6UGx1Z2luQXBpYCBkZWJ1Z2dlciBkb2VzIG5vdCBhZmZlY3QgaXQ6IHRoYXQgb25seSBsb2dzLlxuICpcbiAqIFRoZSBzd2l0Y2ggaXMgcmVnaXN0ZXJlZCBvbiBldmVyeSByZWFkLCB3aGljaCBpcyBpZGVtcG90ZW50LCBhbmQgd2hlbmV2ZXIgYW4gQVBJIGlzIHB1Ymxpc2hlZCwgd2F0Y2hlZCBvciBsb29rZWRcbiAqIHVwLCBzbyBhIGRlYnVnLXNldHRpbmdzIFVJIGxpc3RzIGl0IGFzIHNvb24gYXMgYW55IHBsdWdpbiBBUEkgaXMgaW4gcGxheS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVidWcgc3dpdGNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsaWRhdGVQbHVnaW5BcGlQYXlsb2Fkc0RlYnVnU3dpdGNoKCk6IERlYnVnU3dpdGNoIHtcbiAgcmV0dXJuIHJlZ2lzdGVyRGVidWdTd2l0Y2goVkFMSURBVEVfUExVR0lOX0FQSV9QQVlMT0FEU19ERUJVR19TV0lUQ0hfREVGSU5JVElPTik7XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGEgcGx1Z2luJ3MgQVBJIHNvIG90aGVyIHBsdWdpbnMgY2FuIGNvbnN1bWUgaXQsIGtleWVkIGJ5IHRoZSBwbHVnaW4ncyBgbWFuaWZlc3QuaWRgIGFuZCByZXZva2VkXG4gKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBsdWdpbiB1bmxvYWRzLlxuICpcbiAqIFNldmVyYWwgY29udHJhY3QgdmVyc2lvbnMgbWF5IGJlIHB1Ymxpc2hlZCBzaWRlIGJ5IHNpZGUsIHNvIGEgcHJvdmlkZXIgY2FuIG1vdmUgdG8gYDIuMC4wYCB3aXRob3V0IGJyZWFraW5nXG4gKiBjb25zdW1lcnMgc3RpbGwgcGlubmVkIHRvIGBeMWAuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0eXBlIGJlaW5nIHB1Ymxpc2hlZC5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgcHVibGlzaGluZy5cbiAqIEEgcmVjb3JkIG9mIHRoZSBzYW1lIGBhcGlWZXJzaW9uYCBsZWZ0IGJlaGluZCBieSBhIHByZXZpb3VzIGluc3RhbmNlIG9mIHRoZSBzYW1lIHBsdWdpbiBpcyByZXZva2VkIGFuZCByZXBsYWNlZFxuICogd2hlbiB0aGUgcHVibGlzaGluZyBpbnN0YW5jZSBpcyB0aGUgb25lIE9ic2lkaWFuIGN1cnJlbnRseSBob2xkcyBmb3IgdGhhdCBpZC5cbiAqXG4gKiBAdGhyb3dzIEFuIHtAbGluayBFcnJvcn0gaWYgdGhpcyBwbHVnaW4gaW5zdGFuY2UgaGFzIGFscmVhZHkgcHVibGlzaGVkIHRoaXMgZXhhY3QgYGFwaVZlcnNpb25gLCBvciBhbm90aGVyXG4gKiBpbnN0YW5jZSBob2xkcyBpdCB3aGlsZSB0aGlzIG9uZSBpcyBub3QgdGhlIGxpdmUgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaXNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogUHVibGlzaFBsdWdpbkFwaVBhcmFtczxUQXBpPik6IHZvaWQge1xuICBnZXRWYWxpZGF0ZVBsdWdpbkFwaVBheWxvYWRzRGVidWdTd2l0Y2goKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luLm1hbmlmZXN0LmlkO1xuICBjb25zdCByZWdpc3RyeSA9IGdldFJlZ2lzdHJ5KCk7XG4gIGNvbnN0IGV4aXN0aW5nUmVjb3JkID0gcmVnaXN0cnkucmVjb3Jkc1twbHVnaW5JZF0/LmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkLmFwaVZlcnNpb24gPT09IHBhcmFtcy5hcGlWZXJzaW9uKTtcbiAgaWYgKGV4aXN0aW5nUmVjb3JkKSB7XG4gICAgaWYgKCFpc1N0YWxlUmVjb3JkKGV4aXN0aW5nUmVjb3JkLCBwYXJhbXMucGx1Z2luKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgYWxyZWFkeSBwdWJsaXNoZWQgdGhlIEFQSSB2ZXJzaW9uIFwiJHtwYXJhbXMuYXBpVmVyc2lvbn1cIi5gKTtcbiAgICB9XG5cbiAgICByZXZva2VSZWNvcmQoZXhpc3RpbmdSZWNvcmQpO1xuICB9XG5cbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcGx1Z2luSWRdID8/IFtdO1xuICByZWdpc3RyeS5yZWNvcmRzW3BsdWdpbklkXSA9IHJlY29yZHM7XG5cbiAgY29uc3QgcmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQgPSB7XG4gICAgYXBpOiBwYXJhbXMuYXBpLFxuICAgIGFwaVZlcnNpb246IHBhcmFtcy5hcGlWZXJzaW9uLFxuICAgIGNvbnRyYWN0OiBwYXJhbXMuY29udHJhY3QgPz8ge30sXG4gICAgaXNSZXZva2VkOiBmYWxzZSxcbiAgICBwbHVnaW5JZFxuICB9O1xuICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgcmVjb3JkUHVibGlzaGVycy5zZXQocmVjb3JkLCBwYXJhbXMucGx1Z2luKTtcbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcblxuICAocGFyYW1zLmNvbXBvbmVudCA/PyBwYXJhbXMucGx1Z2luKS5yZWdpc3RlcigoKSA9PiB7XG4gICAgcmV2b2tlUmVjb3JkKHJlY29yZCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFdhdGNoZXMgYW5vdGhlciBwbHVnaW4ncyBBUEkgYW5kIHJldHVybnMgYSBsaXZlIHtAbGluayBQbHVnaW5BcGlSZWZ9IHdob3NlIHtAbGluayBQbHVnaW5BcGlSZWYudmFsdWV9IHN0YXlzXG4gKiBjb3JyZWN0IGFjcm9zcyB0aGUgcHJvdmlkZXIncyBsb2FkLCB1bmxvYWQsIGFuZCByZS1lbmFibGUuXG4gKlxuICogVGhpcyBpcyB0aGUgY29uc3VtZXIgc3VyZmFjZSBmb3IgYW55dGhpbmcgdGhhdCBoYXMgYSBjb21wb25lbnQuIEl0cyBvbmUtc2hvdCBzaWJsaW5nIHtAbGluayBmaW5kUGx1Z2luQXBpfVxuICogb25seSBhbnN3ZXJzIFwibm93XCIgYW5kIG5ldmVyIHRlbGxzIHlvdSB3aGVuIFwibm93XCIgY2hhbmdlZCwgc28gY2FsbGluZyBpdCBkdXJpbmcgYG9ubG9hZGAgcmVhZHMgYG51bGxgIGFuZFxuICogaW52aXRlcyB0aGUgY29uY2x1c2lvbiBcIm5vdCBpbnN0YWxsZWRcIi4gQSBjb25zdW1lciB0aGF0IG5lZWRzIGEgc3luY2hyb25vdXMgYW5zd2VyIGluc2lkZSBhIGNhbGxiYWNrIHdob3NlXG4gKiBzaWduYXR1cmUgZm9yYmlkcyBgYXdhaXRgIOKAlCBgY2hlY2tDYWxsYmFjayhpc0NoZWNraW5nKTogYm9vbGVhbmAsIGBjYW5FeGVjdXRlKClgLCBhIHNldHRpbmdzLXJvdyBgdmlzaWJsZWBcbiAqIHByZWRpY2F0ZSDigJQgaG9sZHMgdGhlIHJlZiAob3IgdGhlIHZhbHVlIGl0IG1haW50YWlucykgaW4gYSBmaWVsZCBhbmQgcmVhZHMgdGhhdCwgd2hpY2ggaXMgYm90aCBjaGVhcGVyIGFuZFxuICogY29ycmVjdCBhY3Jvc3MgQk9USCBlZGdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHR5cGUgdGhlIGNvbnN1bWVyIGNvbXBpbGVkIGFnYWluc3QuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3YXRjaC5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoUGx1Z2luQXBpPFRBcGkgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtczogV2F0Y2hQbHVnaW5BcGlQYXJhbXM8Tm9JbmZlcjxUQXBpPj4pOiBQbHVnaW5BcGlSZWY8VEFwaT4ge1xuICBnZXRWYWxpZGF0ZVBsdWdpbkFwaVBheWxvYWRzRGVidWdTd2l0Y2goKTtcbiAgY29uc3QgcmVmID0gbmV3IFBsdWdpbkFwaVJlZkltcGw8VEFwaT4ocGFyYW1zKTtcbiAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdWJzY3JpYmUoKCkgPT4ge1xuICAgIHJlZi5yZWZyZXNoKCk7XG4gIH0pO1xuICBwYXJhbXMuY29tcG9uZW50LnJlZ2lzdGVyKHVuc3Vic2NyaWJlKTtcbiAgcmVmLnJlZnJlc2goKTtcbiAgcmV0dXJuIHJlZjtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsbHkgZGV0ZWN0cyBhIHRoZW5hYmxlLiBBIGNyb3NzLWNvcHkgdmFsdWUgbWF5IGNvbWUgZnJvbSBhbm90aGVyIHJlYWxtLCBzbyBgaW5zdGFuY2VvZiBQcm9taXNlYCBpc1xuICogbm90IHVzYWJsZSBoZXJlIOKAlCB0aGUgc2FtZSBkaXNjaXBsaW5lIHRoZSByZWdpc3RyeSByZWNvcmRzIGZvbGxvdy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdmFsdWUgdGhlIHRoZW5hYmxlIHJlc29sdmVzIHRvLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgdmFsdWUgaXMgdGhlbmFibGUuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrSXNQcm9taXNlTGlrZTxUPih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAmJiB2YWx1ZSAhPT0gbnVsbFxuICAgICYmICd0aGVuJyBpbiB2YWx1ZVxuICAgICYmIHR5cGVvZiAodmFsdWUgYXMgUHJvbWlzZUxpa2U8VD4pLnRoZW4gPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQ2hlY2tzIHRoYXQgZXZlcnkgbWV0aG9kIHRoZSBlZmZlY3RpdmUgY29udHJhY3QgZGVjbGFyZXMgaXMgYWN0dWFsbHkgcHJlc2VudCBvbiB0aGUgcHVibGlzaGVkIEFQSS5cbiAqXG4gKiBAcGFyYW0gcmVjb3JkIC0gVGhlIHB1Ymxpc2hlZCByZWNvcmQuXG4gKiBAcGFyYW0gY29uc3VtZXJDb250cmFjdCAtIFRoZSBjb25zdW1lcidzIG93biBjb250cmFjdCwgd2hpY2ggd2lucyB3aGVuIHN1cHBsaWVkLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHNoYXBlIG1hdGNoZXMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTWF0Y2hlc0NvbnRyYWN0U2hhcGUocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQsIGNvbnN1bWVyQ29udHJhY3Q/OiBBcGlDb250cmFjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb250cmFjdCA9IGNvbnN1bWVyQ29udHJhY3QgPz8gcmVjb3JkLmNvbnRyYWN0O1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29udHJhY3QpLmV2ZXJ5KChtZXRob2ROYW1lKSA9PiB0eXBlb2YgZ2V0TWVtYmVyKHJlY29yZC5hcGksIG1ldGhvZE5hbWUpID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZ1bmN0aW9uIGEgY29uc3VtZXIgYWN0dWFsbHkgY2FsbHM6IGl0IGFsd2F5cyBpbnZva2VzIHRoZSBvcmlnaW5hbCB3aXRoIHRoZSByYXcgQVBJIG9iamVjdCBhc1xuICogYHRoaXNgLCBhbmQg4oCUIG9ubHkgd2hpbGUgdGhlIGBvYnNpZGlhbi1saWI6dmFsaWRhdGUtcGx1Z2luLWFwaS1wYXlsb2Fkc2AgZGVidWcgc3dpdGNoIGlzIG9uIOKAlCB2YWxpZGF0ZXMgdGhlXG4gKiBkZWNsYXJlZCBwYXlsb2FkcyBhcm91bmQgaXQuXG4gKlxuICogVGhlIHN3aXRjaCBpcyBjb25zdWx0ZWQgcGVyIGNhbGwgcmF0aGVyIHRoYW4gcGVyIHdyYXAsIHNvIHRvZ2dsaW5nIGl0IGF0IHJ1bnRpbWUgdGFrZXMgZWZmZWN0IHdpdGhvdXRcbiAqIHJlLWFjcXVpcmluZyB0aGUgaGFuZGxlLCB3aGlsZSB0aGUgd3JhcHBlcidzIGlkZW50aXR5IHN0YXlzIHN0YWJsZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSB3cmFwcGVyLlxuICogQHJldHVybnMgVGhlIHdyYXBwZXIgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZU1ldGhvZFdyYXBwZXIocGFyYW1zOiBDcmVhdGVNZXRob2RXcmFwcGVyUGFyYW1zKTogKC4uLiRhcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93biB7XG4gIHJldHVybiBmdW5jdGlvbiBwbHVnaW5BcGlNZXRob2QoLi4uJGFyZ3VtZW50czogdW5rbm93bltdKTogdW5rbm93biB7XG4gICAgLy8gUmVhZCBieSB0aGUgT1JJR0lOQUwga2V5LCBub3QgYnkgdGhlIGRpc3BsYXkgbmFtZTogYFN0cmluZyhzeW1ib2wpYCBpcyBgJ1N5bWJvbCh4KSdgLCB3aGljaCBpcyBub3QgYVxuICAgIC8vIGtleSB0aGUgQVBJIG9iamVjdCBoYXMuXG4gICAgY29uc3QgbWV0aG9kID0gY2FzdFRvPCguLi4kaW5uZXJBcmd1bWVudHM6IHVua25vd25bXSkgPT4gdW5rbm93bj4oZ2V0TWVtYmVyKHBhcmFtcy50YXJnZXQsIHBhcmFtcy5wcm9wZXJ0eUtleSkpO1xuICAgIGNvbnN0IG1ldGhvZENvbnRyYWN0ID0gcGFyYW1zLm1ldGhvZENvbnRyYWN0O1xuXG4gICAgaWYgKG1ldGhvZENvbnRyYWN0ID09PSB1bmRlZmluZWQgfHwgIWdldFZhbGlkYXRlUGx1Z2luQXBpUGF5bG9hZHNEZWJ1Z1N3aXRjaCgpLmlzRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gbWV0aG9kLmFwcGx5KHBhcmFtcy50YXJnZXQsICRhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIGlmIChtZXRob2RDb250cmFjdC5pbnB1dCkge1xuICAgICAgdmFsaWRhdGVQYXlsb2FkKHtcbiAgICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgIHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZC5JbnB1dCxcbiAgICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgICAgc2NoZW1hOiBtZXRob2RDb250cmFjdC5pbnB1dCxcbiAgICAgICAgdmFsdWU6ICRhcmd1bWVudHNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJldHVyblZhbHVlID0gbWV0aG9kLmFwcGx5KHBhcmFtcy50YXJnZXQsICRhcmd1bWVudHMpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IG1ldGhvZENvbnRyYWN0Lm91dHB1dDtcbiAgICBpZiAoIW91dHB1dFNjaGVtYSkge1xuICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICAgIH1cblxuICAgIGlmIChjaGVja0lzUHJvbWlzZUxpa2UocmV0dXJuVmFsdWUpKSB7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWUudGhlbigocmVzb2x2ZWRWYWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICB2YWxpZGF0ZVBheWxvYWQoe1xuICAgICAgICAgIG1ldGhvZE5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgICAgIHBheWxvYWRLaW5kOiBQbHVnaW5BcGlQYXlsb2FkS2luZC5PdXRwdXQsXG4gICAgICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgICAgICBzY2hlbWE6IG91dHB1dFNjaGVtYSxcbiAgICAgICAgICB2YWx1ZTogcmVzb2x2ZWRWYWx1ZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVkVmFsdWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZVBheWxvYWQoe1xuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogUGx1Z2luQXBpUGF5bG9hZEtpbmQuT3V0cHV0LFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHNjaGVtYTogb3V0cHV0U2NoZW1hLFxuICAgICAgdmFsdWU6IHJldHVyblZhbHVlXG4gICAgfSk7XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGEgcHVibGlzaGVkIEFQSSBpbiBhIHJldm9jYWJsZSBoYW5kbGUuXG4gKlxuICogQSBmbGFnLWNoZWNraW5nIGBnZXRgIHRyYXAgaXMgdXNlZCByYXRoZXIgdGhhbiBgUHJveHkucmV2b2NhYmxlYCwgYmVjYXVzZSB0aGUgbGF0dGVyIHRocm93cyBhIGJhcmVcbiAqIGBUeXBlRXJyb3JgIHdob3NlIG1lc3NhZ2Ugd2UgY2Fubm90IHBocmFzZSDigJQgYW5kIHRoZSB3aG9sZSB2YWx1ZSBvZiByZXZva2luZyBpcyB0aGF0IHRoZSBlcnJvciBuYW1lcyB0aGVcbiAqIHByb3ZpZGVyLlxuICpcbiAqIE1ldGhvZHMgYXJlIGJvdW5kIHRvIHRoZSBSQVcgYXBpIG9iamVjdCByYXRoZXIgdGhhbiB0byB0aGUgcHJveHk6IGFuIGltcGxlbWVudGF0aW9uIHVzaW5nIHByaXZhdGUgY2xhc3NcbiAqIGZpZWxkcyAoYCNmaWVsZGApIHRocm93cyBpZiBpdHMgYHRoaXNgIGlzIGEgcHJveHkuXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSBwdWJsaXNoZWQgcmVjb3JkLlxuICogQHBhcmFtIGNvbnN1bWVyQ29udHJhY3QgLSBUaGUgY29uc3VtZXIncyBvd24gY29udHJhY3QsIHdoaWNoIHdpbnMgb3ZlciB0aGUgcHVibGlzaGVkIG9uZSB3aGVuIHN1cHBsaWVkLlxuICogQHJldHVybnMgVGhlIGhhbmRsZS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmV2b2NhYmxlSGFuZGxlKHJlY29yZDogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkLCBjb25zdW1lckNvbnRyYWN0PzogQXBpQ29udHJhY3QpOiBvYmplY3Qge1xuICBjb25zdCBjb250cmFjdCA9IGNvbnN1bWVyQ29udHJhY3QgPz8gcmVjb3JkLmNvbnRyYWN0O1xuICBjb25zdCBtZXRob2RDYWNoZSA9IG5ldyBNYXA8UHJvcGVydHlLZXk+KCk7XG5cbiAgcmV0dXJuIG5ldyBQcm94eShyZWNvcmQuYXBpLCB7XG4gICAgZ2V0KHRhcmdldDogb2JqZWN0LCBwcm9wZXJ0eUtleTogUHJvcGVydHlLZXkpOiB1bmtub3duIHtcbiAgICAgIGlmIChyZWNvcmQuaXNSZXZva2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBQbHVnaW5BcGlSZXZva2VkRXJyb3IocmVjb3JkLnBsdWdpbklkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdmFsdWUgPSBnZXRNZW1iZXIodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1ldGhvZCA9IG1ldGhvZENhY2hlLmdldChwcm9wZXJ0eUtleSk7XG4gICAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0aG9kID0gY3JlYXRlTWV0aG9kV3JhcHBlcih7XG4gICAgICAgICAgbWV0aG9kQ29udHJhY3Q6IHR5cGVvZiBwcm9wZXJ0eUtleSA9PT0gJ3N0cmluZycgPyBjb250cmFjdFtwcm9wZXJ0eUtleV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgbWV0aG9kTmFtZTogU3RyaW5nKHByb3BlcnR5S2V5KSxcbiAgICAgICAgICBwbHVnaW5JZDogcmVjb3JkLnBsdWdpbklkLFxuICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgIHRhcmdldFxuICAgICAgICB9KTtcbiAgICAgICAgbWV0aG9kQ2FjaGUuc2V0KHByb3BlcnR5S2V5LCBtZXRob2QpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgc2NoZW1hIGlzc3VlcyBpbnRvIGEgc2luZ2xlIHJlYWRhYmxlIGxpbmUuXG4gKlxuICogQHBhcmFtIGlzc3VlcyAtIFRoZSBpc3N1ZXMgdG8gcmVuZGVyLlxuICogQHJldHVybnMgVGhlIHJlbmRlcmVkIG1lc3NhZ2UuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdElzc3Vlcyhpc3N1ZXM6IHJlYWRvbmx5IFN0YW5kYXJkU2NoZW1hVjEuSXNzdWVbXSk6IHN0cmluZyB7XG4gIHJldHVybiBpc3N1ZXNcbiAgICAubWFwKChpc3N1ZSkgPT4ge1xuICAgICAgY29uc3QgcGF0aCA9IGlzc3VlLnBhdGg/Lm1hcCgoc2VnbWVudCkgPT4gU3RyaW5nKHR5cGVvZiBzZWdtZW50ID09PSAnb2JqZWN0JyA/IHNlZ21lbnQua2V5IDogc2VnbWVudCkpLmpvaW4oJy4nKTtcbiAgICAgIHJldHVybiBwYXRoID8gYCR7cGF0aH06ICR7aXNzdWUubWVzc2FnZX1gIDogaXNzdWUubWVzc2FnZTtcbiAgICB9KVxuICAgIC5qb2luKCc7ICcpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHJlY29yZHMgYSBwbHVnaW4gY3VycmVudGx5IGhhcyBwdWJsaXNoZWQsIGV4Y2x1ZGluZyBhbnkgdGhhdCBoYXZlIGJlZW4gcmV2b2tlZC5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcHJvdmlkaW5nIHBsdWdpbi5cbiAqIEByZXR1cm5zIFRoZSBsaXZlIHJlY29yZHMuXG4gKi9cbmZ1bmN0aW9uIGdldExpdmVSZWNvcmRzKHBsdWdpbklkOiBzdHJpbmcpOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmRbXSB7XG4gIHJldHVybiAoZ2V0UmVnaXN0cnkoKS5yZWNvcmRzW3BsdWdpbklkXSA/PyBbXSkuZmlsdGVyKChyZWNvcmQpID0+ICFyZWNvcmQuaXNSZXZva2VkKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIG1lbWJlciBvZmYgYSBwdWJsaXNoZWQgQVBJIG9iamVjdCB3aXRob3V0IG5hcnJvd2luZyBpdCDigJQgdGhlIEFQSSBjcm9zc2VzIGEgbGlicmFyeS12ZXJzaW9uIGJvdW5kYXJ5LFxuICogc28gbm90aGluZyBhYm91dCBpdHMgc2hhcGUgbWF5IGJlIGFzc3VtZWQuXG4gKlxuICogQHBhcmFtIGFwaSAtIFRoZSBwdWJsaXNoZWQgQVBJIG9iamVjdC5cbiAqIEBwYXJhbSBtZXRob2ROYW1lIC0gVGhlIG1lbWJlciB0byByZWFkLlxuICogQHJldHVybnMgVGhlIG1lbWJlcidzIHZhbHVlLlxuICovXG5mdW5jdGlvbiBnZXRNZW1iZXIoYXBpOiBvYmplY3QsIG1ldGhvZE5hbWU6IFByb3BlcnR5S2V5KTogdW5rbm93biB7XG4gIHJldHVybiBSZWZsZWN0LmdldChhcGksIG1ldGhvZE5hbWUpO1xufVxuXG4vKipcbiAqIFRoZSBkZWJ1Z2dlciB0aGF0IGxvZ3MgYW4gYXN5bmNocm9ub3VzIHBheWxvYWQgdmFsaWRhdGlvbiBmYWlsdXJlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWJ1Z2dlci5cbiAqL1xuZnVuY3Rpb24gZ2V0UGx1Z2luQXBpRGVidWdnZXIoKTogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJEZWJ1Z2dlcihQTFVHSU5fQVBJX0RFQlVHR0VSX05BTUVTUEFDRSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzaGFyZWQgcmVnaXN0cnksIHRvbGVyYXRpbmcgYSBiYWcgd3JpdHRlbiBieSBhIERJRkZFUkVOVCBjb3B5IG9mIHRoaXMgbGlicmFyeSB0aGF0IG1heVxuICogcHJlZGF0ZSBvbmUgb2YgaXRzIGZpZWxkcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KCk6IFBsdWdpbkFwaVJlZ2lzdHJ5IHtcbiAgY29uc3Qgd3JhcHBlciA9IGdldE9ic2lkaWFuTGliU3RhdGU8UGFydGlhbDxQbHVnaW5BcGlSZWdpc3RyeT4+KFBMVUdJTl9BUElfUkVHSVNUUllfU1RBVEVfS0VZLCB7fSk7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gd3JhcHBlci52YWx1ZTtcbiAgcmVnaXN0cnkucmVjb3JkcyA/Pz0ge307XG4gIHJlZ2lzdHJ5LnN1YnNjcmliZXJzID8/PSBbXTtcbiAgcmV0dXJuIGNhc3RUbzxQbHVnaW5BcGlSZWdpc3RyeT4ocmVnaXN0cnkpO1xufVxuXG4vKipcbiAqIERlY2lkZXMgd2hldGhlciBhIHJlY29yZCB0aGF0IGJsb2NrcyBhIHB1Ymxpc2ggd2FzIGxlZnQgYmVoaW5kIGJ5IGEgcHJldmlvdXMgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGx1Z2luLlxuICpcbiAqIEEgcmVjb3JkIG91dGxpdmVzIGl0cyBpbnN0YW5jZSB3aGVuIHRoYXQgaW5zdGFuY2UgcHVibGlzaGVkIGFmdGVyIGl0IGhhZCBhbHJlYWR5IGJlZW4gdW5sb2FkZWQsIGZvciBleGFtcGxlIGFcbiAqIGxvYWQgcmVzdW1lZCBhZnRlciB0aGUgcGx1Z2luIHdhcyBkaXNhYmxlZCBtaWQtbG9hZCBieSBhbiB1cGRhdGUgb3IgYnkgSG90IFJlbG9hZDogaXRzIHJldm9rZSB3YXMgcmVnaXN0ZXJlZCBvblxuICogYSBkZWFkIGNvbXBvbmVudCBhbmQgbmV2ZXIgcnVucy4gUmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgLCBgUGx1Z2lucy5sb2FkUGx1Z2luYCBzdG9yZXMgdGhlIG5ldyBpbnN0YW5jZSBpblxuICogYGFwcC5wbHVnaW5zLnBsdWdpbnNgIGJlZm9yZSBpdCBhd2FpdHMgYHBsdWdpbi5sb2FkKClgLCBzbyB0aGUgcHVibGlzaGluZyBpbnN0YW5jZSBpcyB0aGUgbGl2ZSBvbmUgZXhhY3RseSB3aGVuXG4gKiB0aGF0IG1hcCBob2xkcyBpdC4gQSBsaXZlIGluc3RhbmNlIGNhbm5vdCBzaGFyZSB0aGUgcGx1Z2luIGlkIHdpdGggYW5vdGhlciBsaXZlIHB1Ymxpc2hlciwgc28gdGhlIGVhcmxpZXIgcmVjb3JkXG4gKiBpcyBzdGFsZSB3aGVuZXZlciBhbm90aGVyIGluc3RhbmNlIHB1Ymxpc2hlZCBpdC5cbiAqXG4gKiBBIHNlY29uZCBwdWJsaXNoIGJ5IHRoZSBTQU1FIGluc3RhbmNlIGlzIHN0aWxsIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIGFuZCBzbyBpcyBvbmUgZnJvbSBhbiBpbnN0YW5jZSBPYnNpZGlhbiBub1xuICogbG9uZ2VyIGhvbGRzLlxuICpcbiAqIEBwYXJhbSByZWNvcmQgLSBUaGUgcmVjb3JkIGFscmVhZHkgcHVibGlzaGVkIHVuZGVyIHRoZSBzYW1lIGlkIGFuZCB2ZXJzaW9uLlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gcHVibGlzaGluZyBub3cuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgcmVjb3JkIGJlbG9uZ3MgdG8gYSBwcmV2aW91cyBpbnN0YW5jZSBhbmQgbWF5IGJlIHJlcGxhY2VkLlxuICovXG5mdW5jdGlvbiBpc1N0YWxlUmVjb3JkKHJlY29yZDogUHVibGlzaGVkUGx1Z2luQXBpUmVjb3JkLCBwbHVnaW46IFBsdWdpbik6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVjb3JkUHVibGlzaGVycy5nZXQocmVjb3JkKSAhPT0gcGx1Z2luICYmIHBsdWdpbi5hcHAucGx1Z2lucy5wbHVnaW5zW3BsdWdpbi5tYW5pZmVzdC5pZF0gPT09IHBsdWdpbjtcbn1cblxuLyoqXG4gKiBOb3RpZmllcyBldmVyeSBzdWJzY3JpYmVyLCBvdmVyIGEgU05BUFNIT1Qgb2YgdGhlIGxpc3Qg4oCUIGEgY2FsbGJhY2sgaXMgZnJlZSB0byB1bnN1YnNjcmliZSAob3Igc3Vic2NyaWJlKVxuICogd2hpbGUgdGhlIHN3ZWVwIGlzIHJ1bm5pbmcuXG4gKi9cbmZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHN1YnNjcmliZXIgb2Ygc25hcHNob3QoZ2V0UmVnaXN0cnkoKS5zdWJzY3JpYmVycykpIHtcbiAgICBzdWJzY3JpYmVyKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoaWNoIG9mIHRoZSBmaXZlIGZhaWx1cmVzIGFwcGxpZXMsIHByb2JpbmcgdGhlIGNhdXNlcyBmcm9tIHRoZSBvdXRlcm1vc3QgaW53YXJkcyBzbyB0aGUgbW9zdFxuICogYWN0aW9uYWJsZSBvbmUgd2lucy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdhdGNoIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBUaGUgcmVhc29uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlVW5hdmFpbGFiaWxpdHlSZWFzb24ocGFyYW1zOiBXYXRjaFBsdWdpbkFwaVBhcmFtcyk6IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duKHBhcmFtcy5hcHAucGx1Z2lucy5tYW5pZmVzdHMsIHBhcmFtcy5wbHVnaW5JZCkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90SW5zdGFsbGVkO1xuICB9XG5cbiAgaWYgKCFwYXJhbXMuYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBhcmFtcy5wbHVnaW5JZCkpIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90RW5hYmxlZDtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZHMgPSBnZXRMaXZlUmVjb3JkcyhwYXJhbXMucGx1Z2luSWQpO1xuICBpZiAocmVjb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gUGx1Z2luQXBpVW5hdmFpbGFiaWxpdHlSZWFzb24uTm90UHVibGlzaGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlY29yZHMuZXZlcnkoKHJlY29yZCkgPT4gIXNhdGlzZmllc1ZlcnNpb24ocmVjb3JkLmFwaVZlcnNpb24sIHBhcmFtcy5hcGlWZXJzaW9uUmFuZ2UpKSA/IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlZlcnNpb25NaXNtYXRjaCA6IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlNoYXBlTWlzbWF0Y2g7XG59XG5cbi8qKlxuICogTWFya3MgYSByZWNvcmQgcmV2b2tlZCBhbmQgZHJvcHMgaXQgZnJvbSB0aGUgcmVnaXN0cnksIHRoZW4gdGVsbHMgZXZlcnkgd2F0Y2hlciB0byByZWNvbXB1dGUuXG4gKlxuICogVGhlIHJlY29yZCBvYmplY3QgaXRzZWxmIGlzIGRlbGliZXJhdGVseSBrZXB0IGFsaXZlIGFuZCBmbGFnZ2VkIHJhdGhlciB0aGFuIGRpc2NhcmRlZCwgYmVjYXVzZSBoYW5kbGVzXG4gKiBhbHJlYWR5IGhhbmRlZCBvdXQgY2xvc2Ugb3ZlciBpdCDigJQgdGhhdCBmbGFnIGlzIHdoYXQgdHVybnMgYSBsYXRlciBwcm9wZXJ0eSByZWFkIGludG8gYVxuICoge0BsaW5rIFBsdWdpbkFwaVJldm9rZWRFcnJvcn0uXG4gKlxuICogQHBhcmFtIHJlY29yZCAtIFRoZSByZWNvcmQgdG8gcmV2b2tlLlxuICovXG5mdW5jdGlvbiByZXZva2VSZWNvcmQocmVjb3JkOiBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQpOiB2b2lkIHtcbiAgcmVjb3JkLmlzUmV2b2tlZCA9IHRydWU7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgY29uc3QgcmVjb3JkcyA9IHJlZ2lzdHJ5LnJlY29yZHNbcmVjb3JkLnBsdWdpbklkXTtcbiAgaWYgKHJlY29yZHMpIHtcbiAgICByZWdpc3RyeS5yZWNvcmRzW3JlY29yZC5wbHVnaW5JZF0gPSByZWNvcmRzLmZpbHRlcigoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUgIT09IHJlY29yZCk7XG4gIH1cbiAgbm90aWZ5U3Vic2NyaWJlcnMoKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgaGlnaGVzdCBwdWJsaXNoZWQgcmVjb3JkIHRoYXQgaXMgbGl2ZSwgc2F0aXNmaWVzIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiByYW5nZSwgYW5kIG1hdGNoZXMgdGhlXG4gKiBlZmZlY3RpdmUgY29udHJhY3QncyBzaGFwZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGxvb2t1cCBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHdpbm5pbmcgcmVjb3JkLCBvciBgbnVsbGAgd2hlbiBub25lIHF1YWxpZmllcy5cbiAqL1xuZnVuY3Rpb24gc2VsZWN0UmVjb3JkKHBhcmFtczogRmluZFBsdWdpbkFwaVBhcmFtcyk6IG51bGwgfCBQdWJsaXNoZWRQbHVnaW5BcGlSZWNvcmQge1xuICBjb25zdCBjYW5kaWRhdGVzID0gZ2V0TGl2ZVJlY29yZHMocGFyYW1zLnBsdWdpbklkKVxuICAgIC5maWx0ZXIoKHJlY29yZCkgPT4gc2F0aXNmaWVzVmVyc2lvbihyZWNvcmQuYXBpVmVyc2lvbiwgcGFyYW1zLmFwaVZlcnNpb25SYW5nZSkpXG4gICAgLmZpbHRlcigocmVjb3JkKSA9PiBjaGVja01hdGNoZXNDb250cmFjdFNoYXBlKHJlY29yZCwgcGFyYW1zLmNvbnRyYWN0KSlcbiAgICAuc29ydCgoYSwgYikgPT4gY29tcGFyZVZlcnNpb25zKGIuYXBpVmVyc2lvbiwgYS5hcGlWZXJzaW9uKSk7XG5cbiAgcmV0dXJuIGNhbmRpZGF0ZXNbMF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmaXJlZCB3aGVuZXZlciB0aGUgcmVnaXN0cnkgY2hhbmdlcy5cbiAqXG4gKiBAcGFyYW0gc3Vic2NyaWJlciAtIFRoZSBjYWxsYmFjay5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB1bnJlZ2lzdGVycyB0aGUgY2FsbGJhY2suXG4gKi9cbmZ1bmN0aW9uIHN1YnNjcmliZShzdWJzY3JpYmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0UmVnaXN0cnkoKTtcbiAgcmVnaXN0cnkuc3Vic2NyaWJlcnMucHVzaChzdWJzY3JpYmVyKTtcbiAgcmV0dXJuICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbmRleCA9IHJlZ2lzdHJ5LnN1YnNjcmliZXJzLmluZGV4T2Yoc3Vic2NyaWJlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmVnaXN0cnkuc3Vic2NyaWJlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUnVucyBvbmUgU3RhbmRhcmQgU2NoZW1hIG92ZXIgb25lIHBheWxvYWQuXG4gKlxuICogQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIFNZTkNIUk9OT1VTTFkgdGhyb3dzIGF0IHRoZSBjYWxsIHNpdGUsIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCDigJQgYSB2ZXJzaW9uIHNrZXcgcmVhZHNcbiAqIGFzIGEgbGVnaWJsZSBlcnJvciB3aGVyZSB0aGUgY2FsbCB3YXMgbWFkZS4gQSBzY2hlbWEgdGhhdCBhbnN3ZXJzIHdpdGggYSB7QGxpbmsgUHJvbWlzZX0gY2Fubm90IGRvIHRoYXQ6IHRoZVxuICogc3luY2hyb25vdXMgY2FsbCBpdCB3YXMgZ3VhcmRpbmcgaGFzIGFscmVhZHkgcmV0dXJuZWQgYnkgdGhlIHRpbWUgdGhlIGFuc3dlciBhcnJpdmVzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvXG4gKiB0aHJvdyBpbnRvIGFuZCB0aGUgZmFpbHVyZSBpcyByZXBvcnRlZCB0aHJvdWdoIHRoZSBsaWJyYXJ5IGRlYnVnZ2VyIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAqIEB0aHJvd3MgQSB7QGxpbmsgUGx1Z2luQXBpVmFsaWRhdGlvbkVycm9yfSBpZiBhIHN5bmNocm9ub3VzIHNjaGVtYSByZXBvcnRzIGlzc3Vlcy5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXlsb2FkKHBhcmFtczogVmFsaWRhdGVQYXlsb2FkUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IHBhcmFtcy5zY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHBhcmFtcy52YWx1ZSk7XG5cbiAgaWYgKGNoZWNrSXNQcm9taXNlTGlrZTxTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDx1bmtub3duPj4ocmVzdWx0KSkge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGFzeW5jUmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgaWYgKGFzeW5jUmVzdWx0Lmlzc3Vlcykge1xuICAgICAgICBnZXRQbHVnaW5BcGlEZWJ1Z2dlcigpKFxuICAgICAgICAgICdBc3luY2hyb25vdXMgdmFsaWRhdGlvbiBvZiB0aGUgJXMgb2YgXCIlc1wiIEFQSSBtZXRob2QgXCIlc1wiIGZhaWxlZDogJXMnLFxuICAgICAgICAgIHBhcmFtcy5wYXlsb2FkS2luZCxcbiAgICAgICAgICBwYXJhbXMucGx1Z2luSWQsXG4gICAgICAgICAgcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICAgICAgZm9ybWF0SXNzdWVzKGFzeW5jUmVzdWx0Lmlzc3VlcylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocmVzdWx0Lmlzc3Vlcykge1xuICAgIHRocm93IG5ldyBQbHVnaW5BcGlWYWxpZGF0aW9uRXJyb3Ioe1xuICAgICAgaXNzdWVzOiByZXN1bHQuaXNzdWVzLFxuICAgICAgbWV0aG9kTmFtZTogcGFyYW1zLm1ldGhvZE5hbWUsXG4gICAgICBwYXlsb2FkS2luZDogcGFyYW1zLnBheWxvYWRLaW5kLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBbUdBLG1CQUF5QjtBQUN6QixtQkFHTztBQUNQLDBCQUFpQztBQUNqQyw0QkFBb0M7QUFDcEMsMEJBQXVCO0FBQ3ZCLDhCQUdPO0FBRVAsbUJBQXVDO0FBQ3ZDLGdDQUFvQztBQUVwQyxNQUFNLGdDQUFnQztBQUN0QyxNQUFNLGdDQUFnQztBQUV0QyxNQUFNLHVEQUE4RTtBQUFBLEVBQ2xGLGFBQWE7QUFBQSxFQUNiLElBQUk7QUFBQSxFQUNKLG9CQUFvQjtBQUFBLEVBQ3BCLE1BQU07QUFDUjtBQUtBLE1BQU0saURBQWlEO0FBU3ZELE1BQU0sbUJBQW1CLG9CQUFJLFFBQTBDO0FBS2hF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QUMsSUFBSSwwQ0FBZ0Q7QUFDbko7QUFXQSxTQUFTLGFBQWEsUUFBd0M7QUFDNUQsU0FBTyxZQUFZO0FBQ25CLFFBQU0sV0FBVyxZQUFZO0FBQzdCLFFBQU0sVUFBVSxTQUFTLFFBQVEsT0FBTyxRQUFRO0FBQ2hELE1BQUksU0FBUztBQUNYLGFBQVMsUUFBUSxPQUFPLFFBQVEsSUFBSSxRQUFRLE9BQU8sQ0FBQyxjQUFjLGNBQWMsTUFBTTtBQUFBLEVBQ3hGO0FBQ0Esb0JBQWtCO0FBQ3BCO0FBU0EsU0FBUyxhQUFhLFFBQThEO0FBQ2xGLFFBQU0sYUFBYSxlQUFlLE9BQU8sUUFBUSxFQUM5QyxPQUFPLENBQUMsZUFBVyx3QkFBQUEsV0FBaUIsT0FBTyxZQUFZLE9BQU8sZUFBZSxDQUFDLEVBQzlFLE9BQU8sQ0FBQyxXQUFXLDBCQUEwQixRQUFRLE9BQU8sUUFBUSxDQUFDLEVBQ3JFLEtBQUssQ0FBQyxHQUFHLFVBQU0seUNBQWdCLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQztBQUU3RCxTQUFPLFdBQVcsQ0FBQyxLQUFLO0FBQzFCO0FBUUEsU0FBUyxVQUFVLFlBQW9DO0FBQ3JELFFBQU0sV0FBVyxZQUFZO0FBQzdCLFdBQVMsWUFBWSxLQUFLLFVBQVU7QUFDcEMsU0FBTyxNQUFZO0FBQ2pCLFVBQU0sUUFBUSxTQUFTLFlBQVksUUFBUSxVQUFVO0FBQ3JELFFBQUksVUFBVSxJQUFJO0FBQ2hCLGVBQVMsWUFBWSxPQUFPLE9BQU8sQ0FBQztBQUFBLElBQ3RDO0FBQUEsRUFDRjtBQUNGO0FBYUEsU0FBUyxnQkFBZ0IsUUFBcUM7QUFDNUQsUUFBTSxTQUFTLE9BQU8sT0FBTyxXQUFXLEVBQUUsU0FBUyxPQUFPLEtBQUs7QUFFL0QsTUFBSSxtQkFBcUQsTUFBTSxHQUFHO0FBQ2hFLHdDQUFrQixZQUFZO0FBQzVCLFlBQU0sY0FBYyxNQUFNO0FBQzFCLFVBQUksWUFBWSxRQUFRO0FBQ3RCLDZCQUFxQjtBQUFBLFVBQ25CO0FBQUEsVUFDQSxPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxPQUFPO0FBQUEsVUFDUCxhQUFhLFlBQVksTUFBTTtBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUNEO0FBQUEsRUFDRjtBQUVBLE1BQUksT0FBTyxRQUFRO0FBQ2pCLFVBQU0sSUFBSSx5QkFBeUI7QUFBQSxNQUNqQyxRQUFRLE9BQU87QUFBQSxNQUNmLFlBQVksT0FBTztBQUFBLE1BQ25CLGFBQWEsT0FBTztBQUFBLE1BQ3BCLFVBQVUsT0FBTztBQUFBLElBQ25CLENBQUM7QUFBQSxFQUNIO0FBQ0Y7IiwibmFtZXMiOlsiUGx1Z2luQXBpUGF5bG9hZEtpbmQiLCJQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbiIsInJlY29yZCIsInNhdGlzZmllc1ZlcnNpb24iXX0=
@@ -441,7 +441,11 @@ export declare function getValidatePluginApiPayloadsDebugSwitch(): DebugSwitch;
441
441
  *
442
442
  * @typeParam TApi - The API type being published.
443
443
  * @param params - The parameters for publishing.
444
- * @throws An {@link Error} if this plugin has already published this exact `apiVersion`.
444
+ * A record of the same `apiVersion` left behind by a previous instance of the same plugin is revoked and replaced
445
+ * when the publishing instance is the one Obsidian currently holds for that id.
446
+ *
447
+ * @throws An {@link Error} if this plugin instance has already published this exact `apiVersion`, or another
448
+ * instance holds it while this one is not the live instance.
445
449
  */
446
450
  export declare function publishPluginApi<TApi extends object>(params: PublishPluginApiParams<TApi>): void;
447
451
  /**
@@ -114,6 +114,7 @@ var __copyProps = (to, from, except, desc) => {
114
114
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
115
  var plugin_async_cleanup_exports = {};
116
116
  __export(plugin_async_cleanup_exports, {
117
+ DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS: () => DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS,
117
118
  DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS: () => DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS,
118
119
  PLUGIN_ASYNC_CLEANUPS_STATE_KEY: () => PLUGIN_ASYNC_CLEANUPS_STATE_KEY,
119
120
  didPluginAsyncCleanupsSettle: () => didPluginAsyncCleanupsSettle,
@@ -122,10 +123,11 @@ __export(plugin_async_cleanup_exports, {
122
123
  trackPluginAsyncCleanup: () => trackPluginAsyncCleanup
123
124
  });
124
125
  module.exports = __toCommonJS(plugin_async_cleanup_exports);
125
- var import_error = require('@mnaoumov/typescript-lib/error');
126
- var import_obsidian_lib_state = require('../obsidian-lib-state.cjs');
126
+ var import_error = require("@mnaoumov/typescript-lib/error");
127
+ var import_obsidian_lib_state = require("../obsidian-lib-state.cjs");
127
128
  const PLUGIN_ASYNC_CLEANUPS_STATE_KEY = "pluginAsyncCleanupsV1";
128
129
  const DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS = 1e4;
130
+ const DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS = 500;
129
131
  async function didPluginAsyncCleanupsSettle(params) {
130
132
  const promise = getPendingCleanups().get(params.pluginId);
131
133
  if (!promise) {
@@ -179,6 +181,7 @@ async function runCleanupSafely(params) {
179
181
  }
180
182
  // Annotate the CommonJS export names for ESM import in node:
181
183
  0 && (module.exports = {
184
+ DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS,
182
185
  DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS,
183
186
  PLUGIN_ASYNC_CLEANUPS_STATE_KEY,
184
187
  didPluginAsyncCleanupsSettle,
@@ -186,4 +189,4 @@ async function runCleanupSafely(params) {
186
189
  registerPluginAsyncCleanup,
187
190
  trackPluginAsyncCleanup
188
191
  });
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWFzeW5jLWNsZWFudXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGNsZWFudXAgdGhhdCBvdXRsaXZlcyBhIHBsdWdpbiBpbnN0YW5jZSwgc28gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGx1Z2luIGNhbiBhd2FpdCBpdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBvbnVubG9hZGAgaXMgc3luY2hyb25vdXMgYW5kIG5vdGhpbmcgYXdhaXRzIHdoYXQgaXQgc3RhcnRzLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWA6XG4gKiBgUGx1Z2lucy51bmxvYWRQbHVnaW5gIGNhbGxzIHRoZSBvbGQgaW5zdGFuY2UncyBgdW5sb2FkKClgIGFuZCByZXR1cm5zLCBhbmQgYGVuYWJsZVBsdWdpbmAgdGhlbiBjb25zdHJ1Y3RzIHRoZSBuZXdcbiAqIGluc3RhbmNlIGFuZCBhd2FpdHMgaXRzIGBsb2FkKClgLiBTbyBvbiBhIGRpc2FibGUgLyBlbmFibGUsIGEgcmVsb2FkIG9yIGFuIHVwZGF0ZSB3aGlsZSBlbmFibGVkLCB3b3JrIGxpa2UgY2xvc2luZ1xuICogYW4gSW5kZXhlZERCIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW4gZmxpZ2h0IHdoZW4gdGhlIG5ldyBpbnN0YW5jZSBzdGFydHMsIGFuZCB0aGUgbmV3IGluc3RhbmNlIGNhbiBvcGVuIGEgZGF0YWJhc2VcbiAqIHRoZSBvbGQgb25lIHN0aWxsIGhvbGRzLlxuICpcbiAqIFRoZSByZWdpc3RyeSBoZXJlIGNsb3NlcyB0aGF0IGdhcCB3aXRob3V0IG93bmluZyB0aGUgcmVsb2FkIGxpZmVjeWNsZTogYSBjbGVhbnVwIHN0YXJ0cyB3aGVuIHRoZSBjb21wb25lbnQgaXQgaXNcbiAqIHJlZ2lzdGVyZWQgb24gdW5sb2FkcywgaXRzIHByb21pc2UgaXMga2VwdCByZWFsbS13aWRlIHVuZGVyIHRoZSBwbHVnaW4gaWQsIGFuZCB0aGUgbmV4dCBpbnN0YW5jZSBhd2FpdHMgaXQsIGJvdW5kZWRcbiAqIGJ5IGEgdGltZW91dCwgYmVmb3JlIGl0IHN0YXJ0cy4gYFBsdWdpbkJhc2VgIGRvZXMgYm90aCBoYWx2ZXMgaXRzZWxmLlxuICpcbiAqIFRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgcmVhbG0tZ2xvYmFsIHNoYXJlZC1zdGF0ZSBiYWcgdW5kZXIgdGhlIHZlcnNpb25lZCBrZXkgYHBsdWdpbkFzeW5jQ2xlYW51cHNWMWAsIGJlY2F1c2UgdGhlXG4gKiBvbGQgaW5zdGFuY2UgYW5kIHRoZSBuZXcgb25lIG1heSBidW5kbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGlzIGxpYnJhcnkuIEl0IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlbiB0aG9zZSBjb3BpZXM6XG4gKiBhIHBsYWluIGBNYXBgIGZyb20gcGx1Z2luIGlkIHRvIGEgYFByb21pc2U8dm9pZD5gIHRoYXQgbmV2ZXIgcmVqZWN0cy4gQSBjaGFuZ2Ugb2YgbWVhbmluZyBtb3ZlcyB0byBhIG5ldyBrZXkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIHNoYXJlZC1zdGF0ZSBrZXkgb2YgdGhlIHBlbmRpbmcgY2xlYW51cHMuIFZlcnNpb25lZCwgYmVjYXVzZSBpdCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW4gY29waWVzIG9mIHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9BU1lOQ19DTEVBTlVQU19TVEFURV9LRVkgPSAncGx1Z2luQXN5bmNDbGVhbnVwc1YxJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIG5ldyBwbHVnaW4gaW5zdGFuY2Ugd2FpdHMgZm9yIHRoZSBwcmV2aW91cyBpbnN0YW5jZSdzIGNsZWFudXBzIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHdob3NlIHBlbmRpbmcgY2xlYW51cHMgdG8gYXdhaXQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAuIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTfS5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBjbGVhbnVwLlxuICovXG5leHBvcnQgdHlwZSBQbHVnaW5Bc3luY0NsZWFudXAgPSAoKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNsZWFudXAgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xlYW51cDogUGx1Z2luQXN5bmNDbGVhbnVwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IHdob3NlIHVubG9hZCBzdGFydHMgdGhlIGNsZWFudXAuXG4gICAqL1xuICByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhlIGNsZWFudXAgYmVsb25ncyB0bywgd2hpY2ggdGhlIG5leHQgaW5zdGFuY2Ugd2FpdHMgdW5kZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB0cmFja1BsdWdpbkFzeW5jQ2xlYW51cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2tQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNsZWFudXAgdG8gcnVuIG5vdy5cbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXA6IFBsdWdpbkFzeW5jQ2xlYW51cDtcblxuICAvKipcbiAgICogVGhlIGlkIG9mIHRoZSBwbHVnaW4gdGhlIGNsZWFudXAgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBUcmFja2VkQ2xlYW51cEVudHJ5IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gQXNzaWduZWQgb25jZSB0aGUgc2VsZi1yZW1vdmluZyBwcm9taXNlIGV4aXN0cy5cbiAgcHJvbWlzZT86IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQXdhaXRzIGV2ZXJ5IGNsZWFudXAgc3RpbGwgaW4gZmxpZ2h0IGZvciB0aGUgcGx1Z2luLCBib3VuZGVkIGJ5IGEgdGltZW91dC5cbiAqXG4gKiBSZXNvbHZlcyBhdCBvbmNlIHdoZW4gbm90aGluZyBpcyBwZW5kaW5nLiBOZXZlciByZWplY3RzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiBldmVyeSBwZW5kaW5nIGNsZWFudXAgc2V0dGxlZCBpbiB0aW1lLCBgZmFsc2VgIGlmIHRoZSB0aW1lb3V0IHdhcyByZWFjaGVkIGZpcnN0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGlkUGx1Z2luQXN5bmNDbGVhbnVwc1NldHRsZShwYXJhbXM6IERpZFBsdWdpbkFzeW5jQ2xlYW51cHNTZXR0bGVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgcHJvbWlzZSA9IGdldFBlbmRpbmdDbGVhbnVwcygpLmdldChwYXJhbXMucGx1Z2luSWQpO1xuICBpZiAoIXByb21pc2UpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCB0aW1lb3V0SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxmYWxzZT4oKHJlc29sdmUpID0+IHtcbiAgICB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICB9LCBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfUExVR0lOX0FTWU5DX0NMRUFOVVBfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpO1xuICB9KTtcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBQcm9taXNlLnJhY2UoW3Byb21pc2UudGhlbigoKSA9PiB0cnVlKSwgdGltZW91dFByb21pc2VdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHBsdWdpbiBoYXMgY2xlYW51cHMgc3RpbGwgaW4gZmxpZ2h0LlxuICpcbiAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFueSBjbGVhbnVwIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGlkIGhhcyBub3Qgc2V0dGxlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZW5kaW5nUGx1Z2luQXN5bmNDbGVhbnVwcyhwbHVnaW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRQZW5kaW5nQ2xlYW51cHMoKS5oYXMocGx1Z2luSWQpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhbiBhc3luYyBjbGVhbnVwIHRoYXQgc3RhcnRzIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzIGFuZCB0aGF0IHRoZSBuZXh0IGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gYXdhaXRzLlxuICpcbiAqIFRoZSBjbGVhbnVwIHJ1bnMgZXhhY3RseSBvbmNlLCBvbiB0aGUgY29tcG9uZW50J3MgdW5sb2FkLiBSZWdpc3RlciBpdCBvbiB0aGUgY29tcG9uZW50IHdob3NlIGxpZmV0aW1lIG1hdGNoZXMgdGhlXG4gKiByZXNvdXJjZTogYSBgUGx1Z2luQmFzZWAgc3ViY2xhc3MgY2FsbHMgYHJlZ2lzdGVyQXN5bmNDbGVhbnVwYCBpbnN0ZWFkLCB3aGljaCBzY29wZXMgaXQgdG8gdGhlIGZlYXR1cmUgc3VyZmFjZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cChwYXJhbXM6IFJlZ2lzdGVyUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zKTogdm9pZCB7XG4gIHBhcmFtcy5jb21wb25lbnQucmVnaXN0ZXIoKCkgPT4ge1xuICAgIHRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwKHtcbiAgICAgIGNsZWFudXA6IHBhcmFtcy5jbGVhbnVwLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZFxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSdW5zIGFuIGFzeW5jIGNsZWFudXAgbm93IGFuZCB0cmFja3MgaXQgdW5kZXIgdGhlIHBsdWdpbiBpZCB1bnRpbCBpdCBzZXR0bGVzLlxuICpcbiAqIEEgY2xlYW51cCB0aGF0IHRocm93cyBvciByZWplY3RzIGlzIHByaW50ZWQgYW5kIGNvdW50cyBhcyBzZXR0bGVkLCBzbyBhIGZhaWxpbmcgY2xlYW51cCBuZXZlciBzdG9wcyB0aGUgbmV4dFxuICogaW5zdGFuY2UgZnJvbSBsb2FkaW5nLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwKHBhcmFtczogVHJhY2tQbHVnaW5Bc3luY0NsZWFudXBQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgcGVuZGluZ0NsZWFudXBzID0gZ2V0UGVuZGluZ0NsZWFudXBzKCk7XG4gIGNvbnN0IHByZXZpb3VzUHJvbWlzZSA9IHBlbmRpbmdDbGVhbnVwcy5nZXQocGFyYW1zLnBsdWdpbklkKTtcbiAgY29uc3QgY2xlYW51cFByb21pc2UgPSBydW5DbGVhbnVwU2FmZWx5KHBhcmFtcyk7XG4gIC8vIE5ldmVyIHJlamVjdHM6IGBydW5DbGVhbnVwU2FmZWx5YCBjYXRjaGVzLCBhbmQgc28gZGlkIHdoaWNoZXZlciBjYWxsIHRyYWNrZWQgYHByZXZpb3VzUHJvbWlzZWAuXG4gIGNvbnN0IGVudHJ5OiBUcmFja2VkQ2xlYW51cEVudHJ5ID0ge307XG4gIGVudHJ5LnByb21pc2UgPSAoYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFtwcmV2aW91c1Byb21pc2UsIGNsZWFudXBQcm9taXNlXSk7XG4gICAgLy8gQSBsYXRlciBjYWxsIG1heSBoYXZlIGNoYWluZWQgb250byB0aGlzIGVudHJ5IGFscmVhZHk7IG9ubHkgdGhlIGxhdGVzdCBlbnRyeSByZW1vdmVzIGl0c2VsZi5cbiAgICBpZiAocGVuZGluZ0NsZWFudXBzLmdldChwYXJhbXMucGx1Z2luSWQpID09PSBlbnRyeS5wcm9taXNlKSB7XG4gICAgICBwZW5kaW5nQ2xlYW51cHMuZGVsZXRlKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgfVxuICB9KSgpO1xuICBwZW5kaW5nQ2xlYW51cHMuc2V0KHBhcmFtcy5wbHVnaW5JZCwgZW50cnkucHJvbWlzZSk7XG59XG5cbmZ1bmN0aW9uIGdldFBlbmRpbmdDbGVhbnVwcygpOiBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkxpYlN0YXRlKFBMVUdJTl9BU1lOQ19DTEVBTlVQU19TVEFURV9LRVksIG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpKS52YWx1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuQ2xlYW51cFNhZmVseShwYXJhbXM6IFRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcGFyYW1zLmNsZWFudXAoKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKG5ldyBFcnJvcihgQXN5bmMgY2xlYW51cCBvZiBwbHVnaW4gJHtwYXJhbXMucGx1Z2luSWR9IGZhaWxlZGAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxtQkFBMkI7QUFFM0IsZ0NBQW9DO0FBSzdCLE1BQU0sa0NBQWtDO0FBS3hDLE1BQU0sdURBQXVEO0FBc0VwRSxlQUFzQiw2QkFBNkIsUUFBOEQ7QUFDL0csUUFBTSxVQUFVLG1CQUFtQixFQUFFLElBQUksT0FBTyxRQUFRO0FBQ3hELE1BQUksQ0FBQyxTQUFTO0FBQ1osV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osUUFBTSxpQkFBaUIsSUFBSSxRQUFlLENBQUMsWUFBWTtBQUNyRCxnQkFBWSxPQUFPLFdBQVcsTUFBTTtBQUNsQyxjQUFRLEtBQUs7QUFBQSxJQUNmLEdBQUcsT0FBTyx5QkFBeUIsb0RBQW9EO0FBQUEsRUFDekYsQ0FBQztBQUVELE1BQUk7QUFDRixXQUFPLE1BQU0sUUFBUSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQztBQUFBLEVBQ3RFLFVBQUU7QUFDQSxXQUFPLGFBQWEsU0FBUztBQUFBLEVBQy9CO0FBQ0Y7QUFRTyxTQUFTLDhCQUE4QixVQUEyQjtBQUN2RSxTQUFPLG1CQUFtQixFQUFFLElBQUksUUFBUTtBQUMxQztBQVVPLFNBQVMsMkJBQTJCLFFBQWdEO0FBQ3pGLFNBQU8sVUFBVSxTQUFTLE1BQU07QUFDOUIsNEJBQXdCO0FBQUEsTUFDdEIsU0FBUyxPQUFPO0FBQUEsTUFDaEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBVU8sU0FBUyx3QkFBd0IsUUFBNkM7QUFDbkYsUUFBTSxrQkFBa0IsbUJBQW1CO0FBQzNDLFFBQU0sa0JBQWtCLGdCQUFnQixJQUFJLE9BQU8sUUFBUTtBQUMzRCxRQUFNLGlCQUFpQixpQkFBaUIsTUFBTTtBQUU5QyxRQUFNLFFBQTZCLENBQUM7QUFDcEMsUUFBTSxXQUFXLFlBQTJCO0FBQzFDLFVBQU0sUUFBUSxJQUFJLENBQUMsaUJBQWlCLGNBQWMsQ0FBQztBQUVuRCxRQUFJLGdCQUFnQixJQUFJLE9BQU8sUUFBUSxNQUFNLE1BQU0sU0FBUztBQUMxRCxzQkFBZ0IsT0FBTyxPQUFPLFFBQVE7QUFBQSxJQUN4QztBQUFBLEVBQ0YsR0FBRztBQUNILGtCQUFnQixJQUFJLE9BQU8sVUFBVSxNQUFNLE9BQU87QUFDcEQ7QUFFQSxTQUFTLHFCQUFpRDtBQUN4RCxhQUFPLCtDQUFvQixpQ0FBaUMsb0JBQUksSUFBMkIsQ0FBQyxFQUFFO0FBQ2hHO0FBRUEsZUFBZSxpQkFBaUIsUUFBc0Q7QUFDcEYsTUFBSTtBQUNGLFVBQU0sT0FBTyxRQUFRO0FBQUEsRUFDdkIsU0FBUyxPQUFPO0FBQ2QsaUNBQVcsSUFBSSxNQUFNLDJCQUEyQixPQUFPLFFBQVEsV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM3RjtBQUNGOyIsIm5hbWVzIjpbXX0=
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWFzeW5jLWNsZWFudXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGNsZWFudXAgdGhhdCBvdXRsaXZlcyBhIHBsdWdpbiBpbnN0YW5jZSwgc28gdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIHNhbWUgcGx1Z2luIGNhbiBhd2FpdCBpdC5cbiAqXG4gKiBPYnNpZGlhbidzIGBvbnVubG9hZGAgaXMgc3luY2hyb25vdXMgYW5kIG5vdGhpbmcgYXdhaXRzIHdoYXQgaXQgc3RhcnRzLiBSZWFkIGZyb20gT2JzaWRpYW4gYDEuMTUuMWA6XG4gKiBgUGx1Z2lucy51bmxvYWRQbHVnaW5gIGNhbGxzIHRoZSBvbGQgaW5zdGFuY2UncyBgdW5sb2FkKClgIGFuZCByZXR1cm5zLCBhbmQgYGVuYWJsZVBsdWdpbmAgdGhlbiBjb25zdHJ1Y3RzIHRoZSBuZXdcbiAqIGluc3RhbmNlIGFuZCBhd2FpdHMgaXRzIGBsb2FkKClgLiBTbyBvbiBhIGRpc2FibGUgLyBlbmFibGUsIGEgcmVsb2FkIG9yIGFuIHVwZGF0ZSB3aGlsZSBlbmFibGVkLCB3b3JrIGxpa2UgY2xvc2luZ1xuICogYW4gSW5kZXhlZERCIGNvbm5lY3Rpb24gaXMgc3RpbGwgaW4gZmxpZ2h0IHdoZW4gdGhlIG5ldyBpbnN0YW5jZSBzdGFydHMsIGFuZCB0aGUgbmV3IGluc3RhbmNlIGNhbiBvcGVuIGEgZGF0YWJhc2VcbiAqIHRoZSBvbGQgb25lIHN0aWxsIGhvbGRzLlxuICpcbiAqIFRoZSByZWdpc3RyeSBoZXJlIGNsb3NlcyB0aGF0IGdhcCB3aXRob3V0IG93bmluZyB0aGUgcmVsb2FkIGxpZmVjeWNsZTogYSBjbGVhbnVwIHN0YXJ0cyB3aGVuIHRoZSBjb21wb25lbnQgaXQgaXNcbiAqIHJlZ2lzdGVyZWQgb24gdW5sb2FkcywgaXRzIHByb21pc2UgaXMga2VwdCByZWFsbS13aWRlIHVuZGVyIHRoZSBwbHVnaW4gaWQsIGFuZCB0aGUgbmV4dCBpbnN0YW5jZSBhd2FpdHMgaXQsIGJvdW5kZWRcbiAqIGJ5IGEgdGltZW91dCwgYmVmb3JlIGl0IHN0YXJ0cy4gYFBsdWdpbkJhc2VgIGRvZXMgYm90aCBoYWx2ZXMgaXRzZWxmLlxuICpcbiAqIFRoZSByZWdpc3RyeSBsaXZlcyBpbiB0aGUgcmVhbG0tZ2xvYmFsIHNoYXJlZC1zdGF0ZSBiYWcgdW5kZXIgdGhlIHZlcnNpb25lZCBrZXkgYHBsdWdpbkFzeW5jQ2xlYW51cHNWMWAsIGJlY2F1c2UgdGhlXG4gKiBvbGQgaW5zdGFuY2UgYW5kIHRoZSBuZXcgb25lIG1heSBidW5kbGUgZGlmZmVyZW50IGNvcGllcyBvZiB0aGlzIGxpYnJhcnkuIEl0IGlzIGEgd2lyZSBmb3JtYXQgYmV0d2VlbiB0aG9zZSBjb3BpZXM6XG4gKiBhIHBsYWluIGBNYXBgIGZyb20gcGx1Z2luIGlkIHRvIGEgYFByb21pc2U8dm9pZD5gIHRoYXQgbmV2ZXIgcmVqZWN0cy4gQSBjaGFuZ2Ugb2YgbWVhbmluZyBtb3ZlcyB0byBhIG5ldyBrZXkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgeyBwcmludEVycm9yIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Vycm9yJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5MaWJTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWxpYi1zdGF0ZS50cyc7XG5cbi8qKlxuICogVGhlIHNoYXJlZC1zdGF0ZSBrZXkgb2YgdGhlIHBlbmRpbmcgY2xlYW51cHMuIFZlcnNpb25lZCwgYmVjYXVzZSBpdCBpcyBhIHdpcmUgZm9ybWF0IGJldHdlZW4gY29waWVzIG9mIHRoaXMgbGlicmFyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9BU1lOQ19DTEVBTlVQU19TVEFURV9LRVkgPSAncGx1Z2luQXN5bmNDbGVhbnVwc1YxJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIG5ldyBwbHVnaW4gaW5zdGFuY2Ugd2FpdHMgZm9yIHRoZSBwcmV2aW91cyBpbnN0YW5jZSdzIGNsZWFudXBzIGJ5IGRlZmF1bHQuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuXG4vKipcbiAqIEhvdyBsb25nIGEgbmV3IHBsdWdpbiBpbnN0YW5jZSB3YWl0cyBmb3IgdGhlIHByZXZpb3VzIGluc3RhbmNlJ3MgY2xlYW51cHMsIGJ5IGRlZmF1bHQsIGJlZm9yZSBpdCBzaG93cyBhIG5vdGljZSB0aGF0XG4gKiBpdHMgbG9hZCBpcyBwYXVzZWQuIFNob3J0ZXIgd2FpdHMgc2hvdyBub3RoaW5nLCBzbyB0aGUgdXN1YWwgZmV3IG1pbGxpc2Vjb25kcyBuZXZlciBmbGFzaCBhIG5vdGljZS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUExVR0lOX0FTWU5DX0NMRUFOVVBfTk9USUNFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZGlkUGx1Z2luQXN5bmNDbGVhbnVwc1NldHRsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlkUGx1Z2luQXN5bmNDbGVhbnVwc1NldHRsZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHBsdWdpbiB3aG9zZSBwZW5kaW5nIGNsZWFudXBzIHRvIGF3YWl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9QTFVHSU5fQVNZTkNfQ0xFQU5VUF9USU1FT1VUX0lOX01JTExJU0VDT05EU30uXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQW4gYXN5bmMgY2xlYW51cC5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luQXN5bmNDbGVhbnVwID0gKCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjbGVhbnVwIHRvIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGNsZWFudXA6IFBsdWdpbkFzeW5jQ2xlYW51cDtcblxuICAvKipcbiAgICogVGhlIGNvbXBvbmVudCB3aG9zZSB1bmxvYWQgc3RhcnRzIHRoZSBjbGVhbnVwLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoZSBjbGVhbnVwIGJlbG9uZ3MgdG8sIHdoaWNoIHRoZSBuZXh0IGluc3RhbmNlIHdhaXRzIHVuZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdHJhY2tQbHVnaW5Bc3luY0NsZWFudXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjbGVhbnVwIHRvIHJ1biBub3cuXG4gICAqL1xuICByZWFkb25seSBjbGVhbnVwOiBQbHVnaW5Bc3luY0NsZWFudXA7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoZSBjbGVhbnVwIGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgVHJhY2tlZENsZWFudXBFbnRyeSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0LWRldi10b29sa2l0L3JlYWRvbmx5LWludGVyZmFjZS1tZW1iZXJzIC0tIEFzc2lnbmVkIG9uY2UgdGhlIHNlbGYtcmVtb3ZpbmcgcHJvbWlzZSBleGlzdHMuXG4gIHByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEF3YWl0cyBldmVyeSBjbGVhbnVwIHN0aWxsIGluIGZsaWdodCBmb3IgdGhlIHBsdWdpbiwgYm91bmRlZCBieSBhIHRpbWVvdXQuXG4gKlxuICogUmVzb2x2ZXMgYXQgb25jZSB3aGVuIG5vdGhpbmcgaXMgcGVuZGluZy4gTmV2ZXIgcmVqZWN0cy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgZXZlcnkgcGVuZGluZyBjbGVhbnVwIHNldHRsZWQgaW4gdGltZSwgYGZhbHNlYCBpZiB0aGUgdGltZW91dCB3YXMgcmVhY2hlZCBmaXJzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpZFBsdWdpbkFzeW5jQ2xlYW51cHNTZXR0bGUocGFyYW1zOiBEaWRQbHVnaW5Bc3luY0NsZWFudXBzU2V0dGxlUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHByb21pc2UgPSBnZXRQZW5kaW5nQ2xlYW51cHMoKS5nZXQocGFyYW1zLnBsdWdpbklkKTtcbiAgaWYgKCFwcm9taXNlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBsZXQgdGltZW91dElkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8ZmFsc2U+KChyZXNvbHZlKSA9PiB7XG4gICAgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgfSwgcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX1BMVUdJTl9BU1lOQ19DTEVBTlVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKTtcbiAgfSk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5yYWNlKFtwcm9taXNlLnRoZW4oKCkgPT4gdHJ1ZSksIHRpbWVvdXRQcm9taXNlXSk7XG4gIH0gZmluYWxseSB7XG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBwbHVnaW4gaGFzIGNsZWFudXBzIHN0aWxsIGluIGZsaWdodC5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgcGx1Z2luIGlkLlxuICogQHJldHVybnMgV2hldGhlciBhbnkgY2xlYW51cCByZWdpc3RlcmVkIHVuZGVyIHRoZSBpZCBoYXMgbm90IHNldHRsZWQgeWV0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzUGVuZGluZ1BsdWdpbkFzeW5jQ2xlYW51cHMocGx1Z2luSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0UGVuZGluZ0NsZWFudXBzKCkuaGFzKHBsdWdpbklkKTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYW4gYXN5bmMgY2xlYW51cCB0aGF0IHN0YXJ0cyB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2FkcyBhbmQgdGhhdCB0aGUgbmV4dCBpbnN0YW5jZSBvZiB0aGUgcGx1Z2luIGF3YWl0cy5cbiAqXG4gKiBUaGUgY2xlYW51cCBydW5zIGV4YWN0bHkgb25jZSwgb24gdGhlIGNvbXBvbmVudCdzIHVubG9hZC4gUmVnaXN0ZXIgaXQgb24gdGhlIGNvbXBvbmVudCB3aG9zZSBsaWZldGltZSBtYXRjaGVzIHRoZVxuICogcmVzb3VyY2U6IGEgYFBsdWdpbkJhc2VgIHN1YmNsYXNzIGNhbGxzIGByZWdpc3RlckFzeW5jQ2xlYW51cGAgaW5zdGVhZCwgd2hpY2ggc2NvcGVzIGl0IHRvIHRoZSBmZWF0dXJlIHN1cmZhY2UuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW5Bc3luY0NsZWFudXAocGFyYW1zOiBSZWdpc3RlclBsdWdpbkFzeW5jQ2xlYW51cFBhcmFtcyk6IHZvaWQge1xuICBwYXJhbXMuY29tcG9uZW50LnJlZ2lzdGVyKCgpID0+IHtcbiAgICB0cmFja1BsdWdpbkFzeW5jQ2xlYW51cCh7XG4gICAgICBjbGVhbnVwOiBwYXJhbXMuY2xlYW51cCxcbiAgICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUnVucyBhbiBhc3luYyBjbGVhbnVwIG5vdyBhbmQgdHJhY2tzIGl0IHVuZGVyIHRoZSBwbHVnaW4gaWQgdW50aWwgaXQgc2V0dGxlcy5cbiAqXG4gKiBBIGNsZWFudXAgdGhhdCB0aHJvd3Mgb3IgcmVqZWN0cyBpcyBwcmludGVkIGFuZCBjb3VudHMgYXMgc2V0dGxlZCwgc28gYSBmYWlsaW5nIGNsZWFudXAgbmV2ZXIgc3RvcHMgdGhlIG5leHRcbiAqIGluc3RhbmNlIGZyb20gbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFja1BsdWdpbkFzeW5jQ2xlYW51cChwYXJhbXM6IFRyYWNrUGx1Z2luQXN5bmNDbGVhbnVwUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHBlbmRpbmdDbGVhbnVwcyA9IGdldFBlbmRpbmdDbGVhbnVwcygpO1xuICBjb25zdCBwcmV2aW91c1Byb21pc2UgPSBwZW5kaW5nQ2xlYW51cHMuZ2V0KHBhcmFtcy5wbHVnaW5JZCk7XG4gIGNvbnN0IGNsZWFudXBQcm9taXNlID0gcnVuQ2xlYW51cFNhZmVseShwYXJhbXMpO1xuICAvLyBOZXZlciByZWplY3RzOiBgcnVuQ2xlYW51cFNhZmVseWAgY2F0Y2hlcywgYW5kIHNvIGRpZCB3aGljaGV2ZXIgY2FsbCB0cmFja2VkIGBwcmV2aW91c1Byb21pc2VgLlxuICBjb25zdCBlbnRyeTogVHJhY2tlZENsZWFudXBFbnRyeSA9IHt9O1xuICBlbnRyeS5wcm9taXNlID0gKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChbcHJldmlvdXNQcm9taXNlLCBjbGVhbnVwUHJvbWlzZV0pO1xuICAgIC8vIEEgbGF0ZXIgY2FsbCBtYXkgaGF2ZSBjaGFpbmVkIG9udG8gdGhpcyBlbnRyeSBhbHJlYWR5OyBvbmx5IHRoZSBsYXRlc3QgZW50cnkgcmVtb3ZlcyBpdHNlbGYuXG4gICAgaWYgKHBlbmRpbmdDbGVhbnVwcy5nZXQocGFyYW1zLnBsdWdpbklkKSA9PT0gZW50cnkucHJvbWlzZSkge1xuICAgICAgcGVuZGluZ0NsZWFudXBzLmRlbGV0ZShwYXJhbXMucGx1Z2luSWQpO1xuICAgIH1cbiAgfSkoKTtcbiAgcGVuZGluZ0NsZWFudXBzLnNldChwYXJhbXMucGx1Z2luSWQsIGVudHJ5LnByb21pc2UpO1xufVxuXG5mdW5jdGlvbiBnZXRQZW5kaW5nQ2xlYW51cHMoKTogTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5MaWJTdGF0ZShQTFVHSU5fQVNZTkNfQ0xFQU5VUFNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx2b2lkPj4oKSkudmFsdWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkNsZWFudXBTYWZlbHkocGFyYW1zOiBUcmFja1BsdWdpbkFzeW5jQ2xlYW51cFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IHBhcmFtcy5jbGVhbnVwKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcihuZXcgRXJyb3IoYEFzeW5jIGNsZWFudXAgb2YgcGx1Z2luICR7cGFyYW1zLnBsdWdpbklkfSBmYWlsZWRgLCB7IGNhdXNlOiBlcnJvciB9KSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVCQSxtQkFBMkI7QUFFM0IsZ0NBQW9DO0FBSzdCLE1BQU0sa0NBQWtDO0FBS3hDLE1BQU0sdURBQXVEO0FBTTdELE1BQU0sNERBQTREO0FBc0V6RSxlQUFzQiw2QkFBNkIsUUFBOEQ7QUFDL0csUUFBTSxVQUFVLG1CQUFtQixFQUFFLElBQUksT0FBTyxRQUFRO0FBQ3hELE1BQUksQ0FBQyxTQUFTO0FBQ1osV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osUUFBTSxpQkFBaUIsSUFBSSxRQUFlLENBQUMsWUFBWTtBQUNyRCxnQkFBWSxPQUFPLFdBQVcsTUFBTTtBQUNsQyxjQUFRLEtBQUs7QUFBQSxJQUNmLEdBQUcsT0FBTyx5QkFBeUIsb0RBQW9EO0FBQUEsRUFDekYsQ0FBQztBQUVELE1BQUk7QUFDRixXQUFPLE1BQU0sUUFBUSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQztBQUFBLEVBQ3RFLFVBQUU7QUFDQSxXQUFPLGFBQWEsU0FBUztBQUFBLEVBQy9CO0FBQ0Y7QUFRTyxTQUFTLDhCQUE4QixVQUEyQjtBQUN2RSxTQUFPLG1CQUFtQixFQUFFLElBQUksUUFBUTtBQUMxQztBQVVPLFNBQVMsMkJBQTJCLFFBQWdEO0FBQ3pGLFNBQU8sVUFBVSxTQUFTLE1BQU07QUFDOUIsNEJBQXdCO0FBQUEsTUFDdEIsU0FBUyxPQUFPO0FBQUEsTUFDaEIsVUFBVSxPQUFPO0FBQUEsSUFDbkIsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBVU8sU0FBUyx3QkFBd0IsUUFBNkM7QUFDbkYsUUFBTSxrQkFBa0IsbUJBQW1CO0FBQzNDLFFBQU0sa0JBQWtCLGdCQUFnQixJQUFJLE9BQU8sUUFBUTtBQUMzRCxRQUFNLGlCQUFpQixpQkFBaUIsTUFBTTtBQUU5QyxRQUFNLFFBQTZCLENBQUM7QUFDcEMsUUFBTSxXQUFXLFlBQTJCO0FBQzFDLFVBQU0sUUFBUSxJQUFJLENBQUMsaUJBQWlCLGNBQWMsQ0FBQztBQUVuRCxRQUFJLGdCQUFnQixJQUFJLE9BQU8sUUFBUSxNQUFNLE1BQU0sU0FBUztBQUMxRCxzQkFBZ0IsT0FBTyxPQUFPLFFBQVE7QUFBQSxJQUN4QztBQUFBLEVBQ0YsR0FBRztBQUNILGtCQUFnQixJQUFJLE9BQU8sVUFBVSxNQUFNLE9BQU87QUFDcEQ7QUFFQSxTQUFTLHFCQUFpRDtBQUN4RCxhQUFPLCtDQUFvQixpQ0FBaUMsb0JBQUksSUFBMkIsQ0FBQyxFQUFFO0FBQ2hHO0FBRUEsZUFBZSxpQkFBaUIsUUFBc0Q7QUFDcEYsTUFBSTtBQUNGLFVBQU0sT0FBTyxRQUFRO0FBQUEsRUFDdkIsU0FBUyxPQUFPO0FBQ2QsaUNBQVcsSUFBSSxNQUFNLDJCQUEyQixPQUFPLFFBQVEsV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxFQUM3RjtBQUNGOyIsIm5hbWVzIjpbXX0=
@@ -28,6 +28,11 @@ export declare const PLUGIN_ASYNC_CLEANUPS_STATE_KEY = "pluginAsyncCleanupsV1";
28
28
  * How long a new plugin instance waits for the previous instance's cleanups by default.
29
29
  */
30
30
  export declare const DEFAULT_PLUGIN_ASYNC_CLEANUP_TIMEOUT_IN_MILLISECONDS = 10000;
31
+ /**
32
+ * How long a new plugin instance waits for the previous instance's cleanups, by default, before it shows a notice that
33
+ * its load is paused. Shorter waits show nothing, so the usual few milliseconds never flash a notice.
34
+ */
35
+ export declare const DEFAULT_PLUGIN_ASYNC_CLEANUP_NOTICE_DELAY_IN_MILLISECONDS = 500;
31
36
  /**
32
37
  * Parameters for {@link didPluginAsyncCleanupsSettle}.
33
38
  */
@@ -119,14 +119,14 @@ __export(plugin_context_exports, {
119
119
  initPluginContext: () => initPluginContext
120
120
  });
121
121
  module.exports = __toCommonJS(plugin_context_exports);
122
- var import_abort_controller = require('@mnaoumov/typescript-lib/abort-controller');
123
- var import_debug = require('@mnaoumov/typescript-lib/debug');
124
- var import_library = require('@mnaoumov/typescript-lib/library');
125
- var import_css_class = require('../css-class.cjs');
126
- var import_debug2 = require('../debug.cjs');
127
- var import_generated_during_build = require('../generated-during-build.cjs');
128
- var import_library_styles = require('../library-styles.cjs');
129
- var import_library2 = require('../library.cjs');
122
+ var import_abort_controller = require("@mnaoumov/typescript-lib/abort-controller");
123
+ var import_debug = require("@mnaoumov/typescript-lib/debug");
124
+ var import_library = require("@mnaoumov/typescript-lib/library");
125
+ var import_css_class = require("../css-class.cjs");
126
+ var import_debug2 = require("../debug.cjs");
127
+ var import_generated_during_build = require("../generated-during-build.cjs");
128
+ var import_library_styles = require("../library-styles.cjs");
129
+ var import_library2 = require("../library.cjs");
130
130
  const DEBUG_GUIDE_URL = "https://mnaoumov.dev/obsidian-lib/guides/debugging/";
131
131
  function addPluginCssClasses(element, cssClasses) {
132
132
  const extraCssClasses = typeof cssClasses === "string" ? [cssClasses] : cssClasses ?? [];
@@ -158,6 +158,7 @@ function initPluginContext(pluginId) {
158
158
  (0, import_debug2.showInitialDebugMessage)(pluginId);
159
159
  (0, import_abort_controller.getSharedAbortController)();
160
160
  (0, import_library_styles.injectLibraryStyles)({
161
+ // eslint-disable-next-line obsidianmd/prefer-active-doc -- The shared library styles belong to the main window; `activeDocument` would put them in whichever popout has focus.
161
162
  doc: document,
162
163
  libraryStyles: import_generated_during_build.LIBRARY_STYLES,
163
164
  libraryVersion: import_generated_during_build.LIBRARY_VERSION
@@ -169,4 +170,4 @@ function initPluginContext(pluginId) {
169
170
  initDebugController,
170
171
  initPluginContext
171
172
  });
172
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gY29udGV4dCBhbmQgc2V0cyB1cCB0aGUgcGx1Z2luIElELlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVidWdDb250cm9sbGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldFNoYXJlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IGdldERlYnVnQ29udHJvbGxlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kZWJ1Zyc7XG5pbXBvcnQgeyBMaWJyYXJ5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2xpYnJhcnknO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBzaG93SW5pdGlhbERlYnVnTWVzc2FnZSB9IGZyb20gJy4uL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIExJQlJBUllfU1RZTEVTLFxuICBMSUJSQVJZX1ZFUlNJT05cbn0gZnJvbSAnLi4vZ2VuZXJhdGVkLWR1cmluZy1idWlsZC50cyc7XG5pbXBvcnQgeyBpbmplY3RMaWJyYXJ5U3R5bGVzIH0gZnJvbSAnLi4vbGlicmFyeS1zdHlsZXMudHMnO1xuaW1wb3J0IHtcbiAgT0JTSURJQU5fTElCUkFSWV9OQU1FLFxuICBPYnNpZGlhbkxpYnJhcnlcbn0gZnJvbSAnLi4vbGlicmFyeS50cyc7XG5cbmludGVyZmFjZSBQbHVnaW5Db250ZXh0V2luZG93IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gUGx1Z2luIGNvbnRleHQgc2V0dXAgaW5zdGFsbHMgb3IgcmVwbGFjZXMgdGhlIGRlYnVnIGNvbnRyb2xsZXIuXG4gIERFQlVHOiBEZWJ1Z0NvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IERFQlVHX0dVSURFX1VSTCA9ICdodHRwczovL21uYW91bW92LmRldi9vYnNpZGlhbi1saWIvZ3VpZGVzL2RlYnVnZ2luZy8nO1xuXG4vKipcbiAqIFNldHMgdGhlIENTUyBjbGFzcyBvZiBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IHRoZSBDU1MgY2xhc3Mgb2YuXG4gKiBAcGFyYW0gY3NzQ2xhc3NlcyAtIFRoZSBDU1MgY2xhc3NlcyB0byBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRQbHVnaW5Dc3NDbGFzc2VzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjc3NDbGFzc2VzPzogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFDc3NDbGFzc2VzID0gdHlwZW9mIGNzc0NsYXNzZXMgPT09ICdzdHJpbmcnID8gW2Nzc0NsYXNzZXNdIDogY3NzQ2xhc3NlcyA/PyBbXTtcbiAgZWxlbWVudC5hZGRDbGFzcyhcbiAgICBDc3NDbGFzcy5MaWJyYXJ5TmFtZSxcbiAgICAvLyBUaGUgc2NvcGUgaXMgZW1wdHkgdW50aWwgdGhlIHBsdWdpbiBjb250ZXh0IGlzIGluaXRpYWxpemVkOyBza2lwIGl0IHNvIHdlIG5ldmVyIGFkZCBhbiBlbXB0eSBjbGFzcy5cbiAgICAuLi4oT2JzaWRpYW5MaWJyYXJ5LmNzc0NsYXNzU2NvcGUgPyBbT2JzaWRpYW5MaWJyYXJ5LmNzc0NsYXNzU2NvcGVdIDogW10pLFxuICAgIC4uLmV4dHJhQ3NzQ2xhc3Nlc1xuICApO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBkZWJ1ZyBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB3aW4gLSBUaGUgd2luZG93IHRvIGluaXRpYWxpemUgdGhlIGRlYnVnIGNvbnRyb2xsZXIgZm9yLlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIgY2xlYW51cCBvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREZWJ1Z0NvbnRyb2xsZXIod2luOiBXaW5kb3csIGNvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbkNvbnRleHRXaW5kb3cgPSB3aW4gYXMgUGFydGlhbDxQbHVnaW5Db250ZXh0V2luZG93PjtcbiAgY29uc3Qgb2xkRGVidWcgPSBwbHVnaW5Db250ZXh0V2luZG93LkRFQlVHO1xuICBjb25zdCBuZXdEZWJ1ZyA9IGdldERlYnVnQ29udHJvbGxlcigpO1xuICBwbHVnaW5Db250ZXh0V2luZG93LkRFQlVHID0gbmV3RGVidWc7XG5cbiAgY29tcG9uZW50LnJlZ2lzdGVyKCgpID0+IHtcbiAgICBpZiAocGx1Z2luQ29udGV4dFdpbmRvdy5ERUJVRyA9PT0gbmV3RGVidWcpIHtcbiAgICAgIHBsdWdpbkNvbnRleHRXaW5kb3cuREVCVUcgPSBvbGREZWJ1ZztcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgcGx1Z2luIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFBsdWdpbkNvbnRleHQocGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBPYnNpZGlhbkxpYnJhcnkuaW5pdCh7IGNzc0NsYXNzU2NvcGU6IHBsdWdpbklkIH0pO1xuICBMaWJyYXJ5LmluaXQoe1xuICAgIGRlYnVnR3VpZGVVcmw6IERFQlVHX0dVSURFX1VSTCxcbiAgICBkZWJ1Z05hbWVzcGFjZTogT0JTSURJQU5fTElCUkFSWV9OQU1FLFxuICAgIGRlYnVnUHJlZml4TmFtZXNwYWNlOiBgJHtwbHVnaW5JZH06YCxcbiAgICBzaG91bGRQcmludFN0YWNrVHJhY2U6IHRydWVcbiAgfSk7XG4gIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkKTtcblxuICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGxpYnJhcnkgcmVhY2hlcyBmb3IgdGhlIHNoYXJlZCBhYm9ydCBjb250cm9sbGVyIC0tIG9ubHkgY29uc3VtZXIgcGx1Z2lucyBkby4gQ3JlYXRlXG4gIC8vIGl0IGhlcmUgc28gdGhlIGRldnRvb2xzIGNvbnNvbGUgcmVjaXBlIGluIHRoZSBkZWJ1Z2dpbmcgZ3VpZGUgYWx3YXlzIHJlc29sdmVzLCBpbnN0ZWFkIG9mIHRocm93aW5nIHVudGlsIHNvbWVcbiAgLy8gcGx1Z2luIGhhcHBlbnMgdG8gc3RhcnQgYW4gYWJvcnRhYmxlIG9wZXJhdGlvbi5cbiAgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaW5qZWN0TGlicmFyeVN0eWxlcyh7XG4gICAgZG9jOiBkb2N1bWVudCxcbiAgICBsaWJyYXJ5U3R5bGVzOiBMSUJSQVJZX1NUWUxFUyxcbiAgICBsaWJyYXJ5VmVyc2lvbjogTElCUkFSWV9WRVJTSU9OXG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLDhCQUF5QztBQUN6QyxtQkFBbUM7QUFDbkMscUJBQXdCO0FBRXhCLHVCQUF5QjtBQUN6QixJQUFBQSxnQkFBd0M7QUFDeEMsb0NBR087QUFDUCw0QkFBb0M7QUFDcEMsSUFBQUMsa0JBR087QUFPUCxNQUFNLGtCQUFrQjtBQVFqQixTQUFTLG9CQUFvQixTQUFzQixZQUFzQztBQUM5RixRQUFNLGtCQUFrQixPQUFPLGVBQWUsV0FBVyxDQUFDLFVBQVUsSUFBSSxjQUFjLENBQUM7QUFDdkYsVUFBUTtBQUFBLElBQ04sMEJBQVM7QUFBQSxJQUVULEdBQUksZ0NBQWdCLGdCQUFnQixDQUFDLGdDQUFnQixhQUFhLElBQUksQ0FBQztBQUFBLElBQ3ZFLEdBQUc7QUFBQSxFQUNMO0FBQ0Y7QUFRTyxTQUFTLG9CQUFvQixLQUFhLFdBQTRCO0FBQzNFLFFBQU0sc0JBQXNCO0FBQzVCLFFBQU0sV0FBVyxvQkFBb0I7QUFDckMsUUFBTSxlQUFXLGlDQUFtQjtBQUNwQyxzQkFBb0IsUUFBUTtBQUU1QixZQUFVLFNBQVMsTUFBTTtBQUN2QixRQUFJLG9CQUFvQixVQUFVLFVBQVU7QUFDMUMsMEJBQW9CLFFBQVE7QUFBQSxJQUM5QjtBQUFBLEVBQ0YsQ0FBQztBQUNIO0FBT08sU0FBUyxrQkFBa0IsVUFBd0I7QUFDeEQsa0NBQWdCLEtBQUssRUFBRSxlQUFlLFNBQVMsQ0FBQztBQUNoRCx5QkFBUSxLQUFLO0FBQUEsSUFDWCxlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixzQkFBc0IsR0FBRyxRQUFRO0FBQUEsSUFDakMsdUJBQXVCO0FBQUEsRUFDekIsQ0FBQztBQUNELDZDQUF3QixRQUFRO0FBS2hDLHdEQUF5QjtBQUV6QixpREFBb0I7QUFBQSxJQUNsQixLQUFLO0FBQUEsSUFDTCxlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxFQUNsQixDQUFDO0FBQ0g7IiwibmFtZXMiOlsiaW1wb3J0X2RlYnVnIiwiaW1wb3J0X2xpYnJhcnkiXX0=
173
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gY29udGV4dCBhbmQgc2V0cyB1cCB0aGUgcGx1Z2luIElELlxuICovXG5cbmltcG9ydCB0eXBlIHsgRGVidWdDb250cm9sbGVyIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2RlYnVnLWNvbnRyb2xsZXInO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnQgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldFNoYXJlZEFib3J0Q29udHJvbGxlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hYm9ydC1jb250cm9sbGVyJztcbmltcG9ydCB7IGdldERlYnVnQ29udHJvbGxlciB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9kZWJ1Zyc7XG5pbXBvcnQgeyBMaWJyYXJ5IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2xpYnJhcnknO1xuXG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBzaG93SW5pdGlhbERlYnVnTWVzc2FnZSB9IGZyb20gJy4uL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIExJQlJBUllfU1RZTEVTLFxuICBMSUJSQVJZX1ZFUlNJT05cbn0gZnJvbSAnLi4vZ2VuZXJhdGVkLWR1cmluZy1idWlsZC50cyc7XG5pbXBvcnQgeyBpbmplY3RMaWJyYXJ5U3R5bGVzIH0gZnJvbSAnLi4vbGlicmFyeS1zdHlsZXMudHMnO1xuaW1wb3J0IHtcbiAgT0JTSURJQU5fTElCUkFSWV9OQU1FLFxuICBPYnNpZGlhbkxpYnJhcnlcbn0gZnJvbSAnLi4vbGlicmFyeS50cyc7XG5cbmludGVyZmFjZSBQbHVnaW5Db250ZXh0V2luZG93IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQtZGV2LXRvb2xraXQvcmVhZG9ubHktaW50ZXJmYWNlLW1lbWJlcnMgLS0gUGx1Z2luIGNvbnRleHQgc2V0dXAgaW5zdGFsbHMgb3IgcmVwbGFjZXMgdGhlIGRlYnVnIGNvbnRyb2xsZXIuXG4gIERFQlVHOiBEZWJ1Z0NvbnRyb2xsZXIgfCB1bmRlZmluZWQ7XG59XG5cbmNvbnN0IERFQlVHX0dVSURFX1VSTCA9ICdodHRwczovL21uYW91bW92LmRldi9vYnNpZGlhbi1saWIvZ3VpZGVzL2RlYnVnZ2luZy8nO1xuXG4vKipcbiAqIFNldHMgdGhlIENTUyBjbGFzcyBvZiBhbiBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc2V0IHRoZSBDU1MgY2xhc3Mgb2YuXG4gKiBAcGFyYW0gY3NzQ2xhc3NlcyAtIFRoZSBDU1MgY2xhc3NlcyB0byBzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRQbHVnaW5Dc3NDbGFzc2VzKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBjc3NDbGFzc2VzPzogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgY29uc3QgZXh0cmFDc3NDbGFzc2VzID0gdHlwZW9mIGNzc0NsYXNzZXMgPT09ICdzdHJpbmcnID8gW2Nzc0NsYXNzZXNdIDogY3NzQ2xhc3NlcyA/PyBbXTtcbiAgZWxlbWVudC5hZGRDbGFzcyhcbiAgICBDc3NDbGFzcy5MaWJyYXJ5TmFtZSxcbiAgICAvLyBUaGUgc2NvcGUgaXMgZW1wdHkgdW50aWwgdGhlIHBsdWdpbiBjb250ZXh0IGlzIGluaXRpYWxpemVkOyBza2lwIGl0IHNvIHdlIG5ldmVyIGFkZCBhbiBlbXB0eSBjbGFzcy5cbiAgICAuLi4oT2JzaWRpYW5MaWJyYXJ5LmNzc0NsYXNzU2NvcGUgPyBbT2JzaWRpYW5MaWJyYXJ5LmNzc0NsYXNzU2NvcGVdIDogW10pLFxuICAgIC4uLmV4dHJhQ3NzQ2xhc3Nlc1xuICApO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBkZWJ1ZyBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB3aW4gLSBUaGUgd2luZG93IHRvIGluaXRpYWxpemUgdGhlIGRlYnVnIGNvbnRyb2xsZXIgZm9yLlxuICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXIgY2xlYW51cCBvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXREZWJ1Z0NvbnRyb2xsZXIod2luOiBXaW5kb3csIGNvbXBvbmVudDogQ29tcG9uZW50KTogdm9pZCB7XG4gIGNvbnN0IHBsdWdpbkNvbnRleHRXaW5kb3cgPSB3aW4gYXMgUGFydGlhbDxQbHVnaW5Db250ZXh0V2luZG93PjtcbiAgY29uc3Qgb2xkRGVidWcgPSBwbHVnaW5Db250ZXh0V2luZG93LkRFQlVHO1xuICBjb25zdCBuZXdEZWJ1ZyA9IGdldERlYnVnQ29udHJvbGxlcigpO1xuICBwbHVnaW5Db250ZXh0V2luZG93LkRFQlVHID0gbmV3RGVidWc7XG5cbiAgY29tcG9uZW50LnJlZ2lzdGVyKCgpID0+IHtcbiAgICBpZiAocGx1Z2luQ29udGV4dFdpbmRvdy5ERUJVRyA9PT0gbmV3RGVidWcpIHtcbiAgICAgIHBsdWdpbkNvbnRleHRXaW5kb3cuREVCVUcgPSBvbGREZWJ1ZztcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHRoZSBwbHVnaW4gY29udGV4dC5cbiAqXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgcGx1Z2luIElELlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdFBsdWdpbkNvbnRleHQocGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICBPYnNpZGlhbkxpYnJhcnkuaW5pdCh7IGNzc0NsYXNzU2NvcGU6IHBsdWdpbklkIH0pO1xuICBMaWJyYXJ5LmluaXQoe1xuICAgIGRlYnVnR3VpZGVVcmw6IERFQlVHX0dVSURFX1VSTCxcbiAgICBkZWJ1Z05hbWVzcGFjZTogT0JTSURJQU5fTElCUkFSWV9OQU1FLFxuICAgIGRlYnVnUHJlZml4TmFtZXNwYWNlOiBgJHtwbHVnaW5JZH06YCxcbiAgICBzaG91bGRQcmludFN0YWNrVHJhY2U6IHRydWVcbiAgfSk7XG4gIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkKTtcblxuICAvLyBOb3RoaW5nIGVsc2UgaW4gdGhlIGxpYnJhcnkgcmVhY2hlcyBmb3IgdGhlIHNoYXJlZCBhYm9ydCBjb250cm9sbGVyIC0tIG9ubHkgY29uc3VtZXIgcGx1Z2lucyBkby4gQ3JlYXRlXG4gIC8vIGl0IGhlcmUgc28gdGhlIGRldnRvb2xzIGNvbnNvbGUgcmVjaXBlIGluIHRoZSBkZWJ1Z2dpbmcgZ3VpZGUgYWx3YXlzIHJlc29sdmVzLCBpbnN0ZWFkIG9mIHRocm93aW5nIHVudGlsIHNvbWVcbiAgLy8gcGx1Z2luIGhhcHBlbnMgdG8gc3RhcnQgYW4gYWJvcnRhYmxlIG9wZXJhdGlvbi5cbiAgZ2V0U2hhcmVkQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgaW5qZWN0TGlicmFyeVN0eWxlcyh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFubWQvcHJlZmVyLWFjdGl2ZS1kb2MgLS0gVGhlIHNoYXJlZCBsaWJyYXJ5IHN0eWxlcyBiZWxvbmcgdG8gdGhlIG1haW4gd2luZG93OyBgYWN0aXZlRG9jdW1lbnRgIHdvdWxkIHB1dCB0aGVtIGluIHdoaWNoZXZlciBwb3BvdXQgaGFzIGZvY3VzLlxuICAgIGRvYzogZG9jdW1lbnQsXG4gICAgbGlicmFyeVN0eWxlczogTElCUkFSWV9TVFlMRVMsXG4gICAgbGlicmFyeVZlcnNpb246IExJQlJBUllfVkVSU0lPTlxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSw4QkFBeUM7QUFDekMsbUJBQW1DO0FBQ25DLHFCQUF3QjtBQUV4Qix1QkFBeUI7QUFDekIsSUFBQUEsZ0JBQXdDO0FBQ3hDLG9DQUdPO0FBQ1AsNEJBQW9DO0FBQ3BDLElBQUFDLGtCQUdPO0FBT1AsTUFBTSxrQkFBa0I7QUFRakIsU0FBUyxvQkFBb0IsU0FBc0IsWUFBc0M7QUFDOUYsUUFBTSxrQkFBa0IsT0FBTyxlQUFlLFdBQVcsQ0FBQyxVQUFVLElBQUksY0FBYyxDQUFDO0FBQ3ZGLFVBQVE7QUFBQSxJQUNOLDBCQUFTO0FBQUEsSUFFVCxHQUFJLGdDQUFnQixnQkFBZ0IsQ0FBQyxnQ0FBZ0IsYUFBYSxJQUFJLENBQUM7QUFBQSxJQUN2RSxHQUFHO0FBQUEsRUFDTDtBQUNGO0FBUU8sU0FBUyxvQkFBb0IsS0FBYSxXQUE0QjtBQUMzRSxRQUFNLHNCQUFzQjtBQUM1QixRQUFNLFdBQVcsb0JBQW9CO0FBQ3JDLFFBQU0sZUFBVyxpQ0FBbUI7QUFDcEMsc0JBQW9CLFFBQVE7QUFFNUIsWUFBVSxTQUFTLE1BQU07QUFDdkIsUUFBSSxvQkFBb0IsVUFBVSxVQUFVO0FBQzFDLDBCQUFvQixRQUFRO0FBQUEsSUFDOUI7QUFBQSxFQUNGLENBQUM7QUFDSDtBQU9PLFNBQVMsa0JBQWtCLFVBQXdCO0FBQ3hELGtDQUFnQixLQUFLLEVBQUUsZUFBZSxTQUFTLENBQUM7QUFDaEQseUJBQVEsS0FBSztBQUFBLElBQ1gsZUFBZTtBQUFBLElBQ2YsZ0JBQWdCO0FBQUEsSUFDaEIsc0JBQXNCLEdBQUcsUUFBUTtBQUFBLElBQ2pDLHVCQUF1QjtBQUFBLEVBQ3pCLENBQUM7QUFDRCw2Q0FBd0IsUUFBUTtBQUtoQyx3REFBeUI7QUFFekIsaURBQW9CO0FBQUE7QUFBQSxJQUVsQixLQUFLO0FBQUEsSUFDTCxlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxFQUNsQixDQUFDO0FBQ0g7IiwibmFtZXMiOlsiaW1wb3J0X2RlYnVnIiwiaW1wb3J0X2xpYnJhcnkiXX0=
@@ -178,4 +178,4 @@ class PluginEventSourceImpl {
178
178
  0 && (module.exports = {
179
179
  PluginEventSourceImpl
180
180
  });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbHVnaW4gZXZlbnQgc291cmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXN5bmNFdmVudFJlZixcbiAgQXN5bmNFdmVudFNvdXJjZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYXN5bmMtZXZlbnRzJztcbmltcG9ydCB0eXBlIHsgU3RyaW5nS2V5cyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gJy4vcGx1Z2luLnRzJztcblxuLyoqXG4gKiBFdmVudCBtYXAgZm9yIHBsdWdpbiBldmVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRXZlbnRNYXAge1xuICAvKipcbiAgRmlyZWQgd2hlbiBwbHVnaW4gc2V0dGluZ3MgYXJlIGNoYW5nZWQgZXh0ZXJuYWxseSAoZS5nLiBzeW5jLCBtYW51YWwgZmlsZSBlZGl0KS5cbiAgICovXG4gIHJlYWRvbmx5IGV4dGVybmFsU2V0dGluZ3NDaGFuZ2U6IFtdO1xufVxuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBmb3IgcGx1Z2luIGV2ZW50cy5cbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luRXZlbnRTb3VyY2UgPSBBc3luY0V2ZW50U291cmNlPFBsdWdpbkV2ZW50TWFwPjtcblxuLyoqXG4gKiBQbHVnaW4gZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luRXZlbnRTb3VyY2VJbXBsIGltcGxlbWVudHMgUGx1Z2luRXZlbnRTb3VyY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gZXZlbnQgc291cmNlLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0byBjcmVhdGUgdGhlIGV2ZW50IHNvdXJjZSBmb3IuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luQmFzZSkge31cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvZmY8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luRXZlbnRNYXA+ID8gUGx1Z2luRXZlbnRNYXBbRXZlbnROYW1lXSA6IHVua25vd25bXT4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2luLm9mZihuYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5wbHVnaW4ub2ZmcmVmKGV2ZW50UmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpbkV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgRXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4gPyBQbHVnaW5FdmVudE1hcFtFdmVudE5hbWVdIDogdW5rbm93bltdPihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jRXZlbnRzI29ufSAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luRXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpbkV2ZW50TWFwPiA/IFBsdWdpbkV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFpQ08sTUFBTSxzQkFBbUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNdkQsWUFBK0IsUUFBb0I7QUFBcEI7QUFBQSxFQUFxQjtBQUFBLEVBQXJCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZ0IvQixJQUNMLE1BQ0EsVUFDTTtBQUNOLFNBQUssT0FBTyxJQUFJLE1BQU0sUUFBUTtBQUFBLEVBQ2hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sT0FBTyxVQUErQjtBQUMzQyxTQUFLLE9BQU8sT0FBTyxRQUFRO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQXVCTyxHQUNMLE1BQ0EsVUFDQSxjQUNlO0FBQ2YsV0FBTyxLQUFLLE9BQU8sR0FBRyxNQUFNLFVBQVUsWUFBWTtBQUFBLEVBQ3BEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF1Qk8sS0FDTCxNQUNBLFVBQ0EsY0FDZTtBQUNmLFdBQU8sS0FBSyxPQUFPLEtBQUssTUFBTSxVQUFVLFlBQVk7QUFBQSxFQUN0RDtBQUNGOyIsIm5hbWVzIjpbXX0=
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWV2ZW50LXNvdXJjZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwbHVnaW4gZXZlbnQgc291cmNlLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXN5bmNFdmVudFJlZixcbiAgQXN5bmNFdmVudFNvdXJjZSxcbiAgQ2FsbGJhY2tBcmd1bWVudHNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jLWV2ZW50cyc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ0tleXMgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZSc7XG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbkJhc2UgfSBmcm9tICcuL3BsdWdpbi50cyc7XG5cbi8qKlxuICogRXZlbnQgbWFwIGZvciBwbHVnaW4gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkV2ZW50TWFwIHtcbiAgLyoqXG4gIEZpcmVkIHdoZW4gcGx1Z2luIHNldHRpbmdzIGFyZSBjaGFuZ2VkIGV4dGVybmFsbHkgKGUuZy4gc3luYywgbWFudWFsIGZpbGUgZWRpdCkuXG4gICAqL1xuICByZWFkb25seSBleHRlcm5hbFNldHRpbmdzQ2hhbmdlOiBbXTtcbn1cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgZm9yIHBsdWdpbiBldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIFBsdWdpbkV2ZW50U291cmNlID0gQXN5bmNFdmVudFNvdXJjZTxQbHVnaW5FdmVudE1hcD47XG5cbi8qKlxuICogUGx1Z2luIGV2ZW50IHNvdXJjZSBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbkV2ZW50U291cmNlSW1wbCBpbXBsZW1lbnRzIFBsdWdpbkV2ZW50U291cmNlIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgcGx1Z2luIGV2ZW50IHNvdXJjZS5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdG8gY3JlYXRlIHRoZSBldmVudCBzb3VyY2UgZm9yLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBwbHVnaW46IFBsdWdpbkJhc2UpIHt9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gcmVtb3ZlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmKCdteS1ldmVudCcsIG15TGlzdGVuZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luRXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxQbHVnaW5FdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICk6IHZvaWQge1xuICAgIHRoaXMucGx1Z2luLm9mZihuYW1lLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5wbHVnaW4ub2ZmcmVmKGV2ZW50UmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpbkV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8UGx1Z2luRXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub25jZSgnbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uY2U8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5FdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPFBsdWdpbkV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmIHtcbiAgICByZXR1cm4gdGhpcy5wbHVnaW4ub25jZShuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBa0NPLE1BQU0sc0JBQW1EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTXZELFlBQStCLFFBQW9CO0FBQXBCO0FBQUEsRUFBcUI7QUFBQSxFQUFyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCL0IsSUFDTCxNQUNBLFVBQ007QUFDTixTQUFLLE9BQU8sSUFBSSxNQUFNLFFBQVE7QUFBQSxFQUNoQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLE9BQU8sVUFBK0I7QUFDM0MsU0FBSyxPQUFPLE9BQU8sUUFBUTtBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUF1Qk8sR0FDTCxNQUNBLFVBQ0EsY0FDZTtBQUNmLFdBQU8sS0FBSyxPQUFPLEdBQUcsTUFBTSxVQUFVLFlBQVk7QUFBQSxFQUNwRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBdUJPLEtBQ0wsTUFDQSxVQUNBLGNBQ2U7QUFDZixXQUFPLEtBQUssT0FBTyxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQUEsRUFDdEQ7QUFDRjsiLCJuYW1lcyI6W119