obsidian-dev-utils 88.7.0 → 89.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 (679) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/demo-vault-helper/main.js +20 -23
  3. package/dist/integration-test-plugin/main.js +2218 -1734
  4. package/dist/lib/cjs/__merged.cjs +57 -35
  5. package/dist/lib/cjs/__merged.d.cts +12 -10
  6. package/dist/lib/cjs/abort-controller.cjs +15 -22
  7. package/dist/lib/cjs/array.cjs +27 -26
  8. package/dist/lib/cjs/array.d.cts +25 -7
  9. package/dist/lib/cjs/async-events.cjs +87 -91
  10. package/dist/lib/cjs/async-events.d.cts +50 -50
  11. package/dist/lib/cjs/async.cjs +80 -80
  12. package/dist/lib/cjs/async.d.cts +23 -23
  13. package/dist/lib/cjs/beeper.cjs +11 -15
  14. package/dist/lib/cjs/blob.cjs +14 -25
  15. package/dist/lib/cjs/codemirror/index.cjs +11 -15
  16. package/dist/lib/cjs/codemirror/state-field-spec.cjs +11 -15
  17. package/dist/lib/cjs/debug-controller.cjs +11 -15
  18. package/dist/lib/cjs/debug.cjs +24 -32
  19. package/dist/lib/cjs/debug.d.cts +1 -1
  20. package/dist/lib/cjs/disposable.cjs +59 -43
  21. package/dist/lib/cjs/disposable.d.cts +27 -8
  22. package/dist/lib/cjs/enum.cjs +11 -15
  23. package/dist/lib/cjs/error.cjs +28 -33
  24. package/dist/lib/cjs/function.cjs +30 -34
  25. package/dist/lib/cjs/function.d.cts +26 -26
  26. package/dist/lib/cjs/generated-during-build.cjs +12 -16
  27. package/dist/lib/cjs/html-element.cjs +84 -89
  28. package/dist/lib/cjs/html-element.d.cts +15 -15
  29. package/dist/lib/cjs/index.cjs +11 -15
  30. package/dist/lib/cjs/integration-test-setup.cjs +11 -15
  31. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +11 -15
  32. package/dist/lib/cjs/jest-setup.cjs +11 -15
  33. package/dist/lib/cjs/library.cjs +11 -15
  34. package/dist/lib/cjs/object-utils.cjs +120 -117
  35. package/dist/lib/cjs/object-utils.d.cts +27 -27
  36. package/dist/lib/cjs/obsidian/@types/dataview/data-model/value.d.cts +1 -1
  37. package/dist/lib/cjs/obsidian/@types/dataview/expression/field.d.cts +1 -1
  38. package/dist/lib/cjs/obsidian/@types/dataview/expression/functions.d.cts +4 -4
  39. package/dist/lib/cjs/obsidian/active-file-provider.cjs +11 -15
  40. package/dist/lib/cjs/obsidian/app.cjs +11 -15
  41. package/dist/lib/cjs/obsidian/async-with-notice.cjs +28 -32
  42. package/dist/lib/cjs/obsidian/async-with-notice.d.cts +2 -2
  43. package/dist/lib/cjs/obsidian/attachment-path.cjs +20 -24
  44. package/dist/lib/cjs/obsidian/attachment-path.d.cts +5 -5
  45. package/dist/lib/cjs/obsidian/backlink.cjs +12 -16
  46. package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +11 -15
  47. package/dist/lib/cjs/obsidian/callout.cjs +27 -26
  48. package/dist/lib/cjs/obsidian/callout.d.cts +9 -3
  49. package/dist/lib/cjs/obsidian/canvas.cjs +13 -16
  50. package/dist/lib/cjs/obsidian/case-insensitive-file-index.cjs +18 -20
  51. package/dist/lib/cjs/obsidian/code-block-markdown-information.cjs +11 -15
  52. package/dist/lib/cjs/obsidian/code-block-markdown-information.d.cts +2 -2
  53. package/dist/lib/cjs/obsidian/code-block-reg-exp.cjs +11 -15
  54. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +18 -16
  55. package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +5 -0
  56. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +56 -31
  57. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +42 -8
  58. package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +11 -15
  59. package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +10 -0
  60. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +26 -30
  61. package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +8 -8
  62. package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +12 -16
  63. package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +12 -16
  64. package/dist/lib/cjs/obsidian/command-handlers/global-command-handler.cjs +13 -17
  65. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +11 -15
  66. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +11 -15
  67. package/dist/lib/cjs/obsidian/command-handlers/open-settings-command-handler.cjs +11 -15
  68. package/dist/lib/cjs/obsidian/command-handlers/unlock-active-note-command-handler.cjs +11 -15
  69. package/dist/lib/cjs/obsidian/command-registrar.cjs +11 -15
  70. package/dist/lib/cjs/obsidian/community-plugins.cjs +28 -25
  71. package/dist/lib/cjs/obsidian/community-plugins.d.cts +19 -5
  72. package/dist/lib/cjs/obsidian/components/abort-signal-component.cjs +11 -15
  73. package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +11 -15
  74. package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +4 -4
  75. package/dist/lib/cjs/obsidian/components/async-error-handler-component.cjs +13 -16
  76. package/dist/lib/cjs/obsidian/components/async-events-component.cjs +11 -15
  77. package/dist/lib/cjs/obsidian/components/case-insensitive-file-index-component.cjs +11 -15
  78. package/dist/lib/cjs/obsidian/components/component-ex.cjs +26 -28
  79. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +3 -3
  80. package/dist/lib/cjs/obsidian/components/console-debug-component.cjs +14 -18
  81. package/dist/lib/cjs/obsidian/components/console-debug-component.d.cts +2 -2
  82. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +11 -15
  83. package/dist/lib/cjs/obsidian/components/embed-extensions-component.cjs +11 -15
  84. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +11 -15
  85. package/dist/lib/cjs/obsidian/components/index.cjs +14 -15
  86. package/dist/lib/cjs/obsidian/components/index.d.cts +1 -0
  87. package/dist/lib/cjs/obsidian/components/layout-ready-component.cjs +11 -15
  88. package/dist/lib/cjs/obsidian/components/menu-event-registrar-component.cjs +11 -15
  89. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +29 -33
  90. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +55 -55
  91. package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.cjs +297 -0
  92. package/dist/lib/cjs/obsidian/components/notebook-navigator-menu-event-registrar-component.d.cts +139 -0
  93. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +11 -15
  94. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +28 -31
  95. package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +26 -30
  96. package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +8 -8
  97. package/dist/lib/cjs/obsidian/components/plugin-settings-tab-component.cjs +11 -15
  98. package/dist/lib/cjs/obsidian/components/pointer-position-component.cjs +13 -17
  99. package/dist/lib/cjs/obsidian/components/registry-component.cjs +11 -15
  100. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +72 -62
  101. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +12 -1
  102. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.cjs +16 -20
  103. package/dist/lib/cjs/obsidian/components/syntax-highlighting-component.d.cts +8 -8
  104. package/dist/lib/cjs/obsidian/constructors/get-dom-events-handlers-constructor.cjs +14 -18
  105. package/dist/lib/cjs/obsidian/constructors/index.cjs +11 -15
  106. package/dist/lib/cjs/obsidian/css-class.cjs +11 -15
  107. package/dist/lib/cjs/obsidian/data-handler.cjs +11 -15
  108. package/dist/lib/cjs/obsidian/dataview-link.cjs +13 -17
  109. package/dist/lib/cjs/obsidian/dataview.cjs +35 -41
  110. package/dist/lib/cjs/obsidian/dataview.d.cts +2 -2
  111. package/dist/lib/cjs/obsidian/demo-vault-helper.cjs +13 -17
  112. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +22 -26
  113. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +23 -21
  114. package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +11 -15
  115. package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +11 -15
  116. package/dist/lib/cjs/obsidian/editor.cjs +17 -19
  117. package/dist/lib/cjs/obsidian/events.cjs +12 -16
  118. package/dist/lib/cjs/obsidian/events.d.cts +2 -2
  119. package/dist/lib/cjs/obsidian/extensions-registrar.cjs +11 -15
  120. package/dist/lib/cjs/obsidian/file-change.cjs +76 -80
  121. package/dist/lib/cjs/obsidian/file-change.d.cts +3 -3
  122. package/dist/lib/cjs/obsidian/file-manager.cjs +33 -22
  123. package/dist/lib/cjs/obsidian/file-manager.d.cts +20 -1
  124. package/dist/lib/cjs/obsidian/file-system.cjs +15 -19
  125. package/dist/lib/cjs/obsidian/file-system.d.cts +3 -3
  126. package/dist/lib/cjs/obsidian/frontmatter-link-cache-with-offsets.cjs +11 -15
  127. package/dist/lib/cjs/obsidian/frontmatter.cjs +15 -19
  128. package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +11 -15
  129. package/dist/lib/cjs/obsidian/html-element.cjs +13 -17
  130. package/dist/lib/cjs/obsidian/html-element.d.cts +2 -2
  131. package/dist/lib/cjs/obsidian/i18n/custom-type-options.cjs +11 -15
  132. package/dist/lib/cjs/obsidian/i18n/default-translations.cjs +11 -15
  133. package/dist/lib/cjs/obsidian/i18n/i18n.cjs +13 -16
  134. package/dist/lib/cjs/obsidian/i18n/i18n.d.cts +7 -0
  135. package/dist/lib/cjs/obsidian/i18n/index.cjs +11 -15
  136. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +11 -15
  137. package/dist/lib/cjs/obsidian/i18n/locales/index.cjs +11 -15
  138. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.cjs +11 -15
  139. package/dist/lib/cjs/obsidian/index.cjs +14 -15
  140. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  141. package/dist/lib/cjs/obsidian/is-in-obsidian.cjs +11 -15
  142. package/dist/lib/cjs/obsidian/link-update-progress.cjs +11 -15
  143. package/dist/lib/cjs/obsidian/link.cjs +91 -81
  144. package/dist/lib/cjs/obsidian/link.d.cts +22 -22
  145. package/dist/lib/cjs/obsidian/logger.cjs +21 -25
  146. package/dist/lib/cjs/obsidian/logger.d.cts +5 -5
  147. package/dist/lib/cjs/obsidian/loop.cjs +14 -18
  148. package/dist/lib/cjs/obsidian/loop.d.cts +1 -1
  149. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +12 -16
  150. package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +3 -3
  151. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +35 -40
  152. package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +3 -3
  153. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +12 -16
  154. package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +3 -3
  155. package/dist/lib/cjs/obsidian/markdown-view.cjs +11 -15
  156. package/dist/lib/cjs/obsidian/markdown.cjs +22 -24
  157. package/dist/lib/cjs/obsidian/menu-event-registrar.cjs +11 -15
  158. package/dist/lib/cjs/obsidian/menu-event-registrar.d.cts +1 -1
  159. package/dist/lib/cjs/obsidian/metadata-cache.cjs +16 -20
  160. package/dist/lib/cjs/obsidian/metadata-cache.d.cts +2 -2
  161. package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -15
  162. package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -15
  163. package/dist/lib/cjs/obsidian/modals/index.cjs +11 -15
  164. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +28 -32
  165. package/dist/lib/cjs/obsidian/modals/modal.cjs +11 -15
  166. package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -15
  167. package/dist/lib/cjs/obsidian/modals/select-item.cjs +16 -20
  168. package/dist/lib/cjs/obsidian/modals/select-item.d.cts +1 -1
  169. package/dist/lib/cjs/obsidian/modals/select-option.cjs +11 -15
  170. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.cjs +26 -28
  171. package/dist/lib/cjs/obsidian/modals/suggest-modal-command-builder.d.cts +5 -5
  172. package/dist/lib/cjs/obsidian/notebook-navigator.cjs +155 -0
  173. package/dist/lib/cjs/obsidian/notebook-navigator.d.cts +132 -0
  174. package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +11 -15
  175. package/dist/lib/cjs/obsidian/obsidian-settings.cjs +11 -15
  176. package/dist/lib/cjs/obsidian/parse-link.cjs +61 -62
  177. package/dist/lib/cjs/obsidian/parse-link.d.cts +4 -4
  178. package/dist/lib/cjs/obsidian/path-settings.cjs +27 -25
  179. package/dist/lib/cjs/obsidian/pdf.cjs +13 -17
  180. package/dist/lib/cjs/obsidian/pdf.d.cts +2 -2
  181. package/dist/lib/cjs/obsidian/plugin/index.cjs +11 -15
  182. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +11 -15
  183. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +156 -52
  184. package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +17 -21
  185. package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -2
  186. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +20 -24
  187. package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +11 -9
  188. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +29 -33
  189. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +33 -16
  190. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +11 -1
  191. package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +11 -15
  192. package/dist/lib/cjs/obsidian/popovers/field-popover.cjs +11 -15
  193. package/dist/lib/cjs/obsidian/popovers/index.cjs +11 -15
  194. package/dist/lib/cjs/obsidian/popovers/popover-anchor.cjs +14 -18
  195. package/dist/lib/cjs/obsidian/popovers/popover-anchor.d.cts +2 -2
  196. package/dist/lib/cjs/obsidian/popovers/popover.cjs +19 -23
  197. package/dist/lib/cjs/obsidian/queue.cjs +16 -20
  198. package/dist/lib/cjs/obsidian/queue.d.cts +2 -2
  199. package/dist/lib/cjs/obsidian/react/app-context.cjs +11 -15
  200. package/dist/lib/cjs/obsidian/react/index.cjs +11 -15
  201. package/dist/lib/cjs/obsidian/reference.cjs +11 -15
  202. package/dist/lib/cjs/obsidian/resource-lock.cjs +157 -78
  203. package/dist/lib/cjs/obsidian/resource-lock.d.cts +5 -0
  204. package/dist/lib/cjs/obsidian/resource-url.cjs +12 -16
  205. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +11 -15
  206. package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +2 -2
  207. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.cjs +18 -22
  208. package/dist/lib/cjs/obsidian/setting-components/checkbox-component.d.cts +5 -5
  209. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.cjs +28 -31
  210. package/dist/lib/cjs/obsidian/setting-components/code-highlighter-component.d.cts +2 -2
  211. package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +14 -18
  212. package/dist/lib/cjs/obsidian/setting-components/date-component.d.cts +2 -2
  213. package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +14 -18
  214. package/dist/lib/cjs/obsidian/setting-components/date-time-component.d.cts +2 -2
  215. package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +14 -18
  216. package/dist/lib/cjs/obsidian/setting-components/email-component.d.cts +2 -2
  217. package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +11 -15
  218. package/dist/lib/cjs/obsidian/setting-components/index.cjs +11 -15
  219. package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +14 -18
  220. package/dist/lib/cjs/obsidian/setting-components/month-component.d.cts +2 -2
  221. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.cjs +17 -21
  222. package/dist/lib/cjs/obsidian/setting-components/multiple-dropdown-component.d.cts +2 -2
  223. package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +14 -18
  224. package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.d.cts +2 -2
  225. package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +12 -16
  226. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.cjs +15 -19
  227. package/dist/lib/cjs/obsidian/setting-components/multiple-text-component.d.cts +2 -2
  228. package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +14 -18
  229. package/dist/lib/cjs/obsidian/setting-components/number-component.d.cts +2 -2
  230. package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +14 -18
  231. package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
  232. package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.cjs +16 -20
  233. package/dist/lib/cjs/obsidian/setting-components/setting-component-wrapper.d.cts +2 -2
  234. package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +14 -18
  235. package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
  236. package/dist/lib/cjs/obsidian/setting-components/text-based-component.cjs +16 -20
  237. package/dist/lib/cjs/obsidian/setting-components/text-based-component.d.cts +2 -2
  238. package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +14 -18
  239. package/dist/lib/cjs/obsidian/setting-components/time-component.d.cts +2 -2
  240. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.cjs +15 -19
  241. package/dist/lib/cjs/obsidian/setting-components/tri-state-checkbox-component.d.cts +2 -2
  242. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.cjs +16 -20
  243. package/dist/lib/cjs/obsidian/setting-components/typed-dropdown-component.d.cts +2 -2
  244. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.cjs +18 -22
  245. package/dist/lib/cjs/obsidian/setting-components/typed-multiple-dropdown-component.d.cts +2 -2
  246. package/dist/lib/cjs/obsidian/setting-components/typed-range-text-component.cjs +11 -15
  247. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +16 -19
  248. package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +4 -4
  249. package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +14 -18
  250. package/dist/lib/cjs/obsidian/setting-components/url-component.d.cts +2 -2
  251. package/dist/lib/cjs/obsidian/setting-components/validator-component.cjs +45 -49
  252. package/dist/lib/cjs/obsidian/setting-components/validator-component.d.cts +2 -2
  253. package/dist/lib/cjs/obsidian/setting-components/value-component-with-change-tracking.cjs +11 -15
  254. package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +14 -18
  255. package/dist/lib/cjs/obsidian/setting-components/week-component.d.cts +2 -2
  256. package/dist/lib/cjs/obsidian/setting-ex.cjs +76 -80
  257. package/dist/lib/cjs/obsidian/setting-ex.d.cts +42 -42
  258. package/dist/lib/cjs/obsidian/setting-group-ex.cjs +14 -18
  259. package/dist/lib/cjs/obsidian/setting-group-ex.d.cts +2 -2
  260. package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +11 -15
  261. package/dist/lib/cjs/obsidian/validation.cjs +11 -15
  262. package/dist/lib/cjs/obsidian/vault-delete.cjs +23 -20
  263. package/dist/lib/cjs/obsidian/vault-delete.d.cts +16 -2
  264. package/dist/lib/cjs/obsidian/vault-transaction.cjs +17 -18
  265. package/dist/lib/cjs/obsidian/vault.cjs +81 -63
  266. package/dist/lib/cjs/obsidian/vault.d.cts +32 -11
  267. package/dist/lib/cjs/obsidian/view-registrar.cjs +11 -15
  268. package/dist/lib/cjs/obsidian/workspace.cjs +12 -16
  269. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +11 -15
  270. package/dist/lib/cjs/path.cjs +18 -22
  271. package/dist/lib/cjs/path.d.cts +1 -1
  272. package/dist/lib/cjs/reg-exp.cjs +38 -35
  273. package/dist/lib/cjs/reg-exp.d.cts +4 -4
  274. package/dist/lib/cjs/script-utils/build.cjs +21 -25
  275. package/dist/lib/cjs/script-utils/build.d.cts +1 -1
  276. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +24 -28
  277. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +36 -34
  278. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/custom-esbuild-options-plugin.cjs +11 -15
  279. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +20 -24
  280. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +13 -17
  281. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +16 -20
  282. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/index.cjs +11 -15
  283. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +11 -15
  284. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +6 -2
  285. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +32 -36
  286. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/rename-css-plugin.cjs +11 -15
  287. package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/svelte-wrapper-plugin.cjs +11 -15
  288. package/dist/lib/cjs/script-utils/bundlers/esbuild.cjs +11 -15
  289. package/dist/lib/cjs/script-utils/bundlers/index.cjs +11 -15
  290. package/dist/lib/cjs/script-utils/check-project-types.cjs +13 -17
  291. package/dist/lib/cjs/script-utils/check-project-types.d.cts +12 -4
  292. package/dist/lib/cjs/script-utils/cli-utils.cjs +39 -47
  293. package/dist/lib/cjs/script-utils/cli-utils.d.cts +6 -6
  294. package/dist/lib/cjs/script-utils/code-generator.cjs +11 -15
  295. package/dist/lib/cjs/script-utils/commitlint-config.cjs +11 -15
  296. package/dist/lib/cjs/script-utils/demo-vault-coverage.cjs +22 -23
  297. package/dist/lib/cjs/script-utils/demo-vault.cjs +11 -15
  298. package/dist/lib/cjs/script-utils/env-toggle.cjs +13 -17
  299. package/dist/lib/cjs/script-utils/exec.cjs +40 -44
  300. package/dist/lib/cjs/script-utils/exec.d.cts +4 -4
  301. package/dist/lib/cjs/script-utils/formatters/dprint.cjs +12 -16
  302. package/dist/lib/cjs/script-utils/formatters/index.cjs +11 -15
  303. package/dist/lib/cjs/script-utils/fs.cjs +13 -17
  304. package/dist/lib/cjs/script-utils/git.cjs +11 -15
  305. package/dist/lib/cjs/script-utils/index.cjs +11 -15
  306. package/dist/lib/cjs/script-utils/json.cjs +15 -19
  307. package/dist/lib/cjs/script-utils/json.d.cts +2 -2
  308. package/dist/lib/cjs/script-utils/linters/cspell.cjs +12 -16
  309. package/dist/lib/cjs/script-utils/linters/eslint-agnostic-core-boundary.cjs +11 -15
  310. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +402 -16
  311. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +11 -15
  312. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +11 -15
  313. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.cjs +27 -31
  314. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.cts +3 -1
  315. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +27 -31
  316. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +3 -1
  317. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.cjs +21 -25
  318. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-used-underscore-variables.d.cts +3 -1
  319. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +11 -15
  320. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.cjs +109 -113
  321. package/dist/lib/cjs/script-utils/linters/eslint-rules/params-options-name-match.d.cts +3 -1
  322. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.cjs +13 -17
  323. package/dist/lib/cjs/script-utils/linters/eslint-rules/prefer-noop-async.d.cts +3 -1
  324. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.cjs +21 -25
  325. package/dist/lib/cjs/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.cts +3 -1
  326. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +51 -55
  327. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.d.cts +9 -3
  328. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +25 -27
  329. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.d.cts +6 -2
  330. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +33 -37
  331. package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.d.cts +3 -1
  332. package/dist/lib/cjs/script-utils/linters/eslint-rules/rule-tester-helper.cjs +11 -15
  333. package/dist/lib/cjs/script-utils/linters/eslint.cjs +14 -18
  334. package/dist/lib/cjs/script-utils/linters/index.cjs +14 -15
  335. package/dist/lib/cjs/script-utils/linters/index.d.cts +1 -0
  336. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.cjs +18 -17
  337. package/dist/lib/cjs/script-utils/linters/markdownlint-cli2-config.d.cts +2 -2
  338. package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.cjs +138 -0
  339. package/dist/lib/cjs/script-utils/linters/markdownlint-ignores.d.cts +35 -0
  340. package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +20 -23
  341. package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +18 -22
  342. package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +54 -18
  343. package/dist/lib/cjs/script-utils/nano-staged-config.cjs +11 -15
  344. package/dist/lib/cjs/script-utils/npm-publish.cjs +11 -15
  345. package/dist/lib/cjs/script-utils/npm-run.cjs +20 -17
  346. package/dist/lib/cjs/script-utils/npm-run.d.cts +16 -2
  347. package/dist/lib/cjs/script-utils/npm.cjs +21 -25
  348. package/dist/lib/cjs/script-utils/npm.d.cts +11 -11
  349. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +11 -15
  350. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +165 -55
  351. package/dist/lib/cjs/script-utils/root.cjs +11 -15
  352. package/dist/lib/cjs/script-utils/test-runners/index.cjs +16 -17
  353. package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
  354. package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
  355. package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +325 -0
  356. package/dist/lib/cjs/script-utils/test-runners/vitest-config.d.cts +118 -0
  357. package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
  358. package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
  359. package/dist/lib/cjs/script-utils/version.cjs +62 -63
  360. package/dist/lib/cjs/script-utils/version.d.cts +21 -21
  361. package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
  362. package/dist/lib/cjs/setup.cjs +11 -15
  363. package/dist/lib/cjs/setup.d.cts +1 -1
  364. package/dist/lib/cjs/strict-proxy.cjs +30 -34
  365. package/dist/lib/cjs/strict-proxy.d.cts +2 -2
  366. package/dist/lib/cjs/string.cjs +90 -93
  367. package/dist/lib/cjs/string.d.cts +60 -60
  368. package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
  369. package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
  370. package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
  371. package/dist/lib/cjs/transformers/index.cjs +11 -15
  372. package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
  373. package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
  374. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
  375. package/dist/lib/cjs/transformers/transformer.cjs +11 -15
  376. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
  377. package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
  378. package/dist/lib/cjs/two-way-map.cjs +11 -15
  379. package/dist/lib/cjs/type-guards.cjs +16 -20
  380. package/dist/lib/cjs/type-guards.d.cts +6 -6
  381. package/dist/lib/cjs/type.cjs +13 -17
  382. package/dist/lib/cjs/type.d.cts +2 -2
  383. package/dist/lib/cjs/url.cjs +18 -22
  384. package/dist/lib/cjs/url.d.cts +4 -4
  385. package/dist/lib/cjs/value-provider.cjs +15 -19
  386. package/dist/lib/cjs/value-provider.d.cts +6 -6
  387. package/dist/lib/cjs/value-wrapper.cjs +11 -15
  388. package/dist/lib/cjs/vitest-setup.cjs +11 -15
  389. package/dist/lib/esm/__merged.d.mts +12 -10
  390. package/dist/lib/esm/__merged.mjs +51 -23
  391. package/dist/lib/esm/abort-controller.mjs +5 -8
  392. package/dist/lib/esm/array.d.mts +25 -7
  393. package/dist/lib/esm/array.mjs +16 -12
  394. package/dist/lib/esm/async-events.d.mts +50 -50
  395. package/dist/lib/esm/async-events.mjs +81 -78
  396. package/dist/lib/esm/async.d.mts +23 -23
  397. package/dist/lib/esm/async.mjs +70 -66
  398. package/dist/lib/esm/blob.mjs +4 -11
  399. package/dist/lib/esm/debug.d.mts +1 -1
  400. package/dist/lib/esm/debug.mjs +14 -18
  401. package/dist/lib/esm/disposable.d.mts +27 -8
  402. package/dist/lib/esm/disposable.mjs +47 -29
  403. package/dist/lib/esm/error.mjs +18 -19
  404. package/dist/lib/esm/function.d.mts +26 -26
  405. package/dist/lib/esm/function.mjs +20 -20
  406. package/dist/lib/esm/generated-during-build.mjs +1 -1
  407. package/dist/lib/esm/html-element.d.mts +15 -15
  408. package/dist/lib/esm/html-element.mjs +74 -75
  409. package/dist/lib/esm/object-utils.d.mts +27 -27
  410. package/dist/lib/esm/object-utils.mjs +109 -102
  411. package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
  412. package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
  413. package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
  414. package/dist/lib/esm/obsidian/app.mjs +1 -1
  415. package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
  416. package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
  417. package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
  418. package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
  419. package/dist/lib/esm/obsidian/backlink.mjs +2 -2
  420. package/dist/lib/esm/obsidian/callout.d.mts +9 -3
  421. package/dist/lib/esm/obsidian/callout.mjs +17 -12
  422. package/dist/lib/esm/obsidian/canvas.mjs +3 -2
  423. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
  424. package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
  425. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
  426. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
  427. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +42 -8
  428. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +46 -17
  429. package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +10 -0
  430. package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
  431. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
  432. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
  433. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
  434. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
  435. package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
  436. package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
  437. package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
  438. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
  439. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
  440. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
  441. package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
  442. package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
  443. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
  444. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
  445. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  446. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  447. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
  448. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
  449. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
  450. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
  451. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
  452. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
  453. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
  454. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
  455. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
  456. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
  457. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
  458. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
  459. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
  460. package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
  461. package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
  462. package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
  463. package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
  464. package/dist/lib/esm/obsidian/dataview.mjs +25 -27
  465. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
  466. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
  467. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
  468. package/dist/lib/esm/obsidian/editor.mjs +7 -5
  469. package/dist/lib/esm/obsidian/events.d.mts +2 -2
  470. package/dist/lib/esm/obsidian/events.mjs +2 -2
  471. package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
  472. package/dist/lib/esm/obsidian/file-change.mjs +67 -67
  473. package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
  474. package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
  475. package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
  476. package/dist/lib/esm/obsidian/file-system.mjs +4 -4
  477. package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
  478. package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
  479. package/dist/lib/esm/obsidian/html-element.mjs +3 -3
  480. package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
  481. package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
  482. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  483. package/dist/lib/esm/obsidian/index.mjs +3 -1
  484. package/dist/lib/esm/obsidian/link.d.mts +22 -22
  485. package/dist/lib/esm/obsidian/link.mjs +76 -62
  486. package/dist/lib/esm/obsidian/logger.d.mts +5 -5
  487. package/dist/lib/esm/obsidian/logger.mjs +11 -11
  488. package/dist/lib/esm/obsidian/loop.d.mts +1 -1
  489. package/dist/lib/esm/obsidian/loop.mjs +4 -4
  490. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
  491. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
  492. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
  493. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
  494. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
  495. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
  496. package/dist/lib/esm/obsidian/markdown.mjs +12 -10
  497. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
  498. package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
  499. package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
  500. package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
  501. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
  502. package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
  503. package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
  504. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
  505. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
  506. package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
  507. package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
  508. package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
  509. package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
  510. package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
  511. package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
  512. package/dist/lib/esm/obsidian/pdf.mjs +3 -3
  513. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
  514. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
  515. package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
  516. package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
  517. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
  518. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
  519. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
  520. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
  521. package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
  522. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
  523. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
  524. package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
  525. package/dist/lib/esm/obsidian/queue.d.mts +2 -2
  526. package/dist/lib/esm/obsidian/queue.mjs +6 -6
  527. package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
  528. package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
  529. package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
  530. package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
  531. package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
  532. package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
  533. package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
  534. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
  535. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
  536. package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
  537. package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
  538. package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
  539. package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
  540. package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
  541. package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
  542. package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
  543. package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
  544. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
  545. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
  546. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
  547. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
  548. package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
  549. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
  550. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
  551. package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
  552. package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
  553. package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
  554. package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
  555. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
  556. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
  557. package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
  558. package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
  559. package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
  560. package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
  561. package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
  562. package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
  563. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
  564. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
  565. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
  566. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
  567. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
  568. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
  569. package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
  570. package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
  571. package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
  572. package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
  573. package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
  574. package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
  575. package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
  576. package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
  577. package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
  578. package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
  579. package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
  580. package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
  581. package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
  582. package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
  583. package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
  584. package/dist/lib/esm/obsidian/vault.d.mts +32 -11
  585. package/dist/lib/esm/obsidian/vault.mjs +67 -47
  586. package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
  587. package/dist/lib/esm/obsidian/workspace.mjs +2 -2
  588. package/dist/lib/esm/path.d.mts +1 -1
  589. package/dist/lib/esm/path.mjs +7 -7
  590. package/dist/lib/esm/reg-exp.d.mts +4 -4
  591. package/dist/lib/esm/reg-exp.mjs +28 -21
  592. package/dist/lib/esm/script-utils/build.d.mts +1 -1
  593. package/dist/lib/esm/script-utils/build.mjs +15 -12
  594. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
  595. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
  596. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
  597. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
  598. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
  599. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
  600. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
  601. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
  602. package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
  603. package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
  604. package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
  605. package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
  606. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
  607. package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
  608. package/dist/lib/esm/script-utils/exec.d.mts +4 -4
  609. package/dist/lib/esm/script-utils/exec.mjs +32 -32
  610. package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
  611. package/dist/lib/esm/script-utils/fs.mjs +3 -3
  612. package/dist/lib/esm/script-utils/json.d.mts +2 -2
  613. package/dist/lib/esm/script-utils/json.mjs +5 -5
  614. package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
  615. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
  616. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
  617. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
  618. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
  619. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
  620. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
  621. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
  622. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
  623. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
  624. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
  625. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
  626. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
  627. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
  628. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
  629. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
  630. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
  631. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
  632. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
  633. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
  634. package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
  635. package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
  636. package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
  637. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
  638. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
  639. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
  640. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
  641. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
  642. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
  643. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
  644. package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
  645. package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
  646. package/dist/lib/esm/script-utils/npm.d.mts +11 -11
  647. package/dist/lib/esm/script-utils/npm.mjs +11 -11
  648. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
  649. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
  650. package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
  651. package/dist/lib/esm/script-utils/test-runners/index.mjs +4 -2
  652. package/dist/lib/esm/script-utils/test-runners/vitest-config.d.mts +118 -0
  653. package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +210 -0
  654. package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
  655. package/dist/lib/esm/script-utils/version.d.mts +21 -21
  656. package/dist/lib/esm/script-utils/version.mjs +48 -45
  657. package/dist/lib/esm/setup.d.mts +1 -1
  658. package/dist/lib/esm/setup.mjs +1 -1
  659. package/dist/lib/esm/strict-proxy.d.mts +2 -2
  660. package/dist/lib/esm/strict-proxy.mjs +20 -20
  661. package/dist/lib/esm/string.d.mts +60 -60
  662. package/dist/lib/esm/string.mjs +80 -79
  663. package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
  664. package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
  665. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
  666. package/dist/lib/esm/type-guards.d.mts +6 -6
  667. package/dist/lib/esm/type-guards.mjs +6 -6
  668. package/dist/lib/esm/type.d.mts +2 -2
  669. package/dist/lib/esm/type.mjs +3 -3
  670. package/dist/lib/esm/url.d.mts +4 -4
  671. package/dist/lib/esm/url.mjs +8 -8
  672. package/dist/lib/esm/value-provider.d.mts +6 -6
  673. package/dist/lib/esm/value-provider.mjs +5 -5
  674. package/dist/templates/scripts/vitest-config.ts +2 -88
  675. package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  676. package/obsidian/notebook-navigator/package.json +6 -0
  677. package/package.json +17 -33
  678. package/script-utils/linters/markdownlint-ignores/package.json +6 -0
  679. package/script-utils/test-runners/vitest-config/package.json +6 -0
@@ -40,16 +40,11 @@ if you want to view the source, please visit the github repository of this plugi
40
40
  globalThisRecord[key] ??= newFuncs[key]?.();
41
41
  }
42
42
 
43
- function name(obj) {
44
- return obj;
45
- }
46
-
47
43
  function extractDefault(module) {
48
44
  return module && module.__esModule && 'default' in module ? module.default : module;
49
45
  }
50
46
 
51
- const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
- 'obsidian',
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
53
48
  '@codemirror/autocomplete',
54
49
  '@codemirror/collab',
55
50
  '@codemirror/commands',
@@ -60,11 +55,12 @@ if you want to view the source, please visit the github repository of this plugi
60
55
  '@codemirror/text',
61
56
  '@codemirror/view',
62
57
  '@lezer/common',
58
+ '@lezer/highlight',
63
59
  '@lezer/lr',
64
- '@lezer/highlight'];
65
-
60
+ 'obsidian']
61
+ );
66
62
 
67
- const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
63
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
68
64
  '@codemirror/closebrackets',
69
65
  '@codemirror/comment',
70
66
  '@codemirror/fold',
@@ -76,11 +72,11 @@ if you want to view the source, please visit the github repository of this plugi
76
72
  '@codemirror/rangeset',
77
73
  '@codemirror/rectangular-selection',
78
74
  '@codemirror/stream-parser',
79
- '@codemirror/tooltip'];
80
-
75
+ '@codemirror/tooltip']
76
+ );
81
77
 
82
78
  function requirePatched(id) {
83
- if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
79
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
84
80
  return originalRequire?.(id);
85
81
  }
86
82
 
@@ -89,8 +85,8 @@ if you want to view the source, please visit the github repository of this plugi
89
85
  if (id === 'process' || id === 'node:process') {
90
86
  // eslint-disable-next-line no-console -- Valid usage.
91
87
  console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
- // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
- return globalThis.process;
88
+
89
+ return process;
94
90
  }
95
91
  } else {
96
92
  const module = originalRequire?.(id);
@@ -156,12 +152,12 @@ class AsyncEventsBase {
156
152
  /**
157
153
  * The registry mapping each event name to its list of registered listener references.
158
154
  */
159
- eventRefsMap = /* @__PURE__ */ new Map();
155
+ eventReferencesMap = /* @__PURE__ */ new Map();
160
156
  /**
161
157
  * Remove an event listener.
162
158
  *
163
159
  * @typeParam EventName - The name of the event.
164
- * @typeParam Args - The types of the arguments the event callback accepts.
160
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
165
161
  * @param name - The name of the event.
166
162
  * @param callback - The callback to remove.
167
163
  *
@@ -172,13 +168,13 @@ class AsyncEventsBase {
172
168
  */
173
169
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
174
170
  off(name, callback) {
175
- const eventRefs = this.eventRefsMap.get(name);
171
+ const eventRefs = this.eventReferencesMap.get(name);
176
172
  if (!eventRefs) {
177
173
  return;
178
174
  }
179
175
  (0, import_array.filterInPlace)(eventRefs, (eventRef) => eventRef.callback !== callback);
180
176
  if (eventRefs.length === 0) {
181
- this.eventRefsMap.delete(name);
177
+ this.eventReferencesMap.delete(name);
182
178
  }
183
179
  }
184
180
  /**
@@ -192,23 +188,23 @@ class AsyncEventsBase {
192
188
  * ```
193
189
  */
194
190
  offref(eventRef) {
195
- const eventRefs = this.eventRefsMap.get(eventRef.name);
191
+ const eventRefs = this.eventReferencesMap.get(eventRef.name);
196
192
  if (!eventRefs) {
197
193
  return;
198
194
  }
199
195
  (0, import_array.filterInPlace)(eventRefs, (storedEventRef) => storedEventRef !== eventRef);
200
196
  if (eventRefs.length === 0) {
201
- this.eventRefsMap.delete(eventRef.name);
197
+ this.eventReferencesMap.delete(eventRef.name);
202
198
  }
203
199
  }
204
200
  /**
205
201
  * Add an event listener.
206
202
  *
207
203
  * @typeParam EventName - The name of the event.
208
- * @typeParam Args - The types of the arguments the event callback accepts.
204
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
209
205
  * @param name - The name of the event.
210
206
  * @param callback - The callback to call when the event is triggered.
211
- * @param thisArg - The context passed as `this` to the `callback`.
207
+ * @param thisArgument - The context passed as `this` to the `callback`.
212
208
  * @returns A reference to the event listener.
213
209
  *
214
210
  * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
@@ -222,17 +218,17 @@ class AsyncEventsBase {
222
218
  * ```
223
219
  */
224
220
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
225
- on(name, callback, thisArg) {
226
- let eventRefs = this.eventRefsMap.get(name);
221
+ on(name, callback, thisArgument) {
222
+ let eventRefs = this.eventReferencesMap.get(name);
227
223
  if (!eventRefs) {
228
224
  eventRefs = [];
229
- this.eventRefsMap.set(name, eventRefs);
225
+ this.eventReferencesMap.set(name, eventRefs);
230
226
  }
231
227
  const eventRef = {
232
228
  asyncEventSource: this,
233
229
  callback,
234
230
  name,
235
- thisArg
231
+ thisArgument
236
232
  };
237
233
  eventRefs.push(eventRef);
238
234
  return eventRef;
@@ -241,10 +237,10 @@ class AsyncEventsBase {
241
237
  * Add an event listener that will be triggered only once.
242
238
  *
243
239
  * @typeParam EventName - The name of the event.
244
- * @typeParam Args - The types of the arguments the event callback accepts.
240
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
245
241
  * @param name - The name of the event.
246
242
  * @param callback - The callback to call when the event is triggered.
247
- * @param thisArg - The context passed as `this` to the `callback`.
243
+ * @param thisArgument - The context passed as `this` to the `callback`.
248
244
  * @returns A reference to the event listener.
249
245
  *
250
246
  * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
@@ -258,8 +254,8 @@ class AsyncEventsBase {
258
254
  * ```
259
255
  */
260
256
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
261
- once(name, callback, thisArg) {
262
- const originalEventRef = this.on(name, callback, thisArg);
257
+ once(name, callback, thisArgument) {
258
+ const originalEventRef = this.on(name, callback, thisArgument);
263
259
  const cleanupEventRef = this.on(name, () => {
264
260
  this.offref(originalEventRef);
265
261
  this.offref(cleanupEventRef);
@@ -271,17 +267,17 @@ class AsyncEventsBase {
271
267
  *
272
268
  * @typeParam EventName - The name of the event.
273
269
  * @param name - The name of the event.
274
- * @param args - The data to pass to the event listeners.
270
+ * @param $arguments - The data to pass to the event listeners.
275
271
  *
276
272
  * @example
277
273
  * ```ts
278
274
  * events.trigger('my-event', 'arg1', 'arg2');
279
275
  * ```
280
276
  */
281
- trigger(name, ...args) {
282
- const eventRefs = this.eventRefsMap.get(name) ?? [];
283
- for (const eventRef of eventRefs.slice()) {
284
- this.tryTrigger(eventRef, args);
277
+ trigger(name, ...$arguments) {
278
+ const eventRefs = this.eventReferencesMap.get(name) ?? [];
279
+ for (const eventRef of (0, import_array.snapshot)(eventRefs)) {
280
+ this.tryTrigger(eventRef, $arguments);
285
281
  }
286
282
  }
287
283
  /**
@@ -289,21 +285,21 @@ class AsyncEventsBase {
289
285
  *
290
286
  * @typeParam EventName - The name of the event.
291
287
  * @param name - The name of the event.
292
- * @param args - The data to pass to the event listeners.
288
+ * @param $arguments - The data to pass to the event listeners.
293
289
  * @returns A {@link Promise} that resolves when all listeners have completed.
294
290
  */
295
- async triggerAsync(name, ...args) {
296
- const eventRefs = this.eventRefsMap.get(name) ?? [];
297
- for (const eventRef of eventRefs.slice()) {
298
- await this.tryTriggerAsync(eventRef, args);
291
+ async triggerAsync(name, ...$arguments) {
292
+ const eventRefs = this.eventReferencesMap.get(name) ?? [];
293
+ for (const eventRef of (0, import_array.snapshot)(eventRefs)) {
294
+ await this.tryTriggerAsync(eventRef, $arguments);
299
295
  }
300
296
  }
301
297
  /**
302
298
  * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
303
299
  *
304
- * @typeParam Args - The types of the arguments the function accepts.
300
+ * @typeParam Arguments - The types of the arguments the function accepts.
305
301
  * @param eventRef - The event reference.
306
- * @param args - The data to pass to the event listeners.
302
+ * @param $arguments - The data to pass to the event listeners.
307
303
  *
308
304
  * @example
309
305
  * ```ts
@@ -311,30 +307,30 @@ class AsyncEventsBase {
311
307
  * ```
312
308
  */
313
309
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
314
- tryTrigger(eventRef, args) {
310
+ tryTrigger(eventRef, $arguments) {
315
311
  try {
316
- const result = eventRef.callback.call(eventRef.thisArg, ...args);
312
+ const result = eventRef.callback.call(eventRef.thisArgument, ...$arguments);
317
313
  if (result instanceof Promise) {
318
314
  result.catch(throwDelayed);
319
315
  }
320
- } catch (e) {
321
- throwDelayed(e);
316
+ } catch (error) {
317
+ throwDelayed(error);
322
318
  }
323
319
  }
324
320
  /**
325
321
  * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
326
322
  *
327
- * @typeParam Args - The types of the arguments the function accepts.
323
+ * @typeParam Arguments - The types of the arguments the function accepts.
328
324
  * @param eventRef - The event reference.
329
- * @param args - The data to pass to the event listeners.
325
+ * @param $arguments - The data to pass to the event listeners.
330
326
  * @returns A {@link Promise} that resolves when all listeners have completed.
331
327
  */
332
328
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
333
- async tryTriggerAsync(eventRef, args) {
329
+ async tryTriggerAsync(eventRef, $arguments) {
334
330
  try {
335
- await eventRef.callback.call(eventRef.thisArg, ...args);
336
- } catch (e) {
337
- throwDelayed(e);
331
+ await eventRef.callback.call(eventRef.thisArgument, ...$arguments);
332
+ } catch (error) {
333
+ throwDelayed(error);
338
334
  }
339
335
  }
340
336
  }
@@ -344,44 +340,44 @@ class AsyncEvents extends AsyncEventsBase {
344
340
  *
345
341
  * @typeParam EventName - The name of the event.
346
342
  * @param name - The name of the event.
347
- * @param args - The data to pass to the event listeners.
343
+ * @param $arguments - The data to pass to the event listeners.
348
344
  */
349
- trigger(name, ...args) {
350
- super.trigger(name, ...args);
345
+ trigger(name, ...$arguments) {
346
+ super.trigger(name, ...$arguments);
351
347
  }
352
348
  /**
353
349
  * Trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
354
350
  *
355
351
  * @typeParam EventName - The name of the event.
356
352
  * @param name - The name of the event.
357
- * @param args - The data to pass to the event listeners.
353
+ * @param $arguments - The data to pass to the event listeners.
358
354
  * @returns A {@link Promise} that resolves when all listeners have completed.
359
355
  */
360
- triggerAsync(name, ...args) {
361
- return super.triggerAsync(name, ...args);
356
+ triggerAsync(name, ...$arguments) {
357
+ return super.triggerAsync(name, ...$arguments);
362
358
  }
363
359
  /**
364
360
  * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
365
361
  *
366
- * @typeParam Args - The types of the arguments the function accepts.
362
+ * @typeParam Arguments - The types of the arguments the function accepts.
367
363
  * @param eventRef - The event reference.
368
- * @param args - The data to pass to the event listeners.
364
+ * @param $arguments - The data to pass to the event listeners.
369
365
  */
370
366
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
371
- tryTrigger(eventRef, args) {
372
- super.tryTrigger(eventRef, args);
367
+ tryTrigger(eventRef, $arguments) {
368
+ super.tryTrigger(eventRef, $arguments);
373
369
  }
374
370
  /**
375
371
  * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
376
372
  *
377
- * @typeParam Args - The types of the arguments the function accepts.
373
+ * @typeParam Arguments - The types of the arguments the function accepts.
378
374
  * @param eventRef - The event reference.
379
- * @param args - The data to pass to the event listeners.
375
+ * @param $arguments - The data to pass to the event listeners.
380
376
  * @returns A {@link Promise} that resolves when all listeners have completed.
381
377
  */
382
378
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
383
- async tryTriggerAsync(eventRef, args) {
384
- return super.tryTriggerAsync(eventRef, args);
379
+ async tryTriggerAsync(eventRef, $arguments) {
380
+ return super.tryTriggerAsync(eventRef, $arguments);
385
381
  }
386
382
  }
387
383
  function mixinAsyncEvents() {
@@ -392,7 +388,7 @@ function mixinAsyncEvents() {
392
388
  * Remove an event listener.
393
389
  *
394
390
  * @typeParam EventName - The name of the event.
395
- * @typeParam Args - The types of the arguments the event callback accepts.
391
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
396
392
  * @param name - The name of the event.
397
393
  * @param callback - The callback to remove.
398
394
  */
@@ -412,84 +408,84 @@ function mixinAsyncEvents() {
412
408
  * Add an event listener.
413
409
  *
414
410
  * @typeParam EventName - The name of the event.
415
- * @typeParam Args - The types of the arguments the event callback accepts.
411
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
416
412
  * @param name - The name of the event.
417
413
  * @param callback - The callback to call when the event is triggered.
418
- * @param thisArg - The context passed as `this` to the `callback`.
414
+ * @param thisArgument - The context passed as `this` to the `callback`.
419
415
  * @returns A reference to the event listener.
420
416
  *
421
417
  * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
422
418
  */
423
419
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
424
- on(name, callback, thisArg) {
425
- return this.#asyncEvents.on(name, callback, thisArg);
420
+ on(name, callback, thisArgument) {
421
+ return this.#asyncEvents.on(name, callback, thisArgument);
426
422
  }
427
423
  /**
428
424
  * Add an event listener that will be called only once.
429
425
  *
430
426
  * @typeParam EventName - The name of the event.
431
- * @typeParam Args - The types of the arguments the event callback accepts.
427
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
432
428
  * @param name - The name of the event.
433
429
  * @param callback - The callback to call when the event is triggered.
434
- * @param thisArg - The context passed as `this` to the `callback`.
430
+ * @param thisArgument - The context passed as `this` to the `callback`.
435
431
  * @returns A reference to the event listener.
436
432
  *
437
433
  * @remarks Not refactored to parameter-object pattern, to keep the parity with {@link obsidian#Events#on} (or once, correspondingly).
438
434
  */
439
435
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
440
- once(name, callback, thisArg) {
441
- return this.#asyncEvents.once(name, callback, thisArg);
436
+ once(name, callback, thisArgument) {
437
+ return this.#asyncEvents.once(name, callback, thisArgument);
442
438
  }
443
439
  /**
444
440
  * Trigger an event, executing all the listeners in order even if some of them throw an error.
445
441
  *
446
442
  * @typeParam EventName - The name of the event.
447
443
  * @param name - The name of the event.
448
- * @param args - The data to pass to the event listeners.
444
+ * @param $arguments - The data to pass to the event listeners.
449
445
  */
450
- trigger(name, ...args) {
451
- this.#asyncEvents.trigger(name, ...args);
446
+ trigger(name, ...$arguments) {
447
+ this.#asyncEvents.trigger(name, ...$arguments);
452
448
  }
453
449
  /**
454
450
  * Trigger an event asynchronously.
455
451
  *
456
452
  * @typeParam EventName - The name of the event.
457
453
  * @param name - The name of the event.
458
- * @param args - The data to pass to the event listeners.
454
+ * @param $arguments - The data to pass to the event listeners.
459
455
  * @returns A {@link Promise} that resolves when all listeners have completed.
460
456
  */
461
- async triggerAsync(name, ...args) {
462
- await this.#asyncEvents.triggerAsync(name, ...args);
457
+ async triggerAsync(name, ...$arguments) {
458
+ await this.#asyncEvents.triggerAsync(name, ...$arguments);
463
459
  }
464
460
  /**
465
461
  * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
466
462
  *
467
- * @typeParam Args - The types of the arguments the function accepts.
463
+ * @typeParam Arguments - The types of the arguments the function accepts.
468
464
  * @param eventRef - The event reference.
469
- * @param args - The data to pass to the event listeners.
465
+ * @param $arguments - The data to pass to the event listeners.
470
466
  */
471
467
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
472
- tryTrigger(eventRef, args) {
473
- this.#asyncEvents.tryTrigger(eventRef, args);
468
+ tryTrigger(eventRef, $arguments) {
469
+ this.#asyncEvents.tryTrigger(eventRef, $arguments);
474
470
  }
475
471
  /**
476
472
  * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
477
473
  *
478
- * @typeParam Args - The types of the arguments the function accepts.
474
+ * @typeParam Arguments - The types of the arguments the function accepts.
479
475
  * @param eventRef - The event reference.
480
- * @param args - The data to pass to the event listeners.
476
+ * @param $arguments - The data to pass to the event listeners.
481
477
  * @returns A {@link Promise} that resolves when all listeners have completed.
482
478
  */
483
479
  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
484
- async tryTriggerAsync(eventRef, args) {
485
- await this.#asyncEvents.tryTriggerAsync(eventRef, args);
480
+ async tryTriggerAsync(eventRef, $arguments) {
481
+ await this.#asyncEvents.tryTriggerAsync(eventRef, $arguments);
486
482
  }
487
483
  }
488
484
  return AsyncEventsMixin;
489
485
  };
490
486
  }
491
487
  function subscribeAsyncDisposableEvent(params) {
492
- return new AsyncEventRefDisposable(asAsyncEventSource(params.asyncEventSource).on(params.name, params.callback, params.thisArg));
488
+ return new AsyncEventRefDisposable(asAsyncEventSource(params.asyncEventSource).on(params.name, params.callback, params.thisArgument));
493
489
  }
494
490
  function asAsyncEventSource(value) {
495
491
  return value;
@@ -507,4 +503,4 @@ function throwDelayed(error) {
507
503
  mixinAsyncEvents,
508
504
  subscribeAsyncDisposableEvent
509
505
  });
510
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NhYmxlRXggfSBmcm9tICcuL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi90eXBlLnRzJztcblxuaW1wb3J0IHsgZmlsdGVySW5QbGFjZSB9IGZyb20gJy4vYXJyYXkudHMnO1xuaW1wb3J0IHsgQXN5bmNEaXNwb3NhYmxlQmFzZSB9IGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5cbmRlY2xhcmUgY29uc3QgQVNZTkNfRVZFTlRfTUFQOiB1bmlxdWUgc3ltYm9sO1xuXG4vKipcbiAqIEFzeW5jIGV2ZW50IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50UmVmIHtcbiAgLyoqXG4gICAqIEFuIGV2ZW50IHNvdXJjZS5cbiAgICovXG4gIGFzeW5jRXZlbnRTb3VyY2U6IEdlbmVyaWNBc3luY0V2ZW50U291cmNlO1xuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKi9cbiAgY2FsbGJhY2s6IEdlbmVyaWNDYWxsYmFjaztcblxuICAvKipcbiAgICogQSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqL1xuICB0aGlzQXJnOiB1bmtub3duO1xufVxuXG4vKipcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICogV2hlbiBvbWl0dGVkLCB0aGUgZW1pdHRlciBhY2NlcHRzIGFueSBzdHJpbmcgZXZlbnQgbmFtZSB3aXRoIGFueSBhcmd1bWVudHMuXG4gKiBXaGVuIHByb3ZpZGVkLCBtZXRob2RzIGVuZm9yY2UgY29ycmVjdCBldmVudCBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXNcbiAqIHdpdGggZnVsbCBhdXRvY29tcGxldGUuIFdvcmtzIHdpdGggYm90aCBgdHlwZWAgYWxpYXNlcyBhbmQgYGludGVyZmFjZWAgZGVjbGFyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gVW50eXBlZCAoZGVmYXVsdCkgXHUyMDE0IGFueSBldmVudCBuYW1lLCBhbnkgYXJnczpcbiAqIGNvbnN0IGV2ZW50cyA9IG5ldyBBc3luY0V2ZW50cygpO1xuICogZXZlbnRzLm9uKCdteS1ldmVudCcsIChhcmcxOiBzdHJpbmcpID0+IHsgLi4uIH0pO1xuICpcbiAqIC8vIFR5cGVkIFx1MjAxNCBvbmx5IGRlY2xhcmVkIGV2ZW50cyB3aXRoIGNvcnJlY3QgYXJnczpcbiAqIGludGVyZmFjZSBNeUV2ZW50TWFwIHtcbiAqICAgc2F2ZTogW2RhdGE6IHN0cmluZ107XG4gKiAgIGxvYWQ6IFtpZDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbl07XG4gKiB9XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHM8TXlFdmVudE1hcD4oKTtcbiAqIGV2ZW50cy5vbignc2F2ZScsIChkYXRhKSA9PiB7IC4uLiB9KTsgICAvLyBkYXRhOiBzdHJpbmcgXHUyMDE0IGF1dG9jb21wbGV0ZSBvbiBldmVudCBuYW1lXG4gKiBldmVudHMub24oJ2xvYWQnLCAoaWQsIGZvcmNlKSA9PiB7IC4uLiB9KTsgLy8gaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRTb3VyY2U8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPiBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlIHtcbiAgLyoqXG4gICAqIFBoYW50b20gbWFya2VyIHRoYXQgbWFrZXMge0BsaW5rIEV2ZW50TWFwfSBpbmZlcmFibGUgZnJvbSBhbiB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gKGUuZy4gdmlhXG4gICAqIGBTb3VyY2UgZXh0ZW5kcyBBc3luY0V2ZW50U291cmNlPGluZmVyIEV2ZW50TWFwPmApLiBOZXZlciBwcmVzZW50IGF0IHJ1bnRpbWUuXG4gICAqL1xuICByZWFkb25seSBbQVNZTkNfRVZFTlRfTUFQXT86IEV2ZW50TWFwO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgb248RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3MgZXh0ZW5kcyBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZz86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZjtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbmNlKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWY7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGV4cG9zaW5nIGV2ZW50LXRyaWdnZXJpbmcgbWV0aG9kcyBmb3Igc3ViY2xhc3NlcyBvZiBtaXhpbi1jcmVhdGVkIGNsYXNzZXMuXG4gKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgYHByb3RlY3RlZGAgYXQgcnVudGltZSBidXQgc3VyZmFjZWQgaW4gdGhlIGRlY2xhcmF0aW9uIHR5cGVcbiAqIGJlY2F1c2UgVHlwZVNjcmlwdCBjYW5ub3QgcmVwcmVzZW50IGBwcm90ZWN0ZWRgIGluIGFub255bW91cy1jbGFzcyByZXR1cm4gdHlwZXMuXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4ge1xuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgdHJ5VHJpZ2dlcjxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHRyeVRyaWdnZXJBc3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgY2FsbGJhY2sgYXJndW1lbnQgdHlwZXMgZm9yIGFuIGV2ZW50LlxuICpcbiAqIC0gV2hlbiBgRXZlbnRNYXBgIGhhcyBhbiBpbmRleCBzaWduYXR1cmUgKHVudHlwZWQgZGVmYXVsdCk6IHJldHVybnMgYHVua25vd25bXWAsXG4gKiAgIGFsbG93aW5nIGBBcmdzYCB0byBiZSBpbmZlcnJlZCBmcmVlbHkgZnJvbSB0aGUgY2FsbGJhY2suXG4gKiAtIFdoZW4gYEV2ZW50TWFwYCBoYXMgZXhwbGljaXQga2V5cyBvbmx5ICh0eXBlZCBtYXApOiByZXR1cm5zIGBFdmVudE1hcFtFdmVudE5hbWVdYCxcbiAqICAgZW5mb3JjaW5nIHRoZSBkZWNsYXJlZCBhcmd1bWVudCB0eXBlcyBhbmQgZW5hYmxpbmcgYXV0b2NvbXBsZXRlLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICovXG5leHBvcnQgdHlwZSBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZSBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IHVua25vd25bXVxuICA6IChFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IEV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10pO1xuXG4vKipcbiAqIEJhc2UgZXZlbnQgbWFwIHR5cGUgZm9yIHVudHlwZWQgZW1pdHRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50TWFwQmFzZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT47XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBldmVudCBzb3VyY2UsIHVzZWQgYnkge0BsaW5rIEFzeW5jRXZlbnRSZWZ9XG4gKiBzbyB0aGF0IHJlZnMgY2FuIGJlIHN0b3JlZCByZWdhcmRsZXNzIG9mIHRoZSBlbWl0dGVyJ3MgYEV2ZW50TWFwYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHJlbW92ZS5cbiAgICovXG4gIG9mZnJlZihldmVudFJlZjogQXN5bmNFdmVudFJlZik6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFNvdXJjZSAtIFRoZSB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdHlwZS5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUsIGNvbnN0cmFpbmVkIHRvIHRoZSBzb3VyY2UncyBrbm93biBldmVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXM8U291cmNlIGV4dGVuZHMgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2UsIEV2ZW50TmFtZSBleHRlbmRzIEFzeW5jRXZlbnROYW1lT2Y8U291cmNlPj4ge1xuICAvKipcbiAgICogVGhlIGFzeW5jIGV2ZW50IHNvdXJjZSB0byBzdWJzY3JpYmUgb24uXG4gICAqL1xuICByZWFkb25seSBhc3luY0V2ZW50U291cmNlOiBTb3VyY2U7XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBjYWxsYmFjay4gSXRzIGFyZ3VtZW50IHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tIHtAbGluayBTdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudFBhcmFtcy5uYW1lfS5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBBc3luY0V2ZW50Q2FsbGJhY2tPZjxTb3VyY2UsIEV2ZW50TmFtZT47XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCBuYW1lIHRvIHN1YnNjcmliZSB0by5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IEV2ZW50TmFtZTtcblxuICAvKipcbiAgICogVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgY2FsbGJhY2suXG4gICAqL1xuICByZWFkb25seSB0aGlzQXJnPzogdW5rbm93bjtcbn1cblxuLy8gVGhlIGNhbGxiYWNrIHR5cGUgZm9yIGEgZ2l2ZW4gZXZlbnQgb24gYW4gYXN5bmMgZXZlbnQgc291cmNlLCB3aXRoIGl0cyBhcmd1bWVudCB0dXBsZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG50eXBlIEFzeW5jRXZlbnRDYWxsYmFja09mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+ID0gRXZlbnRNYXBPZjxTb3VyY2U+W0V2ZW50TmFtZV0gZXh0ZW5kcyBpbmZlciBBcmdzIGV4dGVuZHMgdW5rbm93bltdID8gKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD5cbiAgOiBuZXZlcjtcblxuLy8gVGhlIHVuaW9uIG9mIGtub3duIGV2ZW50IG5hbWVzIGZvciBhbiBhc3luYyBldmVudCBzb3VyY2UsIGRlcml2ZWQgZnJvbSBpdHMgZXZlbnQgbWFwLlxudHlwZSBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlPiA9IGtleW9mIEV2ZW50TWFwT2Y8U291cmNlPiAmIHN0cmluZztcblxudHlwZSBFdmVudE1hcENvbnN0cmFpbnQ8VD4gPSBSZWNvcmQ8a2V5b2YgVCwgdW5rbm93bltdPjtcblxuLy8gUmVjb3ZlcnMgdGhlIGV2ZW50IG1hcCBvZiBhbiBhc3luYyBldmVudCBzb3VyY2UgdmlhIHRoZSBwaGFudG9tIG1hcmtlciBvbiBgQXN5bmNFdmVudFNvdXJjZWAuXG50eXBlIEV2ZW50TWFwT2Y8U291cmNlPiA9IFNvdXJjZSBleHRlbmRzIEFzeW5jRXZlbnRTb3VyY2U8aW5mZXIgRXZlbnRNYXA+ID8gRXZlbnRNYXAgOiBuZXZlcjtcblxudHlwZSBHZW5lcmljQ2FsbGJhY2sgPSBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbjx1bmtub3duW10+O1xuXG4vKipcbiAqIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gdGhhdCB1bnJlZ2lzdGVycyBhbiB7QGxpbmsgQXN5bmNFdmVudFJlZn0gb24gZGlzcG9zZSwgdmlhIHRoZSBldmVudCBzb3VyY2Ugc3RvcmVkXG4gKiBvbiB0aGUgcmVmIGl0c2VsZi4gQXN5bmMgY291bnRlcnBhcnQgb2YgdGhlIG5hdGl2ZSBgRXZlbnRSZWZEaXNwb3NhYmxlYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzeW5jRXZlbnRSZWZEaXNwb3NhYmxlIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlQmFzZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZGlzcG9zYWJsZSB3cmFwcGluZyBhbiBleGlzdGluZyB7QGxpbmsgQXN5bmNFdmVudFJlZn0uXG4gICAqXG4gICAqIEBwYXJhbSBhc3luY0V2ZW50UmVmIC0gVGhlIGFzeW5jIGV2ZW50IHJlZmVyZW5jZSB0byB1bnJlZ2lzdGVyIG9uIGRpc3Bvc2UuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhc3luY0V2ZW50UmVmOiBBc3luY0V2ZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyB0aGUgZXZlbnQgdmlhIHRoZSBzb3VyY2Ugc3RvcmVkIG9uIHRoZSByZWYgKGBhc3luY0V2ZW50U291cmNlLm9mZnJlZmApLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIHBlcmZvcm1EaXNwb3NlQXN5bmMoKTogdm9pZCB7XG4gICAgdGhpcy5hc3luY0V2ZW50UmVmLmFzeW5jRXZlbnRTb3VyY2Uub2ZmcmVmKHRoaXMuYXN5bmNFdmVudFJlZik7XG4gIH1cbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBzb3VyY2UgaW1wbGVtZW50YXRpb24uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICogV2hlbiBvbWl0dGVkLCB0aGUgZW1pdHRlciBhY2NlcHRzIGFueSBzdHJpbmcgZXZlbnQgbmFtZSB3aXRoIGFueSBhcmd1bWVudHMuXG4gKiBXaGVuIHByb3ZpZGVkLCBtZXRob2RzIGVuZm9yY2UgY29ycmVjdCBldmVudCBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXNcbiAqIHdpdGggZnVsbCBhdXRvY29tcGxldGUuIFdvcmtzIHdpdGggYm90aCBgdHlwZWAgYWxpYXNlcyBhbmQgYGludGVyZmFjZWAgZGVjbGFyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gVW50eXBlZCAoZGVmYXVsdCkgXHUyMDE0IGFueSBldmVudCBuYW1lLCBhbnkgYXJnczpcbiAqIGNvbnN0IGV2ZW50cyA9IG5ldyBBc3luY0V2ZW50cygpO1xuICogZXZlbnRzLm9uKCdteS1ldmVudCcsIChhcmcxOiBzdHJpbmcpID0+IHsgLi4uIH0pO1xuICpcbiAqIC8vIFR5cGVkIFx1MjAxNCBvbmx5IGRlY2xhcmVkIGV2ZW50cyB3aXRoIGNvcnJlY3QgYXJnczpcbiAqIGludGVyZmFjZSBNeUV2ZW50TWFwIHtcbiAqICAgc2F2ZTogW2RhdGE6IHN0cmluZ107XG4gKiAgIGxvYWQ6IFtpZDogbnVtYmVyLCBmb3JjZTogYm9vbGVhbl07XG4gKiB9XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHM8TXlFdmVudE1hcD4oKTtcbiAqIGV2ZW50cy5vbignc2F2ZScsIChkYXRhKSA9PiB7IC4uLiB9KTsgICAvLyBkYXRhOiBzdHJpbmcgXHUyMDE0IGF1dG9jb21wbGV0ZSBvbiBldmVudCBuYW1lXG4gKiBldmVudHMub24oJ2xvYWQnLCAoaWQsIGZvcmNlKSA9PiB7IC4uLiB9KTsgLy8gaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5cbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUaGUgcmVnaXN0cnkgbWFwcGluZyBlYWNoIGV2ZW50IG5hbWUgdG8gaXRzIGxpc3Qgb2YgcmVnaXN0ZXJlZCBsaXN0ZW5lciByZWZlcmVuY2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50UmVmc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBBc3luY0V2ZW50UmVmW10+KCk7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9mZignbXktZXZlbnQnLCBteUxpc3RlbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZnNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZnNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmcgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGxldCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIGV2ZW50UmVmcyA9IFtdO1xuICAgICAgdGhpcy5ldmVudFJlZnNNYXAuc2V0KG5hbWUsIGV2ZW50UmVmcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYgPSB7XG4gICAgICBhc3luY0V2ZW50U291cmNlOiB0aGlzLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrIGFzIEdlbmVyaWNDYWxsYmFjayxcbiAgICAgIG5hbWUsXG4gICAgICB0aGlzQXJnXG4gICAgfTtcbiAgICBldmVudFJlZnMucHVzaChldmVudFJlZik7XG4gICAgcmV0dXJuIGV2ZW50UmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZyAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jRXZlbnRzI29ufSAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRSZWYgPSB0aGlzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJnKTtcbiAgICBjb25zdCBjbGVhbnVwRXZlbnRSZWYgPSB0aGlzLm9uKG5hbWUsICgpID0+IHtcbiAgICAgIHRoaXMub2ZmcmVmKG9yaWdpbmFsRXZlbnRSZWYpO1xuICAgICAgdGhpcy5vZmZyZWYoY2xlYW51cEV2ZW50UmVmKTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3JpZ2luYWxFdmVudFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy50cmlnZ2VyKCdteS1ldmVudCcsICdhcmcxJywgJ2FyZzInKTtcbiAgICogYGBgXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBldmVudFJlZnMuc2xpY2UoKSkge1xuICAgICAgdGhpcy50cnlUcmlnZ2VyKGV2ZW50UmVmLCBhcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uYXJnczogQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZnNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2YgZXZlbnRSZWZzLnNsaWNlKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJ5VHJpZ2dlckFzeW5jKGV2ZW50UmVmLCBhcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMudHJ5VHJpZ2dlcihteVJlZiwgWydhcmcxJywgJ2FyZzInXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCBhcmdzOiBBcmdzKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZywgLi4uYXJncyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQuY2F0Y2godGhyb3dEZWxheWVkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvd0RlbGF5ZWQoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHJvdGVjdGVkIGFzeW5jIHRyeVRyaWdnZXJBc3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBldmVudFJlZi5jYWxsYmFjay5jYWxsKGV2ZW50UmVmLnRoaXNBcmcsIC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93RGVsYXllZChlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyB7QGxpbmsgQXN5bmNFdmVudHNCYXNlfSBhbmQgcHJvdmlkZXMgcHVibGljIG1ldGhvZHMgZm9yIHRyaWdnZXJpbmcgZXZlbnRzLlxuICpcbiAqIFRoaXMgY2xhc3MgZXhpc3RzIGFzIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHN9LiBCdXQgZXhwb3NpbmcgcHVibGljbHkgYHRyaWdnZXIoKWAgbWV0aG9kcyB2aW9sYXRlcyBlbmNhcHN1bGF0aW9uLlxuICpcbiAqIEF2b2lkIHVzaW5nIGl0IGluIGZhdm9yIG9mIHtAbGluayBBc3luY0V2ZW50c0Jhc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgbWFwLlxuICovXG5leHBvcnQgY2xhc3MgQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPiBleHRlbmRzIEFzeW5jRXZlbnRzQmFzZTxFdmVudE1hcD4ge1xuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRyaWdnZXI8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uYXJnczogQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogdm9pZCB7XG4gICAgc3VwZXIudHJpZ2dlcihuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi5hcmdzOiBDYWxsYmFja0FyZ3M8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIudHJpZ2dlckFzeW5jKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgdHJ5VHJpZ2dlcjxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IHZvaWQge1xuICAgIHN1cGVyLnRyeVRyaWdnZXIoZXZlbnRSZWYsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIHRyeVRyaWdnZXJBc3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsIGFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gdGhhdCBhZGRzIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBkZWxlZ2F0aW9uIHRvIGEgYmFzZSBjbGFzcy5cbiAqXG4gKiBBbGwgZXZlbnQgbWV0aG9kcyBkZWxlZ2F0ZSB0byBhIHByaXZhdGUge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0gaW5zdGFuY2UuXG4gKiBUaGUgYEV2ZW50TWFwYCBnZW5lcmljIGlzIGZpeGVkIGF0IG1peGluLWFwcGxpY2F0aW9uIHRpbWUgXHUyMDE0IGlmIHlvdSBuZWVkIGEgY2xhc3NcbiAqIHRoYXQgaXMgaXRzZWxmIGdlbmVyaWMgb3ZlciBpdHMgZXZlbnQgbWFwLCB1c2UgY29tcG9zaXRpb24gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBiYXNlIGNsYXNzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzIGV4dGVuZGluZyBpdCB3aXRoIHtAbGluayBBc3luY0V2ZW50U291cmNlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUV2ZW50cyB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogfVxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPE15RXZlbnRzPigpKENvbXBvbmVudCkge1xuICogICAvLyBvbigpLCBvZmYoKSwgb25jZSgpLCBvZmZyZWYoKSBhcmUgYXZhaWxhYmxlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyPFRCYXNlIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+PihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlXG4gICk6IEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2Uge1xuICAgIGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzTWl4aW4gZXh0ZW5kcyBiYXNlQ2xhc3MgaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gICAgICByZWFkb25seSAjYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8RXZlbnRNYXA+KCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgICAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmKG5hbWUsIGNhbGxiYWNrKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UgdG8gcmVtb3ZlLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgICAgIHRoaXMuI2FzeW5jRXZlbnRzLm9mZnJlZihldmVudFJlZik7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJncyBleHRlbmRzIENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgICAgICB0aGlzQXJnPzogdW5rbm93blxuICAgICAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhc3luY0V2ZW50cy5vbihuYW1lLCBjYWxsYmFjaywgdGhpc0FyZyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmdzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICAgICAqIEBwYXJhbSB0aGlzQXJnIC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmdzIGV4dGVuZHMgQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICAgICAgbmFtZTogRXZlbnROYW1lLFxuICAgICAgICBjYWxsYmFjazogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmc/OiB1bmtub3duXG4gICAgICApOiBBc3luY0V2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FzeW5jRXZlbnRzLm9uY2UobmFtZSwgY2FsbGJhY2ssIHRoaXNBcmcpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGFyZ3MgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLmFyZ3M6IENhbGxiYWNrQXJnczxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyKG5hbWUsIC4uLmFyZ3MpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uYXJnczogQ2FsbGJhY2tBcmdzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FzeW5jRXZlbnRzLnRyaWdnZXJBc3luYyhuYW1lLCAuLi5hcmdzKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICAgICAqIEBwYXJhbSBhcmdzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBQYXJpdHkgd2l0aCBPYnNpZGlhbidzIEV2ZW50cy50cnlUcmlnZ2VyLlxuICAgICAgcHJvdGVjdGVkIHRyeVRyaWdnZXI8QXJncyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsIGFyZ3M6IEFyZ3MpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMudHJ5VHJpZ2dlcihldmVudFJlZiwgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3MgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gYXJncyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBQYXJpdHkgd2l0aCBPYnNpZGlhbidzIEV2ZW50cy50cnlUcmlnZ2VyLlxuICAgICAgcHJvdGVjdGVkIGFzeW5jIHRyeVRyaWdnZXJBc3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgYXJnczogQXJncyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLiNhc3luY0V2ZW50cy50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBBc3luY0V2ZW50c01peGluIGFzIEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2U7XG4gIH07XG59XG5cbi8qKlxuICogU3Vic2NyaWJlcyB0byBhbiBldmVudCBvbiBhbiB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gYW5kIHJldHVybnMgYW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzXG4gKiBpdCBvbiBkaXNwb3NlLiBBc3luYyBjb3VudGVycGFydCBvZiB0aGUgbmF0aXZlIGBzdWJzY3JpYmVEaXNwb3NhYmxlRXZlbnRgOyB0aGUgZXZlbnQgbmFtZSBhbmQgY2FsbGJhY2sgYXJndW1lbnRcbiAqIHR5cGVzIGFyZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG4gKlxuICogQHR5cGVQYXJhbSBTb3VyY2UgLSBUaGUge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHR5cGUuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzdWJzY3JpcHRpb24gcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gdGhhdCB1bnJlZ2lzdGVycyB0aGUgaGFuZGxlciB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnQ8U291cmNlIGV4dGVuZHMgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2UsIEV2ZW50TmFtZSBleHRlbmRzIEFzeW5jRXZlbnROYW1lT2Y8U291cmNlPj4oXG4gIHBhcmFtczogU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXM8U291cmNlLCBFdmVudE5hbWU+XG4pOiBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIC8vIGBTb3VyY2VgIGlzIGNvbnN0cmFpbmVkIG9ubHkgdG8gdGhlIG9uLWxlc3MgYEdlbmVyaWNBc3luY0V2ZW50U291cmNlYCAoc28gYSB0eXBlZCBzb3VyY2UgaXMgYWNjZXB0ZWQgd2hhdGV2ZXJcbiAgLy8gSXRzIGV2ZW50IG1hcCdzIHZhcmlhbmNlKTsgZXZlcnkgc291cmNlIGlzIGFuIGBBc3luY0V2ZW50U291cmNlYCwgc28gaXQgaXMgbmFycm93ZWQgdG8gcmVhY2ggYG9uYCwgd2hvc2UgdHlwZVxuICAvLyBQYXJhbWV0ZXJzIHRoZW4gaW5mZXIgZnJvbSB0aGUgKGFscmVhZHktdHlwZWQpIG5hbWUgYW5kIGNhbGxiYWNrLlxuICByZXR1cm4gbmV3IEFzeW5jRXZlbnRSZWZEaXNwb3NhYmxlKGFzQXN5bmNFdmVudFNvdXJjZShwYXJhbXMuYXN5bmNFdmVudFNvdXJjZSkub24ocGFyYW1zLm5hbWUsIHBhcmFtcy5jYWxsYmFjaywgcGFyYW1zLnRoaXNBcmcpKTtcbn1cblxuLy8gTmFycm93cyBhIHNvdXJjZSB0byB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdG8gcmVhY2ggYG9uYC4gQSBsb2NhbCBlcXVpdmFsZW50IG9mIGBjYXN0VG9gOiBpbXBvcnRpbmcgYGNhc3RUb2Bcbi8vIEZyb20gYG9iamVjdC11dGlsc2AgaGVyZSB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgY3ljbGUgKG9iamVjdC11dGlscyBcdTIxOTIgZXJyb3IgXHUyMTkyIGFzeW5jLWV2ZW50cykuXG5mdW5jdGlvbiBhc0FzeW5jRXZlbnRTb3VyY2UodmFsdWU6IHVua25vd24pOiBBc3luY0V2ZW50U291cmNlIHtcbiAgcmV0dXJuIHZhbHVlIGFzIEFzeW5jRXZlbnRTb3VyY2U7XG59XG5cbmZ1bmN0aW9uIHRocm93RGVsYXllZChlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0sIDApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFlQSxtQkFBOEI7QUFDOUIsd0JBQW9DO0FBcVE3QixNQUFNLGdDQUFnQyxzQ0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNeEQsWUFBNkIsZUFBOEI7QUFDaEUsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUEsRUFGb0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9qQixzQkFBNEI7QUFDN0MsU0FBSyxjQUFjLGlCQUFpQixPQUFPLEtBQUssYUFBYTtBQUFBLEVBQy9EO0FBQ0Y7QUEwQk8sTUFBZSxnQkFBb0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlySCxlQUFlLG9CQUFJLElBQTZCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZ0I1RCxJQUNM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
506
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NhYmxlRXggfSBmcm9tICcuL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi90eXBlLnRzJztcblxuaW1wb3J0IHtcbiAgZmlsdGVySW5QbGFjZSxcbiAgc25hcHNob3Rcbn0gZnJvbSAnLi9hcnJheS50cyc7XG5pbXBvcnQgeyBBc3luY0Rpc3Bvc2FibGVCYXNlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuZGVjbGFyZSBjb25zdCBBU1lOQ19FVkVOVF9NQVA6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRSZWYge1xuICAvKipcbiAgICogQW4gZXZlbnQgc291cmNlLlxuICAgKi9cbiAgYXN5bmNFdmVudFNvdXJjZTogR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBjYWxsYmFjazogR2VuZXJpY0NhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICovXG4gIHRoaXNBcmd1bWVudDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBQaGFudG9tIG1hcmtlciB0aGF0IG1ha2VzIHtAbGluayBFdmVudE1hcH0gaW5mZXJhYmxlIGZyb20gYW4ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IChlLmcuIHZpYVxuICAgKiBgU291cmNlIGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxpbmZlciBFdmVudE1hcD5gKS4gTmV2ZXIgcHJlc2VudCBhdCBydW50aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgW0FTWU5DX0VWRU5UX01BUF0/OiBFdmVudE1hcDtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZjtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jRXZlbnRzI29ufSAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uY2U8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApOiBBc3luY0V2ZW50UmVmO1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBleHBvc2luZyBldmVudC10cmlnZ2VyaW5nIG1ldGhvZHMgZm9yIHN1YmNsYXNzZXMgb2YgbWl4aW4tY3JlYXRlZCBjbGFzc2VzLlxuICpcbiAqIFRoZXNlIG1ldGhvZHMgYXJlIGBwcm90ZWN0ZWRgIGF0IHJ1bnRpbWUgYnV0IHN1cmZhY2VkIGluIHRoZSBkZWNsYXJhdGlvbiB0eXBlXG4gKiBiZWNhdXNlIFR5cGVTY3JpcHQgY2Fubm90IHJlcHJlc2VudCBgcHJvdGVjdGVkYCBpbiBhbm9ueW1vdXMtY2xhc3MgcmV0dXJuIHR5cGVzLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IHtcbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICovXG4gIHRyaWdnZXI8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHRyeVRyaWdnZXI8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogdm9pZDtcblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBjYWxsYmFjayBhcmd1bWVudCB0eXBlcyBmb3IgYW4gZXZlbnQuXG4gKlxuICogLSBXaGVuIGBFdmVudE1hcGAgaGFzIGFuIGluZGV4IHNpZ25hdHVyZSAodW50eXBlZCBkZWZhdWx0KTogcmV0dXJucyBgdW5rbm93bltdYCxcbiAqICAgYWxsb3dpbmcgYEFyZ3NgIHRvIGJlIGluZmVycmVkIGZyZWVseSBmcm9tIHRoZSBjYWxsYmFjay5cbiAqIC0gV2hlbiBgRXZlbnRNYXBgIGhhcyBleHBsaWNpdCBrZXlzIG9ubHkgKHR5cGVkIG1hcCk6IHJldHVybnMgYEV2ZW50TWFwW0V2ZW50TmFtZV1gLFxuICogICBlbmZvcmNpbmcgdGhlIGRlY2xhcmVkIGFyZ3VtZW50IHR5cGVzIGFuZCBlbmFibGluZyBhdXRvY29tcGxldGUuXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIE1hcHMgZXZlbnQgbmFtZXMgdG8gdGhlaXIgYXJndW1lbnQgdHVwbGVzLlxuICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKi9cbmV4cG9ydCB0eXBlIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWUgZXh0ZW5kcyBzdHJpbmc+ID0gc3RyaW5nIGV4dGVuZHMga2V5b2YgRXZlbnRNYXAgPyB1bmtub3duW11cbiAgOiAoRXZlbnROYW1lIGV4dGVuZHMga2V5b2YgRXZlbnRNYXAgPyBFdmVudE1hcFtFdmVudE5hbWVdIDogdW5rbm93bltdKTtcblxuLyoqXG4gKiBCYXNlIGV2ZW50IG1hcCB0eXBlIGZvciB1bnR5cGVkIGVtaXR0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBFdmVudE1hcEJhc2UgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duW10+O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgZXZlbnQgc291cmNlLCB1c2VkIGJ5IHtAbGluayBBc3luY0V2ZW50UmVmfVxuICogc28gdGhhdCByZWZzIGNhbiBiZSBzdG9yZWQgcmVnYXJkbGVzcyBvZiB0aGUgZW1pdHRlcidzIGBFdmVudE1hcGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2Uge1xuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAqL1xuICBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBTb3VyY2UgLSBUaGUge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHR5cGUuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLCBjb25zdHJhaW5lZCB0byB0aGUgc291cmNlJ3Mga25vd24gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50UGFyYW1zPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+IHtcbiAgLyoqXG4gICAqIFRoZSBhc3luYyBldmVudCBzb3VyY2UgdG8gc3Vic2NyaWJlIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNFdmVudFNvdXJjZTogU291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgY2FsbGJhY2suIEl0cyBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXMubmFtZX0uXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogQXN5bmNFdmVudENhbGxiYWNrT2Y8U291cmNlLCBFdmVudE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBFdmVudE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGhpc0FyZ3VtZW50PzogdW5rbm93bjtcbn1cblxuLy8gVGhlIGNhbGxiYWNrIHR5cGUgZm9yIGEgZ2l2ZW4gZXZlbnQgb24gYW4gYXN5bmMgZXZlbnQgc291cmNlLCB3aXRoIGl0cyBhcmd1bWVudCB0dXBsZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG50eXBlIEFzeW5jRXZlbnRDYWxsYmFja09mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+ID0gRXZlbnRNYXBPZjxTb3VyY2U+W0V2ZW50TmFtZV0gZXh0ZW5kcyBpbmZlciBBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gIDogbmV2ZXI7XG5cbi8vIFRoZSB1bmlvbiBvZiBrbm93biBldmVudCBuYW1lcyBmb3IgYW4gYXN5bmMgZXZlbnQgc291cmNlLCBkZXJpdmVkIGZyb20gaXRzIGV2ZW50IG1hcC5cbnR5cGUgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZT4gPSBrZXlvZiBFdmVudE1hcE9mPFNvdXJjZT4gJiBzdHJpbmc7XG5cbnR5cGUgRXZlbnRNYXBDb25zdHJhaW50PFQ+ID0gUmVjb3JkPGtleW9mIFQsIHVua25vd25bXT47XG5cbi8vIFJlY292ZXJzIHRoZSBldmVudCBtYXAgb2YgYW4gYXN5bmMgZXZlbnQgc291cmNlIHZpYSB0aGUgcGhhbnRvbSBtYXJrZXIgb24gYEFzeW5jRXZlbnRTb3VyY2VgLlxudHlwZSBFdmVudE1hcE9mPFNvdXJjZT4gPSBTb3VyY2UgZXh0ZW5kcyBBc3luY0V2ZW50U291cmNlPGluZmVyIEV2ZW50TWFwPiA/IEV2ZW50TWFwIDogbmV2ZXI7XG5cbnR5cGUgR2VuZXJpY0NhbGxiYWNrID0gR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248dW5rbm93bltdPjtcblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgYW4ge0BsaW5rIEFzeW5jRXZlbnRSZWZ9IG9uIGRpc3Bvc2UsIHZpYSB0aGUgZXZlbnQgc291cmNlIHN0b3JlZFxuICogb24gdGhlIHJlZiBpdHNlbGYuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYEV2ZW50UmVmRGlzcG9zYWJsZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50UmVmRGlzcG9zYWJsZSBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZUJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgd3JhcHBpbmcgYW4gZXhpc3Rpbmcge0BsaW5rIEFzeW5jRXZlbnRSZWZ9LlxuICAgKlxuICAgKiBAcGFyYW0gYXN5bmNFdmVudFJlZiAtIFRoZSBhc3luYyBldmVudCByZWZlcmVuY2UgdG8gdW5yZWdpc3RlciBvbiBkaXNwb3NlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudFJlZjogQXN5bmNFdmVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGV2ZW50IHZpYSB0aGUgc291cmNlIHN0b3JlZCBvbiB0aGUgcmVmIChgYXN5bmNFdmVudFNvdXJjZS5vZmZyZWZgKS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudFJlZi5hc3luY0V2ZW50U291cmNlLm9mZnJlZih0aGlzLmFzeW5jRXZlbnRSZWYpO1xuICB9XG59XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzQmFzZTxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IG1hcHBpbmcgZWFjaCBldmVudCBuYW1lIHRvIGl0cyBsaXN0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXIgcmVmZXJlbmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudFJlZmVyZW5jZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgQXN5bmNFdmVudFJlZltdPigpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9mZignbXktZXZlbnQnLCBteUxpc3RlbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGxldCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIGV2ZW50UmVmcyA9IFtdO1xuICAgICAgdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuc2V0KG5hbWUsIGV2ZW50UmVmcyk7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYgPSB7XG4gICAgICBhc3luY0V2ZW50U291cmNlOiB0aGlzLFxuICAgICAgY2FsbGJhY2s6IGNhbGxiYWNrIGFzIEdlbmVyaWNDYWxsYmFjayxcbiAgICAgIG5hbWUsXG4gICAgICB0aGlzQXJndW1lbnRcbiAgICB9O1xuICAgIGV2ZW50UmVmcy5wdXNoKGV2ZW50UmVmKTtcbiAgICByZXR1cm4gZXZlbnRSZWY7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgb25seSBvbmNlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCB7QGxpbmsgb2JzaWRpYW4jRXZlbnRzI29ufSAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgY29uc3Qgb3JpZ2luYWxFdmVudFJlZiA9IHRoaXMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50UmVmID0gdGhpcy5vbihuYW1lLCAoKSA9PiB7XG4gICAgICB0aGlzLm9mZnJlZihvcmlnaW5hbEV2ZW50UmVmKTtcbiAgICAgIHRoaXMub2ZmcmVmKGNsZWFudXBFdmVudFJlZik7XG4gICAgfSk7XG4gICAgcmV0dXJuIG9yaWdpbmFsRXZlbnRSZWY7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMudHJpZ2dlcignbXktZXZlbnQnLCAnYXJnMScsICdhcmcyJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHJvdGVjdGVkIHRyaWdnZXI8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBzbmFwc2hvdChldmVudFJlZnMpKSB7XG4gICAgICB0aGlzLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZlcmVuY2VzTWFwLmdldChuYW1lKSA/PyBbXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50UmVmIG9mIHNuYXBzaG90KGV2ZW50UmVmcykpIHtcbiAgICAgIGF3YWl0IHRoaXMudHJ5VHJpZ2dlckFzeW5jKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy50cnlUcmlnZ2VyKG15UmVmLCBbJ2FyZzEnLCAnYXJnMiddKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHJvdGVjdGVkIHRyeVRyaWdnZXI8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZ3VtZW50LCAuLi4kYXJndW1lbnRzKTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJlc3VsdC5jYXRjaCh0aHJvd0RlbGF5ZWQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvd0RlbGF5ZWQoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHJvdGVjdGVkIGFzeW5jIHRyeVRyaWdnZXJBc3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCAkYXJndW1lbnRzOiBBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXZlbnRSZWYuY2FsbGJhY2suY2FsbChldmVudFJlZi50aGlzQXJndW1lbnQsIC4uLiRhcmd1bWVudHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvd0RlbGF5ZWQoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEEgY2xhc3MgdGhhdCBleHRlbmRzIHtAbGluayBBc3luY0V2ZW50c0Jhc2V9IGFuZCBwcm92aWRlcyBwdWJsaWMgbWV0aG9kcyBmb3IgdHJpZ2dlcmluZyBldmVudHMuXG4gKlxuICogVGhpcyBjbGFzcyBleGlzdHMgYXMgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50c30uIEJ1dCBleHBvc2luZyBwdWJsaWNseSBgdHJpZ2dlcigpYCBtZXRob2RzIHZpb2xhdGVzIGVuY2Fwc3VsYXRpb24uXG4gKlxuICogQXZvaWQgdXNpbmcgaXQgaW4gZmF2b3Igb2Yge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIFRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGV4dGVuZHMgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgIHN1cGVyLnRyaWdnZXIobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvdmVycmlkZSB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHN1cGVyLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gdGhhdCBhZGRzIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBkZWxlZ2F0aW9uIHRvIGEgYmFzZSBjbGFzcy5cbiAqXG4gKiBBbGwgZXZlbnQgbWV0aG9kcyBkZWxlZ2F0ZSB0byBhIHByaXZhdGUge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0gaW5zdGFuY2UuXG4gKiBUaGUgYEV2ZW50TWFwYCBnZW5lcmljIGlzIGZpeGVkIGF0IG1peGluLWFwcGxpY2F0aW9uIHRpbWUgXHUyMDE0IGlmIHlvdSBuZWVkIGEgY2xhc3NcbiAqIHRoYXQgaXMgaXRzZWxmIGdlbmVyaWMgb3ZlciBpdHMgZXZlbnQgbWFwLCB1c2UgY29tcG9zaXRpb24gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBiYXNlIGNsYXNzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzIGV4dGVuZGluZyBpdCB3aXRoIHtAbGluayBBc3luY0V2ZW50U291cmNlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUV2ZW50cyB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogfVxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPE15RXZlbnRzPigpKENvbXBvbmVudCkge1xuICogICAvLyBvbigpLCBvZmYoKSwgb25jZSgpLCBvZmZyZWYoKSBhcmUgYXZhaWxhYmxlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyPFRCYXNlIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+PihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlXG4gICk6IEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2Uge1xuICAgIGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzTWl4aW4gZXh0ZW5kcyBiYXNlQ2xhc3MgaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gICAgICByZWFkb25seSAjYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8RXZlbnRNYXA+KCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD5cbiAgICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAgICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIHtAbGluayBvYnNpZGlhbiNFdmVudHMjb259IChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgICAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgICAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICAgICApOiBBc3luY0V2ZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2FzeW5jRXZlbnRzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZS5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGV2ZW50IGNhbGxiYWNrIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICAgICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGgge0BsaW5rIG9ic2lkaWFuI0V2ZW50cyNvbn0gKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAgICAgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgICAgcHVibGljIG9uY2U8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICAgICAgbmFtZTogRXZlbnROYW1lLFxuICAgICAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICAgICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICAgICAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNhc3luY0V2ZW50cy5vbmNlKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLiRhcmd1bWVudHM6IENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogdm9pZCB7XG4gICAgICAgIHRoaXMuI2FzeW5jRXZlbnRzLnRyaWdnZXIobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseS5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL1xuICAgICAgcHJvdGVjdGVkIGFzeW5jIHRyaWdnZXJBc3luYzxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyQXN5bmMobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICAgICAqXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBQYXJpdHkgd2l0aCBPYnNpZGlhbidzIEV2ZW50cy50cnlUcmlnZ2VyLlxuICAgICAgcHJvdGVjdGVkIHRyeVRyaWdnZXI8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuI2FzeW5jRXZlbnRzLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBQYXJpdHkgd2l0aCBPYnNpZGlhbidzIEV2ZW50cy50cnlUcmlnZ2VyLlxuICAgICAgcHJvdGVjdGVkIGFzeW5jIHRyeVRyaWdnZXJBc3luYzxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCAkYXJndW1lbnRzOiBBcmd1bWVudHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNFdmVudHMudHJ5VHJpZ2dlckFzeW5jKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gQXN5bmNFdmVudHNNaXhpbiBhcyBBYnN0cmFjdENvbnN0cnVjdG9yPEFzeW5jRXZlbnRTb3VyY2U8RXZlbnRNYXA+ICYgQXN5bmNFdmVudFRyaWdnZXI8RXZlbnRNYXA+PiAmIFRCYXNlO1xuICB9O1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gYW4gZXZlbnQgb24gYW4ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IGFuZCByZXR1cm5zIGFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gdGhhdCB1bnJlZ2lzdGVyc1xuICogaXQgb24gZGlzcG9zZS4gQXN5bmMgY291bnRlcnBhcnQgb2YgdGhlIG5hdGl2ZSBgc3Vic2NyaWJlRGlzcG9zYWJsZUV2ZW50YDsgdGhlIGV2ZW50IG5hbWUgYW5kIGNhbGxiYWNrIGFyZ3VtZW50XG4gKiB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgc291cmNlJ3MgZXZlbnQgbWFwLlxuICpcbiAqIEB0eXBlUGFyYW0gU291cmNlIC0gVGhlIHtAbGluayBBc3luY0V2ZW50U291cmNlfSB0eXBlLlxuICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc3Vic2NyaXB0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgdGhlIGhhbmRsZXIgd2hlbiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50PFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+KFxuICBwYXJhbXM6IFN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50UGFyYW1zPFNvdXJjZSwgRXZlbnROYW1lPlxuKTogQXN5bmNEaXNwb3NhYmxlRXgge1xuICAvLyBgU291cmNlYCBpcyBjb25zdHJhaW5lZCBvbmx5IHRvIHRoZSBvbi1sZXNzIGBHZW5lcmljQXN5bmNFdmVudFNvdXJjZWAgKHNvIGEgdHlwZWQgc291cmNlIGlzIGFjY2VwdGVkIHdoYXRldmVyXG4gIC8vIEl0cyBldmVudCBtYXAncyB2YXJpYW5jZSk7IGV2ZXJ5IHNvdXJjZSBpcyBhbiBgQXN5bmNFdmVudFNvdXJjZWAsIHNvIGl0IGlzIG5hcnJvd2VkIHRvIHJlYWNoIGBvbmAsIHdob3NlIHR5cGVcbiAgLy8gUGFyYW1ldGVycyB0aGVuIGluZmVyIGZyb20gdGhlIChhbHJlYWR5LXR5cGVkKSBuYW1lIGFuZCBjYWxsYmFjay5cbiAgcmV0dXJuIG5ldyBBc3luY0V2ZW50UmVmRGlzcG9zYWJsZShhc0FzeW5jRXZlbnRTb3VyY2UocGFyYW1zLmFzeW5jRXZlbnRTb3VyY2UpLm9uKHBhcmFtcy5uYW1lLCBwYXJhbXMuY2FsbGJhY2ssIHBhcmFtcy50aGlzQXJndW1lbnQpKTtcbn1cblxuLy8gTmFycm93cyBhIHNvdXJjZSB0byB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdG8gcmVhY2ggYG9uYC4gQSBsb2NhbCBlcXVpdmFsZW50IG9mIGBjYXN0VG9gOiBpbXBvcnRpbmcgYGNhc3RUb2Bcbi8vIEZyb20gYG9iamVjdC11dGlsc2AgaGVyZSB3b3VsZCBjcmVhdGUgYSBtb2R1bGUgY3ljbGUgKG9iamVjdC11dGlscyBcdTIxOTIgZXJyb3IgXHUyMTkyIGFzeW5jLWV2ZW50cykuXG5mdW5jdGlvbiBhc0FzeW5jRXZlbnRTb3VyY2UodmFsdWU6IHVua25vd24pOiBBc3luY0V2ZW50U291cmNlIHtcbiAgcmV0dXJuIHZhbHVlIGFzIEFzeW5jRXZlbnRTb3VyY2U7XG59XG5cbmZ1bmN0aW9uIHRocm93RGVsYXllZChlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0sIDApO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLG1CQUdPO0FBQ1Asd0JBQW9DO0FBcVE3QixNQUFNLGdDQUFnQyxzQ0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNeEQsWUFBNkIsZUFBOEI7QUFDaEUsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUEsRUFGb0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9qQixzQkFBNEI7QUFDN0MsU0FBSyxjQUFjLGlCQUFpQixPQUFPLEtBQUssYUFBYTtBQUFBLEVBQy9EO0FBQ0Y7QUEwQk8sTUFBZSxnQkFBb0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlySCxxQkFBcUIsb0JBQUksSUFBNkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFnQmxFLElBQ0wsTUFDQSxVQUNNO0FBQ04sVUFBTSxZQUFZLEtBQUssbUJB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QUFBQTtBQUFBO0FBQUEsTUFPTyxPQUFPLFVBQStCO0FBQzNDLGFBQUssYUFBYSxPQUFPLFFBQVE7QUFBQSxNQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFlTyxHQUNMLE1BQ0EsVUFDQSxjQUNlO0FBQ2YsZUFBTyxLQUFLLGFBQWEsR0FBRyxNQUFNLFVBQVUsWUFBWTtBQUFBLE1BQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWVPLEtBQ0wsTUFDQSxVQUNBLGNBQ2U7QUFDZixlQUFPLEtBQUssYUFBYSxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQUEsTUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BU1UsUUFBZ0QsU0FBb0IsWUFBMEQ7QUFDdEksYUFBSyxhQUFhLFFBQVEsTUFBTSxHQUFHLFVBQVU7QUFBQSxNQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVVBLE1BQWdCLGFBQXFELFNBQW9CLFlBQW1FO0FBQzFKLGNBQU0sS0FBSyxhQUFhLGFBQWEsTUFBTSxHQUFHLFVBQVU7QUFBQSxNQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVVVLFdBQXdDLFVBQXlCLFlBQTZCO0FBQ3RHLGFBQUssYUFBYSxXQUFXLFVBQVUsVUFBVTtBQUFBLE1BQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFXQSxNQUFnQixnQkFBNkMsVUFBeUIsWUFBc0M7QUFDMUgsY0FBTSxLQUFLLGFBQWEsZ0JBQWdCLFVBQVUsVUFBVTtBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFZTyxTQUFTLDhCQUNkLFFBQ21CO0FBSW5CLFNBQU8sSUFBSSx3QkFBd0IsbUJBQW1CLE9BQU8sZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLE1BQU0sT0FBTyxVQUFVLE9BQU8sWUFBWSxDQUFDO0FBQ3RJO0FBSUEsU0FBUyxtQkFBbUIsT0FBa0M7QUFDNUQsU0FBTztBQUNUO0FBRUEsU0FBUyxhQUFhLE9BQXNCO0FBQzFDLFNBQU8sV0FBVyxNQUFNO0FBQ3RCLFVBQU07QUFBQSxFQUNSLEdBQUcsQ0FBQztBQUNOOyIsCiAgIm5hbWVzIjogW10KfQo=