obsidian-dev-utils 88.8.0 → 90.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 (672) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/demo-vault-helper/main.js +20 -23
  3. package/dist/integration-test-plugin/main.js +2229 -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 +54 -32
  57. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +45 -8
  58. package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +24 -15
  59. package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +18 -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 +11 -15
  353. package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +11 -15
  354. package/dist/lib/cjs/script-utils/test-runners/vitest-config.cjs +12 -15
  355. package/dist/lib/cjs/script-utils/test-runners/vitest.cjs +11 -15
  356. package/dist/lib/cjs/script-utils/validate-declarations.cjs +11 -15
  357. package/dist/lib/cjs/script-utils/version.cjs +62 -63
  358. package/dist/lib/cjs/script-utils/version.d.cts +21 -21
  359. package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +11 -15
  360. package/dist/lib/cjs/setup.cjs +11 -15
  361. package/dist/lib/cjs/setup.d.cts +1 -1
  362. package/dist/lib/cjs/strict-proxy.cjs +30 -34
  363. package/dist/lib/cjs/strict-proxy.d.cts +2 -2
  364. package/dist/lib/cjs/string.cjs +90 -93
  365. package/dist/lib/cjs/string.d.cts +60 -60
  366. package/dist/lib/cjs/transformers/date-transformer.cjs +11 -15
  367. package/dist/lib/cjs/transformers/duration-transformer.cjs +11 -15
  368. package/dist/lib/cjs/transformers/group-transformer.cjs +11 -15
  369. package/dist/lib/cjs/transformers/index.cjs +11 -15
  370. package/dist/lib/cjs/transformers/map-transformer.cjs +12 -16
  371. package/dist/lib/cjs/transformers/set-transformer.cjs +12 -16
  372. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +11 -15
  373. package/dist/lib/cjs/transformers/transformer.cjs +11 -15
  374. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +12 -16
  375. package/dist/lib/cjs/transformers/typed-transformer.cjs +11 -15
  376. package/dist/lib/cjs/two-way-map.cjs +11 -15
  377. package/dist/lib/cjs/type-guards.cjs +16 -20
  378. package/dist/lib/cjs/type-guards.d.cts +6 -6
  379. package/dist/lib/cjs/type.cjs +13 -17
  380. package/dist/lib/cjs/type.d.cts +2 -2
  381. package/dist/lib/cjs/url.cjs +18 -22
  382. package/dist/lib/cjs/url.d.cts +4 -4
  383. package/dist/lib/cjs/value-provider.cjs +15 -19
  384. package/dist/lib/cjs/value-provider.d.cts +6 -6
  385. package/dist/lib/cjs/value-wrapper.cjs +11 -15
  386. package/dist/lib/cjs/vitest-setup.cjs +11 -15
  387. package/dist/lib/esm/__merged.d.mts +12 -10
  388. package/dist/lib/esm/__merged.mjs +51 -23
  389. package/dist/lib/esm/abort-controller.mjs +5 -8
  390. package/dist/lib/esm/array.d.mts +25 -7
  391. package/dist/lib/esm/array.mjs +16 -12
  392. package/dist/lib/esm/async-events.d.mts +50 -50
  393. package/dist/lib/esm/async-events.mjs +81 -78
  394. package/dist/lib/esm/async.d.mts +23 -23
  395. package/dist/lib/esm/async.mjs +70 -66
  396. package/dist/lib/esm/blob.mjs +4 -11
  397. package/dist/lib/esm/debug.d.mts +1 -1
  398. package/dist/lib/esm/debug.mjs +14 -18
  399. package/dist/lib/esm/disposable.d.mts +27 -8
  400. package/dist/lib/esm/disposable.mjs +47 -29
  401. package/dist/lib/esm/error.mjs +18 -19
  402. package/dist/lib/esm/function.d.mts +26 -26
  403. package/dist/lib/esm/function.mjs +20 -20
  404. package/dist/lib/esm/generated-during-build.mjs +1 -1
  405. package/dist/lib/esm/html-element.d.mts +15 -15
  406. package/dist/lib/esm/html-element.mjs +74 -75
  407. package/dist/lib/esm/object-utils.d.mts +27 -27
  408. package/dist/lib/esm/object-utils.mjs +109 -102
  409. package/dist/lib/esm/obsidian/@types/dataview/data-model/value.d.mts +1 -1
  410. package/dist/lib/esm/obsidian/@types/dataview/expression/field.d.mts +1 -1
  411. package/dist/lib/esm/obsidian/@types/dataview/expression/functions.d.mts +4 -4
  412. package/dist/lib/esm/obsidian/app.mjs +1 -1
  413. package/dist/lib/esm/obsidian/async-with-notice.d.mts +2 -2
  414. package/dist/lib/esm/obsidian/async-with-notice.mjs +18 -18
  415. package/dist/lib/esm/obsidian/attachment-path.d.mts +5 -5
  416. package/dist/lib/esm/obsidian/attachment-path.mjs +10 -10
  417. package/dist/lib/esm/obsidian/backlink.mjs +2 -2
  418. package/dist/lib/esm/obsidian/callout.d.mts +9 -3
  419. package/dist/lib/esm/obsidian/callout.mjs +17 -12
  420. package/dist/lib/esm/obsidian/canvas.mjs +3 -2
  421. package/dist/lib/esm/obsidian/case-insensitive-file-index.mjs +8 -6
  422. package/dist/lib/esm/obsidian/code-block-markdown-information.d.mts +2 -2
  423. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +5 -0
  424. package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +8 -2
  425. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +45 -8
  426. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +44 -18
  427. package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +18 -0
  428. package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +14 -1
  429. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +8 -8
  430. package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +16 -16
  431. package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +2 -2
  432. package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +2 -2
  433. package/dist/lib/esm/obsidian/command-handlers/global-command-handler.mjs +3 -3
  434. package/dist/lib/esm/obsidian/community-plugins.d.mts +19 -5
  435. package/dist/lib/esm/obsidian/community-plugins.mjs +17 -11
  436. package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +4 -4
  437. package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +1 -1
  438. package/dist/lib/esm/obsidian/components/async-error-handler-component.mjs +3 -2
  439. package/dist/lib/esm/obsidian/components/component-ex.d.mts +3 -3
  440. package/dist/lib/esm/obsidian/components/component-ex.mjs +16 -14
  441. package/dist/lib/esm/obsidian/components/console-debug-component.d.mts +2 -2
  442. package/dist/lib/esm/obsidian/components/console-debug-component.mjs +4 -4
  443. package/dist/lib/esm/obsidian/components/index.d.mts +1 -0
  444. package/dist/lib/esm/obsidian/components/index.mjs +3 -1
  445. package/dist/lib/esm/obsidian/components/menu-event-registrar-component.mjs +5 -5
  446. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +55 -55
  447. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +19 -19
  448. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.d.mts +139 -0
  449. package/dist/lib/esm/obsidian/components/notebook-navigator-menu-event-registrar-component.mjs +196 -0
  450. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +18 -17
  451. package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +8 -8
  452. package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +18 -18
  453. package/dist/lib/esm/obsidian/components/pointer-position-component.mjs +3 -3
  454. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +12 -1
  455. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +62 -48
  456. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.d.mts +8 -8
  457. package/dist/lib/esm/obsidian/components/syntax-highlighting-component.mjs +6 -6
  458. package/dist/lib/esm/obsidian/constructors/get-dom-events-handlers-constructor.mjs +4 -4
  459. package/dist/lib/esm/obsidian/data-handler.mjs +1 -1
  460. package/dist/lib/esm/obsidian/dataview-link.mjs +3 -3
  461. package/dist/lib/esm/obsidian/dataview.d.mts +2 -2
  462. package/dist/lib/esm/obsidian/dataview.mjs +25 -27
  463. package/dist/lib/esm/obsidian/demo-vault-helper.mjs +4 -3
  464. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +12 -12
  465. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +13 -7
  466. package/dist/lib/esm/obsidian/editor.mjs +7 -5
  467. package/dist/lib/esm/obsidian/events.d.mts +2 -2
  468. package/dist/lib/esm/obsidian/events.mjs +2 -2
  469. package/dist/lib/esm/obsidian/file-change.d.mts +3 -3
  470. package/dist/lib/esm/obsidian/file-change.mjs +67 -67
  471. package/dist/lib/esm/obsidian/file-manager.d.mts +20 -1
  472. package/dist/lib/esm/obsidian/file-manager.mjs +22 -8
  473. package/dist/lib/esm/obsidian/file-system.d.mts +3 -3
  474. package/dist/lib/esm/obsidian/file-system.mjs +4 -4
  475. package/dist/lib/esm/obsidian/frontmatter.mjs +5 -5
  476. package/dist/lib/esm/obsidian/html-element.d.mts +2 -2
  477. package/dist/lib/esm/obsidian/html-element.mjs +3 -3
  478. package/dist/lib/esm/obsidian/i18n/i18n.d.mts +7 -0
  479. package/dist/lib/esm/obsidian/i18n/i18n.mjs +3 -2
  480. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  481. package/dist/lib/esm/obsidian/index.mjs +3 -1
  482. package/dist/lib/esm/obsidian/link.d.mts +22 -22
  483. package/dist/lib/esm/obsidian/link.mjs +76 -62
  484. package/dist/lib/esm/obsidian/logger.d.mts +5 -5
  485. package/dist/lib/esm/obsidian/logger.mjs +11 -11
  486. package/dist/lib/esm/obsidian/loop.d.mts +1 -1
  487. package/dist/lib/esm/obsidian/loop.mjs +4 -4
  488. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +3 -3
  489. package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +2 -2
  490. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +3 -3
  491. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +25 -26
  492. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +3 -3
  493. package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +2 -2
  494. package/dist/lib/esm/obsidian/markdown.mjs +12 -10
  495. package/dist/lib/esm/obsidian/menu-event-registrar.d.mts +1 -1
  496. package/dist/lib/esm/obsidian/metadata-cache.d.mts +2 -2
  497. package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
  498. package/dist/lib/esm/obsidian/modals/confirm.mjs +1 -1
  499. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +18 -18
  500. package/dist/lib/esm/obsidian/modals/select-item.d.mts +1 -1
  501. package/dist/lib/esm/obsidian/modals/select-item.mjs +6 -6
  502. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.d.mts +5 -5
  503. package/dist/lib/esm/obsidian/modals/suggest-modal-command-builder.mjs +16 -14
  504. package/dist/lib/esm/obsidian/notebook-navigator.d.mts +132 -0
  505. package/dist/lib/esm/obsidian/notebook-navigator.mjs +49 -0
  506. package/dist/lib/esm/obsidian/parse-link.d.mts +4 -4
  507. package/dist/lib/esm/obsidian/parse-link.mjs +51 -48
  508. package/dist/lib/esm/obsidian/path-settings.mjs +17 -11
  509. package/dist/lib/esm/obsidian/pdf.d.mts +2 -2
  510. package/dist/lib/esm/obsidian/pdf.mjs +3 -3
  511. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +156 -52
  512. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +1 -1
  513. package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -2
  514. package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +7 -7
  515. package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +11 -9
  516. package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +10 -10
  517. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +20 -20
  518. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +11 -1
  519. package/dist/lib/esm/obsidian/plugin/plugin.mjs +23 -2
  520. package/dist/lib/esm/obsidian/popovers/popover-anchor.d.mts +2 -2
  521. package/dist/lib/esm/obsidian/popovers/popover-anchor.mjs +4 -4
  522. package/dist/lib/esm/obsidian/popovers/popover.mjs +9 -9
  523. package/dist/lib/esm/obsidian/queue.d.mts +2 -2
  524. package/dist/lib/esm/obsidian/queue.mjs +6 -6
  525. package/dist/lib/esm/obsidian/resource-lock.d.mts +5 -0
  526. package/dist/lib/esm/obsidian/resource-lock.mjs +147 -64
  527. package/dist/lib/esm/obsidian/resource-url.mjs +2 -2
  528. package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +2 -2
  529. package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +1 -1
  530. package/dist/lib/esm/obsidian/setting-components/checkbox-component.d.mts +5 -5
  531. package/dist/lib/esm/obsidian/setting-components/checkbox-component.mjs +8 -8
  532. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.d.mts +2 -2
  533. package/dist/lib/esm/obsidian/setting-components/code-highlighter-component.mjs +18 -17
  534. package/dist/lib/esm/obsidian/setting-components/date-component.d.mts +2 -2
  535. package/dist/lib/esm/obsidian/setting-components/date-component.mjs +4 -4
  536. package/dist/lib/esm/obsidian/setting-components/date-time-component.d.mts +2 -2
  537. package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +4 -4
  538. package/dist/lib/esm/obsidian/setting-components/email-component.d.mts +2 -2
  539. package/dist/lib/esm/obsidian/setting-components/email-component.mjs +4 -4
  540. package/dist/lib/esm/obsidian/setting-components/month-component.d.mts +2 -2
  541. package/dist/lib/esm/obsidian/setting-components/month-component.mjs +4 -4
  542. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.d.mts +2 -2
  543. package/dist/lib/esm/obsidian/setting-components/multiple-dropdown-component.mjs +7 -7
  544. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.d.mts +2 -2
  545. package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +4 -4
  546. package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +2 -2
  547. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.d.mts +2 -2
  548. package/dist/lib/esm/obsidian/setting-components/multiple-text-component.mjs +5 -5
  549. package/dist/lib/esm/obsidian/setting-components/number-component.d.mts +2 -2
  550. package/dist/lib/esm/obsidian/setting-components/number-component.mjs +4 -4
  551. package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
  552. package/dist/lib/esm/obsidian/setting-components/password-component.mjs +4 -4
  553. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.d.mts +2 -2
  554. package/dist/lib/esm/obsidian/setting-components/setting-component-wrapper.mjs +6 -6
  555. package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
  556. package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +4 -4
  557. package/dist/lib/esm/obsidian/setting-components/text-based-component.d.mts +2 -2
  558. package/dist/lib/esm/obsidian/setting-components/text-based-component.mjs +6 -6
  559. package/dist/lib/esm/obsidian/setting-components/time-component.d.mts +2 -2
  560. package/dist/lib/esm/obsidian/setting-components/time-component.mjs +4 -4
  561. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.d.mts +2 -2
  562. package/dist/lib/esm/obsidian/setting-components/tri-state-checkbox-component.mjs +5 -5
  563. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.d.mts +2 -2
  564. package/dist/lib/esm/obsidian/setting-components/typed-dropdown-component.mjs +6 -6
  565. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.d.mts +2 -2
  566. package/dist/lib/esm/obsidian/setting-components/typed-multiple-dropdown-component.mjs +8 -8
  567. package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +4 -4
  568. package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -5
  569. package/dist/lib/esm/obsidian/setting-components/url-component.d.mts +2 -2
  570. package/dist/lib/esm/obsidian/setting-components/url-component.mjs +4 -4
  571. package/dist/lib/esm/obsidian/setting-components/validator-component.d.mts +2 -2
  572. package/dist/lib/esm/obsidian/setting-components/validator-component.mjs +35 -35
  573. package/dist/lib/esm/obsidian/setting-components/week-component.d.mts +2 -2
  574. package/dist/lib/esm/obsidian/setting-components/week-component.mjs +4 -4
  575. package/dist/lib/esm/obsidian/setting-ex.d.mts +42 -42
  576. package/dist/lib/esm/obsidian/setting-ex.mjs +66 -66
  577. package/dist/lib/esm/obsidian/setting-group-ex.d.mts +2 -2
  578. package/dist/lib/esm/obsidian/setting-group-ex.mjs +4 -4
  579. package/dist/lib/esm/obsidian/vault-delete.d.mts +16 -2
  580. package/dist/lib/esm/obsidian/vault-delete.mjs +12 -6
  581. package/dist/lib/esm/obsidian/vault-transaction.mjs +8 -4
  582. package/dist/lib/esm/obsidian/vault.d.mts +32 -11
  583. package/dist/lib/esm/obsidian/vault.mjs +67 -47
  584. package/dist/lib/esm/obsidian/view-registrar.mjs +1 -1
  585. package/dist/lib/esm/obsidian/workspace.mjs +2 -2
  586. package/dist/lib/esm/path.d.mts +1 -1
  587. package/dist/lib/esm/path.mjs +7 -7
  588. package/dist/lib/esm/reg-exp.d.mts +4 -4
  589. package/dist/lib/esm/reg-exp.mjs +28 -21
  590. package/dist/lib/esm/script-utils/build.d.mts +1 -1
  591. package/dist/lib/esm/script-utils/build.mjs +15 -12
  592. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +14 -14
  593. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +26 -20
  594. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +10 -10
  595. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +3 -3
  596. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +6 -6
  597. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +6 -2
  598. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +1 -1
  599. package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +20 -20
  600. package/dist/lib/esm/script-utils/check-project-types.d.mts +12 -4
  601. package/dist/lib/esm/script-utils/check-project-types.mjs +3 -3
  602. package/dist/lib/esm/script-utils/cli-utils.d.mts +6 -6
  603. package/dist/lib/esm/script-utils/cli-utils.mjs +29 -33
  604. package/dist/lib/esm/script-utils/demo-vault-coverage.mjs +12 -9
  605. package/dist/lib/esm/script-utils/env-toggle.mjs +3 -3
  606. package/dist/lib/esm/script-utils/exec.d.mts +4 -4
  607. package/dist/lib/esm/script-utils/exec.mjs +32 -32
  608. package/dist/lib/esm/script-utils/formatters/dprint.mjs +2 -2
  609. package/dist/lib/esm/script-utils/fs.mjs +3 -3
  610. package/dist/lib/esm/script-utils/json.d.mts +2 -2
  611. package/dist/lib/esm/script-utils/json.mjs +5 -5
  612. package/dist/lib/esm/script-utils/linters/cspell.mjs +2 -2
  613. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +392 -2
  614. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.d.mts +3 -1
  615. package/dist/lib/esm/script-utils/linters/eslint-rules/no-async-callback-to-unsafe-return.mjs +17 -17
  616. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +3 -1
  617. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +17 -17
  618. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.d.mts +3 -1
  619. package/dist/lib/esm/script-utils/linters/eslint-rules/no-used-underscore-variables.mjs +11 -11
  620. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.d.mts +3 -1
  621. package/dist/lib/esm/script-utils/linters/eslint-rules/params-options-name-match.mjs +99 -99
  622. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.d.mts +3 -1
  623. package/dist/lib/esm/script-utils/linters/eslint-rules/prefer-noop-async.mjs +3 -3
  624. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.d.mts +3 -1
  625. package/dist/lib/esm/script-utils/linters/eslint-rules/readonly-params-options-result-members.mjs +11 -11
  626. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.d.mts +9 -3
  627. package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +41 -41
  628. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.d.mts +6 -2
  629. package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +15 -13
  630. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.d.mts +3 -1
  631. package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +23 -23
  632. package/dist/lib/esm/script-utils/linters/eslint.mjs +4 -4
  633. package/dist/lib/esm/script-utils/linters/index.d.mts +1 -0
  634. package/dist/lib/esm/script-utils/linters/index.mjs +3 -1
  635. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.d.mts +2 -2
  636. package/dist/lib/esm/script-utils/linters/markdownlint-cli2-config.mjs +8 -3
  637. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.d.mts +35 -0
  638. package/dist/lib/esm/script-utils/linters/markdownlint-ignores.mjs +33 -0
  639. package/dist/lib/esm/script-utils/linters/markdownlint.mjs +13 -9
  640. package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +54 -18
  641. package/dist/lib/esm/script-utils/linters/over-exposure.mjs +8 -8
  642. package/dist/lib/esm/script-utils/npm-run.d.mts +16 -2
  643. package/dist/lib/esm/script-utils/npm-run.mjs +9 -3
  644. package/dist/lib/esm/script-utils/npm.d.mts +11 -11
  645. package/dist/lib/esm/script-utils/npm.mjs +11 -11
  646. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +165 -55
  647. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +1 -1
  648. package/dist/lib/esm/script-utils/test-runners/vitest-config.mjs +2 -1
  649. package/dist/lib/esm/script-utils/validate-declarations.mjs +1 -1
  650. package/dist/lib/esm/script-utils/version.d.mts +21 -21
  651. package/dist/lib/esm/script-utils/version.mjs +48 -45
  652. package/dist/lib/esm/setup.d.mts +1 -1
  653. package/dist/lib/esm/setup.mjs +1 -1
  654. package/dist/lib/esm/strict-proxy.d.mts +2 -2
  655. package/dist/lib/esm/strict-proxy.mjs +20 -20
  656. package/dist/lib/esm/string.d.mts +60 -60
  657. package/dist/lib/esm/string.mjs +80 -79
  658. package/dist/lib/esm/transformers/map-transformer.mjs +2 -2
  659. package/dist/lib/esm/transformers/set-transformer.mjs +2 -2
  660. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +2 -2
  661. package/dist/lib/esm/type-guards.d.mts +6 -6
  662. package/dist/lib/esm/type-guards.mjs +6 -6
  663. package/dist/lib/esm/type.d.mts +2 -2
  664. package/dist/lib/esm/type.mjs +3 -3
  665. package/dist/lib/esm/url.d.mts +4 -4
  666. package/dist/lib/esm/url.mjs +8 -8
  667. package/dist/lib/esm/value-provider.d.mts +6 -6
  668. package/dist/lib/esm/value-provider.mjs +5 -5
  669. package/obsidian/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  670. package/obsidian/notebook-navigator/package.json +6 -0
  671. package/package.json +17 -33
  672. package/script-utils/linters/markdownlint-ignores/package.json +6 -0
@@ -22,7 +22,7 @@ export interface AddUpdatedFilesToGitOptions {
22
22
  /**
23
23
  * The result of parsing the command-line arguments for a version update.
24
24
  */
25
- export interface ParsedVersionArgs {
25
+ export interface ParsedVersionArguments {
26
26
  /**
27
27
  * The {@link UpdateVersionOptions} parsed from the flags.
28
28
  */
@@ -162,20 +162,6 @@ export declare function addGitTag(newVersion: string): Promise<void>;
162
162
  * @returns A {@link Promise} that resolves when the files have been added and committed.
163
163
  */
164
164
  export declare function addUpdatedFilesToGit(newVersion: string, options?: AddUpdatedFilesToGitOptions): Promise<void>;
165
- /**
166
- * Wraps any bare `http(s)://` URL in the given text in angle brackets (`<url>`) so that text emitted
167
- * into a Markdown document (such as a generated changelog bullet) passes markdownlint's
168
- * `MD034/no-bare-urls` rule while still rendering as a clickable autolink on GitHub.
169
- *
170
- * URLs that are already wrapped in angle brackets (`<url>`) or that form the target of a Markdown
171
- * link (`[text](url)`) are left untouched, so the function is safe to run repeatedly. Trailing
172
- * sentence punctuation (`.`, `,`, `;`, `:`, `!`, `?`) is kept outside the angle brackets so it does
173
- * not become part of the link.
174
- *
175
- * @param text - The text possibly containing bare URLs.
176
- * @returns The text with every bare URL wrapped in angle brackets.
177
- */
178
- export declare function autolinkBareUrls(text: string): string;
179
165
  /**
180
166
  * Checks if the GitHub CLI is installed on the system.
181
167
  *
@@ -183,7 +169,7 @@ export declare function autolinkBareUrls(text: string): string;
183
169
  *
184
170
  * @throws Error if the GitHub CLI is not installed.
185
171
  */
186
- export declare function checkGitHubCliInstalled(): Promise<void>;
172
+ export declare function assertGitHubCliInstalled(): Promise<void>;
187
173
  /**
188
174
  * Checks if Git is installed on the system.
189
175
  *
@@ -191,7 +177,7 @@ export declare function checkGitHubCliInstalled(): Promise<void>;
191
177
  *
192
178
  * @throws Error if Git is not installed.
193
179
  */
194
- export declare function checkGitInstalled(): Promise<void>;
180
+ export declare function assertGitInstalled(): Promise<void>;
195
181
  /**
196
182
  * Checks if the Git repository is clean, meaning there are no uncommitted changes.
197
183
  *
@@ -199,7 +185,21 @@ export declare function checkGitInstalled(): Promise<void>;
199
185
  *
200
186
  * @throws Error if the Git repository is not clean.
201
187
  */
202
- export declare function checkGitRepoClean(): Promise<void>;
188
+ export declare function assertGitRepoClean(): Promise<void>;
189
+ /**
190
+ * Wraps any bare `http(s)://` URL in the given text in angle brackets (`<url>`) so that text emitted
191
+ * into a Markdown document (such as a generated changelog bullet) passes markdownlint's
192
+ * `MD034/no-bare-urls` rule while still rendering as a clickable autolink on GitHub.
193
+ *
194
+ * URLs that are already wrapped in angle brackets (`<url>`) or that form the target of a Markdown
195
+ * link (`[text](url)`) are left untouched, so the function is safe to run repeatedly. Trailing
196
+ * sentence punctuation (`.`, `,`, `;`, `:`, `!`, `?`) is kept outside the angle brackets so it does
197
+ * not become part of the link.
198
+ *
199
+ * @param text - The text possibly containing bare URLs.
200
+ * @returns The text with every bare URL wrapped in angle brackets.
201
+ */
202
+ export declare function autolinkBareUrls(text: string): string;
203
203
  /**
204
204
  * Copies the updated manifest file to the distribution build folder.
205
205
  *
@@ -250,10 +250,10 @@ export declare function gitPush(): Promise<void>;
250
250
  * - `--no-demo-vault` — skip archiving the plugin's demo vault (`demo-vault/`) as a release artifact.
251
251
  * - `--no-release` — run all local steps but skip the push and the GitHub release.
252
252
  *
253
- * @param args - The command-line arguments to parse (typically `process.argv.slice(2)`).
254
- * @returns The {@link ParsedVersionArgs} containing the version update type and the options.
253
+ * @param $arguments - The command-line arguments to parse (typically `process.argv.slice(2)`).
254
+ * @returns The {@link ParsedVersionArguments} containing the version update type and the options.
255
255
  */
256
- export declare function parseVersionArgs(args: string[]): ParsedVersionArgs;
256
+ export declare function parseVersionArguments($arguments: string[]): ParsedVersionArguments;
257
257
  /**
258
258
  * Publishes a GitHub release for the new version.
259
259
  *
@@ -80,14 +80,14 @@ async function addGitTag(newVersion) {
80
80
  async function addUpdatedFilesToGit(newVersion, options = {}) {
81
81
  const { shouldVerifyCommit = true } = options;
82
82
  const versionDebugger = getLibDebugger("Version");
83
- const commitArgs = ["git", "commit", "-m", `chore: release ${newVersion}`, "--allow-empty"];
83
+ const commitArguments = ["git", "commit", "-m", `chore: release ${newVersion}`, "--allow-empty"];
84
84
  if (!shouldVerifyCommit) {
85
- commitArgs.push("--no-verify");
85
+ commitArguments.push("--no-verify");
86
86
  }
87
87
  for (; ; ) {
88
88
  try {
89
89
  await execFromRoot(["git", "add", "--all"], { isQuiet: true });
90
- await execFromRoot(commitArgs, { isQuiet: true });
90
+ await execFromRoot(commitArguments, { isQuiet: true });
91
91
  return;
92
92
  } catch (error) {
93
93
  if (!process.stdin.isTTY) {
@@ -102,28 +102,21 @@ Fix the issues (for example, add the missing word to cspell.json) and press Ente
102
102
  }
103
103
  }
104
104
  }
105
- function autolinkBareUrls(text) {
106
- return text.replace(/(?<![<[(])https?:\/\/[^\s<>)\]]+/g, (url) => {
107
- const trailingPunctuation = /[.,;:!?]+$/.exec(url)?.[0] ?? "";
108
- const bareUrl = url.slice(0, url.length - trailingPunctuation.length);
109
- return `<${bareUrl}>${trailingPunctuation}`;
110
- });
111
- }
112
- async function checkGitHubCliInstalled() {
105
+ async function assertGitHubCliInstalled() {
113
106
  try {
114
107
  await execFromRoot("gh --version", { isQuiet: true });
115
108
  } catch {
116
109
  throw new Error("GitHub CLI is not installed. Please install it from https://cli.github.com/");
117
110
  }
118
111
  }
119
- async function checkGitInstalled() {
112
+ async function assertGitInstalled() {
120
113
  try {
121
114
  await execFromRoot("git --version", { isQuiet: true });
122
115
  } catch {
123
116
  throw new Error("Git is not installed. Please install it from https://git-scm.com/");
124
117
  }
125
118
  }
126
- async function checkGitRepoClean() {
119
+ async function assertGitRepoClean() {
127
120
  try {
128
121
  const stdout = await execFromRoot("git status --porcelain --untracked-files=all", { isQuiet: true });
129
122
  if (stdout) {
@@ -133,6 +126,13 @@ async function checkGitRepoClean() {
133
126
  throw new Error("Git repository is not clean. Please commit or stash your changes before releasing a new version.");
134
127
  }
135
128
  }
129
+ function autolinkBareUrls(text) {
130
+ return text.replaceAll(/(?<![<[(])https?:\/\/[^\s<>)\]]+/g, (url) => {
131
+ const trailingPunctuation = /[.,;:!?]+$/.exec(url)?.[0] ?? "";
132
+ const bareUrl = url.slice(0, url.length - trailingPunctuation.length);
133
+ return `<${bareUrl}>${trailingPunctuation}`;
134
+ });
135
+ }
136
136
  async function copyUpdatedManifest() {
137
137
  await cp(
138
138
  resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ManifestJson }),
@@ -157,9 +157,9 @@ async function getReleaseNotes(newVersion) {
157
157
  const changelogPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ChangelogMd });
158
158
  const content = await readFile(changelogPath, "utf-8");
159
159
  const newVersionEscaped = replaceAll({
160
- replacer: "\\.",
161
- searchValue: ".",
162
- str: newVersion
160
+ $string: newVersion,
161
+ replacer: String.raw`\.`,
162
+ searchValue: "."
163
163
  });
164
164
  const match = new RegExp(`
165
165
  ## ${newVersionEscaped}
@@ -171,15 +171,11 @@ async function getReleaseNotes(newVersion) {
171
171
  let releaseNotes = match?.[1] ? `${match[1]}
172
172
 
173
173
  ` : "";
174
- const tags = (await execFromRoot("git tag --sort=-creatordate", { isQuiet: true })).split(/\r?\n/);
174
+ const tagOutput = await execFromRoot("git tag --sort=-creatordate", { isQuiet: true });
175
+ const tags = tagOutput.split(/\r?\n/);
175
176
  const previousVersion = tags[1];
176
- let changesUrl;
177
177
  const repoUrl = await execFromRoot("gh repo view --json url -q .url", { isQuiet: true });
178
- if (previousVersion) {
179
- changesUrl = `${repoUrl}/compare/${previousVersion}...${newVersion}`;
180
- } else {
181
- changesUrl = `${repoUrl}/commits/${newVersion}`;
182
- }
178
+ const changesUrl = previousVersion ? `${repoUrl}/compare/${previousVersion}...${newVersion}` : `${repoUrl}/commits/${newVersion}`;
183
179
  releaseNotes += `**Full Changelog**: ${changesUrl}`;
184
180
  return releaseNotes;
185
181
  }
@@ -192,22 +188,25 @@ function getVersionUpdateType(versionUpdateType) {
192
188
  case "premajor" /* PreMajor */:
193
189
  case "preminor" /* PreMinor */:
194
190
  case "prepatch" /* PrePatch */:
195
- case "prerelease" /* PreRelease */:
191
+ case "prerelease" /* PreRelease */: {
196
192
  return versionUpdateTypeEnum;
197
- default:
193
+ }
194
+ default: {
198
195
  if (/^\d+\.\d+\.\d+(?:-[\w\d.-]+)?$/.test(versionUpdateType)) {
199
196
  return "manual" /* Manual */;
200
197
  }
201
198
  return "invalid" /* Invalid */;
199
+ }
202
200
  }
203
201
  }
204
202
  async function gitPush() {
205
203
  await execFromRoot("git push --follow-tags --force", { isQuiet: true });
206
204
  }
207
- function parseVersionArgs(args) {
205
+ function parseVersionArguments($arguments) {
208
206
  const { positionals, values } = parseArgs({
209
207
  allowPositionals: true,
210
- args,
208
+ // eslint-disable-next-line unicorn/name-replacements -- `args` is the option name Node's `parseArgs` reads.
209
+ args: $arguments,
211
210
  options: {
212
211
  "no-build": { type: "boolean" },
213
212
  "no-changelog-editing": { type: "boolean" },
@@ -280,13 +279,13 @@ async function updateChangelog(newVersion, options = {}) {
280
279
  previousChangelogLines = [];
281
280
  }
282
281
  const lastTag = replaceAll({
282
+ $string: previousChangelogLines[0] ?? "",
283
283
  replacer: "",
284
- searchValue: "## ",
285
- str: previousChangelogLines[0] ?? ""
284
+ searchValue: "## "
286
285
  });
287
286
  const commitRange = lastTag ? `${lastTag}..HEAD` : "HEAD";
288
- const commitMessagesStr = await execFromRoot(`git log ${commitRange} --format=%B --first-parent -z`, { isQuiet: true });
289
- const commitMessages = commitMessagesStr.split("\0").filter(Boolean).map(toFirstLine);
287
+ const commitMessagesString = await execFromRoot(`git log ${commitRange} --format=%B --first-parent -z`, { isQuiet: true });
288
+ const commitMessages = commitMessagesString.split("\0").filter(Boolean).map((commitMessage) => toFirstLine(commitMessage));
290
289
  let newChangeLog = `# CHANGELOG
291
290
 
292
291
  ## ${newVersion}
@@ -345,12 +344,16 @@ async function updateVersion(versionUpdateType, options = {}) {
345
344
  }
346
345
  throw new Error("No version update type provided");
347
346
  }
348
- const isObsidianPlugin = existsSync(resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ManifestJson })) && (await readPackageJson()).name !== "obsidian-dev-utils";
347
+ let isObsidianPlugin = false;
348
+ if (existsSync(resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ManifestJson }))) {
349
+ const packageJson = await readPackageJson();
350
+ isObsidianPlugin = packageJson.name !== "obsidian-dev-utils";
351
+ }
349
352
  validate(versionUpdateType);
350
- await checkGitInstalled();
351
- await checkGitHubCliInstalled();
353
+ await assertGitInstalled();
354
+ await assertGitHubCliInstalled();
352
355
  if (shouldRunChecks) {
353
- await checkGitRepoClean();
356
+ await assertGitRepoClean();
354
357
  await npmRun("format:check");
355
358
  await npmRun("spellcheck");
356
359
  await npmRun("lint:md");
@@ -413,8 +416,8 @@ async function getLatestObsidianVersion() {
413
416
  function isPreRelease(version) {
414
417
  return prerelease(version) !== null;
415
418
  }
416
- function toFirstLine(str) {
417
- return str.split(/\r?\n/).filter(Boolean).slice(0, 1).join("");
419
+ function toFirstLine($string) {
420
+ return $string.split(/\r?\n/).filter(Boolean).slice(0, 1).join("");
418
421
  }
419
422
  async function updateVersionInFilesForPlugin(newVersion) {
420
423
  const manifestBetaJsonPath = resolvePathFromRootSafe({ path: ObsidianPluginRepoPaths.ManifestBetaJson });
@@ -425,7 +428,7 @@ async function updateVersionInFilesForPlugin(newVersion) {
425
428
  { force: true }
426
429
  );
427
430
  await editJson({
428
- editFn: (manifest) => {
431
+ editFunction: (manifest) => {
429
432
  manifest.version = newVersion;
430
433
  },
431
434
  path: ObsidianPluginRepoPaths.ManifestBetaJson
@@ -433,14 +436,14 @@ async function updateVersionInFilesForPlugin(newVersion) {
433
436
  } else {
434
437
  const latestObsidianVersion = await getLatestObsidianVersion();
435
438
  await editJson({
436
- editFn: (manifest) => {
439
+ editFunction: (manifest) => {
437
440
  manifest.minAppVersion = latestObsidianVersion;
438
441
  manifest.version = newVersion;
439
442
  },
440
443
  path: ObsidianPluginRepoPaths.ManifestJson
441
444
  });
442
445
  await editJson({
443
- editFn: (versions) => {
446
+ editFunction: (versions) => {
444
447
  versions[newVersion] = latestObsidianVersion;
445
448
  },
446
449
  path: ObsidianPluginRepoPaths.VersionsJson
@@ -455,20 +458,20 @@ export {
455
458
  VersionUpdateType,
456
459
  addGitTag,
457
460
  addUpdatedFilesToGit,
461
+ assertGitHubCliInstalled,
462
+ assertGitInstalled,
463
+ assertGitRepoClean,
458
464
  autolinkBareUrls,
459
- checkGitHubCliInstalled,
460
- checkGitInstalled,
461
- checkGitRepoClean,
462
465
  copyUpdatedManifest,
463
466
  getNewVersion,
464
467
  getReleaseNotes,
465
468
  getVersionUpdateType,
466
469
  gitPush,
467
- parseVersionArgs,
470
+ parseVersionArguments,
468
471
  publishGitHubRelease,
469
472
  updateChangelog,
470
473
  updateVersion,
471
474
  updateVersionInFiles,
472
475
  validate
473
476
  };
474
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHByZXJlbGVhc2Vcbn0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlTG9ja0pzb24gfSBmcm9tICcuL25wbS50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4uL2Vycm9yLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQgfSBmcm9tICcuL2RlbW8tdmF1bHQudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyBlZGl0SnNvbiB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQge1xuICBucG1SdW4sXG4gIG5wbVJ1bk9wdGlvbmFsXG59IGZyb20gJy4vbnBtLXJ1bi50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYWRkVXBkYXRlZEZpbGVzVG9HaXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgcHJlLWNvbW1pdCBob29rIHdoZW4gY3JlYXRpbmcgdGhlIHJlbGVhc2UgY29tbWl0LiBXaGVuIGBmYWxzZWAsIGAtLW5vLXZlcmlmeWBcbiAgICogaXMgcGFzc2VkIHRvIHRoZSByZWxlYXNlIGNvbW1pdCB0byBza2lwIHRoZSBob29rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZlcmlmeUNvbW1pdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBhIHZlcnNpb24gdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFZlcnNpb25BcmdzIHtcbiAgLyoqXG4gICAqIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IHBhcnNlZCBmcm9tIHRoZSBmbGFncy5cbiAgICovXG4gIHJlYWRvbmx5IG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9zaXRpb25hbCB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFyZ3VtZW50LCBvciBgdW5kZWZpbmVkYCBpZiBub25lIHdhcyBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZUNoYW5nZWxvZ30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQ2hhbmdlbG9nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LiBXaGVuIGBmYWxzZWAsXG4gICAqIHRoZSBjaGFuZ2Vsb2cgaXMgc3RpbGwgZ2VuZXJhdGVkIGZyb20gY29tbWl0IG1lc3NhZ2VzLCBidXQgaXQgaXMgbm90IG9wZW5lZCBpbiB0aGUgZWRpdG9yIGZvclxuICAgKiBtYW51YWwgcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayB1cGRhdGVWZXJzaW9ufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVWZXJzaW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByZXBhcmUgdGhlIEdpdEh1YiByZWxlYXNlLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSByZWxlYXNlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIEdpdEh1YiByZWxlYXNlIGhhcyBiZWVuIHByZXBhcmVkLlxuICAgKi9cbiAgcHJlcGFyZUdpdEh1YlJlbGVhc2U/KHRoaXM6IHZvaWQsIG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYXJjaGl2ZSB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCBpbiB0aGUgcmVwbyByb290KSBhcyBhIHJlbGVhc2VcbiAgICogYXJ0aWZhY3QuIE9ubHkgYXBwbGllcyB0byBPYnNpZGlhbiBwbHVnaW5zOyBpZ25vcmVkIHdoZW4gdGhlIHJlcG8gaGFzIG5vIGBkZW1vLXZhdWx0L2AgZm9sZGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEFyY2hpdmVEZW1vVmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgYnVpbGQgc3RlcC4gVGhlIGJ1aWxkIGlzIGEgcHVibGlzaGluZyBwcmVyZXF1aXNpdGUsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjayxcbiAgICogc28gaXQgaXMgZ292ZXJuZWQgYnkgdGhpcyBmbGFnIGluZGVwZW5kZW50bHkgb2Yge0BsaW5rIHNob3VsZFJ1bkNoZWNrc30gXHUyMDE0IGl0IHJ1bnMgZXZlbiB3aGVuIHRoZVxuICAgKiBjaGVja3MgYXJlIHNraXBwZWQsIHNvIGEgZmFzdCByZWxlYXNlIHN0aWxsIHNoaXBzIGZyZXNoIGFydGlmYWN0cy4gU2V0IHRvIGBmYWxzZWAgb25seSB3aGVuIHRoZVxuICAgKiBidWlsZCBvdXRwdXQgaXMga25vd24gdG8gYWxyZWFkeSBtYXRjaCB0aGUgY3VycmVudCBjb2RlOyBvdGhlcndpc2UgdGhlIHJlbGVhc2Ugd291bGQgcHVibGlzaFxuICAgKiBzdGFsZSBhcnRpZmFjdHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG9wZW4gdGhlIGdlbmVyYXRlZCBjaGFuZ2Vsb2cgaW4gdGhlIGVkaXRvciBmb3IgYW4gaW50ZXJhY3RpdmUgcmV2aWV3LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRDaGFuZ2Vsb2c/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHB1Ymxpc2ggdGhlIHJlbGVhc2UuIFdoZW4gYGZhbHNlYCwgYWxsIGxvY2FsIHN0ZXBzIGFyZSBleGVjdXRlZCAodmVyc2lvbiBidW1wLFxuICAgKiBjaGFuZ2Vsb2csIGNvbW1pdCwgdGFnKSwgYnV0IHRoZSBjaGFuZ2VzIGFyZSBub3QgcHVzaGVkIGFuZCBubyBHaXRIdWIgcmVsZWFzZSBpcyBwdWJsaXNoZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmVmbGlnaHQgdmVyaWZpY2F0aW9uIGNoZWNrcyAoY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LFxuICAgKiBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMpLiBUaGUgYnVpbGQgc3RlcCBpcyBub3Qgb25lIG9mIHRoZXNlIGNoZWNrcyBcdTIwMTQgaXQgaXMgZ292ZXJuZWRcbiAgICogc2VwYXJhdGVseSBieSB7QGxpbmsgc2hvdWxkQnVpbGR9LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFJ1bkNoZWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBwcmUtY29tbWl0IGhvb2sgd2hlbiBjcmVhdGluZyB0aGUgcmVsZWFzZSBjb21taXQuIFdoZW4gYGZhbHNlYCwgYC0tbm8tdmVyaWZ5YFxuICAgKiBpcyBwYXNzZWQgdG8gdGhlIHJlbGVhc2UgY29tbWl0IHRvIHNraXAgdGhlIGhvb2suXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmVyaWZ5Q29tbWl0PzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIE5wbVBhY2tSZXN1bHQge1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByZS1yZWxlYXNlIGlkZW50aWZpZXIgdXNlZCBmb3IgcHJlLXJlbGVhc2UgdmVyc2lvbnMuXG4gKi9cbmNvbnN0IERFRkFVTFRfUFJFSUQgPSAnYmV0YSc7XG5cbi8qKlxuICogRW51bSByZXByZXNlbnRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIHZlcnNpb24gdXBkYXRlcy5cbiAqXG4gKiBBbGlnbnMgd2l0aCBucG0ncyBgbnBtIHZlcnNpb25gIGluY3JlbWVudCB0eXBlcyBwbHVzIGBNYW51YWxgIGZvciBleHBsaWNpdCB2ZXJzaW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gVmVyc2lvblVwZGF0ZVR5cGUge1xuICBJbnZhbGlkID0gJ2ludmFsaWQnLFxuICBNYWpvciA9ICdtYWpvcicsXG4gIE1hbnVhbCA9ICdtYW51YWwnLFxuICBNaW5vciA9ICdtaW5vcicsXG4gIFBhdGNoID0gJ3BhdGNoJyxcbiAgUHJlTWFqb3IgPSAncHJlbWFqb3InLFxuICBQcmVNaW5vciA9ICdwcmVtaW5vcicsXG4gIFByZVBhdGNoID0gJ3ByZXBhdGNoJyxcbiAgUHJlUmVsZWFzZSA9ICdwcmVyZWxlYXNlJ1xufVxuXG4vKipcbiAqIFR5cGUgcmVwcmVzZW50aW5nIHRoZSBtYW5pZmVzdCBmaWxlIGZvcm1hdCBmb3IgT2JzaWRpYW4gcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdCB7XG4gIC8qKlxuICAgKiBBIG1pbmltdW0gT2JzaWRpYW4gdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhlIHBsdWdpbi5cbiAgICovXG4gIG1pbkFwcFZlcnNpb246IHN0cmluZztcblxuICAvKipcbiAgICogQSB2ZXJzaW9uIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSBvZiBPYnNpZGlhbiByZWxlYXNlcyBKU09OLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUmVsZWFzZXNKc29uIHtcbiAgLyoqXG4gICAqIEEgbmFtZSBvZiB0aGUgT2JzaWRpYW4gcmVsZWFzZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgR2l0IHRhZyBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB0byB1c2UgZm9yIHRoZSB0YWcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHRhZyBoYXMgYmVlbiBjcmVhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkR2l0VGFnKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoYGdpdCB0YWcgLWEgJHtuZXdWZXJzaW9ufSAtbSAke25ld1ZlcnNpb259IC0tZm9yY2VgLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogQWRkcyB1cGRhdGVkIGZpbGVzIHRvIHRoZSBHaXQgc3RhZ2luZyBhcmVhIGFuZCBjb21taXRzIHRoZW0gd2l0aCB0aGUgbmV3IHZlcnNpb24gbWVzc2FnZS5cbiAqXG4gKiBJZiB0aGUgY29tbWl0IGZhaWxzIChmb3IgZXhhbXBsZSwgdGhlIHByZS1jb21taXQgaG9vayByZWplY3RzIGEgbmV3IHdvcmQgaW4gdGhlIGNoYW5nZWxvZykgYW5kIHRoZVxuICogcHJvY2VzcyBpcyBhdHRhY2hlZCB0byBhbiBpbnRlcmFjdGl2ZSB0ZXJtaW5hbCwgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gZml4IHRoZSBpc3N1ZSAoZm9yIGV4YW1wbGUsXG4gKiBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBgY3NwZWxsLmpzb25gKSBhbmQgcHJlc3MgRW50ZXIgdG8gcmV0cnkuIFRoZSByZXRyeSByZS1zdGFnZXMgYWxsIGZpbGVzLCBzbyB0aGVcbiAqIGZpeCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSB3aG9sZSByZWxlYXNlIGxpZmVjeWNsZS4gSW4gYSBub24taW50ZXJhY3RpdmUgZW52aXJvbm1lbnQgKG5vXG4gKiBUVFksIHN1Y2ggYXMgQ0kpLCB0aGUgZXJyb3IgaXMgcmUtdGhyb3duIGluc3RlYWQgb2YgcHJvbXB0aW5nLCBzbyB0aGUgc2NyaXB0IGZhaWxzIGZhc3QgcmF0aGVyIHRoYW5cbiAqIGhhbmdpbmcuIFBhc3MgYHNob3VsZFZlcmlmeUNvbW1pdDogZmFsc2VgIHRvIHNraXAgdGhlIHByZS1jb21taXQgaG9vayBlbnRpcmVseSBpbiBzdWNoIGNhc2VzLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciB1c2VkIGFzIHRoZSBjb21taXQgbWVzc2FnZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSBjb21taXQgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBhbmQgY29tbWl0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBBZGRVcGRhdGVkRmlsZXNUb0dpdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHZlcnNpb25EZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJyk7XG5cbiAgY29uc3QgY29tbWl0QXJncyA9IFsnZ2l0JywgJ2NvbW1pdCcsICctbScsIGBjaG9yZTogcmVsZWFzZSAke25ld1ZlcnNpb259YCwgJy0tYWxsb3ctZW1wdHknXTtcbiAgaWYgKCFzaG91bGRWZXJpZnlDb21taXQpIHtcbiAgICBjb21taXRBcmdzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3MsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKCFwcm9jZXNzLnN0ZGluLmlzVFRZKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uRGVidWdnZXIoXG4gICAgICAgIGBGYWlsZWQgdG8gY29tbWl0IHRoZSByZWxlYXNlLlxcbiR7ZXJyb3JUb1N0cmluZyhlcnJvcil9XFxuYFxuICAgICAgICAgICsgJ0ZpeCB0aGUgaXNzdWVzIChmb3IgZXhhbXBsZSwgYWRkIHRoZSBtaXNzaW5nIHdvcmQgdG8gY3NwZWxsLmpzb24pIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeSB0aGUgY29tbWl0LCBvciBDdHJsK0MgdG8gYWJvcnQuJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IGNyZWF0ZUludGVyZmFjZShwcm9jZXNzLnN0ZGluLCBwcm9jZXNzLnN0ZG91dCkucXVlc3Rpb24oJ1ByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQuLi4nKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2UoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrR2l0SHViQ2xpSW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggLS12ZXJzaW9uJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0dpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2NsaS5naXRodWIuY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIEdpdCBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgR2l0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKlxuICogQHRocm93cyBFcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrR2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0dpdFJlcG9DbGVhbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGRvdXQgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBzdGF0dXMgLS1wb3JjZWxhaW4gLS11bnRyYWNrZWQtZmlsZXM9YWxsJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChzdGRvdXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uIFBsZWFzZSBjb21taXQgb3Igc3Rhc2ggeW91ciBjaGFuZ2VzIGJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbi4nKTtcbiAgfVxufVxuXG4vKipcbiAqIENvcGllcyB0aGUgdXBkYXRlZCBtYW5pZmVzdCBmaWxlIHRvIHRoZSBkaXN0cmlidXRpb24gYnVpbGQgZm9sZGVyLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29weSBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5VXBkYXRlZE1hbmlmZXN0KCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBjcChcbiAgICByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KSxcbiAgICByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IGpvaW4oT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkLCBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24pIH0pLFxuICAgIHsgZm9yY2U6IHRydWUgfVxuICApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIG5ldyB2ZXJzaW9uIHN0cmluZyBiYXNlZCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uIGFuZCB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFVzZXMgdGhlIGBzZW12ZXJgIHBhY2thZ2UgdG8gY29tcHV0ZSB0aGUgbmV4dCB2ZXJzaW9uLCBzdXBwb3J0aW5nIGFsbCBucG0gaW5jcmVtZW50IHR5cGVzOlxuICogYG1ham9yYCwgYG1pbm9yYCwgYHBhdGNoYCwgYHByZW1ham9yYCwgYHByZW1pbm9yYCwgYHByZXBhdGNoYCwgYW5kIGBwcmVyZWxlYXNlYC5cbiAqIFByZS1yZWxlYXNlIHZlcnNpb25zIHVzZSB0aGUgYGJldGFgIGlkZW50aWZpZXIgYnkgZGVmYXVsdCAoZS5nLiwgYDEuMi40LWJldGEuMGApLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB0eXBlIG9mIHZlcnNpb24gdXBkYXRlIG9yIGFuIGV4cGxpY2l0IHZlcnNpb24gc3RyaW5nLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbmV3IHZlcnNpb24gc3RyaW5nLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgY3VycmVudCB2ZXJzaW9uIGlzIGludmFsaWQgb3IgdGhlIGluY3JlbWVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5ld1ZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHZlcnNpb25UeXBlID0gZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBpZiAodmVyc2lvblR5cGUgPT09IFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbCkge1xuICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gcGFja2FnZUpzb24udmVyc2lvbiA/PyAnJztcblxuICBjb25zdCByZWxlYXNlVHlwZSA9IHZlcnNpb25UeXBlIGFzIFJlbGVhc2VUeXBlO1xuICBjb25zdCBpc1ByZVJlbGVhc2VUeXBlID0gcmVsZWFzZVR5cGUuc3RhcnRzV2l0aCgncHJlJyk7XG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBpc1ByZVJlbGVhc2VUeXBlXG4gICAgPyBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlLCBERUZBVUxUX1BSRUlEKVxuICAgIDogaW5jKGN1cnJlbnRWZXJzaW9uLCByZWxlYXNlVHlwZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5ld1ZlcnNpb24sIGBGYWlsZWQgdG8gaW5jcmVtZW50IHZlcnNpb24gZnJvbSAnJHtjdXJyZW50VmVyc2lvbn0nIHdpdGggdHlwZSAnJHt2ZXJzaW9uVHlwZX0nYCk7XG5cbiAgcmV0dXJuIG5ld1ZlcnNpb247XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSByZWxlYXNlIG5vdGVzIGZvciBhIHNwZWNpZmljIHZlcnNpb24gZnJvbSB0aGUgY2hhbmdlbG9nLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSByZWxlYXNlIG5vdGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmVsZWFzZSBub3RlcyBmb3IgdGhlIHNwZWNpZmllZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVsZWFzZU5vdGVzKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNoYW5nZWxvZ1BhdGggPSByZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kIH0pO1xuICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gIGNvbnN0IG5ld1ZlcnNpb25Fc2NhcGVkID0gcmVwbGFjZUFsbCh7XG4gICAgcmVwbGFjZXI6ICdcXFxcLicsXG4gICAgc2VhcmNoVmFsdWU6ICcuJyxcbiAgICBzdHI6IG5ld1ZlcnNpb25cbiAgfSk7XG4gIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChgXFxuIyMgJHtuZXdWZXJzaW9uRXNjYXBlZH1cXG5cXG4oKC58XFxuKSs/KVxcblxcbiMjYCkuZXhlYyhjb250ZW50KTtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIHY4IHRyYWNrcyBvcHRpb25hbCBjaGFpbmluZyBhbmQgdGVybmFyeSBhcyBzZXBhcmF0ZSBicmFuY2hlczsgYm90aCBwYXRocyBhcmUgdGVzdGVkLiAqL1xuICBsZXQgcmVsZWFzZU5vdGVzID0gbWF0Y2g/LlsxXSA/IGAke21hdGNoWzFdfVxcblxcbmAgOiAnJztcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cblxuICBjb25zdCB0YWdzID0gKGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pKS5zcGxpdCgvXFxyP1xcbi8pO1xuICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSB0YWdzWzFdO1xuICBsZXQgY2hhbmdlc1VybDogc3RyaW5nO1xuXG4gIGNvbnN0IHJlcG9VcmwgPSBhd2FpdCBleGVjRnJvbVJvb3QoJ2doIHJlcG8gdmlldyAtLWpzb24gdXJsIC1xIC51cmwnLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG5cbiAgaWYgKHByZXZpb3VzVmVyc2lvbikge1xuICAgIGNoYW5nZXNVcmwgPSBgJHtyZXBvVXJsfS9jb21wYXJlLyR7cHJldmlvdXNWZXJzaW9ufS4uLiR7bmV3VmVyc2lvbn1gO1xuICB9IGVsc2Uge1xuICAgIGNoYW5nZXNVcmwgPSBgJHtyZXBvVXJsfS9jb21taXRzLyR7bmV3VmVyc2lvbn1gO1xuICB9XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCB2ZXJzaW9uVXBkYXRlVHlwZUVudW0gPSB2ZXJzaW9uVXBkYXRlVHlwZSBhcyBWZXJzaW9uVXBkYXRlVHlwZTtcbiAgc3dpdGNoICh2ZXJzaW9uVXBkYXRlVHlwZUVudW0pIHtcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2U6XG4gICAgICByZXR1cm4gdmVyc2lvblVwZGF0ZVR5cGVFbnVtO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGlmICgvXlxcZCtcXC5cXGQrXFwuXFxkKyg/Oi1bXFx3XFxkLi1dKyk/JC8udGVzdCh2ZXJzaW9uVXBkYXRlVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLk1hbnVhbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFZlcnNpb25VcGRhdGVUeXBlLkludmFsaWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gUmVjb2duaXplZCBmbGFnczpcbiAqIC0gYC0tbm8tYnVpbGRgIFx1MjAxNCBza2lwIHRoZSBidWlsZCBzdGVwIChvbmx5IHNhZmUgd2hlbiB0aGUgYnVpbGQgb3V0cHV0IGFscmVhZHkgbWF0Y2hlcyB0aGUgY3VycmVudCBjb2RlKS5cbiAqIC0gYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIFx1MjAxNCBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nIHdpdGhvdXQgb3BlbmluZyBpdCBmb3IgbWFudWFsIHJldmlldy5cbiAqIC0gYC0tbm8tY2hlY2tzYCBcdTIwMTQgc2tpcCB0aGUgY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LCBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMgKHRoZSBidWlsZCBzdGlsbCBydW5zKS5cbiAqIC0gYC0tbm8tY29tbWl0LXZlcmlmaWNhdGlvbmAgXHUyMDE0IHBhc3MgYC0tbm8tdmVyaWZ5YCB0byB0aGUgcmVsZWFzZSBjb21taXQsIHNraXBwaW5nIHRoZSBwcmUtY29tbWl0IGhvb2suXG4gKiAtIGAtLW5vLWRlbW8tdmF1bHRgIFx1MjAxNCBza2lwIGFyY2hpdmluZyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICogLSBgLS1uby1yZWxlYXNlYCBcdTIwMTQgcnVuIGFsbCBsb2NhbCBzdGVwcyBidXQgc2tpcCB0aGUgcHVzaCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgKHR5cGljYWxseSBgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpYCkuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIFBhcnNlZFZlcnNpb25BcmdzfSBjb250YWluaW5nIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIGFuZCB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbkFyZ3MoYXJnczogc3RyaW5nW10pOiBQYXJzZWRWZXJzaW9uQXJncyB7XG4gIGNvbnN0IHsgcG9zaXRpb25hbHMsIHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIGFyZ3MsXG4gICAgb3B0aW9uczoge1xuICAgICAgJ25vLWJ1aWxkJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jaGFuZ2Vsb2ctZWRpdGluZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jb21taXQtdmVyaWZpY2F0aW9uJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1kZW1vLXZhdWx0JzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0OiAhKHZhbHVlc1snbm8tZGVtby12YXVsdCddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZEJ1aWxkOiAhKHZhbHVlc1snbm8tYnVpbGQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFJ1bkNoZWNrczogISh2YWx1ZXNbJ25vLWNoZWNrcyddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgICB9LFxuICAgIHZlcnNpb25VcGRhdGVUeXBlOiBwb3NpdGlvbmFsc1swXVxuICB9O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgYSByZWxlYXNlIGFuZCB1cGxvYWRpbmcgZmlsZXMgZm9yIGVpdGhlciBhbiBPYnNpZGlhbiBwbHVnaW4gb3IgYW5vdGhlciBwcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gKiBAcGFyYW0gaXNPYnNpZGlhblBsdWdpbiAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBwcm9qZWN0IGlzIGFuIE9ic2lkaWFuIHBsdWdpbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVsZWFzZSBoYXMgYmVlbiBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uOiBzdHJpbmcsIGlzT2JzaWRpYW5QbHVnaW46IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZpbGVQYXRoczogc3RyaW5nW107XG5cbiAgaWYgKGlzT2JzaWRpYW5QbHVnaW4pIHtcbiAgICBjb25zdCBidWlsZEZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChidWlsZEZvbGRlcik7XG4gICAgZmlsZVBhdGhzID0gZmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGpvaW4oYnVpbGRGb2xkZXIsIGZpbGVOYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgaW5kZXggPSByZXN1bHRPdXRwdXQuaW5kZXhPZignW1xcbiAgeycpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBKU09OIGFycmF5IGluIHRoZSByZXN1bHQgb3V0cHV0Jyk7XG4gICAgfVxuICAgIHJlc3VsdE91dHB1dCA9IHJlc3VsdE91dHB1dC5zbGljZShpbmRleCk7XG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHRPdXRwdXQpIGFzIFtOcG1QYWNrUmVzdWx0XTtcbiAgICBmaWxlUGF0aHMgPSBbXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgcmVzdWx0WzBdLmZpbGVuYW1lKSxcbiAgICAgIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgICBdO1xuICB9XG5cbiAgZmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBmaWxlUGF0aCB9KSkpO1xuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbXG4gICAgJ2doJyxcbiAgICAncmVsZWFzZScsXG4gICAgJ2NyZWF0ZScsXG4gICAgbmV3VmVyc2lvbixcbiAgICAuLi5maWxlUGF0aHMsXG4gICAgJy0tdGl0bGUnLFxuICAgIGB2JHtuZXdWZXJzaW9ufWAsXG4gICAgLi4uKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSA/IFsnLS1wcmVyZWxlYXNlJ10gOiBbXSksXG4gICAgJy0tbm90ZXMtZmlsZScsXG4gICAgJy0nXG4gIF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHN0ZGluOiBhd2FpdCBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbilcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhbmdlbG9nIGZpbGUgd2l0aCBuZXcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWl0IG1lc3NhZ2VzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbmdlbG9nLCBhcHBlbmRzIG5ldyBlbnRyaWVzIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24sXG4gKiBhbmQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2Vsb2cuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNoYW5nZWxvZyByZXZpZXcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoYW5nZWxvZyB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgSEVBREVSX0xJTkVTX0NPVU5UID0gMjtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGxldCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXTtcbiAgaWYgKGV4aXN0c1N5bmMoY2hhbmdlbG9nUGF0aCkpIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpLnNsaWNlKEhFQURFUl9MSU5FU19DT1VOVCk7XG4gICAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IFtdO1xuICB9XG5cbiAgY29uc3QgbGFzdFRhZyA9IHJlcGxhY2VBbGwoe1xuICAgIHJlcGxhY2VyOiAnJyxcbiAgICBzZWFyY2hWYWx1ZTogJyMjICcsXG4gICAgc3RyOiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzWzBdID8/ICcnXG4gIH0pO1xuICBjb25zdCBjb21taXRSYW5nZSA9IGxhc3RUYWcgPyBgJHtsYXN0VGFnfS4uSEVBRGAgOiAnSEVBRCc7XG4gIGNvbnN0IGNvbW1pdE1lc3NhZ2VzU3RyID0gYXdhaXQgZXhlY0Zyb21Sb290KGBnaXQgbG9nICR7Y29tbWl0UmFuZ2V9IC0tZm9ybWF0PSVCIC0tZmlyc3QtcGFyZW50IC16YCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCBjb21taXRNZXNzYWdlcyA9IGNvbW1pdE1lc3NhZ2VzU3RyLnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubWFwKHRvRmlyc3RMaW5lKTtcblxuICBsZXQgbmV3Q2hhbmdlTG9nID0gYCMgQ0hBTkdFTE9HXFxuXFxuIyMgJHtuZXdWZXJzaW9ufVxcblxcbmA7XG5cbiAgZm9yIChjb25zdCBtZXNzYWdlIG9mIGNvbW1pdE1lc3NhZ2VzKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9IGAtICR7YXV0b2xpbmtCYXJlVXJscyhtZXNzYWdlKX1cXG5gO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMubGVuZ3RoID4gMCkge1xuICAgIG5ld0NoYW5nZUxvZyArPSAnXFxuJztcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcykge1xuICAgICAgbmV3Q2hhbmdlTG9nICs9IGAke2xpbmV9XFxuYDtcbiAgICB9XG4gIH1cblxuICBhd2FpdCB3cml0ZUZpbGUoY2hhbmdlbG9nUGF0aCwgbmV3Q2hhbmdlTG9nLCAndXRmLTgnKTtcblxuICBpZiAoIXNob3VsZEVkaXRDaGFuZ2Vsb2cpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb2RlVmVyc2lvbiA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnY29kZSAtLXZlcnNpb24nLCB7XG4gICAgaXNRdWlldDogdHJ1ZSxcbiAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICB9KTtcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcbiAgaWYgKGNvZGVWZXJzaW9uKSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBDbG9zZSBWaXN1YWwgU3R1ZGlvIENvZGUgd2hlbiB5b3UgYXJlIGRvbmUuLi5gKTtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydjb2RlJywgJy13JywgY2hhbmdlbG9nUGF0aF0sIHtcbiAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICBzaG91bGRJZ25vcmVFeGl0Q29kZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHZlcnNpb25EZWJ1Z2dlcignQ291bGQgbm90IGZpbmQgVmlzdWFsIFN0dWRpbyBDb2RlIGluIHlvdXIgUEFUSC4gVXNpbmcgY29uc29sZSBtb2RlIGluc3RlYWQuJyk7XG4gICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbihcbiAgICAgIGBQbGVhc2UgdXBkYXRlIHRoZSAke09ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLkNoYW5nZWxvZ01kfSBmaWxlLiBQcmVzcyBFbnRlciB3aGVuIHlvdSBhcmUgZG9uZS4uLmBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvamVjdCBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHVwZGF0ZSB0eXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBzZXJpZXMgb2YgdGFza3MgdG8gaGFuZGxlIHZlcnNpb24gdXBkYXRlczpcbiAqIDEuIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIDIuIENoZWNrcyBpZiBHaXQgYW5kIEdpdEh1YiBDTEkgYXJlIGluc3RhbGxlZC5cbiAqIDMuIFZlcmlmaWVzIHRoYXQgdGhlIEdpdCByZXBvc2l0b3J5IGlzIGNsZWFuLlxuICogNC4gUnVucyBzcGVsbGNoZWNrIGFuZCBsaW50aW5nLlxuICogNS4gQnVpbGRzIHRoZSBwcm9qZWN0LlxuICogNi4gVXBkYXRlcyB2ZXJzaW9uIGluIGZpbGVzIGFuZCBjaGFuZ2Vsb2cuXG4gKiA3LiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gR2l0LCB0YWdzIHRoZSBjb21taXQsIGFuZCBwdXNoZXMgdG8gdGhlIHJlcG9zaXRvcnkuXG4gKiA4LiBJZiBhbiBPYnNpZGlhbiBwbHVnaW4sIGNvcGllcyB0aGUgdXBkYXRlZCBtYW5pZmVzdCBhbmQgcHVibGlzaGVzIGEgR2l0SHViIHJlbGVhc2UuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgdG8gcGVyZm9ybSAobWFqb3IsIG1pbm9yLCBwYXRjaCwgcHJlbWFqb3IsIHByZW1pbm9yLCBwcmVwYXRjaCwgcHJlcmVsZWFzZSwgb3IgeC55LnpbLXN1ZmZpeF0pLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIFVwZGF0ZVZlcnNpb25PcHRpb25zfSBjb250cm9sbGluZyB0aGUgcmVsZWFzZSBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdmVyc2lvbiB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlPzogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVWZXJzaW9uT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBwcmVwYXJlR2l0SHViUmVsZWFzZSxcbiAgICBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0ID0gdHJ1ZSxcbiAgICBzaG91bGRCdWlsZCA9IHRydWUsXG4gICAgc2hvdWxkRWRpdENoYW5nZWxvZyA9IHRydWUsXG4gICAgc2hvdWxkUmVsZWFzZSA9IHRydWUsXG4gICAgc2hvdWxkUnVuQ2hlY2tzID0gdHJ1ZSxcbiAgICBzaG91bGRWZXJpZnlDb21taXQgPSB0cnVlXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmICghdmVyc2lvblVwZGF0ZVR5cGUpIHtcbiAgICBjb25zdCBucG1PbGRWZXJzaW9uID0gcHJvY2Vzcy5lbnZbJ25wbV9vbGRfdmVyc2lvbiddO1xuICAgIGNvbnN0IG5wbU5ld1ZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX25ld192ZXJzaW9uJ107XG5cbiAgICBpZiAobnBtT2xkVmVyc2lvbiAmJiBucG1OZXdWZXJzaW9uKSB7XG4gICAgICBhd2FpdCB1cGRhdGVWZXJzaW9uSW5GaWxlcyhucG1PbGRWZXJzaW9uKTtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb24obnBtTmV3VmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHByb3ZpZGVkJyk7XG4gIH1cblxuICBjb25zdCBpc09ic2lkaWFuUGx1Z2luID0gZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbiB9KSkgJiYgKGF3YWl0IHJlYWRQYWNrYWdlSnNvbigpKS5uYW1lICE9PSAnb2JzaWRpYW4tZGV2LXV0aWxzJztcblxuICB2YWxpZGF0ZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IGNoZWNrR2l0SW5zdGFsbGVkKCk7XG4gIGF3YWl0IGNoZWNrR2l0SHViQ2xpSW5zdGFsbGVkKCk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGNoZWNrR2l0UmVwb0NsZWFuKCk7XG4gICAgYXdhaXQgbnBtUnVuKCdmb3JtYXQ6Y2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ3NwZWxsY2hlY2snKTtcbiAgICBhd2FpdCBucG1SdW4oJ2xpbnQ6bWQnKTtcbiAgfVxuXG4gIC8vIFRoZSBidWlsZCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcHVibGlzaGluZywgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLCBzbyBpdCBydW5zIHVubGVzcyBgc2hvdWxkQnVpbGRgIGlzIGBmYWxzZWAgXHUyMDE0IHRoaXMga2VlcHMgdGhlIHJlbGVhc2VkIGFydGlmYWN0cyBpbiBzeW5jIHdpdGggdGhlIGN1cnJlbnQgY29kZSBldmVuIG9uIGEgZmFzdCByZWxlYXNlLlxuICBpZiAoc2hvdWxkQnVpbGQpIHtcbiAgICBhd2FpdCBucG1SdW4oJ2J1aWxkJyk7XG4gIH1cblxuICBpZiAoc2hvdWxkUnVuQ2hlY2tzKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Jyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ2ZpbmQtb3ZlcmV4cG9zZWQnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmludGVncmF0aW9uJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3Q6Y292ZXJhZ2UnKTtcbiAgfVxuXG4gIGNvbnN0IG5ld1ZlcnNpb24gPSBhd2FpdCBnZXROZXdWZXJzaW9uKHZlcnNpb25VcGRhdGVUeXBlKTtcbiAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbik7XG4gIGlmIChpc09ic2lkaWFuUGx1Z2luKSB7XG4gICAgYXdhaXQgdXBkYXRlVmVyc2lvbkluRmlsZXNGb3JQbHVnaW4obmV3VmVyc2lvbik7XG4gIH1cblxuICBhd2FpdCB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbiwgeyBzaG91bGRFZGl0Q2hhbmdlbG9nIH0pO1xuICBhd2FpdCBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uLCB7IHNob3VsZFZlcmlmeUNvbW1pdCB9KTtcbiAgYXdhaXQgYWRkR2l0VGFnKG5ld1ZlcnNpb24pO1xuXG4gIGlmICghc2hvdWxkUmVsZWFzZSkge1xuICAgIGdldExpYkRlYnVnZ2VyKCdWZXJzaW9uJykoJ1NraXBwaW5nIGdpdCBwdXNoIGFuZCBHaXRIdWIgcmVsZWFzZSAoLS1uby1yZWxlYXNlKS4gVGhlIHZlcnNpb24gYnVtcCwgY2hhbmdlbG9nLCBjb21taXQsIGFuZCB0YWcgaGF2ZSBiZWVuIGNyZWF0ZWQgbG9jYWxseS4nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBnaXRQdXNoKCk7XG4gIGF3YWl0IHByZXBhcmVHaXRIdWJSZWxlYXNlPy4obmV3VmVyc2lvbik7XG4gIGlmIChpc09ic2lkaWFuUGx1Z2luICYmIHNob3VsZEFyY2hpdmVEZW1vVmF1bHQpIHtcbiAgICBhd2FpdCBhcmNoaXZlUGx1Z2luRGVtb1ZhdWx0KCk7XG4gIH1cbiAgYXdhaXQgcHVibGlzaEdpdEh1YlJlbGVhc2UobmV3VmVyc2lvbiwgaXNPYnNpZGlhblBsdWdpbik7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgdmVyc2lvbiBpbiB2YXJpb3VzIGZpbGVzLCBpbmNsdWRpbmcgYHBhY2thZ2UuanNvbmAsIGBwYWNrYWdlLWxvY2suanNvbmAsXG4gKiBhbmQgT2JzaWRpYW4gcGx1Z2luIG1hbmlmZXN0cyBpZiBhcHBsaWNhYmxlLlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIHN0cmluZyB0byB1cGRhdGUgaW4gdGhlIGZpbGVzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVWZXJzaW9uSW5GaWxlcyhuZXdWZXJzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZWRpdFBhY2thZ2VKc29uKChwYWNrYWdlSnNvbikgPT4ge1xuICAgIHBhY2thZ2VKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICB9KTtcblxuICBhd2FpdCBlZGl0UGFja2FnZUxvY2tKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuICBhd2FpdCBlZGl0TnBtU2hyaW5rV3JhcEpzb24odXBkYXRlLCB7IHNob3VsZFNraXBJZk1pc3Npbmc6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gdXBkYXRlKHBhY2thZ2VMb2NrSnNvbjogUGFja2FnZUxvY2tKc29uKTogdm9pZCB7XG4gICAgcGFja2FnZUxvY2tKc29uLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIGNvbnN0IGRlZmF1bHRQYWNrYWdlID0gcGFja2FnZUxvY2tKc29uLnBhY2thZ2VzPy5bJyddO1xuICAgIGlmIChkZWZhdWx0UGFja2FnZSkge1xuICAgICAgZGVmYXVsdFBhY2thZ2UudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIGVuc3VyZSBpdCBpcyBlaXRoZXIgYSByZWNvZ25pemVkIHR5cGVcbiAqIG9yIGEgdmFsaWQgbWFudWFsIHZlcnNpb24gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9uVXBkYXRlVHlwZSAtIFRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlIHRvIHZhbGlkYXRlLlxuICogQHRocm93cyBFcnJvciBpZiB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSBpcyBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZ2V0VmVyc2lvblVwZGF0ZVR5cGUodmVyc2lvblVwZGF0ZVR5cGUpID09PSBWZXJzaW9uVXBkYXRlVHlwZS5JbnZhbGlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0ludmFsaWQgdmVyc2lvbiB1cGRhdGUgdHlwZS4gUGxlYXNlIHVzZSBcXCdtYWpvclxcJywgXFwnbWlub3JcXCcsIFxcJ3BhdGNoXFwnLCBcXCdwcmVtYWpvclxcJywgXFwncHJlbWlub3JcXCcsIFxcJ3ByZXBhdGNoXFwnLCBcXCdwcmVyZWxlYXNlXFwnLCBvciBcXCd4Lnkuelstc3VmZml4XVxcJyBmb3JtYXQuJ1xuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPYnNpZGlhbiBmcm9tIHRoZSBHaXRIdWIgcmVsZWFzZXMgQVBJLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIE9ic2lkaWFuLlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyAtLSBXZSBydW4gdGhpcyBvdXRzaWRlIG9mIE9ic2lkaWFuLCBzbyB3ZSBkb24ndCBoYXZlIGByZXF1ZXN0VXJsKClgLlxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL29ic2lkaWFubWQvb2JzaWRpYW4tcmVsZWFzZXMvcmVsZWFzZXMvbGF0ZXN0Jyk7XG4gIGNvbnN0IG9ic2lkaWFuUmVsZWFzZXNKc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpIGFzIFBhcnRpYWw8T2JzaWRpYW5SZWxlYXNlc0pzb24+O1xuICByZXR1cm4gZW5zdXJlTm9uTnVsbGFibGUob2JzaWRpYW5SZWxlYXNlc0pzb24ubmFtZSwgJ0NvdWxkIG5vdCBmaW5kIHRoZSBuYW1lIG9mIHRoZSBsYXRlc3QgT2JzaWRpYW4gcmVsZWFzZScpO1xufVxuXG5mdW5jdGlvbiBpc1ByZVJlbGVhc2UodmVyc2lvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwcmVyZWxlYXNlKHZlcnNpb24pICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiB0b0ZpcnN0TGluZShzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzdHIuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbikuc2xpY2UoMCwgMSkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsYXRlc3RPYnNpZGlhblZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0Rm46IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC5taW5BcHBWZXJzaW9uID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgICB9KTtcblxuICAgIGF3YWl0IGVkaXRKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHtcbiAgICAgIGVkaXRGbjogKHZlcnNpb25zKSA9PiB7XG4gICAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlZlcnNpb25zSnNvblxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMobWFuaWZlc3RCZXRhSnNvblBhdGgpKSB7XG4gICAgICBhd2FpdCBybShtYW5pZmVzdEJldGFKc29uUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29weVVwZGF0ZWRNYW5pZmVzdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLCtCQUErQjtBQUN4QyxTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGdCQUFnQjtBQUN6QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGlDQUFpQztBQUMxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQW1IUCxNQUFNLGdCQUFnQjtBQU9mLElBQUssb0JBQUwsa0JBQUtBLHVCQUFMO0FBQ0wsRUFBQUEsbUJBQUEsYUFBVTtBQUNWLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxZQUFTO0FBQ1QsRUFBQUEsbUJBQUEsV0FBUTtBQUNSLEVBQUFBLG1CQUFBLFdBQVE7QUFDUixFQUFBQSxtQkFBQSxjQUFXO0FBQ1gsRUFBQUEs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QUFpQixnQkFBZ0IsV0FBVyxFQUFFO0FBQ3BELFFBQUksZ0JBQWdCO0FBQ2xCLHFCQUFlLFVBQVU7QUFBQSxJQUMzQjtBQUFBLEVBQ0Y7QUFDRjtBQVNPLFNBQVMsU0FBUyxtQkFBaUM7QUFDeEQsTUFBSSxxQkFBcUIsaUJBQWlCLE1BQU0seUJBQTJCO0FBQ3pFLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBT0EsZUFBZSwyQkFBNEM7QUFFekQsUUFBTSxXQUFXLE1BQU0sTUFBTSwyRUFBMkU7QUFDeEcsUUFBTSx1QkFBdUIsTUFBTSxTQUFTLEtBQUs7QUFDakQsU0FBTyxrQkFBa0IscUJBQXFCLE1BQU0sd0RBQXdEO0FBQzlHO0FBRUEsU0FBUyxhQUFhLFNBQTBCO0FBQzlDLFNBQU8sV0FBVyxPQUFPLE1BQU07QUFDakM7QUFFQSxTQUFTLFlBQVksS0FBcUI7QUFDeEMsU0FBTyxJQUFJLE1BQU0sT0FBTyxFQUFFLE9BQU8sT0FBTyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFO0FBQy9EO0FBRUEsZUFBZSw4QkFBOEIsWUFBbUM7QUFDOUUsUUFBTSx1QkFBdUIsd0JBQXdCLEVBQUUsTUFBTSx3QkFBd0IsaUJBQWlCLENBQUM7QUFDdkcsTUFBSSxhQUFhLFVBQVUsR0FBRztBQUM1QixVQUFNO0FBQUEsTUFDSix3QkFBd0IsRUFBRSxNQUFNLHdCQUF3QixhQUFhLENBQUM7QUFBQSxNQUN0RTtBQUFBLE1BQ0EsRUFBRSxPQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUNBLFVBQU0sU0FBbUI7QUFBQSxNQUN2QixRQUFRLENBQUMsYUFBYTtBQUNwQixpQkFBUyxVQUFVO0FBQUEsTUFDckI7QUFBQSxNQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDaEMsQ0FBQztBQUFBLEVBQ0gsT0FBTztBQUNMLFVBQU0sd0JBQXdCLE1BQU0seUJBQXlCO0FBRTdELFVBQU0sU0FBbUI7QUFBQSxNQUN2QixRQUFRLENBQUMsYUFBYTtBQUNwQixpQkFBUyxnQkFBZ0I7QUFDekIsaUJBQVMsVUFBVTtBQUFBLE1BQ3JCO0FBQUEsTUFDQSxNQUFNLHdCQUF3QjtBQUFBLElBQ2hDLENBQUM7QUFFRCxVQUFNLFNBQWlDO0FBQUEsTUFDckMsUUFBUSxDQUFDLGFBQWE7QUFDcEIsaUJBQVMsVUFBVSxJQUFJO0FBQUEsTUFDekI7QUFBQSxNQUNBLE1BQU0sd0JBQXdCO0FBQUEsSUFDaEMsQ0FBQztBQUVELFFBQUksV0FBVyxvQkFBb0IsR0FBRztBQUNwQyxZQUFNLEdBQUcsb0JBQW9CO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBRUEsUUFBTSxvQkFBb0I7QUFDNUI7IiwKICAibmFtZXMiOiBbIlZlcnNpb25VcGRhdGVUeXBlIl0KfQo=
477
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy92ZXJzaW9uLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyB2ZXJzaW9uIHVwZGF0ZXMgaW4gYSBwcm9qZWN0LlxuICogSXQgaW5jbHVkZXMgdGFza3Mgc3VjaCBhcyB2YWxpZGF0aW5nIHZlcnNpb24gdXBkYXRlIHR5cGVzLCBjaGVja2luZyB0aGUgc3RhdGVcbiAqIG9mIEdpdCBhbmQgR2l0SHViIENMSSwgdXBkYXRpbmcgdmVyc2lvbiBudW1iZXJzIGluIGZpbGVzLCBhbmQgcGVyZm9ybWluZ1xuICogR2l0IG9wZXJhdGlvbnMgc3VjaCBhcyB0YWdnaW5nIGFuZCBwdXNoaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVsZWFzZVR5cGUgfSBmcm9tICdzZW12ZXInO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgcmVhZEZpbGUsXG4gIHJtLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVJbnRlcmZhY2UgfSBmcm9tICdub2RlOnJlYWRsaW5lL3Byb21pc2VzJztcbmltcG9ydCB7IHBhcnNlQXJncyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQge1xuICBpbmMsXG4gIHByZXJlbGVhc2Vcbn0gZnJvbSAnc2VtdmVyJztcblxuaW1wb3J0IHR5cGUgeyBQYWNrYWdlTG9ja0pzb24gfSBmcm9tICcuL25wbS50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vZGVidWcudHMnO1xuaW1wb3J0IHsgZXJyb3JUb1N0cmluZyB9IGZyb20gJy4uL2Vycm9yLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIH0gZnJvbSAnLi4vb2JzaWRpYW4vcGx1Z2luL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICcuLi9wYXRoLnRzJztcbmltcG9ydCB7IHJlcGxhY2VBbGwgfSBmcm9tICcuLi9zdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUsXG4gIGVuc3VyZU5vbk51bGxhYmxlXG59IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IGFyY2hpdmVQbHVnaW5EZW1vVmF1bHQgfSBmcm9tICcuL2RlbW8tdmF1bHQudHMnO1xuaW1wb3J0IHsgcmVhZGRpclBvc2l4IH0gZnJvbSAnLi9mcy50cyc7XG5pbXBvcnQgeyBlZGl0SnNvbiB9IGZyb20gJy4vanNvbi50cyc7XG5pbXBvcnQge1xuICBucG1SdW4sXG4gIG5wbVJ1bk9wdGlvbmFsXG59IGZyb20gJy4vbnBtLXJ1bi50cyc7XG5pbXBvcnQge1xuICBlZGl0TnBtU2hyaW5rV3JhcEpzb24sXG4gIGVkaXRQYWNrYWdlSnNvbixcbiAgZWRpdFBhY2thZ2VMb2NrSnNvbixcbiAgcmVhZFBhY2thZ2VKc29uXG59IGZyb20gJy4vbnBtLnRzJztcbmltcG9ydCB7IE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMgfSBmcm9tICcuL29ic2lkaWFuLWRldi11dGlscy1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIGV4ZWNGcm9tUm9vdCxcbiAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmVcbn0gZnJvbSAnLi9yb290LnRzJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgYWRkVXBkYXRlZEZpbGVzVG9HaXR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJ1biB0aGUgcHJlLWNvbW1pdCBob29rIHdoZW4gY3JlYXRpbmcgdGhlIHJlbGVhc2UgY29tbWl0LiBXaGVuIGBmYWxzZWAsIGAtLW5vLXZlcmlmeWBcbiAgICogaXMgcGFzc2VkIHRvIHRoZSByZWxlYXNlIGNvbW1pdCB0byBza2lwIHRoZSBob29rLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFZlcmlmeUNvbW1pdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBhIHZlcnNpb24gdXBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZFZlcnNpb25Bcmd1bWVudHMge1xuICAvKipcbiAgICogVGhlIHtAbGluayBVcGRhdGVWZXJzaW9uT3B0aW9uc30gcGFyc2VkIGZyb20gdGhlIGZsYWdzLlxuICAgKi9cbiAgcmVhZG9ubHkgb3B0aW9uczogVXBkYXRlVmVyc2lvbk9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbmFsIHZlcnNpb24gdXBkYXRlIHR5cGUgYXJndW1lbnQsIG9yIGB1bmRlZmluZWRgIGlmIG5vbmUgd2FzIHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvblVwZGF0ZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgdXBkYXRlQ2hhbmdlbG9nfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuIFdoZW4gYGZhbHNlYCxcbiAgICogdGhlIGNoYW5nZWxvZyBpcyBzdGlsbCBnZW5lcmF0ZWQgZnJvbSBjb21taXQgbWVzc2FnZXMsIGJ1dCBpdCBpcyBub3Qgb3BlbmVkIGluIHRoZSBlZGl0b3IgZm9yXG4gICAqIG1hbnVhbCByZXZpZXcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHVwZGF0ZVZlcnNpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVZlcnNpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJlcGFyZSB0aGUgR2l0SHViIHJlbGVhc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgR2l0SHViIHJlbGVhc2UgaGFzIGJlZW4gcHJlcGFyZWQuXG4gICAqL1xuICBwcmVwYXJlR2l0SHViUmVsZWFzZT8odGhpczogdm9pZCwgbmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhcmNoaXZlIHRoZSBwbHVnaW4ncyBkZW1vIHZhdWx0IChgZGVtby12YXVsdC9gIGluIHRoZSByZXBvIHJvb3QpIGFzIGEgcmVsZWFzZVxuICAgKiBhcnRpZmFjdC4gT25seSBhcHBsaWVzIHRvIE9ic2lkaWFuIHBsdWdpbnM7IGlnbm9yZWQgd2hlbiB0aGUgcmVwbyBoYXMgbm8gYGRlbW8tdmF1bHQvYCBmb2xkZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXJjaGl2ZURlbW9WYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcnVuIHRoZSBidWlsZCBzdGVwLiBUaGUgYnVpbGQgaXMgYSBwdWJsaXNoaW5nIHByZXJlcXVpc2l0ZSwgbm90IGEgdmVyaWZpY2F0aW9uIGNoZWNrLFxuICAgKiBzbyBpdCBpcyBnb3Zlcm5lZCBieSB0aGlzIGZsYWcgaW5kZXBlbmRlbnRseSBvZiB7QGxpbmsgc2hvdWxkUnVuQ2hlY2tzfSBcdTIwMTQgaXQgcnVucyBldmVuIHdoZW4gdGhlXG4gICAqIGNoZWNrcyBhcmUgc2tpcHBlZCwgc28gYSBmYXN0IHJlbGVhc2Ugc3RpbGwgc2hpcHMgZnJlc2ggYXJ0aWZhY3RzLiBTZXQgdG8gYGZhbHNlYCBvbmx5IHdoZW4gdGhlXG4gICAqIGJ1aWxkIG91dHB1dCBpcyBrbm93biB0byBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNvZGU7IG90aGVyd2lzZSB0aGUgcmVsZWFzZSB3b3VsZCBwdWJsaXNoXG4gICAqIHN0YWxlIGFydGlmYWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRCdWlsZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gb3BlbiB0aGUgZ2VuZXJhdGVkIGNoYW5nZWxvZyBpbiB0aGUgZWRpdG9yIGZvciBhbiBpbnRlcmFjdGl2ZSByZXZpZXcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdENoYW5nZWxvZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHVibGlzaCB0aGUgcmVsZWFzZS4gV2hlbiBgZmFsc2VgLCBhbGwgbG9jYWwgc3RlcHMgYXJlIGV4ZWN1dGVkICh2ZXJzaW9uIGJ1bXAsXG4gICAqIGNoYW5nZWxvZywgY29tbWl0LCB0YWcpLCBidXQgdGhlIGNoYW5nZXMgYXJlIG5vdCBwdXNoZWQgYW5kIG5vIEdpdEh1YiByZWxlYXNlIGlzIHB1Ymxpc2hlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZWZsaWdodCB2ZXJpZmljYXRpb24gY2hlY2tzIChjbGVhbi1yZXBvIGNoZWNrLCBmb3JtYXQsIHNwZWxsY2hlY2ssIGxpbnQsXG4gICAqIG92ZXItZXhwb3N1cmUgYW5hbHlzaXMsIGFuZCB0ZXN0cykuIFRoZSBidWlsZCBzdGVwIGlzIG5vdCBvbmUgb2YgdGhlc2UgY2hlY2tzIFx1MjAxNCBpdCBpcyBnb3Zlcm5lZFxuICAgKiBzZXBhcmF0ZWx5IGJ5IHtAbGluayBzaG91bGRCdWlsZH0uXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUnVuQ2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBydW4gdGhlIHByZS1jb21taXQgaG9vayB3aGVuIGNyZWF0aW5nIHRoZSByZWxlYXNlIGNvbW1pdC4gV2hlbiBgZmFsc2VgLCBgLS1uby12ZXJpZnlgXG4gICAqIGlzIHBhc3NlZCB0byB0aGUgcmVsZWFzZSBjb21taXQgdG8gc2tpcCB0aGUgaG9vay5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRWZXJpZnlDb21taXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgTnBtUGFja1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGZpbGVuYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlZmF1bHQgcHJlLXJlbGVhc2UgaWRlbnRpZmllciB1c2VkIGZvciBwcmUtcmVsZWFzZSB2ZXJzaW9ucy5cbiAqL1xuY29uc3QgREVGQVVMVF9QUkVJRCA9ICdiZXRhJztcblxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgdmVyc2lvbiB1cGRhdGVzLlxuICpcbiAqIEFsaWducyB3aXRoIG5wbSdzIGBucG0gdmVyc2lvbmAgaW5jcmVtZW50IHR5cGVzIHBsdXMgYE1hbnVhbGAgZm9yIGV4cGxpY2l0IHZlcnNpb25zLlxuICovXG5leHBvcnQgZW51bSBWZXJzaW9uVXBkYXRlVHlwZSB7XG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIE1ham9yID0gJ21ham9yJyxcbiAgTWFudWFsID0gJ21hbnVhbCcsXG4gIE1pbm9yID0gJ21pbm9yJyxcbiAgUGF0Y2ggPSAncGF0Y2gnLFxuICBQcmVNYWpvciA9ICdwcmVtYWpvcicsXG4gIFByZU1pbm9yID0gJ3ByZW1pbm9yJyxcbiAgUHJlUGF0Y2ggPSAncHJlcGF0Y2gnLFxuICBQcmVSZWxlYXNlID0gJ3ByZXJlbGVhc2UnXG59XG5cbi8qKlxuICogVHlwZSByZXByZXNlbnRpbmcgdGhlIG1hbmlmZXN0IGZpbGUgZm9ybWF0IGZvciBPYnNpZGlhbiBwbHVnaW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0IHtcbiAgLyoqXG4gICAqIEEgbWluaW11bSBPYnNpZGlhbiB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGUgcGx1Z2luLlxuICAgKi9cbiAgbWluQXBwVmVyc2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUeXBlIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIG9mIE9ic2lkaWFuIHJlbGVhc2VzIEpTT04uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2JzaWRpYW5SZWxlYXNlc0pzb24ge1xuICAvKipcbiAgICogQSBuYW1lIG9mIHRoZSBPYnNpZGlhbiByZWxlYXNlLlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBHaXQgdGFnIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIHVzZSBmb3IgdGhlIHRhZy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdGFnIGhhcyBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRHaXRUYWcobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IHRhZyAtYSAke25ld1ZlcnNpb259IC1tICR7bmV3VmVyc2lvbn0gLS1mb3JjZWAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBBZGRzIHVwZGF0ZWQgZmlsZXMgdG8gdGhlIEdpdCBzdGFnaW5nIGFyZWEgYW5kIGNvbW1pdHMgdGhlbSB3aXRoIHRoZSBuZXcgdmVyc2lvbiBtZXNzYWdlLlxuICpcbiAqIElmIHRoZSBjb21taXQgZmFpbHMgKGZvciBleGFtcGxlLCB0aGUgcHJlLWNvbW1pdCBob29rIHJlamVjdHMgYSBuZXcgd29yZCBpbiB0aGUgY2hhbmdlbG9nKSBhbmQgdGhlXG4gKiBwcm9jZXNzIGlzIGF0dGFjaGVkIHRvIGFuIGludGVyYWN0aXZlIHRlcm1pbmFsLCB0aGUgdXNlciBpcyBwcm9tcHRlZCB0byBmaXggdGhlIGlzc3VlIChmb3IgZXhhbXBsZSxcbiAqIGFkZCB0aGUgbWlzc2luZyB3b3JkIHRvIGBjc3BlbGwuanNvbmApIGFuZCBwcmVzcyBFbnRlciB0byByZXRyeS4gVGhlIHJldHJ5IHJlLXN0YWdlcyBhbGwgZmlsZXMsIHNvIHRoZVxuICogZml4IGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlc3RhcnRpbmcgdGhlIHdob2xlIHJlbGVhc2UgbGlmZWN5Y2xlLiBJbiBhIG5vbi1pbnRlcmFjdGl2ZSBlbnZpcm9ubWVudCAobm9cbiAqIFRUWSwgc3VjaCBhcyBDSSksIHRoZSBlcnJvciBpcyByZS10aHJvd24gaW5zdGVhZCBvZiBwcm9tcHRpbmcsIHNvIHRoZSBzY3JpcHQgZmFpbHMgZmFzdCByYXRoZXIgdGhhblxuICogaGFuZ2luZy4gUGFzcyBgc2hvdWxkVmVyaWZ5Q29tbWl0OiBmYWxzZWAgdG8gc2tpcCB0aGUgcHJlLWNvbW1pdCBob29rIGVudGlyZWx5IGluIHN1Y2ggY2FzZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHVzZWQgYXMgdGhlIGNvbW1pdCBtZXNzYWdlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNvbW1pdCBiZWhhdmlvci5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkIGFuZCBjb21taXR0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRVcGRhdGVkRmlsZXNUb0dpdChuZXdWZXJzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IEFkZFVwZGF0ZWRGaWxlc1RvR2l0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgc2hvdWxkVmVyaWZ5Q29tbWl0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgdmVyc2lvbkRlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ1ZlcnNpb24nKTtcblxuICBjb25zdCBjb21taXRBcmd1bWVudHMgPSBbJ2dpdCcsICdjb21taXQnLCAnLW0nLCBgY2hvcmU6IHJlbGVhc2UgJHtuZXdWZXJzaW9ufWAsICctLWFsbG93LWVtcHR5J107XG4gIGlmICghc2hvdWxkVmVyaWZ5Q29tbWl0KSB7XG4gICAgY29tbWl0QXJndW1lbnRzLnB1c2goJy0tbm8tdmVyaWZ5Jyk7XG4gIH1cblxuICBmb3IgKDs7KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2dpdCcsICdhZGQnLCAnLS1hbGwnXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgYXdhaXQgZXhlY0Zyb21Sb290KGNvbW1pdEFyZ3VtZW50cywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXByb2Nlc3Muc3RkaW4uaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIHZlcnNpb25EZWJ1Z2dlcihcbiAgICAgICAgYEZhaWxlZCB0byBjb21taXQgdGhlIHJlbGVhc2UuXFxuJHtlcnJvclRvU3RyaW5nKGVycm9yKX1cXG5gXG4gICAgICAgICAgKyAnRml4IHRoZSBpc3N1ZXMgKGZvciBleGFtcGxlLCBhZGQgdGhlIG1pc3Npbmcgd29yZCB0byBjc3BlbGwuanNvbikgYW5kIHByZXNzIEVudGVyIHRvIHJldHJ5IHRoZSBjb21taXQsIG9yIEN0cmwrQyB0byBhYm9ydC4nXG4gICAgICApO1xuICAgICAgYXdhaXQgY3JlYXRlSW50ZXJmYWNlKHByb2Nlc3Muc3RkaW4sIHByb2Nlc3Muc3Rkb3V0KS5xdWVzdGlvbignUHJlc3MgRW50ZXIgdG8gcmV0cnkgdGhlIGNvbW1pdC4uLicpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgR2l0SHViIENMSSBpcyBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdEh1YiBDTEkgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXRIdWIgQ0xJIGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRIdWJDbGlJbnN0YWxsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlY0Zyb21Sb290KCdnaCAtLXZlcnNpb24nLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0SHViIENMSSBpcyBub3QgaW5zdGFsbGVkLiBQbGVhc2UgaW5zdGFsbCBpdCBmcm9tIGh0dHBzOi8vY2xpLmdpdGh1Yi5jb20vJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgR2l0IGlzIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtLlxuICpcbiAqIFRocm93cyBhbiBlcnJvciBpZiBHaXQgaXMgbm90IGluc3RhbGxlZC5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIEdpdCBpcyBub3QgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXNzZXJ0R2l0SW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IC0tdmVyc2lvbicsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdHaXQgaXMgbm90IGluc3RhbGxlZC4gUGxlYXNlIGluc3RhbGwgaXQgZnJvbSBodHRwczovL2dpdC1zY20uY29tLycpO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBjbGVhbiwgbWVhbmluZyB0aGVyZSBhcmUgbm8gdW5jb21taXR0ZWQgY2hhbmdlcy5cbiAqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIEdpdCByZXBvc2l0b3J5IGlzIG5vdCBjbGVhbi5cbiAqXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBHaXQgcmVwb3NpdG9yeSBpcyBub3QgY2xlYW4uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3NlcnRHaXRSZXBvQ2xlYW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgZXhlY0Zyb21Sb290KCdnaXQgc3RhdHVzIC0tcG9yY2VsYWluIC0tdW50cmFja2VkLWZpbGVzPWFsbCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICBpZiAoc3Rkb3V0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignR2l0IHJlcG9zaXRvcnkgaXMgbm90IGNsZWFuLiBQbGVhc2UgY29tbWl0IG9yIHN0YXNoIHlvdXIgY2hhbmdlcyBiZWZvcmUgcmVsZWFzaW5nIGEgbmV3IHZlcnNpb24uJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBhbnkgYmFyZSBgaHR0cChzKTovL2AgVVJMIGluIHRoZSBnaXZlbiB0ZXh0IGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBzbyB0aGF0IHRleHQgZW1pdHRlZFxuICogaW50byBhIE1hcmtkb3duIGRvY3VtZW50IChzdWNoIGFzIGEgZ2VuZXJhdGVkIGNoYW5nZWxvZyBidWxsZXQpIHBhc3NlcyBtYXJrZG93bmxpbnQnc1xuICogYE1EMDM0L25vLWJhcmUtdXJsc2AgcnVsZSB3aGlsZSBzdGlsbCByZW5kZXJpbmcgYXMgYSBjbGlja2FibGUgYXV0b2xpbmsgb24gR2l0SHViLlxuICpcbiAqIFVSTHMgdGhhdCBhcmUgYWxyZWFkeSB3cmFwcGVkIGluIGFuZ2xlIGJyYWNrZXRzIChgPHVybD5gKSBvciB0aGF0IGZvcm0gdGhlIHRhcmdldCBvZiBhIE1hcmtkb3duXG4gKiBsaW5rIChgW3RleHRdKHVybClgKSBhcmUgbGVmdCB1bnRvdWNoZWQsIHNvIHRoZSBmdW5jdGlvbiBpcyBzYWZlIHRvIHJ1biByZXBlYXRlZGx5LiBUcmFpbGluZ1xuICogc2VudGVuY2UgcHVuY3R1YXRpb24gKGAuYCwgYCxgLCBgO2AsIGA6YCwgYCFgLCBgP2ApIGlzIGtlcHQgb3V0c2lkZSB0aGUgYW5nbGUgYnJhY2tldHMgc28gaXQgZG9lc1xuICogbm90IGJlY29tZSBwYXJ0IG9mIHRoZSBsaW5rLlxuICpcbiAqIEBwYXJhbSB0ZXh0IC0gVGhlIHRleHQgcG9zc2libHkgY29udGFpbmluZyBiYXJlIFVSTHMuXG4gKiBAcmV0dXJucyBUaGUgdGV4dCB3aXRoIGV2ZXJ5IGJhcmUgVVJMIHdyYXBwZWQgaW4gYW5nbGUgYnJhY2tldHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdXRvbGlua0JhcmVVcmxzKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0LnJlcGxhY2VBbGwoLyg/PCFbPFsoXSlodHRwcz86XFwvXFwvW15cXHM8PilcXF1dKy9nLCAodXJsKSA9PiB7XG4gICAgY29uc3QgdHJhaWxpbmdQdW5jdHVhdGlvbiA9IC9bLiw7OiE/XSskLy5leGVjKHVybCk/LlswXSA/PyAnJztcbiAgICBjb25zdCBiYXJlVXJsID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSB0cmFpbGluZ1B1bmN0dWF0aW9uLmxlbmd0aCk7XG4gICAgcmV0dXJuIGA8JHtiYXJlVXJsfT4ke3RyYWlsaW5nUHVuY3R1YXRpb259YDtcbiAgfSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGZpbGUgdG8gdGhlIGRpc3RyaWJ1dGlvbiBidWlsZCBmb2xkZXIuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb3B5IG9wZXJhdGlvbiBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlVcGRhdGVkTWFuaWZlc3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGNwKFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pLFxuICAgIHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogam9pbihPYnNpZGlhblBsdWdpblJlcG9QYXRocy5EaXN0QnVpbGQsIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0SnNvbikgfSksXG4gICAgeyBmb3JjZTogdHJ1ZSB9XG4gICk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbmV3IHZlcnNpb24gc3RyaW5nIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZlcnNpb24gYW5kIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVXNlcyB0aGUgYHNlbXZlcmAgcGFja2FnZSB0byBjb21wdXRlIHRoZSBuZXh0IHZlcnNpb24sIHN1cHBvcnRpbmcgYWxsIG5wbSBpbmNyZW1lbnQgdHlwZXM6XG4gKiBgbWFqb3JgLCBgbWlub3JgLCBgcGF0Y2hgLCBgcHJlbWFqb3JgLCBgcHJlbWlub3JgLCBgcHJlcGF0Y2hgLCBhbmQgYHByZXJlbGVhc2VgLlxuICogUHJlLXJlbGVhc2UgdmVyc2lvbnMgdXNlIHRoZSBgYmV0YWAgaWRlbnRpZmllciBieSBkZWZhdWx0IChlLmcuLCBgMS4yLjQtYmV0YS4wYCkuXG4gKlxuICogQHBhcmFtIHZlcnNpb25VcGRhdGVUeXBlIC0gVGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgb3IgYW4gZXhwbGljaXQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgdmVyc2lvbiBzdHJpbmcuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjdXJyZW50IHZlcnNpb24gaXMgaW52YWxpZCBvciB0aGUgaW5jcmVtZW50IGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdmVyc2lvblR5cGUgPSBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGlmICh2ZXJzaW9uVHlwZSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsKSB7XG4gICAgcmV0dXJuIHZlcnNpb25VcGRhdGVUeXBlO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkUGFja2FnZUpzb24oKTtcbiAgY29uc3QgY3VycmVudFZlcnNpb24gPSBwYWNrYWdlSnNvbi52ZXJzaW9uID8/ICcnO1xuXG4gIGNvbnN0IHJlbGVhc2VUeXBlID0gdmVyc2lvblR5cGUgYXMgUmVsZWFzZVR5cGU7XG4gIGNvbnN0IGlzUHJlUmVsZWFzZVR5cGUgPSByZWxlYXNlVHlwZS5zdGFydHNXaXRoKCdwcmUnKTtcbiAgY29uc3QgbmV3VmVyc2lvbiA9IGlzUHJlUmVsZWFzZVR5cGVcbiAgICA/IGluYyhjdXJyZW50VmVyc2lvbiwgcmVsZWFzZVR5cGUsIERFRkFVTFRfUFJFSUQpXG4gICAgOiBpbmMoY3VycmVudFZlcnNpb24sIHJlbGVhc2VUeXBlKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobmV3VmVyc2lvbiwgYEZhaWxlZCB0byBpbmNyZW1lbnQgdmVyc2lvbiBmcm9tICcke2N1cnJlbnRWZXJzaW9ufScgd2l0aCB0eXBlICcke3ZlcnNpb25UeXBlfSdgKTtcblxuICByZXR1cm4gbmV3VmVyc2lvbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHJlbGVhc2Ugbm90ZXMgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiBmcm9tIHRoZSBjaGFuZ2Vsb2cuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIGZvciB3aGljaCB0byBnZXQgdGhlIHJlbGVhc2Ugbm90ZXMuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZWxlYXNlIG5vdGVzIGZvciB0aGUgc3BlY2lmaWVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShjaGFuZ2Vsb2dQYXRoLCAndXRmLTgnKTtcbiAgY29uc3QgbmV3VmVyc2lvbkVzY2FwZWQgPSByZXBsYWNlQWxsKHtcbiAgICAkc3RyaW5nOiBuZXdWZXJzaW9uLFxuICAgIHJlcGxhY2VyOiBTdHJpbmcucmF3YFxcLmAsXG4gICAgc2VhcmNoVmFsdWU6ICcuJ1xuICB9KTtcbiAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGBcXG4jIyAke25ld1ZlcnNpb25Fc2NhcGVkfVxcblxcbigoLnxcXG4pKz8pXFxuXFxuIyNgKS5leGVjKGNvbnRlbnQpO1xuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gdjggdHJhY2tzIG9wdGlvbmFsIGNoYWluaW5nIGFuZCB0ZXJuYXJ5IGFzIHNlcGFyYXRlIGJyYW5jaGVzOyBib3RoIHBhdGhzIGFyZSB0ZXN0ZWQuICovXG4gIGxldCByZWxlYXNlTm90ZXMgPSBtYXRjaD8uWzFdID8gYCR7bWF0Y2hbMV19XFxuXFxuYCA6ICcnO1xuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuXG4gIGNvbnN0IHRhZ091dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2l0IHRhZyAtLXNvcnQ9LWNyZWF0b3JkYXRlJywgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICBjb25zdCB0YWdzID0gdGFnT3V0cHV0LnNwbGl0KC9cXHI/XFxuLyk7XG4gIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IHRhZ3NbMV07XG5cbiAgY29uc3QgcmVwb1VybCA9IGF3YWl0IGV4ZWNGcm9tUm9vdCgnZ2ggcmVwbyB2aWV3IC0tanNvbiB1cmwgLXEgLnVybCcsIHsgaXNRdWlldDogdHJ1ZSB9KTtcblxuICBjb25zdCBjaGFuZ2VzVXJsID0gcHJldmlvdXNWZXJzaW9uID8gYCR7cmVwb1VybH0vY29tcGFyZS8ke3ByZXZpb3VzVmVyc2lvbn0uLi4ke25ld1ZlcnNpb259YCA6IGAke3JlcG9Vcmx9L2NvbW1pdHMvJHtuZXdWZXJzaW9ufWA7XG5cbiAgcmVsZWFzZU5vdGVzICs9IGAqKkZ1bGwgQ2hhbmdlbG9nKio6ICR7Y2hhbmdlc1VybH1gO1xuICByZXR1cm4gcmVsZWFzZU5vdGVzO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHR5cGUgb2YgdmVyc2lvbiB1cGRhdGUgYmFzZWQgb24gdGhlIGlucHV0IHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgaW5wdXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSBjb3JyZXNwb25kaW5nIGBWZXJzaW9uVXBkYXRlVHlwZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZXJzaW9uVXBkYXRlVHlwZSh2ZXJzaW9uVXBkYXRlVHlwZTogc3RyaW5nKTogVmVyc2lvblVwZGF0ZVR5cGUge1xuICBjb25zdCB2ZXJzaW9uVXBkYXRlVHlwZUVudW0gPSB2ZXJzaW9uVXBkYXRlVHlwZSBhcyBWZXJzaW9uVXBkYXRlVHlwZTtcbiAgc3dpdGNoICh2ZXJzaW9uVXBkYXRlVHlwZUVudW0pIHtcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLk1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZU1ham9yOlxuICAgIGNhc2UgVmVyc2lvblVwZGF0ZVR5cGUuUHJlTWlub3I6XG4gICAgY2FzZSBWZXJzaW9uVXBkYXRlVHlwZS5QcmVQYXRjaDpcbiAgICBjYXNlIFZlcnNpb25VcGRhdGVUeXBlLlByZVJlbGVhc2U6IHtcbiAgICAgIHJldHVybiB2ZXJzaW9uVXBkYXRlVHlwZUVudW07XG4gICAgfVxuXG4gICAgZGVmYXVsdDoge1xuICAgICAgaWYgKC9eXFxkK1xcLlxcZCtcXC5cXGQrKD86LVtcXHdcXGQuLV0rKT8kLy50ZXN0KHZlcnNpb25VcGRhdGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuTWFudWFsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdXNoZXMgY29tbWl0cyBhbmQgdGFncyB0byB0aGUgcmVtb3RlIEdpdCByZXBvc2l0b3J5LlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcHVzaCBvcGVyYXRpb24gaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBleGVjRnJvbVJvb3QoJ2dpdCBwdXNoIC0tZm9sbG93LXRhZ3MgLS1mb3JjZScsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIGEgdmVyc2lvbiB1cGRhdGUgaW50byBhIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kXG4gKiB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9LlxuICpcbiAqIEVhY2ggYmVoYXZpb3IgaXMgZW5hYmxlZCBieSBkZWZhdWx0OyB0aGUgY29ycmVzcG9uZGluZyBgLS1uby0qYCBmbGFnIHR1cm5zIGl0IG9mZi4gUmVjb2duaXplZCBmbGFnczpcbiAqIC0gYC0tbm8tYnVpbGRgIFx1MjAxNCBza2lwIHRoZSBidWlsZCBzdGVwIChvbmx5IHNhZmUgd2hlbiB0aGUgYnVpbGQgb3V0cHV0IGFscmVhZHkgbWF0Y2hlcyB0aGUgY3VycmVudCBjb2RlKS5cbiAqIC0gYC0tbm8tY2hhbmdlbG9nLWVkaXRpbmdgIFx1MjAxNCBnZW5lcmF0ZSB0aGUgY2hhbmdlbG9nIHdpdGhvdXQgb3BlbmluZyBpdCBmb3IgbWFudWFsIHJldmlldy5cbiAqIC0gYC0tbm8tY2hlY2tzYCBcdTIwMTQgc2tpcCB0aGUgY2xlYW4tcmVwbyBjaGVjaywgZm9ybWF0LCBzcGVsbGNoZWNrLCBsaW50LCBvdmVyLWV4cG9zdXJlIGFuYWx5c2lzLCBhbmQgdGVzdHMgKHRoZSBidWlsZCBzdGlsbCBydW5zKS5cbiAqIC0gYC0tbm8tY29tbWl0LXZlcmlmaWNhdGlvbmAgXHUyMDE0IHBhc3MgYC0tbm8tdmVyaWZ5YCB0byB0aGUgcmVsZWFzZSBjb21taXQsIHNraXBwaW5nIHRoZSBwcmUtY29tbWl0IGhvb2suXG4gKiAtIGAtLW5vLWRlbW8tdmF1bHRgIFx1MjAxNCBza2lwIGFyY2hpdmluZyB0aGUgcGx1Z2luJ3MgZGVtbyB2YXVsdCAoYGRlbW8tdmF1bHQvYCkgYXMgYSByZWxlYXNlIGFydGlmYWN0LlxuICogLSBgLS1uby1yZWxlYXNlYCBcdTIwMTQgcnVuIGFsbCBsb2NhbCBzdGVwcyBidXQgc2tpcCB0aGUgcHVzaCBhbmQgdGhlIEdpdEh1YiByZWxlYXNlLlxuICpcbiAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgKHR5cGljYWxseSBgcHJvY2Vzcy5hcmd2LnNsaWNlKDIpYCkuXG4gKiBAcmV0dXJucyBUaGUge0BsaW5rIFBhcnNlZFZlcnNpb25Bcmd1bWVudHN9IGNvbnRhaW5pbmcgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgYW5kIHRoZSBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWZXJzaW9uQXJndW1lbnRzKCRhcmd1bWVudHM6IHN0cmluZ1tdKTogUGFyc2VkVmVyc2lvbkFyZ3VtZW50cyB7XG4gIGNvbnN0IHsgcG9zaXRpb25hbHMsIHZhbHVlcyB9ID0gcGFyc2VBcmdzKHtcbiAgICBhbGxvd1Bvc2l0aW9uYWxzOiB0cnVlLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBhcmdzYCBpcyB0aGUgb3B0aW9uIG5hbWUgTm9kZSdzIGBwYXJzZUFyZ3NgIHJlYWRzLlxuICAgIGFyZ3M6ICRhcmd1bWVudHMsXG4gICAgb3B0aW9uczoge1xuICAgICAgJ25vLWJ1aWxkJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jaGFuZ2Vsb2ctZWRpdGluZyc6IHsgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAnbm8tY2hlY2tzJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1jb21taXQtdmVyaWZpY2F0aW9uJzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1kZW1vLXZhdWx0JzogeyB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICduby1yZWxlYXNlJzogeyB0eXBlOiAnYm9vbGVhbicgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBvcHRpb25zOiB7XG4gICAgICBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0OiAhKHZhbHVlc1snbm8tZGVtby12YXVsdCddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZEJ1aWxkOiAhKHZhbHVlc1snbm8tYnVpbGQnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRFZGl0Q2hhbmdlbG9nOiAhKHZhbHVlc1snbm8tY2hhbmdlbG9nLWVkaXRpbmcnXSA/PyBmYWxzZSksXG4gICAgICBzaG91bGRSZWxlYXNlOiAhKHZhbHVlc1snbm8tcmVsZWFzZSddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFJ1bkNoZWNrczogISh2YWx1ZXNbJ25vLWNoZWNrcyddID8/IGZhbHNlKSxcbiAgICAgIHNob3VsZFZlcmlmeUNvbW1pdDogISh2YWx1ZXNbJ25vLWNvbW1pdC12ZXJpZmljYXRpb24nXSA/PyBmYWxzZSlcbiAgICB9LFxuICAgIHZlcnNpb25VcGRhdGVUeXBlOiBwb3NpdGlvbmFsc1swXVxuICB9O1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIEdpdEh1YiByZWxlYXNlIGZvciB0aGUgbmV3IHZlcnNpb24uXG4gKlxuICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgYSByZWxlYXNlIGFuZCB1cGxvYWRpbmcgZmlsZXMgZm9yIGVpdGhlciBhbiBPYnNpZGlhbiBwbHVnaW4gb3IgYW5vdGhlciBwcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBuZXdWZXJzaW9uIC0gVGhlIG5ldyB2ZXJzaW9uIG51bWJlciBmb3IgdGhlIHJlbGVhc2UuXG4gKiBAcGFyYW0gaXNPYnNpZGlhblBsdWdpbiAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBwcm9qZWN0IGlzIGFuIE9ic2lkaWFuIHBsdWdpbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgcmVsZWFzZSBoYXMgYmVlbiBwdWJsaXNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdWJsaXNoR2l0SHViUmVsZWFzZShuZXdWZXJzaW9uOiBzdHJpbmcsIGlzT2JzaWRpYW5QbHVnaW46IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IGZpbGVQYXRoczogc3RyaW5nW107XG5cbiAgaWYgKGlzT2JzaWRpYW5QbHVnaW4pIHtcbiAgICBjb25zdCBidWlsZEZvbGRlciA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuRGlzdEJ1aWxkIH0pO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXJQb3NpeChidWlsZEZvbGRlcik7XG4gICAgZmlsZVBhdGhzID0gZmlsZU5hbWVzLm1hcCgoZmlsZU5hbWUpID0+IGpvaW4oYnVpbGRGb2xkZXIsIGZpbGVOYW1lKSk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlc3VsdE91dHB1dCA9IGF3YWl0IGV4ZWNGcm9tUm9vdChbJ25wbScsICdwYWNrJywgJy0tcGFjay1kZXN0aW5hdGlvbicsIE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgJy0tanNvbiddLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgY29uc3QgaW5kZXggPSByZXN1bHRPdXRwdXQuaW5kZXhPZignW1xcbiAgeycpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBKU09OIGFycmF5IGluIHRoZSByZXN1bHQgb3V0cHV0Jyk7XG4gICAgfVxuICAgIHJlc3VsdE91dHB1dCA9IHJlc3VsdE91dHB1dC5zbGljZShpbmRleCk7XG4gICAgY29uc3QgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHRPdXRwdXQpIGFzIFtOcG1QYWNrUmVzdWx0XTtcbiAgICBmaWxlUGF0aHMgPSBbXG4gICAgICBqb2luKE9ic2lkaWFuRGV2VXRpbHNSZXBvUGF0aHMuRGlzdCwgcmVzdWx0WzBdLmZpbGVuYW1lKSxcbiAgICAgIGpvaW4oT2JzaWRpYW5EZXZVdGlsc1JlcG9QYXRocy5EaXN0LCBPYnNpZGlhbkRldlV0aWxzUmVwb1BhdGhzLlN0eWxlc0NzcylcbiAgICBdO1xuICB9XG5cbiAgZmlsZVBhdGhzID0gZmlsZVBhdGhzLmZpbHRlcigoZmlsZVBhdGgpID0+IGV4aXN0c1N5bmMocmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBmaWxlUGF0aCB9KSkpO1xuXG4gIGF3YWl0IGV4ZWNGcm9tUm9vdChbXG4gICAgJ2doJyxcbiAgICAncmVsZWFzZScsXG4gICAgJ2NyZWF0ZScsXG4gICAgbmV3VmVyc2lvbixcbiAgICAuLi5maWxlUGF0aHMsXG4gICAgJy0tdGl0bGUnLFxuICAgIGB2JHtuZXdWZXJzaW9ufWAsXG4gICAgLi4uKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSA/IFsnLS1wcmVyZWxlYXNlJ10gOiBbXSksXG4gICAgJy0tbm90ZXMtZmlsZScsXG4gICAgJy0nXG4gIF0sIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHN0ZGluOiBhd2FpdCBnZXRSZWxlYXNlTm90ZXMobmV3VmVyc2lvbilcbiAgfSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgY2hhbmdlbG9nIGZpbGUgd2l0aCBuZXcgdmVyc2lvbiBpbmZvcm1hdGlvbiBhbmQgY29tbWl0IG1lc3NhZ2VzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGN1cnJlbnQgY2hhbmdlbG9nLCBhcHBlbmRzIG5ldyBlbnRyaWVzIGZvciB0aGUgbGF0ZXN0IHZlcnNpb24sXG4gKiBhbmQgcHJvbXB0cyB0aGUgdXNlciB0byByZXZpZXcgdGhlIGNoYW5nZXMuXG4gKlxuICogQHBhcmFtIG5ld1ZlcnNpb24gLSBUaGUgbmV3IHZlcnNpb24gbnVtYmVyIHRvIGJlIGFkZGVkIHRvIHRoZSBjaGFuZ2Vsb2cuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlQ2hhbmdlbG9nT3B0aW9uc30gY29udHJvbGxpbmcgdGhlIGNoYW5nZWxvZyByZXZpZXcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNoYW5nZWxvZyB1cGRhdGUgaXMgY29tcGxldGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVDaGFuZ2Vsb2cobmV3VmVyc2lvbjogc3RyaW5nLCBvcHRpb25zOiBVcGRhdGVDaGFuZ2Vsb2dPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgY29uc3QgSEVBREVSX0xJTkVTX0NPVU5UID0gMjtcbiAgY29uc3QgY2hhbmdlbG9nUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWQgfSk7XG4gIGxldCBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzOiBzdHJpbmdbXTtcbiAgaWYgKGV4aXN0c1N5bmMoY2hhbmdlbG9nUGF0aCkpIHtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoY2hhbmdlbG9nUGF0aCwgJ3V0Zi04Jyk7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpLnNsaWNlKEhFQURFUl9MSU5FU19DT1VOVCk7XG4gICAgaWYgKHByZXZpb3VzQ2hhbmdlbG9nTGluZXMuYXQoLTEpID09PSAnJykge1xuICAgICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5wb3AoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcHJldmlvdXNDaGFuZ2Vsb2dMaW5lcyA9IFtdO1xuICB9XG5cbiAgY29uc3QgbGFzdFRhZyA9IHJlcGxhY2VBbGwoe1xuICAgICRzdHJpbmc6IHByZXZpb3VzQ2hhbmdlbG9nTGluZXNbMF0gPz8gJycsXG4gICAgcmVwbGFjZXI6ICcnLFxuICAgIHNlYXJjaFZhbHVlOiAnIyMgJ1xuICB9KTtcbiAgY29uc3QgY29tbWl0UmFuZ2UgPSBsYXN0VGFnID8gYCR7bGFzdFRhZ30uLkhFQURgIDogJ0hFQUQnO1xuICBjb25zdCBjb21taXRNZXNzYWdlc1N0cmluZyA9IGF3YWl0IGV4ZWNGcm9tUm9vdChgZ2l0IGxvZyAke2NvbW1pdFJhbmdlfSAtLWZvcm1hdD0lQiAtLWZpcnN0LXBhcmVudCAtemAsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgY29uc3QgY29tbWl0TWVzc2FnZXMgPSBjb21taXRNZXNzYWdlc1N0cmluZy5zcGxpdCgnXFwwJykuZmlsdGVyKEJvb2xlYW4pLm1hcCgoY29tbWl0TWVzc2FnZSkgPT4gdG9GaXJzdExpbmUoY29tbWl0TWVzc2FnZSkpO1xuXG4gIGxldCBuZXdDaGFuZ2VMb2cgPSBgIyBDSEFOR0VMT0dcXG5cXG4jIyAke25ld1ZlcnNpb259XFxuXFxuYDtcblxuICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgY29tbWl0TWVzc2FnZXMpIHtcbiAgICBuZXdDaGFuZ2VMb2cgKz0gYC0gJHthdXRvbGlua0JhcmVVcmxzKG1lc3NhZ2UpfVxcbmA7XG4gIH1cblxuICBpZiAocHJldmlvdXNDaGFuZ2Vsb2dMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgbmV3Q2hhbmdlTG9nICs9ICdcXG4nO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBwcmV2aW91c0NoYW5nZWxvZ0xpbmVzKSB7XG4gICAgICBuZXdDaGFuZ2VMb2cgKz0gYCR7bGluZX1cXG5gO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IHdyaXRlRmlsZShjaGFuZ2Vsb2dQYXRoLCBuZXdDaGFuZ2VMb2csICd1dGYtOCcpO1xuXG4gIGlmICghc2hvdWxkRWRpdENoYW5nZWxvZykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNvZGVWZXJzaW9uID0gYXdhaXQgZXhlY0Zyb21Sb290KCdjb2RlIC0tdmVyc2lvbicsIHtcbiAgICBpc1F1aWV0OiB0cnVlLFxuICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gIH0pO1xuICBjb25zdCB2ZXJzaW9uRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpO1xuICBpZiAoY29kZVZlcnNpb24pIHtcbiAgICB2ZXJzaW9uRGVidWdnZXIoYFBsZWFzZSB1cGRhdGUgdGhlICR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIENsb3NlIFZpc3VhbCBTdHVkaW8gQ29kZSB3aGVuIHlvdSBhcmUgZG9uZS4uLmApO1xuICAgIGF3YWl0IGV4ZWNGcm9tUm9vdChbJ2NvZGUnLCAnLXcnLCBjaGFuZ2Vsb2dQYXRoXSwge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdmVyc2lvbkRlYnVnZ2VyKCdDb3VsZCBub3QgZmluZCBWaXN1YWwgU3R1ZGlvIENvZGUgaW4geW91ciBQQVRILiBVc2luZyBjb25zb2xlIG1vZGUgaW5zdGVhZC4nKTtcbiAgICBhd2FpdCBjcmVhdGVJbnRlcmZhY2UocHJvY2Vzcy5zdGRpbiwgcHJvY2Vzcy5zdGRvdXQpLnF1ZXN0aW9uKFxuICAgICAgYFBsZWFzZSB1cGRhdGUgdGhlICR7T2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuQ2hhbmdlbG9nTWR9IGZpbGUuIFByZXNzIEVudGVyIHdoZW4geW91IGFyZSBkb25lLi4uYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgdXBkYXRlIHR5cGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiB0YXNrcyB0byBoYW5kbGUgdmVyc2lvbiB1cGRhdGVzOlxuICogMS4gVmFsaWRhdGVzIHRoZSB2ZXJzaW9uIHVwZGF0ZSB0eXBlLlxuICogMi4gQ2hlY2tzIGlmIEdpdCBhbmQgR2l0SHViIENMSSBhcmUgaW5zdGFsbGVkLlxuICogMy4gVmVyaWZpZXMgdGhhdCB0aGUgR2l0IHJlcG9zaXRvcnkgaXMgY2xlYW4uXG4gKiA0LiBSdW5zIHNwZWxsY2hlY2sgYW5kIGxpbnRpbmcuXG4gKiA1LiBCdWlsZHMgdGhlIHByb2plY3QuXG4gKiA2LiBVcGRhdGVzIHZlcnNpb24gaW4gZmlsZXMgYW5kIGNoYW5nZWxvZy5cbiAqIDcuIEFkZHMgdXBkYXRlZCBmaWxlcyB0byBHaXQsIHRhZ3MgdGhlIGNvbW1pdCwgYW5kIHB1c2hlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAqIDguIElmIGFuIE9ic2lkaWFuIHBsdWdpbiwgY29waWVzIHRoZSB1cGRhdGVkIG1hbmlmZXN0IGFuZCBwdWJsaXNoZXMgYSBHaXRIdWIgcmVsZWFzZS5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdHlwZSBvZiB2ZXJzaW9uIHVwZGF0ZSB0byBwZXJmb3JtIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVtYWpvciwgcHJlbWlub3IsIHByZXBhdGNoLCBwcmVyZWxlYXNlLCBvciB4Lnkuelstc3VmZml4XSkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgVXBkYXRlVmVyc2lvbk9wdGlvbnN9IGNvbnRyb2xsaW5nIHRoZSByZWxlYXNlIGJlaGF2aW9yLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB2ZXJzaW9uIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb24odmVyc2lvblVwZGF0ZVR5cGU/OiBzdHJpbmcsIG9wdGlvbnM6IFVwZGF0ZVZlcnNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIHByZXBhcmVHaXRIdWJSZWxlYXNlLFxuICAgIHNob3VsZEFyY2hpdmVEZW1vVmF1bHQgPSB0cnVlLFxuICAgIHNob3VsZEJ1aWxkID0gdHJ1ZSxcbiAgICBzaG91bGRFZGl0Q2hhbmdlbG9nID0gdHJ1ZSxcbiAgICBzaG91bGRSZWxlYXNlID0gdHJ1ZSxcbiAgICBzaG91bGRSdW5DaGVja3MgPSB0cnVlLFxuICAgIHNob3VsZFZlcmlmeUNvbW1pdCA9IHRydWVcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKCF2ZXJzaW9uVXBkYXRlVHlwZSkge1xuICAgIGNvbnN0IG5wbU9sZFZlcnNpb24gPSBwcm9jZXNzLmVudlsnbnBtX29sZF92ZXJzaW9uJ107XG4gICAgY29uc3QgbnBtTmV3VmVyc2lvbiA9IHByb2Nlc3MuZW52WyducG1fbmV3X3ZlcnNpb24nXTtcblxuICAgIGlmIChucG1PbGRWZXJzaW9uICYmIG5wbU5ld1ZlcnNpb24pIHtcbiAgICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5wbU9sZFZlcnNpb24pO1xuICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbihucG1OZXdWZXJzaW9uLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHZlcnNpb24gdXBkYXRlIHR5cGUgcHJvdmlkZWQnKTtcbiAgfVxuXG4gIGxldCBpc09ic2lkaWFuUGx1Z2luID0gZmFsc2U7XG4gIGlmIChleGlzdHNTeW5jKHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RKc29uIH0pKSkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcmVhZFBhY2thZ2VKc29uKCk7XG4gICAgaXNPYnNpZGlhblBsdWdpbiA9IHBhY2thZ2VKc29uLm5hbWUgIT09ICdvYnNpZGlhbi1kZXYtdXRpbHMnO1xuICB9XG5cbiAgdmFsaWRhdGUodmVyc2lvblVwZGF0ZVR5cGUpO1xuICBhd2FpdCBhc3NlcnRHaXRJbnN0YWxsZWQoKTtcbiAgYXdhaXQgYXNzZXJ0R2l0SHViQ2xpSW5zdGFsbGVkKCk7XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IGFzc2VydEdpdFJlcG9DbGVhbigpO1xuICAgIGF3YWl0IG5wbVJ1bignZm9ybWF0OmNoZWNrJyk7XG4gICAgYXdhaXQgbnBtUnVuKCdzcGVsbGNoZWNrJyk7XG4gICAgYXdhaXQgbnBtUnVuKCdsaW50Om1kJyk7XG4gIH1cblxuICAvLyBUaGUgYnVpbGQgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHB1Ymxpc2hpbmcsIG5vdCBhIHZlcmlmaWNhdGlvbiBjaGVjaywgc28gaXQgcnVucyB1bmxlc3MgYHNob3VsZEJ1aWxkYCBpcyBgZmFsc2VgIFx1MjAxNCB0aGlzIGtlZXBzIHRoZSByZWxlYXNlZCBhcnRpZmFjdHMgaW4gc3luYyB3aXRoIHRoZSBjdXJyZW50IGNvZGUgZXZlbiBvbiBhIGZhc3QgcmVsZWFzZS5cbiAgaWYgKHNob3VsZEJ1aWxkKSB7XG4gICAgYXdhaXQgbnBtUnVuKCdidWlsZCcpO1xuICB9XG5cbiAgaWYgKHNob3VsZFJ1bkNoZWNrcykge1xuICAgIGF3YWl0IG5wbVJ1bignbGludCcpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCdmaW5kLW92ZXJleHBvc2VkJyk7XG4gICAgYXdhaXQgbnBtUnVuT3B0aW9uYWwoJ3Rlc3QnKTtcbiAgICBhd2FpdCBucG1SdW5PcHRpb25hbCgndGVzdDppbnRlZ3JhdGlvbicpO1xuICAgIGF3YWl0IG5wbVJ1bk9wdGlvbmFsKCd0ZXN0OmNvdmVyYWdlJyk7XG4gIH1cblxuICBjb25zdCBuZXdWZXJzaW9uID0gYXdhaXQgZ2V0TmV3VmVyc2lvbih2ZXJzaW9uVXBkYXRlVHlwZSk7XG4gIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbikge1xuICAgIGF3YWl0IHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb24pO1xuICB9XG5cbiAgYXdhaXQgdXBkYXRlQ2hhbmdlbG9nKG5ld1ZlcnNpb24sIHsgc2hvdWxkRWRpdENoYW5nZWxvZyB9KTtcbiAgYXdhaXQgYWRkVXBkYXRlZEZpbGVzVG9HaXQobmV3VmVyc2lvbiwgeyBzaG91bGRWZXJpZnlDb21taXQgfSk7XG4gIGF3YWl0IGFkZEdpdFRhZyhuZXdWZXJzaW9uKTtcblxuICBpZiAoIXNob3VsZFJlbGVhc2UpIHtcbiAgICBnZXRMaWJEZWJ1Z2dlcignVmVyc2lvbicpKCdTa2lwcGluZyBnaXQgcHVzaCBhbmQgR2l0SHViIHJlbGVhc2UgKC0tbm8tcmVsZWFzZSkuIFRoZSB2ZXJzaW9uIGJ1bXAsIGNoYW5nZWxvZywgY29tbWl0LCBhbmQgdGFnIGhhdmUgYmVlbiBjcmVhdGVkIGxvY2FsbHkuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZ2l0UHVzaCgpO1xuICBhd2FpdCBwcmVwYXJlR2l0SHViUmVsZWFzZT8uKG5ld1ZlcnNpb24pO1xuICBpZiAoaXNPYnNpZGlhblBsdWdpbiAmJiBzaG91bGRBcmNoaXZlRGVtb1ZhdWx0KSB7XG4gICAgYXdhaXQgYXJjaGl2ZVBsdWdpbkRlbW9WYXVsdCgpO1xuICB9XG4gIGF3YWl0IHB1Ymxpc2hHaXRIdWJSZWxlYXNlKG5ld1ZlcnNpb24sIGlzT2JzaWRpYW5QbHVnaW4pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHZlcnNpb24gaW4gdmFyaW91cyBmaWxlcywgaW5jbHVkaW5nIGBwYWNrYWdlLmpzb25gLCBgcGFja2FnZS1sb2NrLmpzb25gLFxuICogYW5kIE9ic2lkaWFuIHBsdWdpbiBtYW5pZmVzdHMgaWYgYXBwbGljYWJsZS5cbiAqXG4gKiBAcGFyYW0gbmV3VmVyc2lvbiAtIFRoZSBuZXcgdmVyc2lvbiBzdHJpbmcgdG8gdXBkYXRlIGluIHRoZSBmaWxlcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlVmVyc2lvbkluRmlsZXMobmV3VmVyc2lvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGVkaXRQYWNrYWdlSnNvbigocGFja2FnZUpzb24pID0+IHtcbiAgICBwYWNrYWdlSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgfSk7XG5cbiAgYXdhaXQgZWRpdFBhY2thZ2VMb2NrSnNvbih1cGRhdGUsIHsgc2hvdWxkU2tpcElmTWlzc2luZzogdHJ1ZSB9KTtcbiAgYXdhaXQgZWRpdE5wbVNocmlua1dyYXBKc29uKHVwZGF0ZSwgeyBzaG91bGRTa2lwSWZNaXNzaW5nOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWNrYWdlTG9ja0pzb246IFBhY2thZ2VMb2NrSnNvbik6IHZvaWQge1xuICAgIHBhY2thZ2VMb2NrSnNvbi52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICBjb25zdCBkZWZhdWx0UGFja2FnZSA9IHBhY2thZ2VMb2NrSnNvbi5wYWNrYWdlcz8uWycnXTtcbiAgICBpZiAoZGVmYXVsdFBhY2thZ2UpIHtcbiAgICAgIGRlZmF1bHRQYWNrYWdlLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyB0aGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byBlbnN1cmUgaXQgaXMgZWl0aGVyIGEgcmVjb2duaXplZCB0eXBlXG4gKiBvciBhIHZhbGlkIG1hbnVhbCB2ZXJzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gdmVyc2lvblVwZGF0ZVR5cGUgLSBUaGUgdmVyc2lvbiB1cGRhdGUgdHlwZSB0byB2YWxpZGF0ZS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHZlcnNpb24gdXBkYXRlIHR5cGUgaXMgaW52YWxpZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZlcnNpb25VcGRhdGVUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGdldFZlcnNpb25VcGRhdGVUeXBlKHZlcnNpb25VcGRhdGVUeXBlKSA9PT0gVmVyc2lvblVwZGF0ZVR5cGUuSW52YWxpZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdJbnZhbGlkIHZlcnNpb24gdXBkYXRlIHR5cGUuIFBsZWFzZSB1c2UgXFwnbWFqb3JcXCcsIFxcJ21pbm9yXFwnLCBcXCdwYXRjaFxcJywgXFwncHJlbWFqb3JcXCcsIFxcJ3ByZW1pbm9yXFwnLCBcXCdwcmVwYXRjaFxcJywgXFwncHJlcmVsZWFzZVxcJywgb3IgXFwneC55LnpbLXN1ZmZpeF1cXCcgZm9ybWF0LidcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogRmV0Y2hlcyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgT2JzaWRpYW4gZnJvbSB0aGUgR2l0SHViIHJlbGVhc2VzIEFQSS5cbiAqXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPYnNpZGlhbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0TGF0ZXN0T2JzaWRpYW5WZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMgLS0gV2UgcnVuIHRoaXMgb3V0c2lkZSBvZiBPYnNpZGlhbiwgc28gd2UgZG9uJ3QgaGF2ZSBgcmVxdWVzdFVybCgpYC5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9vYnNpZGlhbm1kL29ic2lkaWFuLXJlbGVhc2VzL3JlbGVhc2VzL2xhdGVzdCcpO1xuICBjb25zdCBvYnNpZGlhblJlbGVhc2VzSnNvbiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyBQYXJ0aWFsPE9ic2lkaWFuUmVsZWFzZXNKc29uPjtcbiAgcmV0dXJuIGVuc3VyZU5vbk51bGxhYmxlKG9ic2lkaWFuUmVsZWFzZXNKc29uLm5hbWUsICdDb3VsZCBub3QgZmluZCB0aGUgbmFtZSBvZiB0aGUgbGF0ZXN0IE9ic2lkaWFuIHJlbGVhc2UnKTtcbn1cblxuZnVuY3Rpb24gaXNQcmVSZWxlYXNlKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJlcmVsZWFzZSh2ZXJzaW9uKSAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gdG9GaXJzdExpbmUoJHN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICRzdHJpbmcuc3BsaXQoL1xccj9cXG4vKS5maWx0ZXIoQm9vbGVhbikuc2xpY2UoMCwgMSkuam9pbignJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVZlcnNpb25JbkZpbGVzRm9yUGx1Z2luKG5ld1ZlcnNpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBtYW5pZmVzdEJldGFKc29uUGF0aCA9IHJlc29sdmVQYXRoRnJvbVJvb3RTYWZlKHsgcGF0aDogT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMuTWFuaWZlc3RCZXRhSnNvbiB9KTtcbiAgaWYgKGlzUHJlUmVsZWFzZShuZXdWZXJzaW9uKSkge1xuICAgIGF3YWl0IGNwKFxuICAgICAgcmVzb2x2ZVBhdGhGcm9tUm9vdFNhZmUoeyBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb24gfSksXG4gICAgICBtYW5pZmVzdEJldGFKc29uUGF0aCxcbiAgICAgIHsgZm9yY2U6IHRydWUgfVxuICAgICk7XG4gICAgYXdhaXQgZWRpdEpzb248TWFuaWZlc3Q+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKG1hbmlmZXN0KSA9PiB7XG4gICAgICAgIG1hbmlmZXN0LnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1hbmlmZXN0QmV0YUpzb25cbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsYXRlc3RPYnNpZGlhblZlcnNpb24gPSBhd2FpdCBnZXRMYXRlc3RPYnNpZGlhblZlcnNpb24oKTtcblxuICAgIGF3YWl0IGVkaXRKc29uPE1hbmlmZXN0Pih7XG4gICAgICBlZGl0RnVuY3Rpb246IChtYW5pZmVzdCkgPT4ge1xuICAgICAgICBtYW5pZmVzdC5taW5BcHBWZXJzaW9uID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgICBtYW5pZmVzdC52ZXJzaW9uID0gbmV3VmVyc2lvbjtcbiAgICAgIH0sXG4gICAgICBwYXRoOiBPYnNpZGlhblBsdWdpblJlcG9QYXRocy5NYW5pZmVzdEpzb25cbiAgICB9KTtcblxuICAgIGF3YWl0IGVkaXRKc29uPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KHtcbiAgICAgIGVkaXRGdW5jdGlvbjogKHZlcnNpb25zKSA9PiB7XG4gICAgICAgIHZlcnNpb25zW25ld1ZlcnNpb25dID0gbGF0ZXN0T2JzaWRpYW5WZXJzaW9uO1xuICAgICAgfSxcbiAgICAgIHBhdGg6IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlZlcnNpb25zSnNvblxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0c1N5bmMobWFuaWZlc3RCZXRhSnNvblBhdGgpKSB7XG4gICAgICBhd2FpdCBybShtYW5pZmVzdEJldGFKc29uUGF0aCk7XG4gICAgfVxuICB9XG5cbiAgYXdhaXQgY29weVVwZGF0ZWRNYW5pZmVzdCgpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxpQkFBaUI7QUFDMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFJUCxTQUFTLHNCQUFzQjtBQUMvQixTQUFTLHFCQUFxQjtBQUM5QixTQUFTLCtCQUErQjtBQUN4QyxTQUFTLFlBQVk7QUFDckIsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLG9CQUFvQjtBQUM3QixTQUFTLGdCQUFnQjtBQUN6QjtBQUFB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
@@ -27,7 +27,7 @@
27
27
  *
28
28
  * @param fn - The callback to register with the hook.
29
29
  */
30
- export type HookRegistrar = (fn: () => Promise<void> | void) => void;
30
+ export type HookRegistrar = ($function: () => Promise<void> | void) => void;
31
31
  /**
32
32
  * Parameters for {@link setup}.
33
33
  */
@@ -113,4 +113,4 @@ export {
113
113
  setup,
114
114
  silenceConsole
115
115
  };
116
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NldHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIHRlc3Qtc2V0dXAgZW5kcG9pbnQgZm9yIGBvYnNpZGlhbi1kZXYtdXRpbHNgLlxuICpcbiAqIFdpcmVzIHRoZSBsaWJyYXJ5J3MgcGVyLXRlc3Qgc2V0dXAgaW50byBhIHRlc3QgZnJhbWV3b3JrJ3MgYGJlZm9yZUVhY2hgIC8gYGFmdGVyRWFjaGAgbGlmZWN5Y2xlXG4gKiBob29rcy4gQmVmb3JlIGVhY2ggdGVzdCBpdCByZXNldHMgdGhlIHNoYXJlZC1zdGF0ZSBiYWcgb24gYGdsb2JhbFRoaXMuX19vYnNpZGlhbkRldlV0aWxzYCAoc29cbiAqIGFjY3VtdWxhdGVkIHN0YXRlIHN1Y2ggYXMgZGVidWdnZXJzLCBxdWV1ZXMsIGFuZCByZWdpc3RlcmVkIGhhbmRsZXJzIGRvZXMgbm90IGxlYWsgYmV0d2VlbiB0ZXN0cyksXG4gKiByZXNldHMgdGhlIGluamVjdGVkIHtAbGluayBMaWJyYXJ5fSBzdGF0ZSAoc28gdGhlIG5leHQgdGVzdCBjYW4gcmUtaW5pdGlhbGl6ZSksIGVuYWJsZXNcbiAqIGFzeW5jLW9wZXJhdGlvbiB0cmFja2luZywgc2lsZW5jZXMgZXZlcnkgYGNvbnNvbGVgIG1ldGhvZCAoc28gaW5jaWRlbnRhbCBsb2cvd2Fybi9lcnJvciBvdXRwdXRcbiAqIGRvZXMgbm90IHBvbGx1dGUgdGhlIHRlc3QgcmVwb3J0KSwgY2xlYXJzIGBsb2NhbFN0b3JhZ2VgIChzbyBwZXItd29ya2VyIFdlYiBTdG9yYWdlIHN0YXRlIGRvZXMgbm90XG4gKiBsZWFrIGJldHdlZW4gdGVzdHMpLCBhbmQgc3RhcnRzIGNvbGxlY3RpbmcgdW5oYW5kbGVkIGFzeW5jIGVycm9yczsgYWZ0ZXIgZWFjaCB0ZXN0IGl0IGRyYWlucyBhbnlcbiAqIHRyYWNrZWQgZmlyZS1hbmQtZm9yZ2V0IG9wZXJhdGlvbnMsIGRpc2FibGVzIHRyYWNraW5nLCByZXN0b3JlcyB0aGUgb3JpZ2luYWwgYGNvbnNvbGVgIG1ldGhvZHMsIGFuZFxuICogZmFpbHMgdGhlIHRlc3Qgd2l0aCBhbiBgQWdncmVnYXRlRXJyb3JgIGlmIGFueSB1bmhhbmRsZWQgYXN5bmMgZXJyb3Igd2FzIGVtaXR0ZWQgd2hpbGUgbm8gY29uc3VtZXJcbiAqIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQuIEl0IGFsc28gaW5zdGFsbHMge0BsaW5rIGluc3RhbGxXYXJuaW5nc0FzRXJyb3JzfSBvbmNlLCBzbyBhbnkgTm9kZSBwcm9jZXNzXG4gKiB3YXJuaW5nIGZhaWxzIHRoZSBydW4uIFRlc3RzIGNhbiB0aGVyZWZvcmUgYGF3YWl0IHdhaXRGb3JBbGxBc3luY09wZXJhdGlvbnMoKWAgYWdhaW5zdCBhIGNsZWFuLCBpc29sYXRlZCBzdGF0ZSwgYW5kIGFcbiAqIHRlc3QgdGhhdCBuZWVkcyB0byBhc3NlcnQgb24gY29uc29sZSBvdXRwdXQgY2FuIHJlLWluc3RydW1lbnQgdGhlIG1ldGhvZCBpdCBjYXJlcyBhYm91dCAoZS5nLlxuICogYHZpLnNweU9uKGNvbnNvbGUsICdlcnJvcicpYCksIHdoaWNoIHRyYW5zcGFyZW50bHkgb3ZlcnJpZGVzIHRoZSBuby1vcCBmb3IgdGhhdCB0ZXN0LlxuICpcbiAqIFRoaXMgbW9kdWxlIGhhcyBubyBpbXBvcnQtdGltZSBzaWRlIGVmZmVjdHMgYW5kIG5vIGRlcGVuZGVuY3kgb24gYW55IHNwZWNpZmljIHRlc3QgZnJhbWV3b3JrLiBUaGVcbiAqIHRoaW4gVml0ZXN0L0plc3Qgc2V0dXAgZmlsZXMgKGB2aXRlc3Qtc2V0dXAudHNgIC8gYGplc3Qtc2V0dXAudHNgKSBjYWxsIHtAbGluayBzZXR1cH0gd2l0aCB0aGVcbiAqIGhvb2tzIGltcG9ydGVkIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBmcmFtZXdvcmtzLlxuICovXG5cbmltcG9ydCB7XG4gIGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nLFxuICBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nLFxuICBpc0FzeW5jT3BlcmF0aW9uVHJhY2tpbmdFbmFibGVkLFxuICB3YWl0Rm9yQWxsQXN5bmNPcGVyYXRpb25zXG59IGZyb20gJy4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgc3RhcnRDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnMsXG4gIHN0b3BDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnNcbn0gZnJvbSAnLi9lcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBMaWJyYXJ5IH0gZnJvbSAnLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7IHJlc2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgaW5zdGFsbFdhcm5pbmdzQXNFcnJvcnMgfSBmcm9tICcuL3NjcmlwdC11dGlscy93YXJuaW5ncy1hcy1lcnJvcnMudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBBIHRlc3QtZnJhbWV3b3JrIGxpZmVjeWNsZSBob29rIHJlZ2lzdHJhciwgc3VjaCBhcyBgYmVmb3JlRWFjaGAgb3IgYGFmdGVyRWFjaGAuXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGhvb2suXG4gKi9cbmV4cG9ydCB0eXBlIEhvb2tSZWdpc3RyYXIgPSAoZm46ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dXBQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHRlc3QgZnJhbWV3b3JrJ3MgYGFmdGVyRWFjaGAgaG9vayByZWdpc3RyYXIuIFVzZWQgdG8gdGVhciBkb3duIHBlci10ZXN0IHN0YXRlIGFmdGVyIGVhY2ggdGVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGFmdGVyRWFjaDogSG9va1JlZ2lzdHJhcjtcblxuICAvKipcbiAgICogVGhlIHRlc3QgZnJhbWV3b3JrJ3MgYGJlZm9yZUVhY2hgIGhvb2sgcmVnaXN0cmFyLiBVc2VkIHRvIHNldCB1cCBmcmVzaCBwZXItdGVzdCBzdGF0ZSBiZWZvcmUgZWFjaCB0ZXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgYmVmb3JlRWFjaDogSG9va1JlZ2lzdHJhcjtcbn1cblxuY29uc3QgQ09OU09MRV9NRVRIT0RfTkFNRVMgPSBbXG4gICdhc3NlcnQnLFxuICAnY291bnQnLFxuICAnY291bnRSZXNldCcsXG4gICdkZWJ1ZycsXG4gICdkaXInLFxuICAnZGlyeG1sJyxcbiAgJ2Vycm9yJyxcbiAgJ2dyb3VwJyxcbiAgJ2dyb3VwQ29sbGFwc2VkJyxcbiAgJ2dyb3VwRW5kJyxcbiAgJ2luZm8nLFxuICAnbG9nJyxcbiAgJ3RhYmxlJyxcbiAgJ3RpbWUnLFxuICAndGltZUVuZCcsXG4gICd0aW1lTG9nJyxcbiAgJ3RyYWNlJyxcbiAgJ3dhcm4nXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSAoa2V5b2YgQ29uc29sZSlbXTtcblxudHlwZSBDb25zb2xlTWV0aG9kTmFtZSA9ICh0eXBlb2YgQ09OU09MRV9NRVRIT0RfTkFNRVMpW251bWJlcl07XG5cbmNvbnN0IG9yaWdpbmFsQ29uc29sZU1ldGhvZERlc2NyaXB0b3JzID0gbmV3IE1hcDxDb25zb2xlTWV0aG9kTmFtZSwgUHJvcGVydHlEZXNjcmlwdG9yPigpO1xuXG4vKipcbiAqIFJlc3RvcmVzIGV2ZXJ5IGBjb25zb2xlYCBtZXRob2QgcHJldmlvdXNseSByZXBsYWNlZCBieSB7QGxpbmsgc2lsZW5jZUNvbnNvbGV9IHRvIGl0cyBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVDb25zb2xlKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBkZXNjcmlwdG9yXSBvZiBvcmlnaW5hbENvbnNvbGVNZXRob2REZXNjcmlwdG9ycykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zb2xlLCBtZXRob2ROYW1lLCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBgb2JzaWRpYW4tZGV2LXV0aWxzYCBwZXItdGVzdCBzZXR1cCB3aXRoIGEgdGVzdCBmcmFtZXdvcmsncyBsaWZlY3ljbGUgaG9va3MuXG4gKlxuICogSW5zdGFsbHMge0BsaW5rIGluc3RhbGxXYXJuaW5nc0FzRXJyb3JzfSAob25jZSkgc28gYW55IE5vZGUgcHJvY2VzcyB3YXJuaW5nIGZhaWxzIHRoZSBydW4uIEJlZm9yZVxuICogZWFjaCB0ZXN0ICh2aWEgdGhlIHN1cHBsaWVkIGBiZWZvcmVFYWNoYCkgaXQgcmVzZXRzIHRoZSBzaGFyZWQtc3RhdGUgYmFnIGFuZCB0aGUgaW5qZWN0ZWRcbiAqIHtAbGluayBMaWJyYXJ5fSBzdGF0ZSwgZW5hYmxlcyBhc3luYy1vcGVyYXRpb24gdHJhY2tpbmcsIHNpbGVuY2VzIHRoZSBgY29uc29sZWAsIGNsZWFyc1xuICogYGxvY2FsU3RvcmFnZWAsIGFuZCBzdGFydHMgY29sbGVjdGluZyB1bmhhbmRsZWQgYXN5bmMgZXJyb3JzOyBhZnRlciBlYWNoIHRlc3QgKHZpYSB0aGUgc3VwcGxpZWRcbiAqIGBhZnRlckVhY2hgKSBpdCBkcmFpbnMgdHJhY2tlZCBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucywgZGlzYWJsZXMgdHJhY2tpbmcsIHJlc3RvcmVzIHRoZSBgY29uc29sZWAsXG4gKiBhbmQgZmFpbHMgdGhlIHRlc3QgaWYgYW55IHVuaGFuZGxlZCBhc3luYyBlcnJvciB3YXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGxpZmVjeWNsZSBob29rIHJlZ2lzdHJhcnMgdG8gd2lyZSBzZXR1cCBpbnRvLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXAocGFyYW1zOiBTZXR1cFBhcmFtcyk6IHZvaWQge1xuICBpbnN0YWxsV2FybmluZ3NBc0Vycm9ycygpO1xuICBwYXJhbXMuYmVmb3JlRWFjaChiZWZvcmVFYWNoSGFuZGxlcik7XG4gIHBhcmFtcy5hZnRlckVhY2goYWZ0ZXJFYWNoSGFuZGxlcik7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgZXZlcnkgYGNvbnNvbGVgIG1ldGhvZCB3aXRoIGEgbm8tb3Agc28gaW5jaWRlbnRhbCBvdXRwdXQgZG9lcyBub3QgcG9sbHV0ZSB0aGUgdGVzdCByZXBvcnQuXG4gKlxuICogVGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9ucyBhcmUgY2FwdHVyZWQgb24gZmlyc3QgdXNlIGFuZCByZXN0b3JlZCBieSB7QGxpbmsgcmVzdG9yZUNvbnNvbGV9LiBBIHRlc3RcbiAqIHRoYXQgbmVlZHMgdG8gYXNzZXJ0IG9uIGNvbnNvbGUgb3V0cHV0IGNhbiByZS1pbnN0cnVtZW50IHRoZSBtZXRob2QgaXQgY2FyZXMgYWJvdXQgKGUuZy5cbiAqIGB2aS5zcHlPbihjb25zb2xlLCAnZXJyb3InKWApLCB0cmFuc3BhcmVudGx5IG92ZXJyaWRpbmcgdGhlIG5vLW9wIGZvciB0aGF0IHRlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaWxlbmNlQ29uc29sZSgpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIENPTlNPTEVfTUVUSE9EX05BTUVTKSB7XG4gICAgaWYgKCFvcmlnaW5hbENvbnNvbGVNZXRob2REZXNjcmlwdG9ycy5oYXMobWV0aG9kTmFtZSkpIHtcbiAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBlbnN1cmVOb25OdWxsYWJsZShPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbnNvbGUsIG1ldGhvZE5hbWUpKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZU1ldGhvZERlc2NyaXB0b3JzLnNldChtZXRob2ROYW1lLCBkZXNjcmlwdG9yKTtcbiAgICB9XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc29sZSwgbWV0aG9kTmFtZSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIHZhbHVlOiBub29wLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhZnRlckVhY2hIYW5kbGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBEcmFpbiBmaXJlLWFuZC1mb3JnZXQgb3BlcmF0aW9ucyBmaXJzdCBzbyBhbnkgdGhhdCByZWplY3QgZW1pdCB0aGVpciBhc3luYyBlcnJvciBiZWZvcmUgd2UgY2hlY2suXG4gIC8vIFNraXAgd2hlbiBhIHRlc3QgZGlzYWJsZWQgdHJhY2tpbmcgaXRzZWxmLCBzaW5jZSB3YWl0Rm9yQWxsQXN5bmNPcGVyYXRpb25zIHdvdWxkIHRoZW4gdGhyb3cuXG4gIGlmIChpc0FzeW5jT3BlcmF0aW9uVHJhY2tpbmdFbmFibGVkKCkpIHtcbiAgICBhd2FpdCB3YWl0Rm9yQWxsQXN5bmNPcGVyYXRpb25zKCk7XG4gIH1cbiAgZGlzYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKTtcbiAgcmVzdG9yZUNvbnNvbGUoKTtcblxuICBjb25zdCBzd2FsbG93ZWRBc3luY0Vycm9ycyA9IHN0b3BDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnMoKTtcbiAgaWYgKHN3YWxsb3dlZEFzeW5jRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICBzd2FsbG93ZWRBc3luY0Vycm9ycyxcbiAgICAgIGAke1N0cmluZyhzd2FsbG93ZWRBc3luY0Vycm9ycy5sZW5ndGgpfSB1bmhhbmRsZWQgYXN5bmMgZXJyb3Iocykgb2NjdXJyZWQgZHVyaW5nIHRoZSB0ZXN0LmBcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZm9yZUVhY2hIYW5kbGVyKCk6IHZvaWQge1xuICByZXNldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSgpO1xuICBMaWJyYXJ5LnJlc2V0VG9EZWZhdWx0KCk7XG4gIGVuYWJsZUFzeW5jT3BlcmF0aW9uVHJhY2tpbmcoKTtcbiAgc2lsZW5jZUNvbnNvbGUoKTtcbiAgY2xlYXJMb2NhbFN0b3JhZ2UoKTtcbiAgc3RhcnRDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnMoKTtcbn1cblxuZnVuY3Rpb24gY2xlYXJMb2NhbFN0b3JhZ2UoKTogdm9pZCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUZXN0IHNldHVwOiBjbGVhcmluZyBwZXItd29ya2VyIGxvY2FsU3RvcmFnZTsgZ3VhcmRlZCwgYW5kIHByb3ZpZGVkIG9ubHkgd2hlcmUgbm9kZSBzdXBwb3J0cyBpdC5cbiAgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscywgbi9uby11bnN1cHBvcnRlZC1mZWF0dXJlcy9ub2RlLWJ1aWx0aW5zIC0tIFRlc3Qgc2V0dXA6IGNsZWFyaW5nIHBlci13b3JrZXIgbG9jYWxTdG9yYWdlLlxuICAgIGxvY2FsU3RvcmFnZS5jbGVhcigpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXdCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyxlQUFlO0FBQ3hCLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsK0JBQStCO0FBQ3hDLFNBQVMseUJBQXlCO0FBd0JsQyxNQUFNLHVCQUF1QjtBQUFBLEVBQzNCO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjtBQUlBLE1BQU0sbUNBQW1DLG9CQUFJLElBQTJDO0FBS2pGLFNBQVMsaUJBQXVCO0FBQ3JDLGFBQVcsQ0FBQyxZQUFZLFVBQVUsS0FBSyxrQ0FBa0M7QUFDdkUsV0FBTyxlQUFlLFNBQVMsWUFBWSxVQUFVO0FBQUEsRUFDdkQ7QUFDRjtBQWNPLFNBQVMsTUFBTSxRQUEyQjtBQUMvQywwQkFBd0I7QUFDeEIsU0FBTyxXQUFXLGlCQUFpQjtBQUNuQyxTQUFPLFVBQVUsZ0JBQWdCO0FBQ25DO0FBU08sU0FBUyxpQkFBdUI7QUFDckMsYUFBVyxjQUFjLHNCQUFzQjtBQUM3QyxRQUFJLENBQUMsaUNBQWlDLElBQUksVUFBVSxHQUFHO0FBQ3JELFlBQU0sYUFBYSxrQkFBa0IsT0FBTyx5QkFBeUIsU0FBUyxVQUFVLENBQUM7QUFDekYsdUNBQWlDLElBQUksWUFBWSxVQUFVO0FBQUEsSUFDN0Q7QUFFQSxXQUFPLGVBQWUsU0FBUyxZQUFZO0FBQUEsTUFDekMsY0FBYztBQUFBLE1BQ2QsWUFBWTtBQUFBLE1BQ1osT0FBTztBQUFBLE1BQ1AsVUFBVTtBQUFBLElBQ1osQ0FBQztBQUFBLEVBQ0g7QUFDRjtBQUVBLGVBQWUsbUJBQWtDO0FBRy9DLE1BQUksZ0NBQWdDLEdBQUc7QUFDckMsVUFBTSwwQkFBMEI7QUFBQSxFQUNsQztBQUNBLGdDQUE4QjtBQUM5QixpQkFBZTtBQUVmLFFBQU0sdUJBQXVCLG1DQUFtQztBQUNoRSxNQUFJLHFCQUFxQixTQUFTLEdBQUc7QUFDbkMsVUFBTSxJQUFJO0FBQUEsTUFDUjtBQUFBLE1BQ0EsR0FBRyxPQUFPLHFCQUFxQixNQUFNLENBQUM7QUFBQSxJQUN4QztBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsb0JBQTBCO0FBQ2pDLDZCQUEyQjtBQUMzQixVQUFRLGVBQWU7QUFDdkIsK0JBQTZCO0FBQzdCLGlCQUFlO0FBQ2Ysb0JBQWtCO0FBQ2xCLHNDQUFvQztBQUN0QztBQUVBLFNBQVMsb0JBQTBCO0FBRWpDLE1BQUksT0FBTyxpQkFBaUIsYUFBYTtBQUV2QyxpQkFBYSxNQUFNO0FBQUEsRUFDckI7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
116
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3NldHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRnJhbWV3b3JrLWFnbm9zdGljIHRlc3Qtc2V0dXAgZW5kcG9pbnQgZm9yIGBvYnNpZGlhbi1kZXYtdXRpbHNgLlxuICpcbiAqIFdpcmVzIHRoZSBsaWJyYXJ5J3MgcGVyLXRlc3Qgc2V0dXAgaW50byBhIHRlc3QgZnJhbWV3b3JrJ3MgYGJlZm9yZUVhY2hgIC8gYGFmdGVyRWFjaGAgbGlmZWN5Y2xlXG4gKiBob29rcy4gQmVmb3JlIGVhY2ggdGVzdCBpdCByZXNldHMgdGhlIHNoYXJlZC1zdGF0ZSBiYWcgb24gYGdsb2JhbFRoaXMuX19vYnNpZGlhbkRldlV0aWxzYCAoc29cbiAqIGFjY3VtdWxhdGVkIHN0YXRlIHN1Y2ggYXMgZGVidWdnZXJzLCBxdWV1ZXMsIGFuZCByZWdpc3RlcmVkIGhhbmRsZXJzIGRvZXMgbm90IGxlYWsgYmV0d2VlbiB0ZXN0cyksXG4gKiByZXNldHMgdGhlIGluamVjdGVkIHtAbGluayBMaWJyYXJ5fSBzdGF0ZSAoc28gdGhlIG5leHQgdGVzdCBjYW4gcmUtaW5pdGlhbGl6ZSksIGVuYWJsZXNcbiAqIGFzeW5jLW9wZXJhdGlvbiB0cmFja2luZywgc2lsZW5jZXMgZXZlcnkgYGNvbnNvbGVgIG1ldGhvZCAoc28gaW5jaWRlbnRhbCBsb2cvd2Fybi9lcnJvciBvdXRwdXRcbiAqIGRvZXMgbm90IHBvbGx1dGUgdGhlIHRlc3QgcmVwb3J0KSwgY2xlYXJzIGBsb2NhbFN0b3JhZ2VgIChzbyBwZXItd29ya2VyIFdlYiBTdG9yYWdlIHN0YXRlIGRvZXMgbm90XG4gKiBsZWFrIGJldHdlZW4gdGVzdHMpLCBhbmQgc3RhcnRzIGNvbGxlY3RpbmcgdW5oYW5kbGVkIGFzeW5jIGVycm9yczsgYWZ0ZXIgZWFjaCB0ZXN0IGl0IGRyYWlucyBhbnlcbiAqIHRyYWNrZWQgZmlyZS1hbmQtZm9yZ2V0IG9wZXJhdGlvbnMsIGRpc2FibGVzIHRyYWNraW5nLCByZXN0b3JlcyB0aGUgb3JpZ2luYWwgYGNvbnNvbGVgIG1ldGhvZHMsIGFuZFxuICogZmFpbHMgdGhlIHRlc3Qgd2l0aCBhbiBgQWdncmVnYXRlRXJyb3JgIGlmIGFueSB1bmhhbmRsZWQgYXN5bmMgZXJyb3Igd2FzIGVtaXR0ZWQgd2hpbGUgbm8gY29uc3VtZXJcbiAqIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQuIEl0IGFsc28gaW5zdGFsbHMge0BsaW5rIGluc3RhbGxXYXJuaW5nc0FzRXJyb3JzfSBvbmNlLCBzbyBhbnkgTm9kZSBwcm9jZXNzXG4gKiB3YXJuaW5nIGZhaWxzIHRoZSBydW4uIFRlc3RzIGNhbiB0aGVyZWZvcmUgYGF3YWl0IHdhaXRGb3JBbGxBc3luY09wZXJhdGlvbnMoKWAgYWdhaW5zdCBhIGNsZWFuLCBpc29sYXRlZCBzdGF0ZSwgYW5kIGFcbiAqIHRlc3QgdGhhdCBuZWVkcyB0byBhc3NlcnQgb24gY29uc29sZSBvdXRwdXQgY2FuIHJlLWluc3RydW1lbnQgdGhlIG1ldGhvZCBpdCBjYXJlcyBhYm91dCAoZS5nLlxuICogYHZpLnNweU9uKGNvbnNvbGUsICdlcnJvcicpYCksIHdoaWNoIHRyYW5zcGFyZW50bHkgb3ZlcnJpZGVzIHRoZSBuby1vcCBmb3IgdGhhdCB0ZXN0LlxuICpcbiAqIFRoaXMgbW9kdWxlIGhhcyBubyBpbXBvcnQtdGltZSBzaWRlIGVmZmVjdHMgYW5kIG5vIGRlcGVuZGVuY3kgb24gYW55IHNwZWNpZmljIHRlc3QgZnJhbWV3b3JrLiBUaGVcbiAqIHRoaW4gVml0ZXN0L0plc3Qgc2V0dXAgZmlsZXMgKGB2aXRlc3Qtc2V0dXAudHNgIC8gYGplc3Qtc2V0dXAudHNgKSBjYWxsIHtAbGluayBzZXR1cH0gd2l0aCB0aGVcbiAqIGhvb2tzIGltcG9ydGVkIGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBmcmFtZXdvcmtzLlxuICovXG5cbmltcG9ydCB7XG4gIGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nLFxuICBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nLFxuICBpc0FzeW5jT3BlcmF0aW9uVHJhY2tpbmdFbmFibGVkLFxuICB3YWl0Rm9yQWxsQXN5bmNPcGVyYXRpb25zXG59IGZyb20gJy4vYXN5bmMudHMnO1xuaW1wb3J0IHtcbiAgc3RhcnRDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnMsXG4gIHN0b3BDb2xsZWN0aW5nVW5oYW5kbGVkQXN5bmNFcnJvcnNcbn0gZnJvbSAnLi9lcnJvci50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9mdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBMaWJyYXJ5IH0gZnJvbSAnLi9saWJyYXJ5LnRzJztcbmltcG9ydCB7IHJlc2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHsgaW5zdGFsbFdhcm5pbmdzQXNFcnJvcnMgfSBmcm9tICcuL3NjcmlwdC11dGlscy93YXJuaW5ncy1hcy1lcnJvcnMudHMnO1xuaW1wb3J0IHsgZW5zdXJlTm9uTnVsbGFibGUgfSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBBIHRlc3QtZnJhbWV3b3JrIGxpZmVjeWNsZSBob29rIHJlZ2lzdHJhciwgc3VjaCBhcyBgYmVmb3JlRWFjaGAgb3IgYGFmdGVyRWFjaGAuXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGNhbGxiYWNrIHRvIHJlZ2lzdGVyIHdpdGggdGhlIGhvb2suXG4gKi9cbmV4cG9ydCB0eXBlIEhvb2tSZWdpc3RyYXIgPSAoJGZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZCkgPT4gdm9pZDtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc2V0dXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXN0IGZyYW1ld29yaydzIGBhZnRlckVhY2hgIGhvb2sgcmVnaXN0cmFyLiBVc2VkIHRvIHRlYXIgZG93biBwZXItdGVzdCBzdGF0ZSBhZnRlciBlYWNoIHRlc3QuXG4gICAqL1xuICByZWFkb25seSBhZnRlckVhY2g6IEhvb2tSZWdpc3RyYXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXN0IGZyYW1ld29yaydzIGBiZWZvcmVFYWNoYCBob29rIHJlZ2lzdHJhci4gVXNlZCB0byBzZXQgdXAgZnJlc2ggcGVyLXRlc3Qgc3RhdGUgYmVmb3JlIGVhY2ggdGVzdC5cbiAgICovXG4gIHJlYWRvbmx5IGJlZm9yZUVhY2g6IEhvb2tSZWdpc3RyYXI7XG59XG5cbmNvbnN0IENPTlNPTEVfTUVUSE9EX05BTUVTID0gW1xuICAnYXNzZXJ0JyxcbiAgJ2NvdW50JyxcbiAgJ2NvdW50UmVzZXQnLFxuICAnZGVidWcnLFxuICAnZGlyJyxcbiAgJ2RpcnhtbCcsXG4gICdlcnJvcicsXG4gICdncm91cCcsXG4gICdncm91cENvbGxhcHNlZCcsXG4gICdncm91cEVuZCcsXG4gICdpbmZvJyxcbiAgJ2xvZycsXG4gICd0YWJsZScsXG4gICd0aW1lJyxcbiAgJ3RpbWVFbmQnLFxuICAndGltZUxvZycsXG4gICd0cmFjZScsXG4gICd3YXJuJ1xuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgKGtleW9mIENvbnNvbGUpW107XG5cbnR5cGUgQ29uc29sZU1ldGhvZE5hbWUgPSAodHlwZW9mIENPTlNPTEVfTUVUSE9EX05BTUVTKVtudW1iZXJdO1xuXG5jb25zdCBvcmlnaW5hbENvbnNvbGVNZXRob2REZXNjcmlwdG9ycyA9IG5ldyBNYXA8Q29uc29sZU1ldGhvZE5hbWUsIFByb3BlcnR5RGVzY3JpcHRvcj4oKTtcblxuLyoqXG4gKiBSZXN0b3JlcyBldmVyeSBgY29uc29sZWAgbWV0aG9kIHByZXZpb3VzbHkgcmVwbGFjZWQgYnkge0BsaW5rIHNpbGVuY2VDb25zb2xlfSB0byBpdHMgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlQ29uc29sZSgpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgZGVzY3JpcHRvcl0gb2Ygb3JpZ2luYWxDb25zb2xlTWV0aG9kRGVzY3JpcHRvcnMpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29uc29sZSwgbWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYG9ic2lkaWFuLWRldi11dGlsc2AgcGVyLXRlc3Qgc2V0dXAgd2l0aCBhIHRlc3QgZnJhbWV3b3JrJ3MgbGlmZWN5Y2xlIGhvb2tzLlxuICpcbiAqIEluc3RhbGxzIHtAbGluayBpbnN0YWxsV2FybmluZ3NBc0Vycm9yc30gKG9uY2UpIHNvIGFueSBOb2RlIHByb2Nlc3Mgd2FybmluZyBmYWlscyB0aGUgcnVuLiBCZWZvcmVcbiAqIGVhY2ggdGVzdCAodmlhIHRoZSBzdXBwbGllZCBgYmVmb3JlRWFjaGApIGl0IHJlc2V0cyB0aGUgc2hhcmVkLXN0YXRlIGJhZyBhbmQgdGhlIGluamVjdGVkXG4gKiB7QGxpbmsgTGlicmFyeX0gc3RhdGUsIGVuYWJsZXMgYXN5bmMtb3BlcmF0aW9uIHRyYWNraW5nLCBzaWxlbmNlcyB0aGUgYGNvbnNvbGVgLCBjbGVhcnNcbiAqIGBsb2NhbFN0b3JhZ2VgLCBhbmQgc3RhcnRzIGNvbGxlY3RpbmcgdW5oYW5kbGVkIGFzeW5jIGVycm9yczsgYWZ0ZXIgZWFjaCB0ZXN0ICh2aWEgdGhlIHN1cHBsaWVkXG4gKiBgYWZ0ZXJFYWNoYCkgaXQgZHJhaW5zIHRyYWNrZWQgZmlyZS1hbmQtZm9yZ2V0IG9wZXJhdGlvbnMsIGRpc2FibGVzIHRyYWNraW5nLCByZXN0b3JlcyB0aGUgYGNvbnNvbGVgLFxuICogYW5kIGZhaWxzIHRoZSB0ZXN0IGlmIGFueSB1bmhhbmRsZWQgYXN5bmMgZXJyb3Igd2FzIGVtaXR0ZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBsaWZlY3ljbGUgaG9vayByZWdpc3RyYXJzIHRvIHdpcmUgc2V0dXAgaW50by5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwKHBhcmFtczogU2V0dXBQYXJhbXMpOiB2b2lkIHtcbiAgaW5zdGFsbFdhcm5pbmdzQXNFcnJvcnMoKTtcbiAgcGFyYW1zLmJlZm9yZUVhY2goYmVmb3JlRWFjaEhhbmRsZXIpO1xuICBwYXJhbXMuYWZ0ZXJFYWNoKGFmdGVyRWFjaEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIGV2ZXJ5IGBjb25zb2xlYCBtZXRob2Qgd2l0aCBhIG5vLW9wIHNvIGluY2lkZW50YWwgb3V0cHV0IGRvZXMgbm90IHBvbGx1dGUgdGhlIHRlc3QgcmVwb3J0LlxuICpcbiAqIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGNhcHR1cmVkIG9uIGZpcnN0IHVzZSBhbmQgcmVzdG9yZWQgYnkge0BsaW5rIHJlc3RvcmVDb25zb2xlfS4gQSB0ZXN0XG4gKiB0aGF0IG5lZWRzIHRvIGFzc2VydCBvbiBjb25zb2xlIG91dHB1dCBjYW4gcmUtaW5zdHJ1bWVudCB0aGUgbWV0aG9kIGl0IGNhcmVzIGFib3V0IChlLmcuXG4gKiBgdmkuc3B5T24oY29uc29sZSwgJ2Vycm9yJylgKSwgdHJhbnNwYXJlbnRseSBvdmVycmlkaW5nIHRoZSBuby1vcCBmb3IgdGhhdCB0ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lsZW5jZUNvbnNvbGUoKTogdm9pZCB7XG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBDT05TT0xFX01FVEhPRF9OQU1FUykge1xuICAgIGlmICghb3JpZ2luYWxDb25zb2xlTWV0aG9kRGVzY3JpcHRvcnMuaGFzKG1ldGhvZE5hbWUpKSB7XG4gICAgICBjb25zdCBkZXNjcmlwdG9yID0gZW5zdXJlTm9uTnVsbGFibGUoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25zb2xlLCBtZXRob2ROYW1lKSk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVNZXRob2REZXNjcmlwdG9ycy5zZXQobWV0aG9kTmFtZSwgZGVzY3JpcHRvcik7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnNvbGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogbm9vcCxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYWZ0ZXJFYWNoSGFuZGxlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gRHJhaW4gZmlyZS1hbmQtZm9yZ2V0IG9wZXJhdGlvbnMgZmlyc3Qgc28gYW55IHRoYXQgcmVqZWN0IGVtaXQgdGhlaXIgYXN5bmMgZXJyb3IgYmVmb3JlIHdlIGNoZWNrLlxuICAvLyBTa2lwIHdoZW4gYSB0ZXN0IGRpc2FibGVkIHRyYWNraW5nIGl0c2VsZiwgc2luY2Ugd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucyB3b3VsZCB0aGVuIHRocm93LlxuICBpZiAoaXNBc3luY09wZXJhdGlvblRyYWNraW5nRW5hYmxlZCgpKSB7XG4gICAgYXdhaXQgd2FpdEZvckFsbEFzeW5jT3BlcmF0aW9ucygpO1xuICB9XG4gIGRpc2FibGVBc3luY09wZXJhdGlvblRyYWNraW5nKCk7XG4gIHJlc3RvcmVDb25zb2xlKCk7XG5cbiAgY29uc3Qgc3dhbGxvd2VkQXN5bmNFcnJvcnMgPSBzdG9wQ29sbGVjdGluZ1VuaGFuZGxlZEFzeW5jRXJyb3JzKCk7XG4gIGlmIChzd2FsbG93ZWRBc3luY0Vycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgc3dhbGxvd2VkQXN5bmNFcnJvcnMsXG4gICAgICBgJHtTdHJpbmcoc3dhbGxvd2VkQXN5bmNFcnJvcnMubGVuZ3RoKX0gdW5oYW5kbGVkIGFzeW5jIGVycm9yKHMpIG9jY3VycmVkIGR1cmluZyB0aGUgdGVzdC5gXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBiZWZvcmVFYWNoSGFuZGxlcigpOiB2b2lkIHtcbiAgcmVzZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoKTtcbiAgTGlicmFyeS5yZXNldFRvRGVmYXVsdCgpO1xuICBlbmFibGVBc3luY09wZXJhdGlvblRyYWNraW5nKCk7XG4gIHNpbGVuY2VDb25zb2xlKCk7XG4gIGNsZWFyTG9jYWxTdG9yYWdlKCk7XG4gIHN0YXJ0Q29sbGVjdGluZ1VuaGFuZGxlZEFzeW5jRXJyb3JzKCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyTG9jYWxTdG9yYWdlKCk6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzLCBuL25vLXVuc3VwcG9ydGVkLWZlYXR1cmVzL25vZGUtYnVpbHRpbnMgLS0gVGVzdCBzZXR1cDogY2xlYXJpbmcgcGVyLXdvcmtlciBsb2NhbFN0b3JhZ2U7IGd1YXJkZWQsIGFuZCBwcm92aWRlZCBvbmx5IHdoZXJlIG5vZGUgc3VwcG9ydHMgaXQuXG4gIGlmICh0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMsIG4vbm8tdW5zdXBwb3J0ZWQtZmVhdHVyZXMvbm9kZS1idWlsdGlucyAtLSBUZXN0IHNldHVwOiBjbGVhcmluZyBwZXItd29ya2VyIGxvY2FsU3RvcmFnZS5cbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3QkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsZUFBZTtBQUN4QixTQUFTLGtDQUFrQztBQUMzQyxTQUFTLCtCQUErQjtBQUN4QyxTQUFTLHlCQUF5QjtBQXdCbEMsTUFBTSx1QkFBdUI7QUFBQSxFQUMzQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Y7QUFJQSxNQUFNLG1DQUFtQyxvQkFBSSxJQUEyQztBQUtqRixTQUFTLGlCQUF1QjtBQUNyQyxhQUFXLENBQUMsWUFBWSxVQUFVLEtBQUssa0NBQWtDO0FBQ3ZFLFdBQU8sZUFBZSxTQUFTLFlBQVksVUFBVTtBQUFBLEVBQ3ZEO0FBQ0Y7QUFjTyxTQUFTLE1BQU0sUUFBMkI7QUFDL0MsMEJBQXdCO0FBQ3hCLFNBQU8sV0FBVyxpQkFBaUI7QUFDbkMsU0FBTyxVQUFVLGdCQUFnQjtBQUNuQztBQVNPLFNBQVMsaUJBQXVCO0FBQ3JDLGFBQVcsY0FBYyxzQkFBc0I7QUFDN0MsUUFBSSxDQUFDLGlDQUFpQyxJQUFJLFVBQVUsR0FBRztBQUNyRCxZQUFNLGFBQWEsa0JBQWtCLE9BQU8seUJBQXlCLFNBQVMsVUFBVSxDQUFDO0FBQ3pGLHVDQUFpQyxJQUFJLFlBQVksVUFBVTtBQUFBLElBQzdEO0FBRUEsV0FBTyxlQUFlLFNBQVMsWUFBWTtBQUFBLE1BQ3pDLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxNQUNQLFVBQVU7QUFBQSxJQUNaLENBQUM7QUFBQSxFQUNIO0FBQ0Y7QUFFQSxlQUFlLG1CQUFrQztBQUcvQyxNQUFJLGdDQUFnQyxHQUFHO0FBQ3JDLFVBQU0sMEJBQTBCO0FBQUEsRUFDbEM7QUFDQSxnQ0FBOEI7QUFDOUIsaUJBQWU7QUFFZixRQUFNLHVCQUF1QixtQ0FBbUM7QUFDaEUsTUFBSSxxQkFBcUIsU0FBUyxHQUFHO0FBQ25DLFVBQU0sSUFBSTtBQUFBLE1BQ1I7QUFBQSxNQUNBLEdBQUcsT0FBTyxxQkFBcUIsTUFBTSxDQUFDO0FBQUEsSUFDeEM7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLG9CQUEwQjtBQUNqQyw2QkFBMkI7QUFDM0IsVUFBUSxlQUFlO0FBQ3ZCLCtCQUE2QjtBQUM3QixpQkFBZTtBQUNmLG9CQUFrQjtBQUNsQixzQ0FBb0M7QUFDdEM7QUFFQSxTQUFTLG9CQUEwQjtBQUVqQyxNQUFJLE9BQU8saUJBQWlCLGFBQWE7QUFFdkMsaUJBQWEsTUFBTTtBQUFBLEVBQ3JCO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -31,10 +31,10 @@ type StrictProxyPartialObject<T> = {
31
31
  * optional properties without triggering the proxy's error on missing props.
32
32
  *
33
33
  * @typeParam T - The object type.
34
- * @param obj - The object to bypass.
34
+ * @param $object - The object to bypass.
35
35
  * @returns The unwrapped object.
36
36
  */
37
- export declare function bypassStrictProxy<T>(obj: T): T;
37
+ export declare function bypassStrictProxy<T>($object: T): T;
38
38
  /**
39
39
  * Creates a strictly-typed mock object from a partial implementation.
40
40
  * Uses a `Proxy` that throws a descriptive error when any unmocked