@mnaoumov/obsidian-lib 0.0.0 → 1.0.1

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 (1044) hide show
  1. package/@types/dataview/api/data-array/package.json +4 -0
  2. package/@types/dataview/api/extensions/package.json +4 -0
  3. package/@types/dataview/api/inline-api/package.json +4 -0
  4. package/@types/dataview/api/plugin-api/package.json +4 -0
  5. package/@types/dataview/api/result/package.json +4 -0
  6. package/@types/dataview/data-import/common/package.json +4 -0
  7. package/@types/dataview/data-import/csv/package.json +4 -0
  8. package/@types/dataview/data-import/inline-field/package.json +4 -0
  9. package/@types/dataview/data-import/markdown-file/package.json +4 -0
  10. package/@types/dataview/data-import/persister/package.json +4 -0
  11. package/@types/dataview/data-import/web-worker/import-entry/package.json +4 -0
  12. package/@types/dataview/data-import/web-worker/import-impl/package.json +4 -0
  13. package/@types/dataview/data-import/web-worker/import-manager/package.json +4 -0
  14. package/@types/dataview/data-index/index/package.json +4 -0
  15. package/@types/dataview/data-index/package.json +4 -0
  16. package/@types/dataview/data-index/resolver/package.json +4 -0
  17. package/@types/dataview/data-index/source/package.json +4 -0
  18. package/@types/dataview/data-model/markdown/package.json +4 -0
  19. package/@types/dataview/data-model/serialized/markdown/package.json +4 -0
  20. package/@types/dataview/data-model/transferable/package.json +4 -0
  21. package/@types/dataview/data-model/value/package.json +4 -0
  22. package/@types/dataview/expression/binaryop/package.json +4 -0
  23. package/@types/dataview/expression/context/package.json +4 -0
  24. package/@types/dataview/expression/field/package.json +4 -0
  25. package/@types/dataview/expression/functions/package.json +4 -0
  26. package/@types/dataview/expression/parse/package.json +4 -0
  27. package/@types/dataview/index/package.json +4 -0
  28. package/@types/dataview/main/package.json +4 -0
  29. package/@types/dataview/package.json +4 -0
  30. package/@types/dataview/query/engine/package.json +4 -0
  31. package/@types/dataview/query/parse/package.json +4 -0
  32. package/@types/dataview/query/query/package.json +4 -0
  33. package/@types/dataview/settings/package.json +4 -0
  34. package/@types/dataview/typings/obsidian-ex/package.json +4 -0
  35. package/@types/dataview/typings/workers/package.json +4 -0
  36. package/@types/dataview/ui/export/markdown/package.json +4 -0
  37. package/@types/dataview/ui/lp-render/package.json +4 -0
  38. package/@types/dataview/ui/markdown/package.json +4 -0
  39. package/@types/dataview/ui/refreshable-view/package.json +4 -0
  40. package/@types/dataview/ui/render/package.json +4 -0
  41. package/@types/dataview/ui/views/calendar-view/package.json +4 -0
  42. package/@types/dataview/ui/views/inline-field-live-preview/package.json +4 -0
  43. package/@types/dataview/ui/views/inline-view/package.json +4 -0
  44. package/@types/dataview/ui/views/js-view/package.json +4 -0
  45. package/@types/dataview/ui/views/list-view/package.json +4 -0
  46. package/@types/dataview/ui/views/table-view/package.json +4 -0
  47. package/@types/dataview/ui/views/task-view/package.json +4 -0
  48. package/@types/dataview/util/hash/package.json +4 -0
  49. package/@types/dataview/util/locale/package.json +4 -0
  50. package/@types/dataview/util/media/package.json +4 -0
  51. package/@types/dataview/util/normalize/package.json +4 -0
  52. package/@types/i18next/package.json +4 -0
  53. package/@types/obsidian-integration-testing/package.json +4 -0
  54. package/@types/original-fs/package.json +4 -0
  55. package/LICENSE +21 -0
  56. package/README.md +15 -1
  57. package/codemirror/index/package.json +6 -0
  58. package/codemirror/package.json +6 -0
  59. package/codemirror/state-field-spec/package.json +6 -0
  60. package/command-handlers/abstract-file-command-handler/package.json +6 -0
  61. package/command-handlers/command-handler/package.json +6 -0
  62. package/command-handlers/command-handler-component/package.json +6 -0
  63. package/command-handlers/editor-command-handler/package.json +6 -0
  64. package/command-handlers/file-command-handler/package.json +6 -0
  65. package/command-handlers/folder-command-handler/package.json +6 -0
  66. package/command-handlers/global-command-handler/package.json +6 -0
  67. package/command-handlers/index/package.json +6 -0
  68. package/command-handlers/open-demo-vault-command-handler/package.json +6 -0
  69. package/command-handlers/open-settings-command-handler/package.json +6 -0
  70. package/command-handlers/package.json +6 -0
  71. package/command-handlers/unlock-active-note-command-handler/package.json +6 -0
  72. package/components/abort-signal-component/package.json +6 -0
  73. package/components/all-windows-event-component/package.json +6 -0
  74. package/components/async-error-handler-component/package.json +6 -0
  75. package/components/async-events-component/package.json +6 -0
  76. package/components/case-insensitive-file-index-component/package.json +6 -0
  77. package/components/component-ex/package.json +6 -0
  78. package/components/console-debug-component/package.json +6 -0
  79. package/components/core-plugin-toggle-component/package.json +6 -0
  80. package/components/disposable-component/package.json +6 -0
  81. package/components/embed-extensions-component/package.json +6 -0
  82. package/components/generate-markdown-link-default-params-component/package.json +6 -0
  83. package/components/index/package.json +6 -0
  84. package/components/layout-ready-component/package.json +6 -0
  85. package/components/menu-event-registrar-component/package.json +6 -0
  86. package/components/monkey-around-component/package.json +6 -0
  87. package/components/notebook-navigator-menu-event-registrar-component/package.json +6 -0
  88. package/components/package.json +6 -0
  89. package/components/plugin-context-component/package.json +6 -0
  90. package/components/plugin-gate-component/package.json +6 -0
  91. package/components/plugin-notice-component/package.json +6 -0
  92. package/components/plugin-settings-component/package.json +6 -0
  93. package/components/plugin-settings-tab-component/package.json +6 -0
  94. package/components/plugin-suggestion-component/package.json +6 -0
  95. package/components/pointer-position-component/package.json +6 -0
  96. package/components/registry-component/package.json +6 -0
  97. package/components/release-notes-component/package.json +6 -0
  98. package/components/rename-delete-handler-component/package.json +6 -0
  99. package/components/rmdir-guard-component/package.json +6 -0
  100. package/components/settings-migration-component/package.json +6 -0
  101. package/components/syntax-highlighting-component/package.json +6 -0
  102. package/components/templates-language-component/package.json +6 -0
  103. package/constructors/get-dom-events-handlers-constructor/package.json +6 -0
  104. package/constructors/index/package.json +6 -0
  105. package/constructors/package.json +6 -0
  106. package/dist/lib/cjs/@types/dataview/api/data-array.d.cts +137 -0
  107. package/dist/lib/cjs/@types/dataview/api/extensions.d.cts +16 -0
  108. package/dist/lib/cjs/@types/dataview/api/inline-api.d.cts +187 -0
  109. package/dist/lib/cjs/@types/dataview/api/plugin-api.d.cts +210 -0
  110. package/dist/lib/cjs/@types/dataview/api/result.d.cts +39 -0
  111. package/dist/lib/cjs/@types/dataview/data-import/common.d.cts +4 -0
  112. package/dist/lib/cjs/@types/dataview/data-import/csv.d.cts +4 -0
  113. package/dist/lib/cjs/@types/dataview/data-import/inline-field.d.cts +43 -0
  114. package/dist/lib/cjs/@types/dataview/data-import/markdown-file.d.cts +53 -0
  115. package/dist/lib/cjs/@types/dataview/data-import/persister.d.cts +33 -0
  116. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-entry.d.cts +2 -0
  117. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-impl.d.cts +7 -0
  118. package/dist/lib/cjs/@types/dataview/data-import/web-worker/import-manager.d.cts +38 -0
  119. package/dist/lib/cjs/@types/dataview/data-index/index.d.cts +187 -0
  120. package/dist/lib/cjs/@types/dataview/data-index/resolver.d.cts +24 -0
  121. package/dist/lib/cjs/@types/dataview/data-index/source.d.cts +72 -0
  122. package/dist/lib/cjs/@types/dataview/data-model/markdown.d.cts +116 -0
  123. package/dist/lib/cjs/@types/dataview/data-model/serialized/markdown.d.cts +107 -0
  124. package/dist/lib/cjs/@types/dataview/data-model/transferable.d.cts +8 -0
  125. package/dist/lib/cjs/@types/dataview/data-model/value.d.cts +176 -0
  126. package/dist/lib/cjs/@types/dataview/expression/binaryop.d.cts +44 -0
  127. package/dist/lib/cjs/@types/dataview/expression/context.d.cts +50 -0
  128. package/dist/lib/cjs/@types/dataview/expression/field.d.cts +83 -0
  129. package/dist/lib/cjs/@types/dataview/expression/functions.d.cts +150 -0
  130. package/dist/lib/cjs/@types/dataview/expression/parse.d.cts +164 -0
  131. package/dist/lib/cjs/@types/dataview/index.d.cts +56 -0
  132. package/dist/lib/cjs/@types/dataview/main.d.cts +53 -0
  133. package/dist/lib/cjs/@types/dataview/query/engine.d.cts +104 -0
  134. package/dist/lib/cjs/@types/dataview/query/parse.d.cts +45 -0
  135. package/dist/lib/cjs/@types/dataview/query/query.d.cts +96 -0
  136. package/dist/lib/cjs/@types/dataview/settings.d.cts +61 -0
  137. package/dist/lib/cjs/@types/dataview/typings/obsidian-ex.d.cts +29 -0
  138. package/dist/lib/cjs/@types/dataview/typings/workers.d.cts +5 -0
  139. package/dist/lib/cjs/@types/dataview/ui/export/markdown.d.cts +16 -0
  140. package/dist/lib/cjs/@types/dataview/ui/lp-render.d.cts +38 -0
  141. package/dist/lib/cjs/@types/dataview/ui/markdown.d.cts +87 -0
  142. package/dist/lib/cjs/@types/dataview/ui/refreshable-view.d.cts +19 -0
  143. package/dist/lib/cjs/@types/dataview/ui/render.d.cts +34 -0
  144. package/dist/lib/cjs/@types/dataview/ui/views/calendar-view.d.cts +18 -0
  145. package/dist/lib/cjs/@types/dataview/ui/views/inline-field-live-preview.d.cts +43 -0
  146. package/dist/lib/cjs/@types/dataview/ui/views/inline-view.d.cts +29 -0
  147. package/dist/lib/cjs/@types/dataview/ui/views/js-view.d.cts +24 -0
  148. package/dist/lib/cjs/@types/dataview/ui/views/list-view.d.cts +26 -0
  149. package/dist/lib/cjs/@types/dataview/ui/views/table-view.d.cts +29 -0
  150. package/dist/lib/cjs/@types/dataview/ui/views/task-view.d.cts +52 -0
  151. package/dist/lib/cjs/@types/dataview/util/hash.d.cts +2 -0
  152. package/dist/lib/cjs/@types/dataview/util/locale.d.cts +3 -0
  153. package/dist/lib/cjs/@types/dataview/util/media.d.cts +7 -0
  154. package/dist/lib/cjs/@types/dataview/util/normalize.d.cts +45 -0
  155. package/dist/lib/cjs/@types/i18next.d.cts +14 -0
  156. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +29 -0
  157. package/dist/lib/cjs/@types/original-fs.d.cts +15 -0
  158. package/dist/lib/cjs/__merged.cjs +1656 -0
  159. package/dist/lib/cjs/__merged.d.cts +205 -0
  160. package/dist/lib/cjs/active-file-provider.cjs +161 -0
  161. package/dist/lib/cjs/active-file-provider.d.cts +36 -0
  162. package/dist/lib/cjs/app.cjs +153 -0
  163. package/dist/lib/cjs/app.d.cts +17 -0
  164. package/dist/lib/cjs/async-with-notice.cjs +235 -0
  165. package/dist/lib/cjs/async-with-notice.d.cts +113 -0
  166. package/dist/lib/cjs/attachment-path.cjs +379 -0
  167. package/dist/lib/cjs/attachment-path.d.cts +341 -0
  168. package/dist/lib/cjs/attachment-unit-folder.cjs +168 -0
  169. package/dist/lib/cjs/attachment-unit-folder.d.cts +103 -0
  170. package/dist/lib/cjs/backlink-index.cjs +249 -0
  171. package/dist/lib/cjs/backlink-index.d.cts +51 -0
  172. package/dist/lib/cjs/backlink.cjs +217 -0
  173. package/dist/lib/cjs/backlink.d.cts +66 -0
  174. package/dist/lib/cjs/bases-view-registrar.cjs +162 -0
  175. package/dist/lib/cjs/bases-view-registrar.d.cts +52 -0
  176. package/dist/lib/cjs/callout.cjs +220 -0
  177. package/dist/lib/cjs/callout.d.cts +76 -0
  178. package/dist/lib/cjs/canvas.cjs +215 -0
  179. package/dist/lib/cjs/canvas.d.cts +28 -0
  180. package/dist/lib/cjs/case-insensitive-file-index.cjs +244 -0
  181. package/dist/lib/cjs/case-insensitive-file-index.d.cts +92 -0
  182. package/dist/lib/cjs/code-block-markdown-information.cjs +131 -0
  183. package/dist/lib/cjs/code-block-markdown-information.d.cts +48 -0
  184. package/dist/lib/cjs/code-block-reg-exp.cjs +145 -0
  185. package/dist/lib/cjs/code-block-reg-exp.d.cts +39 -0
  186. package/dist/lib/cjs/codemirror/index.cjs +153 -0
  187. package/dist/lib/cjs/codemirror/index.d.cts +2 -0
  188. package/dist/lib/cjs/codemirror/state-field-spec.cjs +131 -0
  189. package/dist/lib/cjs/codemirror/state-field-spec.d.cts +72 -0
  190. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.cjs +416 -0
  191. package/dist/lib/cjs/command-handlers/abstract-file-command-handler.d.cts +274 -0
  192. package/dist/lib/cjs/command-handlers/command-handler-component.cjs +278 -0
  193. package/dist/lib/cjs/command-handlers/command-handler-component.d.cts +146 -0
  194. package/dist/lib/cjs/command-handlers/command-handler.cjs +200 -0
  195. package/dist/lib/cjs/command-handlers/command-handler.d.cts +107 -0
  196. package/dist/lib/cjs/command-handlers/editor-command-handler.cjs +348 -0
  197. package/dist/lib/cjs/command-handlers/editor-command-handler.d.cts +208 -0
  198. package/dist/lib/cjs/command-handlers/file-command-handler.cjs +285 -0
  199. package/dist/lib/cjs/command-handlers/file-command-handler.d.cts +143 -0
  200. package/dist/lib/cjs/command-handlers/folder-command-handler.cjs +293 -0
  201. package/dist/lib/cjs/command-handlers/folder-command-handler.d.cts +149 -0
  202. package/dist/lib/cjs/command-handlers/global-command-handler.cjs +185 -0
  203. package/dist/lib/cjs/command-handlers/global-command-handler.d.cts +40 -0
  204. package/dist/lib/cjs/command-handlers/index.cjs +180 -0
  205. package/dist/lib/cjs/command-handlers/index.d.cts +11 -0
  206. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.cjs +209 -0
  207. package/dist/lib/cjs/command-handlers/open-demo-vault-command-handler.d.cts +73 -0
  208. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +174 -0
  209. package/dist/lib/cjs/command-handlers/open-settings-command-handler.d.cts +44 -0
  210. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.cjs +187 -0
  211. package/dist/lib/cjs/command-handlers/unlock-active-note-command-handler.d.cts +54 -0
  212. package/dist/lib/cjs/command-registrar.cjs +169 -0
  213. package/dist/lib/cjs/command-registrar.d.cts +48 -0
  214. package/dist/lib/cjs/community-plugins.cjs +322 -0
  215. package/dist/lib/cjs/community-plugins.d.cts +270 -0
  216. package/dist/lib/cjs/components/abort-signal-component.cjs +172 -0
  217. package/dist/lib/cjs/components/abort-signal-component.d.cts +30 -0
  218. package/dist/lib/cjs/components/all-windows-event-component.cjs +214 -0
  219. package/dist/lib/cjs/components/all-windows-event-component.d.cts +84 -0
  220. package/dist/lib/cjs/components/async-error-handler-component.cjs +176 -0
  221. package/dist/lib/cjs/components/async-error-handler-component.d.cts +30 -0
  222. package/dist/lib/cjs/components/async-events-component.cjs +148 -0
  223. package/dist/lib/cjs/components/async-events-component.d.cts +15 -0
  224. package/dist/lib/cjs/components/case-insensitive-file-index-component.cjs +186 -0
  225. package/dist/lib/cjs/components/case-insensitive-file-index-component.d.cts +36 -0
  226. package/dist/lib/cjs/components/component-ex.cjs +504 -0
  227. package/dist/lib/cjs/components/component-ex.d.cts +229 -0
  228. package/dist/lib/cjs/components/console-debug-component.cjs +170 -0
  229. package/dist/lib/cjs/components/console-debug-component.d.cts +30 -0
  230. package/dist/lib/cjs/components/core-plugin-toggle-component.cjs +202 -0
  231. package/dist/lib/cjs/components/core-plugin-toggle-component.d.cts +102 -0
  232. package/dist/lib/cjs/components/disposable-component.cjs +154 -0
  233. package/dist/lib/cjs/components/disposable-component.d.cts +24 -0
  234. package/dist/lib/cjs/components/embed-extensions-component.cjs +174 -0
  235. package/dist/lib/cjs/components/embed-extensions-component.d.cts +38 -0
  236. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.cjs +170 -0
  237. package/dist/lib/cjs/components/generate-markdown-link-default-params-component.d.cts +42 -0
  238. package/dist/lib/cjs/components/index.cjs +237 -0
  239. package/dist/lib/cjs/components/index.d.cts +30 -0
  240. package/dist/lib/cjs/components/layout-ready-component.cjs +211 -0
  241. package/dist/lib/cjs/components/layout-ready-component.d.cts +48 -0
  242. package/dist/lib/cjs/components/menu-event-registrar-component.cjs +196 -0
  243. package/dist/lib/cjs/components/menu-event-registrar-component.d.cts +52 -0
  244. package/dist/lib/cjs/components/monkey-around-component.cjs +245 -0
  245. package/dist/lib/cjs/components/monkey-around-component.d.cts +241 -0
  246. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.cjs +321 -0
  247. package/dist/lib/cjs/components/notebook-navigator-menu-event-registrar-component.d.cts +150 -0
  248. package/dist/lib/cjs/components/plugin-context-component.cjs +180 -0
  249. package/dist/lib/cjs/components/plugin-context-component.d.cts +36 -0
  250. package/dist/lib/cjs/components/plugin-gate-component.cjs +548 -0
  251. package/dist/lib/cjs/components/plugin-gate-component.d.cts +332 -0
  252. package/dist/lib/cjs/components/plugin-notice-component.cjs +629 -0
  253. package/dist/lib/cjs/components/plugin-notice-component.d.cts +362 -0
  254. package/dist/lib/cjs/components/plugin-settings-component.cjs +644 -0
  255. package/dist/lib/cjs/components/plugin-settings-component.d.cts +362 -0
  256. package/dist/lib/cjs/components/plugin-settings-tab-component.cjs +170 -0
  257. package/dist/lib/cjs/components/plugin-settings-tab-component.d.cts +39 -0
  258. package/dist/lib/cjs/components/plugin-suggestion-component.cjs +278 -0
  259. package/dist/lib/cjs/components/plugin-suggestion-component.d.cts +162 -0
  260. package/dist/lib/cjs/components/pointer-position-component.cjs +166 -0
  261. package/dist/lib/cjs/components/pointer-position-component.d.cts +29 -0
  262. package/dist/lib/cjs/components/registry-component.cjs +187 -0
  263. package/dist/lib/cjs/components/registry-component.d.cts +37 -0
  264. package/dist/lib/cjs/components/release-notes-component.cjs +225 -0
  265. package/dist/lib/cjs/components/release-notes-component.d.cts +129 -0
  266. package/dist/lib/cjs/components/rename-delete-handler-component.cjs +1275 -0
  267. package/dist/lib/cjs/components/rename-delete-handler-component.d.cts +165 -0
  268. package/dist/lib/cjs/components/rmdir-guard-component.cjs +190 -0
  269. package/dist/lib/cjs/components/rmdir-guard-component.d.cts +76 -0
  270. package/dist/lib/cjs/components/settings-migration-component.cjs +222 -0
  271. package/dist/lib/cjs/components/settings-migration-component.d.cts +120 -0
  272. package/dist/lib/cjs/components/syntax-highlighting-component.cjs +248 -0
  273. package/dist/lib/cjs/components/syntax-highlighting-component.d.cts +149 -0
  274. package/dist/lib/cjs/components/templates-language-component.cjs +276 -0
  275. package/dist/lib/cjs/components/templates-language-component.d.cts +124 -0
  276. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.cjs +246 -0
  277. package/dist/lib/cjs/constructors/get-dom-events-handlers-constructor.d.cts +22 -0
  278. package/dist/lib/cjs/constructors/index.cjs +153 -0
  279. package/dist/lib/cjs/constructors/index.d.cts +2 -0
  280. package/dist/lib/cjs/css-class.cjs +208 -0
  281. package/dist/lib/cjs/css-class.d.cts +278 -0
  282. package/dist/lib/cjs/data-handler.cjs +170 -0
  283. package/dist/lib/cjs/data-handler.d.cts +49 -0
  284. package/dist/lib/cjs/dataview-link.cjs +160 -0
  285. package/dist/lib/cjs/dataview-link.d.cts +42 -0
  286. package/dist/lib/cjs/dataview.cjs +379 -0
  287. package/dist/lib/cjs/dataview.d.cts +249 -0
  288. package/dist/lib/cjs/debug.cjs +148 -0
  289. package/dist/lib/cjs/debug.d.cts +19 -0
  290. package/dist/lib/cjs/demo-vault-helper-settings.cjs +131 -0
  291. package/dist/lib/cjs/demo-vault-helper-settings.d.cts +29 -0
  292. package/dist/lib/cjs/demo-vault-helper.cjs +232 -0
  293. package/dist/lib/cjs/demo-vault-helper.d.cts +61 -0
  294. package/dist/lib/cjs/demo-vault-naming.cjs +157 -0
  295. package/dist/lib/cjs/demo-vault-naming.d.cts +54 -0
  296. package/dist/lib/cjs/desktop-demo-vault-opener.cjs +348 -0
  297. package/dist/lib/cjs/desktop-demo-vault-opener.d.cts +76 -0
  298. package/dist/lib/cjs/desktop-trusted-input.cjs +301 -0
  299. package/dist/lib/cjs/desktop-trusted-input.d.cts +288 -0
  300. package/dist/lib/cjs/editor-extension-registrar.cjs +162 -0
  301. package/dist/lib/cjs/editor-extension-registrar.d.cts +37 -0
  302. package/dist/lib/cjs/editor-suggest-registrar.cjs +162 -0
  303. package/dist/lib/cjs/editor-suggest-registrar.d.cts +36 -0
  304. package/dist/lib/cjs/editor.cjs +200 -0
  305. package/dist/lib/cjs/editor.d.cts +45 -0
  306. package/dist/lib/cjs/events.cjs +172 -0
  307. package/dist/lib/cjs/events.d.cts +98 -0
  308. package/dist/lib/cjs/extensions-registrar.cjs +162 -0
  309. package/dist/lib/cjs/extensions-registrar.d.cts +51 -0
  310. package/dist/lib/cjs/file-change.cjs +558 -0
  311. package/dist/lib/cjs/file-change.d.cts +156 -0
  312. package/dist/lib/cjs/file-explorer.cjs +157 -0
  313. package/dist/lib/cjs/file-explorer.d.cts +34 -0
  314. package/dist/lib/cjs/file-manager.cjs +251 -0
  315. package/dist/lib/cjs/file-manager.d.cts +123 -0
  316. package/dist/lib/cjs/file-system.cjs +571 -0
  317. package/dist/lib/cjs/file-system.d.cts +554 -0
  318. package/dist/lib/cjs/folder-note.cjs +261 -0
  319. package/dist/lib/cjs/folder-note.d.cts +166 -0
  320. package/dist/lib/cjs/frontmatter-formatting.cjs +448 -0
  321. package/dist/lib/cjs/frontmatter-formatting.d.cts +44 -0
  322. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.cjs +159 -0
  323. package/dist/lib/cjs/frontmatter-link-cache-with-offsets.d.cts +34 -0
  324. package/dist/lib/cjs/frontmatter.cjs +271 -0
  325. package/dist/lib/cjs/frontmatter.d.cts +145 -0
  326. package/dist/lib/cjs/generated-during-build.cjs +146 -0
  327. package/dist/lib/cjs/generated-during-build.d.cts +25 -0
  328. package/dist/lib/cjs/hover-link-source-registrar.cjs +162 -0
  329. package/dist/lib/cjs/hover-link-source-registrar.d.cts +52 -0
  330. package/dist/lib/cjs/html-element.cjs +183 -0
  331. package/dist/lib/cjs/html-element.d.cts +98 -0
  332. package/dist/lib/cjs/i18n/custom-type-options.cjs +132 -0
  333. package/dist/lib/cjs/i18n/custom-type-options.d.cts +38 -0
  334. package/dist/lib/cjs/i18n/default-translations.cjs +132 -0
  335. package/dist/lib/cjs/i18n/default-translations.d.cts +15 -0
  336. package/dist/lib/cjs/i18n/i18n.cjs +192 -0
  337. package/dist/lib/cjs/i18n/i18n.d.cts +38 -0
  338. package/dist/lib/cjs/i18n/index.cjs +162 -0
  339. package/dist/lib/cjs/i18n/index.d.cts +5 -0
  340. package/dist/lib/cjs/i18n/locales/en.cjs +224 -0
  341. package/dist/lib/cjs/i18n/locales/en.d.cts +91 -0
  342. package/dist/lib/cjs/i18n/locales/index.cjs +156 -0
  343. package/dist/lib/cjs/i18n/locales/index.d.cts +3 -0
  344. package/dist/lib/cjs/i18n/locales/translations-map.cjs +150 -0
  345. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +100 -0
  346. package/dist/lib/cjs/index.cjs +435 -0
  347. package/dist/lib/cjs/index.d.cts +96 -0
  348. package/dist/lib/cjs/is-in-obsidian.cjs +154 -0
  349. package/dist/lib/cjs/is-in-obsidian.d.cts +12 -0
  350. package/dist/lib/cjs/library-styles.cjs +173 -0
  351. package/dist/lib/cjs/library-styles.d.cts +56 -0
  352. package/dist/lib/cjs/library.cjs +181 -0
  353. package/dist/lib/cjs/library.d.cts +57 -0
  354. package/dist/lib/cjs/link-name.cjs +145 -0
  355. package/dist/lib/cjs/link-name.d.cts +23 -0
  356. package/dist/lib/cjs/link-update-progress.cjs +131 -0
  357. package/dist/lib/cjs/link-update-progress.d.cts +32 -0
  358. package/dist/lib/cjs/link.cjs +1053 -0
  359. package/dist/lib/cjs/link.d.cts +1369 -0
  360. package/dist/lib/cjs/logger.cjs +212 -0
  361. package/dist/lib/cjs/logger.d.cts +37 -0
  362. package/dist/lib/cjs/loop.cjs +243 -0
  363. package/dist/lib/cjs/loop.d.cts +104 -0
  364. package/dist/lib/cjs/markdown-code-block-processor-registrar.cjs +166 -0
  365. package/dist/lib/cjs/markdown-code-block-processor-registrar.d.cts +62 -0
  366. package/dist/lib/cjs/markdown-code-block-processor.cjs +444 -0
  367. package/dist/lib/cjs/markdown-code-block-processor.d.cts +137 -0
  368. package/dist/lib/cjs/markdown-post-processor-registrar.cjs +163 -0
  369. package/dist/lib/cjs/markdown-post-processor-registrar.d.cts +59 -0
  370. package/dist/lib/cjs/markdown-view.cjs +151 -0
  371. package/dist/lib/cjs/markdown-view.d.cts +14 -0
  372. package/dist/lib/cjs/markdown.cjs +470 -0
  373. package/dist/lib/cjs/markdown.d.cts +226 -0
  374. package/dist/lib/cjs/menu-event-registrar.cjs +131 -0
  375. package/dist/lib/cjs/menu-event-registrar.d.cts +84 -0
  376. package/dist/lib/cjs/metadata-cache.cjs +544 -0
  377. package/dist/lib/cjs/metadata-cache.d.cts +359 -0
  378. package/dist/lib/cjs/mobile-trusted-input.cjs +185 -0
  379. package/dist/lib/cjs/mobile-trusted-input.d.cts +98 -0
  380. package/dist/lib/cjs/modals/alert.cjs +178 -0
  381. package/dist/lib/cjs/modals/alert.d.cts +35 -0
  382. package/dist/lib/cjs/modals/confirm.cjs +188 -0
  383. package/dist/lib/cjs/modals/confirm.d.cts +39 -0
  384. package/dist/lib/cjs/modals/index.cjs +177 -0
  385. package/dist/lib/cjs/modals/index.d.cts +10 -0
  386. package/dist/lib/cjs/modals/minimizable-modal.cjs +441 -0
  387. package/dist/lib/cjs/modals/minimizable-modal.d.cts +129 -0
  388. package/dist/lib/cjs/modals/modal-command-builder.cjs +458 -0
  389. package/dist/lib/cjs/modals/modal-command-builder.d.cts +285 -0
  390. package/dist/lib/cjs/modals/modal.cjs +176 -0
  391. package/dist/lib/cjs/modals/modal.d.cts +64 -0
  392. package/dist/lib/cjs/modals/prompt.cjs +256 -0
  393. package/dist/lib/cjs/modals/prompt.d.cts +83 -0
  394. package/dist/lib/cjs/modals/select-item.cjs +201 -0
  395. package/dist/lib/cjs/modals/select-item.d.cts +55 -0
  396. package/dist/lib/cjs/modals/select-option.cjs +189 -0
  397. package/dist/lib/cjs/modals/select-option.d.cts +65 -0
  398. package/dist/lib/cjs/modals/suggest-modal-command-builder.cjs +144 -0
  399. package/dist/lib/cjs/modals/suggest-modal-command-builder.d.cts +35 -0
  400. package/dist/lib/cjs/note-priority.cjs +234 -0
  401. package/dist/lib/cjs/note-priority.d.cts +154 -0
  402. package/dist/lib/cjs/notebook-navigator.cjs +163 -0
  403. package/dist/lib/cjs/notebook-navigator.d.cts +132 -0
  404. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +175 -0
  405. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +42 -0
  406. package/dist/lib/cjs/obsidian-protocol-handler-registrar.cjs +165 -0
  407. package/dist/lib/cjs/obsidian-protocol-handler-registrar.d.cts +55 -0
  408. package/dist/lib/cjs/obsidian-settings.cjs +182 -0
  409. package/dist/lib/cjs/obsidian-settings.d.cts +62 -0
  410. package/dist/lib/cjs/parse-link.cjs +538 -0
  411. package/dist/lib/cjs/parse-link.d.cts +288 -0
  412. package/dist/lib/cjs/path-settings.cjs +269 -0
  413. package/dist/lib/cjs/path-settings.d.cts +56 -0
  414. package/dist/lib/cjs/pdf.cjs +173 -0
  415. package/dist/lib/cjs/pdf.d.cts +26 -0
  416. package/dist/lib/cjs/plugin/index.cjs +174 -0
  417. package/dist/lib/cjs/plugin/index.d.cts +9 -0
  418. package/dist/lib/cjs/plugin/plugin-api.cjs +519 -0
  419. package/dist/lib/cjs/plugin/plugin-api.d.cts +413 -0
  420. package/dist/lib/cjs/plugin/plugin-context.cjs +191 -0
  421. package/dist/lib/cjs/plugin/plugin-context.d.cts +27 -0
  422. package/dist/lib/cjs/plugin/plugin-event-source.cjs +226 -0
  423. package/dist/lib/cjs/plugin/plugin-event-source.d.cts +97 -0
  424. package/dist/lib/cjs/plugin/plugin-install-state.cjs +195 -0
  425. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +113 -0
  426. package/dist/lib/cjs/plugin/plugin-lifecycle-events.cjs +151 -0
  427. package/dist/lib/cjs/plugin/plugin-lifecycle-events.d.cts +127 -0
  428. package/dist/lib/cjs/plugin/plugin-settings-tab.cjs +611 -0
  429. package/dist/lib/cjs/plugin/plugin-settings-tab.d.cts +368 -0
  430. package/dist/lib/cjs/plugin/plugin.cjs +706 -0
  431. package/dist/lib/cjs/plugin/plugin.d.cts +363 -0
  432. package/dist/lib/cjs/plugin/settings-migration-api.cjs +131 -0
  433. package/dist/lib/cjs/plugin/settings-migration-api.d.cts +91 -0
  434. package/dist/lib/cjs/plugin-cli-handler-registrar.cjs +163 -0
  435. package/dist/lib/cjs/plugin-cli-handler-registrar.d.cts +64 -0
  436. package/dist/lib/cjs/popovers/field-popover.cjs +182 -0
  437. package/dist/lib/cjs/popovers/field-popover.d.cts +75 -0
  438. package/dist/lib/cjs/popovers/index.cjs +159 -0
  439. package/dist/lib/cjs/popovers/index.d.cts +4 -0
  440. package/dist/lib/cjs/popovers/popover-anchor.cjs +182 -0
  441. package/dist/lib/cjs/popovers/popover-anchor.d.cts +67 -0
  442. package/dist/lib/cjs/popovers/popover.cjs +229 -0
  443. package/dist/lib/cjs/popovers/popover.d.cts +78 -0
  444. package/dist/lib/cjs/property-entry.cjs +172 -0
  445. package/dist/lib/cjs/property-entry.d.cts +43 -0
  446. package/dist/lib/cjs/queue.cjs +212 -0
  447. package/dist/lib/cjs/queue.d.cts +93 -0
  448. package/dist/lib/cjs/react/app-context.cjs +151 -0
  449. package/dist/lib/cjs/react/app-context.d.cts +24 -0
  450. package/dist/lib/cjs/react/index.cjs +153 -0
  451. package/dist/lib/cjs/react/index.d.cts +2 -0
  452. package/dist/lib/cjs/reference.cjs +186 -0
  453. package/dist/lib/cjs/reference.d.cts +116 -0
  454. package/dist/lib/cjs/resource-lock.cjs +1096 -0
  455. package/dist/lib/cjs/resource-lock.d.cts +318 -0
  456. package/dist/lib/cjs/resource-url.cjs +156 -0
  457. package/dist/lib/cjs/resource-url.d.cts +31 -0
  458. package/dist/lib/cjs/ribbon-icon-registrar.cjs +163 -0
  459. package/dist/lib/cjs/ribbon-icon-registrar.d.cts +60 -0
  460. package/dist/lib/cjs/setting-components/checkbox-component.cjs +216 -0
  461. package/dist/lib/cjs/setting-components/checkbox-component.d.cts +69 -0
  462. package/dist/lib/cjs/setting-components/code-highlighter-component.cjs +378 -0
  463. package/dist/lib/cjs/setting-components/code-highlighter-component.d.cts +132 -0
  464. package/dist/lib/cjs/setting-components/date-component.cjs +180 -0
  465. package/dist/lib/cjs/setting-components/date-component.d.cts +38 -0
  466. package/dist/lib/cjs/setting-components/date-time-component.cjs +180 -0
  467. package/dist/lib/cjs/setting-components/date-time-component.d.cts +38 -0
  468. package/dist/lib/cjs/setting-components/email-component.cjs +191 -0
  469. package/dist/lib/cjs/setting-components/email-component.d.cts +49 -0
  470. package/dist/lib/cjs/setting-components/file-component.cjs +183 -0
  471. package/dist/lib/cjs/setting-components/file-component.d.cts +43 -0
  472. package/dist/lib/cjs/setting-components/index.cjs +228 -0
  473. package/dist/lib/cjs/setting-components/index.d.cts +27 -0
  474. package/dist/lib/cjs/setting-components/month-component.cjs +188 -0
  475. package/dist/lib/cjs/setting-components/month-component.d.cts +51 -0
  476. package/dist/lib/cjs/setting-components/multiple-dropdown-component.cjs +253 -0
  477. package/dist/lib/cjs/setting-components/multiple-dropdown-component.d.cts +92 -0
  478. package/dist/lib/cjs/setting-components/multiple-email-component.cjs +177 -0
  479. package/dist/lib/cjs/setting-components/multiple-email-component.d.cts +38 -0
  480. package/dist/lib/cjs/setting-components/multiple-file-component.cjs +185 -0
  481. package/dist/lib/cjs/setting-components/multiple-file-component.d.cts +43 -0
  482. package/dist/lib/cjs/setting-components/multiple-text-component.cjs +272 -0
  483. package/dist/lib/cjs/setting-components/multiple-text-component.d.cts +109 -0
  484. package/dist/lib/cjs/setting-components/number-component.cjs +201 -0
  485. package/dist/lib/cjs/setting-components/number-component.d.cts +56 -0
  486. package/dist/lib/cjs/setting-components/password-component.cjs +177 -0
  487. package/dist/lib/cjs/setting-components/password-component.d.cts +38 -0
  488. package/dist/lib/cjs/setting-components/setting-component-wrapper.cjs +160 -0
  489. package/dist/lib/cjs/setting-components/setting-component-wrapper.d.cts +13 -0
  490. package/dist/lib/cjs/setting-components/telephone-component.cjs +191 -0
  491. package/dist/lib/cjs/setting-components/telephone-component.d.cts +51 -0
  492. package/dist/lib/cjs/setting-components/text-based-component.cjs +170 -0
  493. package/dist/lib/cjs/setting-components/text-based-component.d.cts +38 -0
  494. package/dist/lib/cjs/setting-components/time-component.cjs +185 -0
  495. package/dist/lib/cjs/setting-components/time-component.d.cts +38 -0
  496. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.cjs +217 -0
  497. package/dist/lib/cjs/setting-components/tri-state-checkbox-component.d.cts +69 -0
  498. package/dist/lib/cjs/setting-components/typed-dropdown-component.cjs +262 -0
  499. package/dist/lib/cjs/setting-components/typed-dropdown-component.d.cts +97 -0
  500. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.cjs +264 -0
  501. package/dist/lib/cjs/setting-components/typed-multiple-dropdown-component.d.cts +99 -0
  502. package/dist/lib/cjs/setting-components/typed-range-text-component.cjs +175 -0
  503. package/dist/lib/cjs/setting-components/typed-range-text-component.d.cts +35 -0
  504. package/dist/lib/cjs/setting-components/typed-text-component.cjs +232 -0
  505. package/dist/lib/cjs/setting-components/typed-text-component.d.cts +100 -0
  506. package/dist/lib/cjs/setting-components/url-component.cjs +191 -0
  507. package/dist/lib/cjs/setting-components/url-component.d.cts +49 -0
  508. package/dist/lib/cjs/setting-components/validator-component.cjs +230 -0
  509. package/dist/lib/cjs/setting-components/validator-component.d.cts +23 -0
  510. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.cjs +131 -0
  511. package/dist/lib/cjs/setting-components/value-component-with-change-tracking.d.cts +20 -0
  512. package/dist/lib/cjs/setting-components/week-component.cjs +188 -0
  513. package/dist/lib/cjs/setting-components/week-component.d.cts +51 -0
  514. package/dist/lib/cjs/setting-ex.cjs +372 -0
  515. package/dist/lib/cjs/setting-ex.d.cts +198 -0
  516. package/dist/lib/cjs/setting-group-ex.cjs +165 -0
  517. package/dist/lib/cjs/setting-group-ex.d.cts +26 -0
  518. package/dist/lib/cjs/status-bar-item-registrar.cjs +162 -0
  519. package/dist/lib/cjs/status-bar-item-registrar.d.cts +36 -0
  520. package/dist/lib/cjs/templater.cjs +279 -0
  521. package/dist/lib/cjs/templater.d.cts +284 -0
  522. package/dist/lib/cjs/transformers/duration-transformer.cjs +182 -0
  523. package/dist/lib/cjs/transformers/duration-transformer.d.cts +39 -0
  524. package/dist/lib/cjs/transformers/index.cjs +153 -0
  525. package/dist/lib/cjs/transformers/index.d.cts +2 -0
  526. package/dist/lib/cjs/trusted-input.cjs +196 -0
  527. package/dist/lib/cjs/trusted-input.d.cts +131 -0
  528. package/dist/lib/cjs/validation.cjs +189 -0
  529. package/dist/lib/cjs/validation.d.cts +87 -0
  530. package/dist/lib/cjs/vault-delete.cjs +222 -0
  531. package/dist/lib/cjs/vault-delete.d.cts +82 -0
  532. package/dist/lib/cjs/vault-transaction.cjs +412 -0
  533. package/dist/lib/cjs/vault-transaction.d.cts +163 -0
  534. package/dist/lib/cjs/vault.cjs +701 -0
  535. package/dist/lib/cjs/vault.d.cts +506 -0
  536. package/dist/lib/cjs/view-registrar.cjs +162 -0
  537. package/dist/lib/cjs/view-registrar.d.cts +52 -0
  538. package/dist/lib/cjs/workspace.cjs +186 -0
  539. package/dist/lib/cjs/workspace.d.cts +81 -0
  540. package/dist/lib/esm/@types/dataview/api/data-array.d.mts +137 -0
  541. package/dist/lib/esm/@types/dataview/api/extensions.d.mts +16 -0
  542. package/dist/lib/esm/@types/dataview/api/inline-api.d.mts +187 -0
  543. package/dist/lib/esm/@types/dataview/api/plugin-api.d.mts +210 -0
  544. package/dist/lib/esm/@types/dataview/api/result.d.mts +39 -0
  545. package/dist/lib/esm/@types/dataview/data-import/common.d.mts +4 -0
  546. package/dist/lib/esm/@types/dataview/data-import/csv.d.mts +4 -0
  547. package/dist/lib/esm/@types/dataview/data-import/inline-field.d.mts +43 -0
  548. package/dist/lib/esm/@types/dataview/data-import/markdown-file.d.mts +53 -0
  549. package/dist/lib/esm/@types/dataview/data-import/persister.d.mts +33 -0
  550. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-entry.d.mts +2 -0
  551. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-impl.d.mts +7 -0
  552. package/dist/lib/esm/@types/dataview/data-import/web-worker/import-manager.d.mts +38 -0
  553. package/dist/lib/esm/@types/dataview/data-index/index.d.mts +187 -0
  554. package/dist/lib/esm/@types/dataview/data-index/resolver.d.mts +24 -0
  555. package/dist/lib/esm/@types/dataview/data-index/source.d.mts +72 -0
  556. package/dist/lib/esm/@types/dataview/data-model/markdown.d.mts +116 -0
  557. package/dist/lib/esm/@types/dataview/data-model/serialized/markdown.d.mts +107 -0
  558. package/dist/lib/esm/@types/dataview/data-model/transferable.d.mts +8 -0
  559. package/dist/lib/esm/@types/dataview/data-model/value.d.mts +176 -0
  560. package/dist/lib/esm/@types/dataview/expression/binaryop.d.mts +44 -0
  561. package/dist/lib/esm/@types/dataview/expression/context.d.mts +50 -0
  562. package/dist/lib/esm/@types/dataview/expression/field.d.mts +83 -0
  563. package/dist/lib/esm/@types/dataview/expression/functions.d.mts +150 -0
  564. package/dist/lib/esm/@types/dataview/expression/parse.d.mts +164 -0
  565. package/dist/lib/esm/@types/dataview/index.d.mts +56 -0
  566. package/dist/lib/esm/@types/dataview/main.d.mts +53 -0
  567. package/dist/lib/esm/@types/dataview/query/engine.d.mts +104 -0
  568. package/dist/lib/esm/@types/dataview/query/parse.d.mts +45 -0
  569. package/dist/lib/esm/@types/dataview/query/query.d.mts +96 -0
  570. package/dist/lib/esm/@types/dataview/settings.d.mts +61 -0
  571. package/dist/lib/esm/@types/dataview/typings/obsidian-ex.d.mts +29 -0
  572. package/dist/lib/esm/@types/dataview/typings/workers.d.mts +5 -0
  573. package/dist/lib/esm/@types/dataview/ui/export/markdown.d.mts +16 -0
  574. package/dist/lib/esm/@types/dataview/ui/lp-render.d.mts +38 -0
  575. package/dist/lib/esm/@types/dataview/ui/markdown.d.mts +87 -0
  576. package/dist/lib/esm/@types/dataview/ui/refreshable-view.d.mts +19 -0
  577. package/dist/lib/esm/@types/dataview/ui/render.d.mts +34 -0
  578. package/dist/lib/esm/@types/dataview/ui/views/calendar-view.d.mts +18 -0
  579. package/dist/lib/esm/@types/dataview/ui/views/inline-field-live-preview.d.mts +43 -0
  580. package/dist/lib/esm/@types/dataview/ui/views/inline-view.d.mts +29 -0
  581. package/dist/lib/esm/@types/dataview/ui/views/js-view.d.mts +24 -0
  582. package/dist/lib/esm/@types/dataview/ui/views/list-view.d.mts +26 -0
  583. package/dist/lib/esm/@types/dataview/ui/views/table-view.d.mts +29 -0
  584. package/dist/lib/esm/@types/dataview/ui/views/task-view.d.mts +52 -0
  585. package/dist/lib/esm/@types/dataview/util/hash.d.mts +2 -0
  586. package/dist/lib/esm/@types/dataview/util/locale.d.mts +3 -0
  587. package/dist/lib/esm/@types/dataview/util/media.d.mts +7 -0
  588. package/dist/lib/esm/@types/dataview/util/normalize.d.mts +45 -0
  589. package/dist/lib/esm/@types/i18next.d.mts +14 -0
  590. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +29 -0
  591. package/dist/lib/esm/@types/original-fs.d.mts +15 -0
  592. package/dist/lib/esm/__merged.d.mts +205 -0
  593. package/dist/lib/esm/__merged.mjs +1524 -0
  594. package/dist/lib/esm/active-file-provider.d.mts +36 -0
  595. package/dist/lib/esm/active-file-provider.mjs +64 -0
  596. package/dist/lib/esm/app.d.mts +17 -0
  597. package/dist/lib/esm/app.mjs +56 -0
  598. package/dist/lib/esm/async-with-notice.d.mts +113 -0
  599. package/dist/lib/esm/async-with-notice.mjs +141 -0
  600. package/dist/lib/esm/attachment-path.d.mts +341 -0
  601. package/dist/lib/esm/attachment-path.mjs +294 -0
  602. package/dist/lib/esm/attachment-unit-folder.d.mts +103 -0
  603. package/dist/lib/esm/attachment-unit-folder.mjs +70 -0
  604. package/dist/lib/esm/backlink-index.d.mts +51 -0
  605. package/dist/lib/esm/backlink-index.mjs +152 -0
  606. package/dist/lib/esm/backlink.d.mts +66 -0
  607. package/dist/lib/esm/backlink.mjs +123 -0
  608. package/dist/lib/esm/bases-view-registrar.d.mts +52 -0
  609. package/dist/lib/esm/bases-view-registrar.mjs +65 -0
  610. package/dist/lib/esm/callout.d.mts +76 -0
  611. package/dist/lib/esm/callout.mjs +124 -0
  612. package/dist/lib/esm/canvas.d.mts +28 -0
  613. package/dist/lib/esm/canvas.mjs +121 -0
  614. package/dist/lib/esm/case-insensitive-file-index.d.mts +92 -0
  615. package/dist/lib/esm/case-insensitive-file-index.mjs +144 -0
  616. package/dist/lib/esm/code-block-markdown-information.d.mts +48 -0
  617. package/dist/lib/esm/code-block-markdown-information.mjs +42 -0
  618. package/dist/lib/esm/code-block-reg-exp.d.mts +39 -0
  619. package/dist/lib/esm/code-block-reg-exp.mjs +48 -0
  620. package/dist/lib/esm/codemirror/index.d.mts +2 -0
  621. package/dist/lib/esm/codemirror/index.mjs +46 -0
  622. package/dist/lib/esm/codemirror/state-field-spec.d.mts +72 -0
  623. package/dist/lib/esm/codemirror/state-field-spec.mjs +42 -0
  624. package/dist/lib/esm/command-handlers/abstract-file-command-handler.d.mts +274 -0
  625. package/dist/lib/esm/command-handlers/abstract-file-command-handler.mjs +322 -0
  626. package/dist/lib/esm/command-handlers/command-handler-component.d.mts +146 -0
  627. package/dist/lib/esm/command-handlers/command-handler-component.mjs +185 -0
  628. package/dist/lib/esm/command-handlers/command-handler.d.mts +107 -0
  629. package/dist/lib/esm/command-handlers/command-handler.mjs +103 -0
  630. package/dist/lib/esm/command-handlers/editor-command-handler.d.mts +208 -0
  631. package/dist/lib/esm/command-handlers/editor-command-handler.mjs +254 -0
  632. package/dist/lib/esm/command-handlers/file-command-handler.d.mts +143 -0
  633. package/dist/lib/esm/command-handlers/file-command-handler.mjs +192 -0
  634. package/dist/lib/esm/command-handlers/folder-command-handler.d.mts +149 -0
  635. package/dist/lib/esm/command-handlers/folder-command-handler.mjs +200 -0
  636. package/dist/lib/esm/command-handlers/global-command-handler.d.mts +40 -0
  637. package/dist/lib/esm/command-handlers/global-command-handler.mjs +88 -0
  638. package/dist/lib/esm/command-handlers/index.d.mts +11 -0
  639. package/dist/lib/esm/command-handlers/index.mjs +64 -0
  640. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.d.mts +73 -0
  641. package/dist/lib/esm/command-handlers/open-demo-vault-command-handler.mjs +102 -0
  642. package/dist/lib/esm/command-handlers/open-settings-command-handler.d.mts +44 -0
  643. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +77 -0
  644. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.d.mts +54 -0
  645. package/dist/lib/esm/command-handlers/unlock-active-note-command-handler.mjs +90 -0
  646. package/dist/lib/esm/command-registrar.d.mts +48 -0
  647. package/dist/lib/esm/command-registrar.mjs +72 -0
  648. package/dist/lib/esm/community-plugins.d.mts +270 -0
  649. package/dist/lib/esm/community-plugins.mjs +214 -0
  650. package/dist/lib/esm/components/abort-signal-component.d.mts +30 -0
  651. package/dist/lib/esm/components/abort-signal-component.mjs +75 -0
  652. package/dist/lib/esm/components/all-windows-event-component.d.mts +84 -0
  653. package/dist/lib/esm/components/all-windows-event-component.mjs +117 -0
  654. package/dist/lib/esm/components/async-error-handler-component.d.mts +30 -0
  655. package/dist/lib/esm/components/async-error-handler-component.mjs +79 -0
  656. package/dist/lib/esm/components/async-events-component.d.mts +15 -0
  657. package/dist/lib/esm/components/async-events-component.mjs +51 -0
  658. package/dist/lib/esm/components/case-insensitive-file-index-component.d.mts +36 -0
  659. package/dist/lib/esm/components/case-insensitive-file-index-component.mjs +93 -0
  660. package/dist/lib/esm/components/component-ex.d.mts +229 -0
  661. package/dist/lib/esm/components/component-ex.mjs +413 -0
  662. package/dist/lib/esm/components/console-debug-component.d.mts +30 -0
  663. package/dist/lib/esm/components/console-debug-component.mjs +73 -0
  664. package/dist/lib/esm/components/core-plugin-toggle-component.d.mts +102 -0
  665. package/dist/lib/esm/components/core-plugin-toggle-component.mjs +105 -0
  666. package/dist/lib/esm/components/disposable-component.d.mts +24 -0
  667. package/dist/lib/esm/components/disposable-component.mjs +57 -0
  668. package/dist/lib/esm/components/embed-extensions-component.d.mts +38 -0
  669. package/dist/lib/esm/components/embed-extensions-component.mjs +77 -0
  670. package/dist/lib/esm/components/generate-markdown-link-default-params-component.d.mts +42 -0
  671. package/dist/lib/esm/components/generate-markdown-link-default-params-component.mjs +73 -0
  672. package/dist/lib/esm/components/index.d.mts +30 -0
  673. package/dist/lib/esm/components/index.mjs +102 -0
  674. package/dist/lib/esm/components/layout-ready-component.d.mts +48 -0
  675. package/dist/lib/esm/components/layout-ready-component.mjs +113 -0
  676. package/dist/lib/esm/components/menu-event-registrar-component.d.mts +52 -0
  677. package/dist/lib/esm/components/menu-event-registrar-component.mjs +99 -0
  678. package/dist/lib/esm/components/monkey-around-component.d.mts +241 -0
  679. package/dist/lib/esm/components/monkey-around-component.mjs +146 -0
  680. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.d.mts +150 -0
  681. package/dist/lib/esm/components/notebook-navigator-menu-event-registrar-component.mjs +227 -0
  682. package/dist/lib/esm/components/plugin-context-component.d.mts +36 -0
  683. package/dist/lib/esm/components/plugin-context-component.mjs +86 -0
  684. package/dist/lib/esm/components/plugin-gate-component.d.mts +332 -0
  685. package/dist/lib/esm/components/plugin-gate-component.mjs +464 -0
  686. package/dist/lib/esm/components/plugin-notice-component.d.mts +362 -0
  687. package/dist/lib/esm/components/plugin-notice-component.mjs +535 -0
  688. package/dist/lib/esm/components/plugin-settings-component.d.mts +362 -0
  689. package/dist/lib/esm/components/plugin-settings-component.mjs +554 -0
  690. package/dist/lib/esm/components/plugin-settings-tab-component.d.mts +39 -0
  691. package/dist/lib/esm/components/plugin-settings-tab-component.mjs +73 -0
  692. package/dist/lib/esm/components/plugin-suggestion-component.d.mts +162 -0
  693. package/dist/lib/esm/components/plugin-suggestion-component.mjs +184 -0
  694. package/dist/lib/esm/components/pointer-position-component.d.mts +29 -0
  695. package/dist/lib/esm/components/pointer-position-component.mjs +69 -0
  696. package/dist/lib/esm/components/registry-component.d.mts +37 -0
  697. package/dist/lib/esm/components/registry-component.mjs +90 -0
  698. package/dist/lib/esm/components/release-notes-component.d.mts +129 -0
  699. package/dist/lib/esm/components/release-notes-component.mjs +128 -0
  700. package/dist/lib/esm/components/rename-delete-handler-component.d.mts +165 -0
  701. package/dist/lib/esm/components/rename-delete-handler-component.mjs +1230 -0
  702. package/dist/lib/esm/components/rmdir-guard-component.d.mts +76 -0
  703. package/dist/lib/esm/components/rmdir-guard-component.mjs +92 -0
  704. package/dist/lib/esm/components/settings-migration-component.d.mts +120 -0
  705. package/dist/lib/esm/components/settings-migration-component.mjs +125 -0
  706. package/dist/lib/esm/components/syntax-highlighting-component.d.mts +149 -0
  707. package/dist/lib/esm/components/syntax-highlighting-component.mjs +151 -0
  708. package/dist/lib/esm/components/templates-language-component.d.mts +124 -0
  709. package/dist/lib/esm/components/templates-language-component.mjs +179 -0
  710. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.d.mts +22 -0
  711. package/dist/lib/esm/constructors/get-dom-events-handlers-constructor.mjs +149 -0
  712. package/dist/lib/esm/constructors/index.d.mts +2 -0
  713. package/dist/lib/esm/constructors/index.mjs +46 -0
  714. package/dist/lib/esm/css-class.d.mts +278 -0
  715. package/dist/lib/esm/css-class.mjs +111 -0
  716. package/dist/lib/esm/data-handler.d.mts +49 -0
  717. package/dist/lib/esm/data-handler.mjs +73 -0
  718. package/dist/lib/esm/dataview-link.d.mts +42 -0
  719. package/dist/lib/esm/dataview-link.mjs +66 -0
  720. package/dist/lib/esm/dataview.d.mts +249 -0
  721. package/dist/lib/esm/dataview.mjs +280 -0
  722. package/dist/lib/esm/debug.d.mts +19 -0
  723. package/dist/lib/esm/debug.mjs +51 -0
  724. package/dist/lib/esm/demo-vault-helper-settings.d.mts +29 -0
  725. package/dist/lib/esm/demo-vault-helper-settings.mjs +42 -0
  726. package/dist/lib/esm/demo-vault-helper.d.mts +61 -0
  727. package/dist/lib/esm/demo-vault-helper.mjs +142 -0
  728. package/dist/lib/esm/demo-vault-naming.d.mts +54 -0
  729. package/dist/lib/esm/demo-vault-naming.mjs +59 -0
  730. package/dist/lib/esm/desktop-demo-vault-opener.d.mts +76 -0
  731. package/dist/lib/esm/desktop-demo-vault-opener.mjs +266 -0
  732. package/dist/lib/esm/desktop-trusted-input.d.mts +288 -0
  733. package/dist/lib/esm/desktop-trusted-input.mjs +198 -0
  734. package/dist/lib/esm/editor-extension-registrar.d.mts +37 -0
  735. package/dist/lib/esm/editor-extension-registrar.mjs +65 -0
  736. package/dist/lib/esm/editor-suggest-registrar.d.mts +36 -0
  737. package/dist/lib/esm/editor-suggest-registrar.mjs +68 -0
  738. package/dist/lib/esm/editor.d.mts +45 -0
  739. package/dist/lib/esm/editor.mjs +107 -0
  740. package/dist/lib/esm/events.d.mts +98 -0
  741. package/dist/lib/esm/events.mjs +73 -0
  742. package/dist/lib/esm/extensions-registrar.d.mts +51 -0
  743. package/dist/lib/esm/extensions-registrar.mjs +65 -0
  744. package/dist/lib/esm/file-change.d.mts +156 -0
  745. package/dist/lib/esm/file-change.mjs +473 -0
  746. package/dist/lib/esm/file-explorer.d.mts +34 -0
  747. package/dist/lib/esm/file-explorer.mjs +60 -0
  748. package/dist/lib/esm/file-manager.d.mts +123 -0
  749. package/dist/lib/esm/file-manager.mjs +161 -0
  750. package/dist/lib/esm/file-system.d.mts +554 -0
  751. package/dist/lib/esm/file-system.mjs +458 -0
  752. package/dist/lib/esm/folder-note.d.mts +166 -0
  753. package/dist/lib/esm/folder-note.mjs +161 -0
  754. package/dist/lib/esm/frontmatter-formatting.d.mts +44 -0
  755. package/dist/lib/esm/frontmatter-formatting.mjs +368 -0
  756. package/dist/lib/esm/frontmatter-link-cache-with-offsets.d.mts +34 -0
  757. package/dist/lib/esm/frontmatter-link-cache-with-offsets.mjs +61 -0
  758. package/dist/lib/esm/frontmatter.d.mts +145 -0
  759. package/dist/lib/esm/frontmatter.mjs +174 -0
  760. package/dist/lib/esm/generated-during-build.d.mts +25 -0
  761. package/dist/lib/esm/generated-during-build.mjs +48 -0
  762. package/dist/lib/esm/hover-link-source-registrar.d.mts +52 -0
  763. package/dist/lib/esm/hover-link-source-registrar.mjs +65 -0
  764. package/dist/lib/esm/html-element.d.mts +98 -0
  765. package/dist/lib/esm/html-element.mjs +86 -0
  766. package/dist/lib/esm/i18n/custom-type-options.d.mts +38 -0
  767. package/dist/lib/esm/i18n/custom-type-options.mjs +43 -0
  768. package/dist/lib/esm/i18n/default-translations.d.mts +15 -0
  769. package/dist/lib/esm/i18n/default-translations.mjs +43 -0
  770. package/dist/lib/esm/i18n/i18n.d.mts +38 -0
  771. package/dist/lib/esm/i18n/i18n.mjs +89 -0
  772. package/dist/lib/esm/i18n/index.d.mts +5 -0
  773. package/dist/lib/esm/i18n/index.mjs +52 -0
  774. package/dist/lib/esm/i18n/locales/en.d.mts +91 -0
  775. package/dist/lib/esm/i18n/locales/en.mjs +127 -0
  776. package/dist/lib/esm/i18n/locales/index.d.mts +3 -0
  777. package/dist/lib/esm/i18n/locales/index.mjs +48 -0
  778. package/dist/lib/esm/i18n/locales/translations-map.d.mts +100 -0
  779. package/dist/lib/esm/i18n/locales/translations-map.mjs +52 -0
  780. package/dist/lib/esm/index.d.mts +96 -0
  781. package/dist/lib/esm/index.mjs +234 -0
  782. package/dist/lib/esm/is-in-obsidian.d.mts +12 -0
  783. package/dist/lib/esm/is-in-obsidian.mjs +59 -0
  784. package/dist/lib/esm/library-styles.d.mts +56 -0
  785. package/dist/lib/esm/library-styles.mjs +72 -0
  786. package/dist/lib/esm/library.d.mts +57 -0
  787. package/dist/lib/esm/library.mjs +83 -0
  788. package/dist/lib/esm/link-name.d.mts +23 -0
  789. package/dist/lib/esm/link-name.mjs +48 -0
  790. package/dist/lib/esm/link-update-progress.d.mts +32 -0
  791. package/dist/lib/esm/link-update-progress.mjs +42 -0
  792. package/dist/lib/esm/link.d.mts +1369 -0
  793. package/dist/lib/esm/link.mjs +988 -0
  794. package/dist/lib/esm/logger.d.mts +37 -0
  795. package/dist/lib/esm/logger.mjs +115 -0
  796. package/dist/lib/esm/loop.d.mts +104 -0
  797. package/dist/lib/esm/loop.mjs +151 -0
  798. package/dist/lib/esm/markdown-code-block-processor-registrar.d.mts +62 -0
  799. package/dist/lib/esm/markdown-code-block-processor-registrar.mjs +69 -0
  800. package/dist/lib/esm/markdown-code-block-processor.d.mts +137 -0
  801. package/dist/lib/esm/markdown-code-block-processor.mjs +356 -0
  802. package/dist/lib/esm/markdown-post-processor-registrar.d.mts +59 -0
  803. package/dist/lib/esm/markdown-post-processor-registrar.mjs +66 -0
  804. package/dist/lib/esm/markdown-view.d.mts +14 -0
  805. package/dist/lib/esm/markdown-view.mjs +54 -0
  806. package/dist/lib/esm/markdown.d.mts +226 -0
  807. package/dist/lib/esm/markdown.mjs +391 -0
  808. package/dist/lib/esm/menu-event-registrar.d.mts +84 -0
  809. package/dist/lib/esm/menu-event-registrar.mjs +42 -0
  810. package/dist/lib/esm/metadata-cache.d.mts +359 -0
  811. package/dist/lib/esm/metadata-cache.mjs +454 -0
  812. package/dist/lib/esm/mobile-trusted-input.d.mts +98 -0
  813. package/dist/lib/esm/mobile-trusted-input.mjs +82 -0
  814. package/dist/lib/esm/modals/alert.d.mts +35 -0
  815. package/dist/lib/esm/modals/alert.mjs +84 -0
  816. package/dist/lib/esm/modals/confirm.d.mts +39 -0
  817. package/dist/lib/esm/modals/confirm.mjs +94 -0
  818. package/dist/lib/esm/modals/index.d.mts +10 -0
  819. package/dist/lib/esm/modals/index.mjs +62 -0
  820. package/dist/lib/esm/modals/minimizable-modal.d.mts +129 -0
  821. package/dist/lib/esm/modals/minimizable-modal.mjs +348 -0
  822. package/dist/lib/esm/modals/modal-command-builder.d.mts +285 -0
  823. package/dist/lib/esm/modals/modal-command-builder.mjs +363 -0
  824. package/dist/lib/esm/modals/modal.d.mts +64 -0
  825. package/dist/lib/esm/modals/modal.mjs +78 -0
  826. package/dist/lib/esm/modals/prompt.d.mts +83 -0
  827. package/dist/lib/esm/modals/prompt.mjs +168 -0
  828. package/dist/lib/esm/modals/select-item.d.mts +55 -0
  829. package/dist/lib/esm/modals/select-item.mjs +104 -0
  830. package/dist/lib/esm/modals/select-option.d.mts +65 -0
  831. package/dist/lib/esm/modals/select-option.mjs +95 -0
  832. package/dist/lib/esm/modals/suggest-modal-command-builder.d.mts +35 -0
  833. package/dist/lib/esm/modals/suggest-modal-command-builder.mjs +47 -0
  834. package/dist/lib/esm/note-priority.d.mts +154 -0
  835. package/dist/lib/esm/note-priority.mjs +135 -0
  836. package/dist/lib/esm/notebook-navigator.d.mts +132 -0
  837. package/dist/lib/esm/notebook-navigator.mjs +64 -0
  838. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +42 -0
  839. package/dist/lib/esm/obsidian-dev-utils-state.mjs +76 -0
  840. package/dist/lib/esm/obsidian-protocol-handler-registrar.d.mts +55 -0
  841. package/dist/lib/esm/obsidian-protocol-handler-registrar.mjs +68 -0
  842. package/dist/lib/esm/obsidian-settings.d.mts +62 -0
  843. package/dist/lib/esm/obsidian-settings.mjs +81 -0
  844. package/dist/lib/esm/parse-link.d.mts +288 -0
  845. package/dist/lib/esm/parse-link.mjs +428 -0
  846. package/dist/lib/esm/path-settings.d.mts +56 -0
  847. package/dist/lib/esm/path-settings.mjs +176 -0
  848. package/dist/lib/esm/pdf.d.mts +26 -0
  849. package/dist/lib/esm/pdf.mjs +76 -0
  850. package/dist/lib/esm/plugin/index.d.mts +9 -0
  851. package/dist/lib/esm/plugin/index.mjs +60 -0
  852. package/dist/lib/esm/plugin/plugin-api.d.mts +413 -0
  853. package/dist/lib/esm/plugin/plugin-api.mjs +422 -0
  854. package/dist/lib/esm/plugin/plugin-context.d.mts +27 -0
  855. package/dist/lib/esm/plugin/plugin-context.mjs +101 -0
  856. package/dist/lib/esm/plugin/plugin-event-source.d.mts +97 -0
  857. package/dist/lib/esm/plugin/plugin-event-source.mjs +129 -0
  858. package/dist/lib/esm/plugin/plugin-install-state.d.mts +113 -0
  859. package/dist/lib/esm/plugin/plugin-install-state.mjs +101 -0
  860. package/dist/lib/esm/plugin/plugin-lifecycle-events.d.mts +127 -0
  861. package/dist/lib/esm/plugin/plugin-lifecycle-events.mjs +52 -0
  862. package/dist/lib/esm/plugin/plugin-settings-tab.d.mts +368 -0
  863. package/dist/lib/esm/plugin/plugin-settings-tab.mjs +527 -0
  864. package/dist/lib/esm/plugin/plugin.d.mts +363 -0
  865. package/dist/lib/esm/plugin/plugin.mjs +611 -0
  866. package/dist/lib/esm/plugin/settings-migration-api.d.mts +91 -0
  867. package/dist/lib/esm/plugin/settings-migration-api.mjs +42 -0
  868. package/dist/lib/esm/plugin-cli-handler-registrar.d.mts +64 -0
  869. package/dist/lib/esm/plugin-cli-handler-registrar.mjs +66 -0
  870. package/dist/lib/esm/popovers/field-popover.d.mts +75 -0
  871. package/dist/lib/esm/popovers/field-popover.mjs +88 -0
  872. package/dist/lib/esm/popovers/index.d.mts +4 -0
  873. package/dist/lib/esm/popovers/index.mjs +50 -0
  874. package/dist/lib/esm/popovers/popover-anchor.d.mts +67 -0
  875. package/dist/lib/esm/popovers/popover-anchor.mjs +82 -0
  876. package/dist/lib/esm/popovers/popover.d.mts +78 -0
  877. package/dist/lib/esm/popovers/popover.mjs +132 -0
  878. package/dist/lib/esm/property-entry.d.mts +43 -0
  879. package/dist/lib/esm/property-entry.mjs +73 -0
  880. package/dist/lib/esm/queue.d.mts +93 -0
  881. package/dist/lib/esm/queue.mjs +122 -0
  882. package/dist/lib/esm/react/app-context.d.mts +24 -0
  883. package/dist/lib/esm/react/app-context.mjs +56 -0
  884. package/dist/lib/esm/react/index.d.mts +2 -0
  885. package/dist/lib/esm/react/index.mjs +46 -0
  886. package/dist/lib/esm/reference.d.mts +116 -0
  887. package/dist/lib/esm/reference.mjs +87 -0
  888. package/dist/lib/esm/resource-lock.d.mts +318 -0
  889. package/dist/lib/esm/resource-lock.mjs +1006 -0
  890. package/dist/lib/esm/resource-url.d.mts +31 -0
  891. package/dist/lib/esm/resource-url.mjs +59 -0
  892. package/dist/lib/esm/ribbon-icon-registrar.d.mts +60 -0
  893. package/dist/lib/esm/ribbon-icon-registrar.mjs +66 -0
  894. package/dist/lib/esm/setting-components/checkbox-component.d.mts +69 -0
  895. package/dist/lib/esm/setting-components/checkbox-component.mjs +119 -0
  896. package/dist/lib/esm/setting-components/code-highlighter-component.d.mts +132 -0
  897. package/dist/lib/esm/setting-components/code-highlighter-component.mjs +287 -0
  898. package/dist/lib/esm/setting-components/date-component.d.mts +38 -0
  899. package/dist/lib/esm/setting-components/date-component.mjs +83 -0
  900. package/dist/lib/esm/setting-components/date-time-component.d.mts +38 -0
  901. package/dist/lib/esm/setting-components/date-time-component.mjs +83 -0
  902. package/dist/lib/esm/setting-components/email-component.d.mts +49 -0
  903. package/dist/lib/esm/setting-components/email-component.mjs +94 -0
  904. package/dist/lib/esm/setting-components/file-component.d.mts +43 -0
  905. package/dist/lib/esm/setting-components/file-component.mjs +86 -0
  906. package/dist/lib/esm/setting-components/index.d.mts +27 -0
  907. package/dist/lib/esm/setting-components/index.mjs +96 -0
  908. package/dist/lib/esm/setting-components/month-component.d.mts +51 -0
  909. package/dist/lib/esm/setting-components/month-component.mjs +91 -0
  910. package/dist/lib/esm/setting-components/multiple-dropdown-component.d.mts +92 -0
  911. package/dist/lib/esm/setting-components/multiple-dropdown-component.mjs +159 -0
  912. package/dist/lib/esm/setting-components/multiple-email-component.d.mts +38 -0
  913. package/dist/lib/esm/setting-components/multiple-email-component.mjs +80 -0
  914. package/dist/lib/esm/setting-components/multiple-file-component.d.mts +43 -0
  915. package/dist/lib/esm/setting-components/multiple-file-component.mjs +88 -0
  916. package/dist/lib/esm/setting-components/multiple-text-component.d.mts +109 -0
  917. package/dist/lib/esm/setting-components/multiple-text-component.mjs +178 -0
  918. package/dist/lib/esm/setting-components/number-component.d.mts +56 -0
  919. package/dist/lib/esm/setting-components/number-component.mjs +104 -0
  920. package/dist/lib/esm/setting-components/password-component.d.mts +38 -0
  921. package/dist/lib/esm/setting-components/password-component.mjs +80 -0
  922. package/dist/lib/esm/setting-components/setting-component-wrapper.d.mts +13 -0
  923. package/dist/lib/esm/setting-components/setting-component-wrapper.mjs +63 -0
  924. package/dist/lib/esm/setting-components/telephone-component.d.mts +51 -0
  925. package/dist/lib/esm/setting-components/telephone-component.mjs +94 -0
  926. package/dist/lib/esm/setting-components/text-based-component.d.mts +38 -0
  927. package/dist/lib/esm/setting-components/text-based-component.mjs +73 -0
  928. package/dist/lib/esm/setting-components/time-component.d.mts +38 -0
  929. package/dist/lib/esm/setting-components/time-component.mjs +88 -0
  930. package/dist/lib/esm/setting-components/tri-state-checkbox-component.d.mts +69 -0
  931. package/dist/lib/esm/setting-components/tri-state-checkbox-component.mjs +120 -0
  932. package/dist/lib/esm/setting-components/typed-dropdown-component.d.mts +97 -0
  933. package/dist/lib/esm/setting-components/typed-dropdown-component.mjs +168 -0
  934. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.d.mts +99 -0
  935. package/dist/lib/esm/setting-components/typed-multiple-dropdown-component.mjs +167 -0
  936. package/dist/lib/esm/setting-components/typed-range-text-component.d.mts +35 -0
  937. package/dist/lib/esm/setting-components/typed-range-text-component.mjs +78 -0
  938. package/dist/lib/esm/setting-components/typed-text-component.d.mts +100 -0
  939. package/dist/lib/esm/setting-components/typed-text-component.mjs +138 -0
  940. package/dist/lib/esm/setting-components/url-component.d.mts +49 -0
  941. package/dist/lib/esm/setting-components/url-component.mjs +94 -0
  942. package/dist/lib/esm/setting-components/validator-component.d.mts +23 -0
  943. package/dist/lib/esm/setting-components/validator-component.mjs +142 -0
  944. package/dist/lib/esm/setting-components/value-component-with-change-tracking.d.mts +20 -0
  945. package/dist/lib/esm/setting-components/value-component-with-change-tracking.mjs +42 -0
  946. package/dist/lib/esm/setting-components/week-component.d.mts +51 -0
  947. package/dist/lib/esm/setting-components/week-component.mjs +91 -0
  948. package/dist/lib/esm/setting-ex.d.mts +198 -0
  949. package/dist/lib/esm/setting-ex.mjs +274 -0
  950. package/dist/lib/esm/setting-group-ex.d.mts +26 -0
  951. package/dist/lib/esm/setting-group-ex.mjs +68 -0
  952. package/dist/lib/esm/status-bar-item-registrar.d.mts +36 -0
  953. package/dist/lib/esm/status-bar-item-registrar.mjs +65 -0
  954. package/dist/lib/esm/templater.d.mts +284 -0
  955. package/dist/lib/esm/templater.mjs +173 -0
  956. package/dist/lib/esm/transformers/duration-transformer.d.mts +39 -0
  957. package/dist/lib/esm/transformers/duration-transformer.mjs +85 -0
  958. package/dist/lib/esm/transformers/index.d.mts +2 -0
  959. package/dist/lib/esm/transformers/index.mjs +46 -0
  960. package/dist/lib/esm/trusted-input.d.mts +131 -0
  961. package/dist/lib/esm/trusted-input.mjs +83 -0
  962. package/dist/lib/esm/validation.d.mts +87 -0
  963. package/dist/lib/esm/validation.mjs +87 -0
  964. package/dist/lib/esm/vault-delete.d.mts +82 -0
  965. package/dist/lib/esm/vault-delete.mjs +132 -0
  966. package/dist/lib/esm/vault-transaction.d.mts +163 -0
  967. package/dist/lib/esm/vault-transaction.mjs +325 -0
  968. package/dist/lib/esm/vault.d.mts +506 -0
  969. package/dist/lib/esm/vault.mjs +604 -0
  970. package/dist/lib/esm/view-registrar.d.mts +52 -0
  971. package/dist/lib/esm/view-registrar.mjs +65 -0
  972. package/dist/lib/esm/workspace.d.mts +81 -0
  973. package/dist/lib/esm/workspace.mjs +84 -0
  974. package/dist/styles.css +497 -0
  975. package/i18n/custom-type-options/package.json +6 -0
  976. package/i18n/default-translations/package.json +6 -0
  977. package/i18n/i18n/package.json +6 -0
  978. package/i18n/index/package.json +6 -0
  979. package/i18n/locales/en/package.json +6 -0
  980. package/i18n/locales/index/package.json +6 -0
  981. package/i18n/locales/package.json +6 -0
  982. package/i18n/locales/translations-map/package.json +6 -0
  983. package/i18n/package.json +6 -0
  984. package/modals/alert/package.json +6 -0
  985. package/modals/confirm/package.json +6 -0
  986. package/modals/index/package.json +6 -0
  987. package/modals/minimizable-modal/package.json +6 -0
  988. package/modals/modal/package.json +6 -0
  989. package/modals/modal-command-builder/package.json +6 -0
  990. package/modals/package.json +6 -0
  991. package/modals/prompt/package.json +6 -0
  992. package/modals/select-item/package.json +6 -0
  993. package/modals/select-option/package.json +6 -0
  994. package/modals/suggest-modal-command-builder/package.json +6 -0
  995. package/package.json +533 -13
  996. package/plugin/index/package.json +6 -0
  997. package/plugin/package.json +6 -0
  998. package/plugin/plugin/package.json +6 -0
  999. package/plugin/plugin-api/package.json +6 -0
  1000. package/plugin/plugin-context/package.json +6 -0
  1001. package/plugin/plugin-event-source/package.json +6 -0
  1002. package/plugin/plugin-install-state/package.json +6 -0
  1003. package/plugin/plugin-lifecycle-events/package.json +6 -0
  1004. package/plugin/plugin-settings-tab/package.json +6 -0
  1005. package/plugin/settings-migration-api/package.json +6 -0
  1006. package/popovers/field-popover/package.json +6 -0
  1007. package/popovers/index/package.json +6 -0
  1008. package/popovers/package.json +6 -0
  1009. package/popovers/popover/package.json +6 -0
  1010. package/popovers/popover-anchor/package.json +6 -0
  1011. package/react/app-context/package.json +6 -0
  1012. package/react/index/package.json +6 -0
  1013. package/react/package.json +6 -0
  1014. package/setting-components/checkbox-component/package.json +6 -0
  1015. package/setting-components/code-highlighter-component/package.json +6 -0
  1016. package/setting-components/date-component/package.json +6 -0
  1017. package/setting-components/date-time-component/package.json +6 -0
  1018. package/setting-components/email-component/package.json +6 -0
  1019. package/setting-components/file-component/package.json +6 -0
  1020. package/setting-components/index/package.json +6 -0
  1021. package/setting-components/month-component/package.json +6 -0
  1022. package/setting-components/multiple-dropdown-component/package.json +6 -0
  1023. package/setting-components/multiple-email-component/package.json +6 -0
  1024. package/setting-components/multiple-file-component/package.json +6 -0
  1025. package/setting-components/multiple-text-component/package.json +6 -0
  1026. package/setting-components/number-component/package.json +6 -0
  1027. package/setting-components/package.json +6 -0
  1028. package/setting-components/password-component/package.json +6 -0
  1029. package/setting-components/setting-component-wrapper/package.json +6 -0
  1030. package/setting-components/telephone-component/package.json +6 -0
  1031. package/setting-components/text-based-component/package.json +6 -0
  1032. package/setting-components/time-component/package.json +6 -0
  1033. package/setting-components/tri-state-checkbox-component/package.json +6 -0
  1034. package/setting-components/typed-dropdown-component/package.json +6 -0
  1035. package/setting-components/typed-multiple-dropdown-component/package.json +6 -0
  1036. package/setting-components/typed-range-text-component/package.json +6 -0
  1037. package/setting-components/typed-text-component/package.json +6 -0
  1038. package/setting-components/url-component/package.json +6 -0
  1039. package/setting-components/validator-component/package.json +6 -0
  1040. package/setting-components/value-component-with-change-tracking/package.json +6 -0
  1041. package/setting-components/week-component/package.json +6 -0
  1042. package/transformers/duration-transformer/package.json +6 -0
  1043. package/transformers/index/package.json +6 -0
  1044. package/transformers/package.json +6 -0
@@ -0,0 +1,1053 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ (function () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
9
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return "/";
17
+ },
18
+ env: {},
19
+ platform: "android"
20
+ };
21
+ const existingProcess = globalThis.process;
22
+ if (!existingProcess) {
23
+ globalThis.process = browserProcess;
24
+ return;
25
+ }
26
+ if (existingProcess.versions?.node) {
27
+ return;
28
+ }
29
+ const existingProcessRecord = existingProcess;
30
+ for (const [key, value] of Object.entries(browserProcess)) {
31
+ existingProcessRecord[key] ??= value;
32
+ }
33
+ existingProcessRecord["browser"] = true;
34
+ }
35
+
36
+ function keepName($unknown) {
37
+ return $unknown;
38
+ }
39
+
40
+ (function initCjs() {
41
+ const globalThisRecord = globalThis;
42
+ ensureDisposeSymbols();
43
+ globalThisRecord["__name"] ??= keepName;
44
+ globalThisRecord["__extractDefault"] ??= extractDefault;
45
+ ensureBrowserProcess();
46
+ function extractDefault(module) {
47
+ return module && module.__esModule && "default" in module ? module.default : module;
48
+ }
49
+ })();
50
+ })();
51
+ (function patchObsidianRequire() {
52
+ const originalRequire = require;
53
+ if (!originalRequire || originalRequire.__isPatched) {
54
+ return;
55
+ }
56
+ require = Object.assign(
57
+ (id) => requirePatched(id),
58
+ originalRequire,
59
+ {
60
+ __isPatched: true
61
+ }
62
+ );
63
+ function extractDefault(module) {
64
+ return module && module.__esModule && "default" in module ? module.default : module;
65
+ }
66
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
67
+ "@codemirror/autocomplete",
68
+ "@codemirror/collab",
69
+ "@codemirror/commands",
70
+ "@codemirror/language",
71
+ "@codemirror/lint",
72
+ "@codemirror/search",
73
+ "@codemirror/state",
74
+ "@codemirror/text",
75
+ "@codemirror/view",
76
+ "@lezer/common",
77
+ "@lezer/highlight",
78
+ "@lezer/lr",
79
+ "obsidian"
80
+ ]);
81
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
82
+ "@codemirror/closebrackets",
83
+ "@codemirror/comment",
84
+ "@codemirror/fold",
85
+ "@codemirror/gutter",
86
+ "@codemirror/highlight",
87
+ "@codemirror/history",
88
+ "@codemirror/matchbrackets",
89
+ "@codemirror/panel",
90
+ "@codemirror/rangeset",
91
+ "@codemirror/rectangular-selection",
92
+ "@codemirror/stream-parser",
93
+ "@codemirror/tooltip"
94
+ ]);
95
+ function requirePatched(id) {
96
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
97
+ return originalRequire?.(id);
98
+ }
99
+ if (globalThis.app.isMobile) {
100
+ if (id === "process" || id === "node:process") {
101
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
102
+ return process;
103
+ }
104
+ } else {
105
+ const module = originalRequire?.(id);
106
+ if (module) {
107
+ return extractDefault(module);
108
+ }
109
+ }
110
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
111
+ return {};
112
+ }
113
+ })();
114
+
115
+ "use strict";
116
+ var __defProp = Object.defineProperty;
117
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
118
+ var __getOwnPropNames = Object.getOwnPropertyNames;
119
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
120
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
121
+ var __typeError = (msg) => {
122
+ throw TypeError(msg);
123
+ };
124
+ var __export = (target, all) => {
125
+ for (var name in all)
126
+ __defProp(target, name, { get: all[name], enumerable: true });
127
+ };
128
+ var __copyProps = (to, from, except, desc) => {
129
+ if (from && typeof from === "object" || typeof from === "function") {
130
+ for (let key of __getOwnPropNames(from))
131
+ if (!__hasOwnProp.call(to, key) && key !== except)
132
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
133
+ }
134
+ return to;
135
+ };
136
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
137
+ var __using = (stack, value, async) => {
138
+ if (value != null) {
139
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
140
+ var dispose, inner;
141
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
142
+ if (dispose === void 0) {
143
+ dispose = value[__knownSymbol("dispose")];
144
+ if (async) inner = dispose;
145
+ }
146
+ if (typeof dispose !== "function") __typeError("Object not disposable");
147
+ if (inner) dispose = function() {
148
+ try {
149
+ inner.call(this);
150
+ } catch (e) {
151
+ return Promise.reject(e);
152
+ }
153
+ };
154
+ stack.push([async, dispose, value]);
155
+ } else if (async) {
156
+ stack.push([async]);
157
+ }
158
+ return value;
159
+ };
160
+ var __callDispose = (stack, error, hasError) => {
161
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
162
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
163
+ };
164
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
165
+ var next = (it) => {
166
+ while (it = stack.pop()) {
167
+ try {
168
+ var result = it[1] && it[1].call(it[2]);
169
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
170
+ } catch (e) {
171
+ fail(e);
172
+ }
173
+ }
174
+ if (hasError) throw error;
175
+ };
176
+ return next();
177
+ };
178
+ var link_exports = {};
179
+ __export(link_exports, {
180
+ LinkPathStyle: () => LinkPathStyle,
181
+ LinkStyle: () => LinkStyle,
182
+ buildBacklinksSnapshot: () => buildBacklinksSnapshot,
183
+ convertLink: () => convertLink,
184
+ editBacklinks: () => editBacklinks,
185
+ editBacklinksSnapshot: () => editBacklinksSnapshot,
186
+ editLinks: () => editLinks,
187
+ editLinksInContent: () => editLinksInContent,
188
+ extractLinkFile: () => extractLinkFile,
189
+ generateMarkdownLink: () => generateMarkdownLink,
190
+ generateRawMarkdownLink: () => generateRawMarkdownLink,
191
+ getGenerateMarkdownLinkDefaultParamsFns: () => getGenerateMarkdownLinkDefaultParamsFns,
192
+ hasAngleBrackets: () => hasAngleBrackets,
193
+ hasEmbedSyntax: () => hasEmbedSyntax,
194
+ hasLeadingDot: () => hasLeadingDot,
195
+ hasLeadingSlash: () => hasLeadingSlash,
196
+ hasWikilinkSyntax: () => hasWikilinkSyntax,
197
+ shouldResetAlias: () => shouldResetAlias,
198
+ splitSubpath: () => splitSubpath,
199
+ updateFileUrlLinksInContent: () => updateFileUrlLinksInContent,
200
+ updateFileUrlLinksInFile: () => updateFileUrlLinksInFile,
201
+ updateLink: () => updateLink,
202
+ updateLinksInContent: () => updateLinksInContent,
203
+ updateLinksInFile: () => updateLinksInFile
204
+ });
205
+ module.exports = __toCommonJS(link_exports);
206
+ var import_abort_controller = require('@mnaoumov/typescript-lib/abort-controller');
207
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
208
+ var import_path = require('@mnaoumov/typescript-lib/path');
209
+ var import_string = require('@mnaoumov/typescript-lib/string');
210
+ var import_type_guards = require('@mnaoumov/typescript-lib/type-guards');
211
+ var import_url = require('@mnaoumov/typescript-lib/url');
212
+ var import_implementations = require('@obsidian-typings/obsidian-public-latest/implementations');
213
+ var import_obsidian = require('obsidian');
214
+ var import_debug = require('./debug.cjs');
215
+ var import_file_change = require('./file-change.cjs');
216
+ var import_file_system = require('./file-system.cjs');
217
+ var import_metadata_cache = require('./metadata-cache.cjs');
218
+ var import_obsidian_dev_utils_state = require('./obsidian-dev-utils-state.cjs');
219
+ var import_obsidian_settings = require('./obsidian-settings.cjs');
220
+ var import_parse_link = require('./parse-link.cjs');
221
+ var import_reference = require('./reference.cjs');
222
+ const ESCAPED_WIKILINK_DIVIDER = String.raw`\|`;
223
+ const OPTIONALLY_ESCAPED_WIKILINK_DIVIDER_REGEXP = /\\?\|/g;
224
+ const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?:^|[^\\])\|/;
225
+ const snapshotLinkIdentityKeyProviders = /* @__PURE__ */ new WeakMap();
226
+ var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => {
227
+ LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault";
228
+ LinkPathStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
229
+ LinkPathStyle2["RelativePathToTheSource"] = "RelativePathToTheSource";
230
+ LinkPathStyle2["ShortestPathWhenPossible"] = "ShortestPathWhenPossible";
231
+ return LinkPathStyle2;
232
+ })(LinkPathStyle || {});
233
+ var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => {
234
+ LinkStyle2["Markdown"] = "Markdown";
235
+ LinkStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
236
+ LinkStyle2["PreserveExisting"] = "PreserveExisting";
237
+ LinkStyle2["Wikilink"] = "Wikilink";
238
+ return LinkStyle2;
239
+ })(LinkStyle || {});
240
+ function buildBacklinksSnapshot(params) {
241
+ const {
242
+ backlinks,
243
+ linkIdentityKeyProvider: explicitLinkIdentityKeyProvider,
244
+ pathRemapper,
245
+ payloadProvider,
246
+ target
247
+ } = params;
248
+ const snapshot = target ?? /* @__PURE__ */ new Map();
249
+ const linkIdentityKeyProvider = resolveSnapshotLinkIdentityKeyProvider({
250
+ callerName: "buildBacklinksSnapshot",
251
+ explicitLinkIdentityKeyProvider,
252
+ snapshot
253
+ });
254
+ snapshotLinkIdentityKeyProviders.set(snapshot, linkIdentityKeyProvider);
255
+ for (const backlinkPath of backlinks.keys()) {
256
+ const newBacklinkPath = pathRemapper?.(backlinkPath) ?? backlinkPath;
257
+ let payloads = snapshot.get(newBacklinkPath);
258
+ if (!payloads) {
259
+ payloads = /* @__PURE__ */ new Map();
260
+ snapshot.set(newBacklinkPath, payloads);
261
+ }
262
+ for (const link of backlinks.get(backlinkPath) ?? []) {
263
+ payloads.set(linkIdentityKeyProvider(link), payloadProvider(link));
264
+ }
265
+ }
266
+ return snapshot;
267
+ }
268
+ function convertLink(params) {
269
+ const targetFile = extractLinkFile({
270
+ app: params.app,
271
+ link: params.link,
272
+ sourcePathOrFile: params.oldSourcePathOrFile ?? params.newSourcePathOrFile
273
+ });
274
+ return targetFile ? updateLink((0, import_object_utils.normalizeOptionalProperties)({
275
+ app: params.app,
276
+ isEmptyEmbedAliasAllowed: params.isEmptyEmbedAliasAllowed,
277
+ link: params.link,
278
+ linkPathStyle: params.linkPathStyle,
279
+ linkStyle: params.linkStyle,
280
+ newSourcePathOrFile: params.newSourcePathOrFile,
281
+ newTargetPathOrFile: targetFile,
282
+ oldSourcePathOrFile: params.oldSourcePathOrFile,
283
+ shouldEscapeAlias: params.shouldEscapeAlias,
284
+ shouldIncludeAttachmentExtensionToEmbedAlias: params.shouldIncludeAttachmentExtensionToEmbedAlias,
285
+ shouldUpdateFileNameAlias: params.shouldUpdateFileNameAlias,
286
+ shouldUseAngleBrackets: params.shouldUseAngleBrackets,
287
+ shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths,
288
+ shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths
289
+ })) : params.link.original;
290
+ }
291
+ async function editBacklinks(params) {
292
+ const {
293
+ app,
294
+ linkConverter,
295
+ linkUpdateProgressReporter,
296
+ pathOrFile,
297
+ ...options
298
+ } = params;
299
+ const backlinks = await (0, import_metadata_cache.getBacklinksForFileSafe)({ app, pathOrFile, ...options });
300
+ const snapshot = buildBacklinksSnapshot({
301
+ backlinks,
302
+ payloadProvider: getUndefinedPayload
303
+ });
304
+ await editBacklinksSnapshot((0, import_object_utils.normalizeOptionalProperties)({
305
+ app,
306
+ linkConverter: ({ link }) => linkConverter(link),
307
+ linkUpdateProgressReporter,
308
+ snapshot,
309
+ ...options
310
+ }));
311
+ }
312
+ async function editBacklinksSnapshot(params) {
313
+ const {
314
+ app,
315
+ linkConverter,
316
+ linkIdentityKeyProvider: explicitLinkIdentityKeyProvider,
317
+ linkUpdateProgressReporter,
318
+ shouldVisitUnmatchedLinks = false,
319
+ snapshot,
320
+ ...options
321
+ } = params;
322
+ const linkIdentityKeyProvider = resolveSnapshotLinkIdentityKeyProvider({
323
+ callerName: "editBacklinksSnapshot",
324
+ explicitLinkIdentityKeyProvider,
325
+ snapshot
326
+ });
327
+ const backlinkNotePaths = [...snapshot.keys()];
328
+ let processed = 0;
329
+ for (const backlinkNotePath of backlinkNotePaths) {
330
+ const payloads = (0, import_type_guards.ensureNonNullable)(snapshot.get(backlinkNotePath));
331
+ await editLinks({
332
+ app,
333
+ linkConverter: (link) => {
334
+ const linkIdentityKey = linkIdentityKeyProvider(link);
335
+ return !payloads.has(linkIdentityKey) && !shouldVisitUnmatchedLinks ? void 0 : linkConverter({
336
+ link,
337
+ payload: payloads.get(linkIdentityKey),
338
+ sourcePath: backlinkNotePath
339
+ });
340
+ },
341
+ pathOrFile: backlinkNotePath,
342
+ ...options
343
+ });
344
+ processed++;
345
+ linkUpdateProgressReporter?.({
346
+ currentPath: backlinkNotePath,
347
+ processed,
348
+ total: backlinkNotePaths.length
349
+ });
350
+ }
351
+ }
352
+ async function editLinks(params) {
353
+ const {
354
+ app,
355
+ linkConverter,
356
+ offsetRange,
357
+ pathOrFile,
358
+ shouldEditExternalLinks = false,
359
+ shouldEditFrontmatterExternalLinks = false,
360
+ shouldEditMultiValueFrontmatterExternalLinks = false,
361
+ ...options
362
+ } = params;
363
+ if (offsetRange !== void 0) {
364
+ validateOffsetRange(offsetRange);
365
+ }
366
+ await (0, import_file_change.applyFileChanges)({
367
+ app,
368
+ changesProvider: async ({ abortSignal, content }) => {
369
+ const cache = await (0, import_metadata_cache.getCacheSafe)(app, pathOrFile, {
370
+ shouldParseExternalLinks: shouldEditExternalLinks,
371
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
372
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
373
+ });
374
+ abortSignal.throwIfAborted();
375
+ const file = (0, import_file_system.getFile)({ app, pathOrFile });
376
+ const cachedContent = await app.vault.cachedRead(file);
377
+ abortSignal.throwIfAborted();
378
+ return content === cachedContent ? await getFileChanges((0, import_object_utils.normalizeOptionalProperties)({
379
+ abortSignal,
380
+ cache,
381
+ isCanvasFileCache: (0, import_file_system.isCanvasFile)(pathOrFile),
382
+ linkConverter,
383
+ offsetRange,
384
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
385
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
386
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
387
+ })) : null;
388
+ },
389
+ pathOrFile,
390
+ ...options
391
+ });
392
+ }
393
+ async function editLinksInContent(params) {
394
+ const { app, content, linkConverter, offsetRange, shouldEditExternalLinks = false, shouldEditFrontmatterExternalLinks = false, shouldEditMultiValueFrontmatterExternalLinks = false } = params;
395
+ let { abortSignal } = params;
396
+ abortSignal ??= (0, import_abort_controller.abortSignalNever)();
397
+ abortSignal.throwIfAborted();
398
+ if (offsetRange !== void 0) {
399
+ validateOffsetRange(offsetRange);
400
+ }
401
+ const newContent = await (0, import_file_change.applyContentChanges)({
402
+ abortSignal,
403
+ changesProvider: async () => {
404
+ const cache = await (0, import_metadata_cache.parseMetadata)(app, content, {
405
+ shouldParseExternalLinks: shouldEditExternalLinks,
406
+ shouldParseFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
407
+ shouldParseMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
408
+ });
409
+ abortSignal.throwIfAborted();
410
+ const changes = await getFileChanges((0, import_object_utils.normalizeOptionalProperties)({
411
+ abortSignal,
412
+ cache,
413
+ isCanvasFileCache: false,
414
+ linkConverter,
415
+ offsetRange,
416
+ shouldIncludeExternalLinks: shouldEditExternalLinks,
417
+ shouldIncludeFrontmatterExternalLinks: shouldEditFrontmatterExternalLinks,
418
+ shouldIncludeMultiValueFrontmatterExternalLinks: shouldEditMultiValueFrontmatterExternalLinks
419
+ }));
420
+ abortSignal.throwIfAborted();
421
+ return changes;
422
+ },
423
+ content,
424
+ path: ""
425
+ });
426
+ abortSignal.throwIfAborted();
427
+ (0, import_type_guards.assertNonNullable)(newContent, "Failed to update links in content");
428
+ return newContent;
429
+ }
430
+ function extractLinkFile(params) {
431
+ const {
432
+ app,
433
+ link,
434
+ shouldAllowNonExistingFile = false,
435
+ sourcePathOrFile
436
+ } = params;
437
+ const { linkPath } = splitSubpath(link.link);
438
+ const sourcePath = (0, import_file_system.getPath)(app, sourcePathOrFile);
439
+ const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
440
+ if (file) {
441
+ return file;
442
+ }
443
+ if (!shouldAllowNonExistingFile) {
444
+ return null;
445
+ }
446
+ if (linkPath.startsWith("/")) {
447
+ return (0, import_file_system.getFile)({ app, pathOrFile: linkPath, shouldIncludeNonExisting: true });
448
+ }
449
+ const fullLinkPath = (0, import_path.join)((0, import_path.dirname)(sourcePath), `./${linkPath}`);
450
+ return fullLinkPath.startsWith("../") ? null : (0, import_file_system.getFile)({ app, pathOrFile: fullLinkPath, shouldIncludeNonExisting: true });
451
+ }
452
+ function generateMarkdownLink(params) {
453
+ var _stack = [];
454
+ try {
455
+ const { app } = params;
456
+ const DEFAULT_PARAMS = {
457
+ isEmptyEmbedAliasAllowed: true
458
+ };
459
+ const customDefaultParams = getGenerateMarkdownLinkDefaultParamsFns().map((defaultParamsFunction) => defaultParamsFunction());
460
+ params = Object.assign({}, DEFAULT_PARAMS, ...customDefaultParams, (0, import_object_utils.removeUndefinedProperties)({ ...params }));
461
+ const targetFile = (0, import_file_system.getFile)((0, import_object_utils.normalizeOptionalProperties)({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
462
+ const _registration = __using(_stack, (0, import_metadata_cache.registerFiles)(app, [targetFile]));
463
+ return generateMarkdownLinkImpl(params);
464
+ } catch (_) {
465
+ var _error = _, _hasError = true;
466
+ } finally {
467
+ __callDispose(_stack, _error, _hasError);
468
+ }
469
+ }
470
+ function generateRawMarkdownLink(params) {
471
+ const embedPrefix = params.isEmbed ? "!" : "";
472
+ if (params.isWikilink) {
473
+ const aliasPart = params.alias ? `|${params.alias}` : "";
474
+ return `${embedPrefix}[[${params.url}${aliasPart}]]`;
475
+ }
476
+ const alias = params.alias ?? "";
477
+ const shouldEscapeAlias = params.shouldEscapeAlias ?? false;
478
+ const escapedAlias = shouldEscapeAlias ? (0, import_parse_link.escapeAlias)(alias) : alias;
479
+ const url = params.shouldUseAngleBrackets ? `<${params.url}>` : (0, import_url.encodeUrl)(params.url);
480
+ const titlePart = params.title ? ` ${JSON.stringify(params.title)}` : "";
481
+ return `${embedPrefix}[${escapedAlias}](${url}${titlePart})`;
482
+ }
483
+ function getGenerateMarkdownLinkDefaultParamsFns() {
484
+ return (0, import_obsidian_dev_utils_state.getObsidianDevUtilsState)("generateMarkdownLinkDefaultParamsFns", []).value;
485
+ }
486
+ function hasAngleBrackets(link) {
487
+ const parseLinkResult = (0, import_parse_link.parseLink)(link);
488
+ return parseLinkResult?.hasAngleBrackets ?? false;
489
+ }
490
+ function hasEmbedSyntax(link) {
491
+ const parseLinkResult = (0, import_parse_link.parseLink)(link);
492
+ return parseLinkResult?.isEmbed ?? false;
493
+ }
494
+ function hasLeadingDot(link) {
495
+ const parseLinkResult = (0, import_parse_link.parseLink)(link);
496
+ return parseLinkResult?.url.startsWith("./") ?? false;
497
+ }
498
+ function hasLeadingSlash(link) {
499
+ const parseLinkResult = (0, import_parse_link.parseLink)(link);
500
+ return parseLinkResult?.url.startsWith("/") ?? false;
501
+ }
502
+ function hasWikilinkSyntax(link) {
503
+ const parseLinkResult = (0, import_parse_link.parseLink)(link);
504
+ return parseLinkResult?.isWikilink ?? false;
505
+ }
506
+ function shouldResetAlias(params) {
507
+ const {
508
+ app,
509
+ displayText,
510
+ isWikilink,
511
+ newSourcePathOrFile,
512
+ oldSourcePathOrFile,
513
+ oldTargetPath,
514
+ targetPathOrFile
515
+ } = params;
516
+ if (isWikilink === false) {
517
+ return false;
518
+ }
519
+ if (!displayText) {
520
+ return true;
521
+ }
522
+ const targetFile = (0, import_file_system.getFile)({ app, pathOrFile: targetPathOrFile, shouldIncludeNonExisting: true });
523
+ const newSourcePath = (0, import_file_system.getPath)(app, newSourcePathOrFile);
524
+ const oldSourcePath = (0, import_file_system.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
525
+ const newSourceFolder = (0, import_path.dirname)(newSourcePath);
526
+ const oldSourceFolder = (0, import_path.dirname)(oldSourcePath);
527
+ const aliasesToReset = /* @__PURE__ */ new Set();
528
+ for (const pathOrFile of [targetFile.path, oldTargetPath]) {
529
+ if (!pathOrFile) {
530
+ continue;
531
+ }
532
+ const path = (0, import_file_system.getPath)(app, pathOrFile);
533
+ aliasesToReset.add(path);
534
+ aliasesToReset.add((0, import_path.basename)(path));
535
+ aliasesToReset.add((0, import_path.relative)(newSourceFolder, path));
536
+ aliasesToReset.add((0, import_path.relative)(oldSourceFolder, path));
537
+ }
538
+ for (const sourcePath of [oldSourcePath, newSourcePath]) {
539
+ aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
540
+ }
541
+ const cleanDisplayText = (0, import_string.replaceAll)({
542
+ $string: (0, import_obsidian.normalizePath)((0, import_type_guards.ensureNonNullable)(displayText.split(" > ", 1)[0])),
543
+ replacer: "",
544
+ searchValue: /^\.\//g
545
+ }).toLowerCase();
546
+ for (const alias of aliasesToReset) {
547
+ if (alias.toLowerCase() === cleanDisplayText) {
548
+ return true;
549
+ }
550
+ const folder = (0, import_path.dirname)(alias);
551
+ const base = (0, import_path.basename)(alias, (0, import_path.extname)(alias));
552
+ if ((0, import_path.join)(folder, base).toLowerCase() === cleanDisplayText) {
553
+ return true;
554
+ }
555
+ }
556
+ return false;
557
+ }
558
+ function splitSubpath(link) {
559
+ const parsed = (0, import_obsidian.parseLinktext)((0, import_string.normalizeString)(link));
560
+ return {
561
+ linkPath: parsed.path,
562
+ subpath: parsed.subpath
563
+ };
564
+ }
565
+ async function updateFileUrlLinksInContent(params) {
566
+ const { app, content, offsetRange, shouldUseAngleBrackets = false } = params;
567
+ return await editLinksInContent((0, import_object_utils.normalizeOptionalProperties)({
568
+ abortSignal: params.abortSignal,
569
+ app,
570
+ content,
571
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
572
+ offsetRange,
573
+ shouldEditExternalLinks: true,
574
+ shouldEditFrontmatterExternalLinks: true,
575
+ shouldEditMultiValueFrontmatterExternalLinks: true
576
+ }));
577
+ }
578
+ async function updateFileUrlLinksInFile(params) {
579
+ const {
580
+ app,
581
+ offsetRange,
582
+ pathOrFile,
583
+ shouldUseAngleBrackets = false,
584
+ ...options
585
+ } = params;
586
+ await editLinks((0, import_object_utils.normalizeOptionalProperties)({
587
+ app,
588
+ linkConverter: (link) => normalizeFileUrlLink(link, shouldUseAngleBrackets),
589
+ // Forwarded by name rather than through `options`, so a later refactor cannot drop it silently.
590
+ offsetRange,
591
+ pathOrFile,
592
+ shouldEditExternalLinks: true,
593
+ shouldEditFrontmatterExternalLinks: true,
594
+ shouldEditMultiValueFrontmatterExternalLinks: true,
595
+ ...options
596
+ }));
597
+ }
598
+ function updateLink(params) {
599
+ const {
600
+ app,
601
+ isEmptyEmbedAliasAllowed,
602
+ link,
603
+ linkPathStyle,
604
+ linkStyle,
605
+ newSourcePathOrFile,
606
+ newTargetPathOrFile,
607
+ oldSourcePathOrFile,
608
+ oldTargetPathOrFile,
609
+ shouldEscapeAlias,
610
+ shouldIncludeAttachmentExtensionToEmbedAlias,
611
+ shouldUpdateFileNameAlias = true,
612
+ shouldUseAngleBrackets,
613
+ shouldUseLeadingDotForRelativePaths,
614
+ shouldUseLeadingSlashForAbsolutePaths
615
+ } = params;
616
+ if (!newTargetPathOrFile) {
617
+ return link.original;
618
+ }
619
+ const newTargetFile = (0, import_file_system.getFile)({ app, pathOrFile: newTargetPathOrFile, shouldIncludeNonExisting: true });
620
+ const oldSourcePath = (0, import_file_system.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
621
+ const oldTargetPath = (0, import_file_system.getPath)(app, oldTargetPathOrFile ?? newTargetPathOrFile);
622
+ const isWikilink = shouldUseWikilinkStyle((0, import_object_utils.normalizeOptionalProperties)({
623
+ app,
624
+ linkStyle,
625
+ originalLink: link.original
626
+ }));
627
+ const { subpath } = splitSubpath(link.link);
628
+ if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile) && (0, import_reference.isCanvasFileNodeReference)(link)) {
629
+ return newTargetFile.path + subpath;
630
+ }
631
+ const parseLinkResult = (0, import_parse_link.parseLink)(link.original);
632
+ let alias;
633
+ if (isWikilink && parseLinkResult?.alias) {
634
+ alias = parseLinkResult.alias;
635
+ }
636
+ alias ??= shouldResetAlias((0, import_object_utils.normalizeOptionalProperties)({
637
+ app,
638
+ displayText: link.displayText,
639
+ isWikilink,
640
+ newSourcePathOrFile,
641
+ oldSourcePathOrFile,
642
+ oldTargetPath,
643
+ targetPathOrFile: newTargetFile
644
+ })) ? void 0 : parseLinkResult?.alias;
645
+ if (shouldUpdateFileNameAlias) {
646
+ if (alias === (0, import_path.basename)(oldTargetPath, (0, import_path.extname)(oldTargetPath))) {
647
+ alias = newTargetFile.basename;
648
+ } else if (alias === (0, import_path.basename)(oldTargetPath)) {
649
+ alias = newTargetFile.name;
650
+ }
651
+ }
652
+ const newLink = generateMarkdownLink((0, import_object_utils.normalizeOptionalProperties)({
653
+ alias,
654
+ app,
655
+ isEmptyEmbedAliasAllowed,
656
+ isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
657
+ linkPathStyle,
658
+ linkStyle,
659
+ originalLink: link.original,
660
+ shouldEscapeAlias,
661
+ shouldIncludeAttachmentExtensionToEmbedAlias,
662
+ shouldUseAngleBrackets,
663
+ shouldUseLeadingDotForRelativePaths,
664
+ shouldUseLeadingSlashForAbsolutePaths,
665
+ sourcePathOrFile: newSourcePathOrFile,
666
+ subpath,
667
+ targetPathOrFile: newTargetFile
668
+ }));
669
+ return newLink;
670
+ }
671
+ async function updateLinksInContent(params) {
672
+ const {
673
+ app,
674
+ content,
675
+ isEmptyEmbedAliasAllowed,
676
+ linkPathStyle,
677
+ linkStyle,
678
+ newSourcePathOrFile,
679
+ offsetRange,
680
+ oldSourcePathOrFile,
681
+ shouldEscapeAlias,
682
+ shouldIncludeAttachmentExtensionToEmbedAlias,
683
+ shouldUpdateEmbedOnlyLinks,
684
+ shouldUpdateFileNameAlias,
685
+ shouldUseAngleBrackets,
686
+ shouldUseLeadingDotForRelativePaths,
687
+ shouldUseLeadingSlashForAbsolutePaths
688
+ } = params;
689
+ return await editLinksInContent((0, import_object_utils.normalizeOptionalProperties)({
690
+ app,
691
+ content,
692
+ linkConverter: (link) => {
693
+ const isEmbedLink = hasEmbedSyntax(link.original);
694
+ return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink((0, import_object_utils.normalizeOptionalProperties)({
695
+ app,
696
+ isEmptyEmbedAliasAllowed,
697
+ link,
698
+ linkPathStyle,
699
+ linkStyle,
700
+ newSourcePathOrFile,
701
+ oldSourcePathOrFile,
702
+ shouldEscapeAlias,
703
+ shouldIncludeAttachmentExtensionToEmbedAlias,
704
+ shouldUpdateFileNameAlias,
705
+ shouldUseAngleBrackets,
706
+ shouldUseLeadingDotForRelativePaths,
707
+ shouldUseLeadingSlashForAbsolutePaths
708
+ }));
709
+ },
710
+ offsetRange
711
+ }));
712
+ }
713
+ async function updateLinksInFile(params) {
714
+ const {
715
+ app,
716
+ isEmptyEmbedAliasAllowed,
717
+ linkPathStyle,
718
+ linkStyle,
719
+ newSourcePathOrFile,
720
+ offsetRange,
721
+ oldSourcePathOrFile,
722
+ shouldEscapeAlias,
723
+ shouldIncludeAttachmentExtensionToEmbedAlias,
724
+ shouldUpdateEmbedOnlyLinks,
725
+ shouldUpdateFileNameAlias,
726
+ shouldUseAngleBrackets,
727
+ shouldUseLeadingDotForRelativePaths,
728
+ shouldUseLeadingSlashForAbsolutePaths
729
+ } = params;
730
+ if ((0, import_file_system.isCanvasFile)(newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(import_implementations.InternalPluginName.Canvas)) {
731
+ return;
732
+ }
733
+ await editLinks((0, import_object_utils.normalizeOptionalProperties)({
734
+ ...params,
735
+ linkConverter: (link) => {
736
+ const isEmbedLink = hasEmbedSyntax(link.original);
737
+ return shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink ? void 0 : convertLink((0, import_object_utils.normalizeOptionalProperties)({
738
+ app,
739
+ isEmptyEmbedAliasAllowed,
740
+ link,
741
+ linkPathStyle,
742
+ linkStyle,
743
+ newSourcePathOrFile,
744
+ oldSourcePathOrFile,
745
+ shouldEscapeAlias,
746
+ shouldIncludeAttachmentExtensionToEmbedAlias,
747
+ shouldUpdateFileNameAlias,
748
+ shouldUseAngleBrackets,
749
+ shouldUseLeadingDotForRelativePaths,
750
+ shouldUseLeadingSlashForAbsolutePaths
751
+ }));
752
+ },
753
+ // Named beside the `...params` spread, so a later refactor to explicit forwarding cannot drop it silently.
754
+ offsetRange,
755
+ pathOrFile: newSourcePathOrFile
756
+ }));
757
+ }
758
+ function defaultLinkIdentityKeyProvider(link) {
759
+ return JSON.stringify(link);
760
+ }
761
+ function generateLinkText(params) {
762
+ const { app, config, subpath, targetFile } = params;
763
+ let { sourcePath } = params;
764
+ if (sourcePath === "/") {
765
+ sourcePath = "";
766
+ }
767
+ let linkText;
768
+ if (targetFile.path === sourcePath && subpath && config.isSingleSubpathAllowed) {
769
+ linkText = "";
770
+ } else {
771
+ switch (config.linkPathStyle) {
772
+ /* v8 ignore stop */
773
+ case "AbsolutePathInVault" /* AbsolutePathInVault */: {
774
+ linkText = targetFile.path;
775
+ if (config.shouldUseLeadingSlashForAbsolutePaths && !linkText.startsWith("/")) {
776
+ linkText = `/${linkText}`;
777
+ }
778
+ break;
779
+ }
780
+ case "RelativePathToTheNote" /* RelativePathToTheSource */: {
781
+ linkText = (0, import_path.relative)((0, import_path.dirname)(sourcePath), targetFile.path);
782
+ if (config.shouldUseLeadingDotForRelativePaths && !linkText.startsWith(".")) {
783
+ linkText = `./${linkText}`;
784
+ }
785
+ break;
786
+ }
787
+ case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
788
+ const shortestName = (0, import_file_system.isMarkdownFile)(targetFile) ? targetFile.basename : targetFile.name;
789
+ const matchedFiles = app.metadataCache.getLinkpathDest(shortestName, sourcePath);
790
+ linkText = matchedFiles.length === 1 && matchedFiles[0] === targetFile ? targetFile.name : targetFile.path;
791
+ break;
792
+ }
793
+ /* v8 ignore start -- All valid FinalLinkPathStyle values are handled above. */
794
+ default: {
795
+ (0, import_type_guards.assertNever)(config.linkPathStyle);
796
+ }
797
+ }
798
+ }
799
+ linkText = config.isWikilink ? (0, import_string.trimEnd)({
800
+ $string: linkText,
801
+ suffix: `.${import_file_system.MARKDOWN_FILE_EXTENSION}`
802
+ }) : linkText;
803
+ linkText += subpath;
804
+ return linkText;
805
+ }
806
+ function generateMarkdownLinkImpl(params) {
807
+ const { app } = params;
808
+ const targetFile = (0, import_file_system.getFile)((0, import_object_utils.normalizeOptionalProperties)({ app, pathOrFile: params.targetPathOrFile, shouldIncludeNonExisting: params.isNonExistingFileAllowed }));
809
+ const sourcePath = (0, import_file_system.getPath)(app, params.sourcePathOrFile);
810
+ const subpath = params.subpath ?? "";
811
+ const linkConfig = getLinkConfig(params);
812
+ const linkText = generateLinkText({
813
+ app,
814
+ config: linkConfig,
815
+ sourcePath,
816
+ subpath,
817
+ targetFile
818
+ });
819
+ return linkConfig.isWikilink ? generateWikiLink({
820
+ alias: params.alias,
821
+ isEmbed: linkConfig.isEmbed,
822
+ linkText
823
+ }) : generateMarkdownStyleLink({
824
+ config: linkConfig,
825
+ linkText,
826
+ markdownLinkParams: params,
827
+ targetFile
828
+ });
829
+ }
830
+ function generateMarkdownStyleLink(params) {
831
+ const { config, linkText, markdownLinkParams, targetFile } = params;
832
+ let alias = markdownLinkParams.alias ?? "";
833
+ let shouldEscapeAlias = markdownLinkParams.shouldEscapeAlias ?? false;
834
+ if (!alias && ((0, import_file_system.isMarkdownFile)(targetFile) || !markdownLinkParams.isEmptyEmbedAliasAllowed)) {
835
+ alias = !markdownLinkParams.shouldIncludeAttachmentExtensionToEmbedAlias || (0, import_file_system.isMarkdownFile)(targetFile) ? targetFile.basename : targetFile.name;
836
+ shouldEscapeAlias = true;
837
+ }
838
+ return generateRawMarkdownLink({
839
+ alias,
840
+ isEmbed: config.isEmbed,
841
+ isWikilink: false,
842
+ shouldEscapeAlias,
843
+ shouldUseAngleBrackets: config.shouldUseAngleBrackets,
844
+ url: linkText
845
+ });
846
+ }
847
+ function generateWikiLink(params) {
848
+ const { alias, isEmbed, linkText } = params;
849
+ return generateRawMarkdownLink({
850
+ isEmbed,
851
+ isWikilink: true,
852
+ ...alias?.toLowerCase() === linkText.toLowerCase() ? { url: alias } : {
853
+ alias,
854
+ url: linkText
855
+ }
856
+ });
857
+ }
858
+ async function getFileChanges(params) {
859
+ const {
860
+ cache,
861
+ isCanvasFileCache,
862
+ linkConverter,
863
+ offsetRange,
864
+ shouldIncludeExternalLinks = false,
865
+ shouldIncludeFrontmatterExternalLinks = false,
866
+ shouldIncludeMultiValueFrontmatterExternalLinks = false
867
+ } = params;
868
+ let { abortSignal } = params;
869
+ abortSignal ??= (0, import_abort_controller.abortSignalNever)();
870
+ abortSignal.throwIfAborted();
871
+ if (!cache) {
872
+ return [];
873
+ }
874
+ const changes = [];
875
+ const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({
876
+ end: section.position.end.offset,
877
+ start: section.position.start.offset
878
+ }));
879
+ const getFileChangesDebugger = (0, import_debug.getObsidianLibDebugger)("Link:getFileChanges");
880
+ for (const link of (0, import_metadata_cache.getLinks)({ cache, shouldIncludeExternalLinks, shouldIncludeFrontmatterExternalLinks, shouldIncludeMultiValueFrontmatterExternalLinks })) {
881
+ abortSignal.throwIfAborted();
882
+ if (offsetRange !== void 0 && !(0, import_reference.isReferenceInOffsetRange)(link, offsetRange)) {
883
+ getFileChangesDebugger(
884
+ (0, import_implementations.isReferenceCache)(link) ? "Skipping a link that is not fully contained in the offset range" : "Skipping a link that carries no position within the content, so it can never be in the offset range",
885
+ { link: link.original, offsetRange }
886
+ );
887
+ continue;
888
+ }
889
+ const newContent = await linkConverter(link, abortSignal);
890
+ abortSignal.throwIfAborted();
891
+ if (newContent === void 0) {
892
+ continue;
893
+ }
894
+ const fileChange = (0, import_reference.referenceToFileChange)(link, newContent);
895
+ if (isCanvasFileCache) {
896
+ if ((0, import_file_change.isCanvasChange)(fileChange)) {
897
+ changes.push(fileChange);
898
+ } else {
899
+ console.error("Unsupported file change", fileChange);
900
+ }
901
+ } else {
902
+ if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
903
+ fileChange.newContent = fileChange.newContent.replaceAll(OPTIONALLY_ESCAPED_WIKILINK_DIVIDER_REGEXP, () => ESCAPED_WIKILINK_DIVIDER);
904
+ }
905
+ changes.push(fileChange);
906
+ }
907
+ }
908
+ return changes;
909
+ }
910
+ function getFinalLinkPathStyle(app, linkPathStyle) {
911
+ const resolvedStyle = linkPathStyle ?? "ObsidianSettingsDefault" /* ObsidianSettingsDefault */;
912
+ switch (resolvedStyle) {
913
+ case "AbsolutePathInVault" /* AbsolutePathInVault */: {
914
+ return "AbsolutePathInVault" /* AbsolutePathInVault */;
915
+ }
916
+ case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
917
+ return resolveFinalLinkPathStyleFromObsidianSettings(app);
918
+ }
919
+ case "RelativePathToTheSource" /* RelativePathToTheSource */: {
920
+ return "RelativePathToTheNote" /* RelativePathToTheSource */;
921
+ }
922
+ case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
923
+ return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
924
+ }
925
+ default: {
926
+ (0, import_type_guards.assertNever)(resolvedStyle);
927
+ }
928
+ }
929
+ }
930
+ function getLinkConfig(params) {
931
+ const { app } = params;
932
+ return {
933
+ isEmbed: params.isEmbed ?? (params.originalLink ? hasEmbedSyntax(params.originalLink) : false),
934
+ isSingleSubpathAllowed: params.isSingleSubpathAllowed ?? true,
935
+ isWikilink: shouldUseWikilinkStyle((0, import_object_utils.normalizeOptionalProperties)({
936
+ app,
937
+ linkStyle: params.linkStyle,
938
+ originalLink: params.originalLink
939
+ })),
940
+ linkPathStyle: getFinalLinkPathStyle(app, params.linkPathStyle),
941
+ shouldUseAngleBrackets: params.shouldUseAngleBrackets ?? (params.originalLink ? hasAngleBrackets(params.originalLink) : void 0) ?? false,
942
+ shouldUseLeadingDotForRelativePaths: params.shouldUseLeadingDotForRelativePaths ?? (params.originalLink ? hasLeadingDot(params.originalLink) : void 0) ?? false,
943
+ shouldUseLeadingSlashForAbsolutePaths: params.shouldUseLeadingSlashForAbsolutePaths ?? (params.originalLink ? hasLeadingSlash(params.originalLink) : void 0) ?? false
944
+ };
945
+ }
946
+ function getUndefinedPayload() {
947
+ }
948
+ function normalizeFileUrlLink(link, shouldUseAngleBrackets) {
949
+ if ((0, import_parse_link.isParseLinkFrontmatterReference)(link)) {
950
+ return link.parseLinkResult.isFileUrl ? (0, import_url.normalizeFileUrl)(link.parseLinkResult.url) : void 0;
951
+ }
952
+ if (!(0, import_parse_link.isParseLinkReference)(link)) {
953
+ return;
954
+ }
955
+ const { parseLinkResult } = link;
956
+ return parseLinkResult.isFileUrl ? generateRawMarkdownLink((0, import_object_utils.normalizeOptionalProperties)({
957
+ alias: parseLinkResult.alias,
958
+ isEmbed: parseLinkResult.isEmbed,
959
+ isWikilink: false,
960
+ shouldUseAngleBrackets,
961
+ url: (0, import_url.normalizeFileUrl)(parseLinkResult.url)
962
+ })) : void 0;
963
+ }
964
+ function resolveFinalLinkPathStyleFromObsidianSettings(app) {
965
+ const newLinkFormat = (0, import_obsidian_settings.getNewLinkFormat)(app);
966
+ switch (newLinkFormat) {
967
+ case "absolute": {
968
+ return "AbsolutePathInVault" /* AbsolutePathInVault */;
969
+ }
970
+ case "relative": {
971
+ return "RelativePathToTheNote" /* RelativePathToTheSource */;
972
+ }
973
+ case "shortest": {
974
+ return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
975
+ }
976
+ default: {
977
+ (0, import_type_guards.assertNever)(newLinkFormat);
978
+ }
979
+ }
980
+ }
981
+ function resolveSnapshotLinkIdentityKeyProvider(params) {
982
+ const { callerName, explicitLinkIdentityKeyProvider, snapshot } = params;
983
+ const recordedLinkIdentityKeyProvider = snapshotLinkIdentityKeyProviders.get(snapshot);
984
+ if (explicitLinkIdentityKeyProvider && recordedLinkIdentityKeyProvider && explicitLinkIdentityKeyProvider !== recordedLinkIdentityKeyProvider) {
985
+ throw new Error(
986
+ `${callerName} was passed a linkIdentityKeyProvider that differs from the one the snapshot was built with. The snapshot is keyed by the other, so no link would match. Omit the parameter to use the snapshot's own.`
987
+ );
988
+ }
989
+ return explicitLinkIdentityKeyProvider ?? recordedLinkIdentityKeyProvider ?? defaultLinkIdentityKeyProvider;
990
+ }
991
+ function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
992
+ if (!(0, import_file_change.isContentChange)(fileChange)) {
993
+ return false;
994
+ }
995
+ return UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent) && tablePositions.some((tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end);
996
+ }
997
+ function shouldUseWikilinkStyle(params) {
998
+ const { app, linkStyle, originalLink } = params;
999
+ const resolvedStyle = linkStyle ?? "PreserveExisting" /* PreserveExisting */;
1000
+ switch (resolvedStyle) {
1001
+ case "Markdown" /* Markdown */: {
1002
+ return false;
1003
+ }
1004
+ case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
1005
+ return (0, import_obsidian_settings.shouldUseWikilinks)(app);
1006
+ }
1007
+ case "PreserveExisting" /* PreserveExisting */: {
1008
+ return originalLink === void 0 ? (0, import_obsidian_settings.shouldUseWikilinks)(app) : hasWikilinkSyntax(originalLink);
1009
+ }
1010
+ case "Wikilink" /* Wikilink */: {
1011
+ return true;
1012
+ }
1013
+ default: {
1014
+ (0, import_type_guards.assertNever)(resolvedStyle);
1015
+ }
1016
+ }
1017
+ }
1018
+ function validateOffsetRange(offsetRange) {
1019
+ if (offsetRange.startOffset < 0) {
1020
+ throw new Error(`Invalid offset range: the start offset ${String(offsetRange.startOffset)} must not be negative.`);
1021
+ }
1022
+ if (offsetRange.endOffset < offsetRange.startOffset) {
1023
+ throw new Error(`Invalid offset range: the end offset ${String(offsetRange.endOffset)} must not be less than the start offset ${String(offsetRange.startOffset)}.`);
1024
+ }
1025
+ }
1026
+ // Annotate the CommonJS export names for ESM import in node:
1027
+ 0 && (module.exports = {
1028
+ LinkPathStyle,
1029
+ LinkStyle,
1030
+ buildBacklinksSnapshot,
1031
+ convertLink,
1032
+ editBacklinks,
1033
+ editBacklinksSnapshot,
1034
+ editLinks,
1035
+ editLinksInContent,
1036
+ extractLinkFile,
1037
+ generateMarkdownLink,
1038
+ generateRawMarkdownLink,
1039
+ getGenerateMarkdownLinkDefaultParamsFns,
1040
+ hasAngleBrackets,
1041
+ hasEmbedSyntax,
1042
+ hasLeadingDot,
1043
+ hasLeadingSlash,
1044
+ hasWikilinkSyntax,
1045
+ shouldResetAlias,
1046
+ splitSubpath,
1047
+ updateFileUrlLinksInContent,
1048
+ updateFileUrlLinksInFile,
1049
+ updateLink,
1050
+ updateLinksInContent,
1051
+ updateLinksInFile
1052
+ });
1053
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGhhbmRsaW5nIGFuZCB1cGRhdGluZyBsaW5rcyB3aXRoaW4gT2JzaWRpYW4gdmF1bHRzLiBJdCBpbmNsdWRlc1xuICogZnVuY3Rpb25zIHRvIHNwbGl0IHBhdGhzLCB1cGRhdGUgbGlua3MgaW4gZmlsZXMsIGFuZCBnZW5lcmF0ZSBtYXJrZG93biBsaW5rcyB3aXRoIHZhcmlvdXMgb3B0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1heWJlUmV0dXJuIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3R5cGUnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBSZWZlcmVuY2UsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFib3J0U2lnbmFsTmV2ZXIgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvYWJvcnQtY29udHJvbGxlcic7XG5pbXBvcnQge1xuICBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMsXG4gIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXNcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQge1xuICBiYXNlbmFtZSxcbiAgZGlybmFtZSxcbiAgZXh0bmFtZSxcbiAgam9pbixcbiAgcmVsYXRpdmVcbn0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplU3RyaW5nLFxuICByZXBsYWNlQWxsLFxuICB0cmltRW5kXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9zdHJpbmcnO1xuaW1wb3J0IHtcbiAgYXNzZXJ0TmV2ZXIsXG4gIGFzc2VydE5vbk51bGxhYmxlLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHtcbiAgZW5jb2RlVXJsLFxuICBub3JtYWxpemVGaWxlVXJsXG59IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi91cmwnO1xuaW1wb3J0IHtcbiAgSW50ZXJuYWxQbHVnaW5OYW1lLFxuICBpc1JlZmVyZW5jZUNhY2hlXG59IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QvaW1wbGVtZW50YXRpb25zJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHBhcnNlTGlua3RleHRcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IEZpbGVDaGFuZ2UgfSBmcm9tICcuL2ZpbGUtY2hhbmdlLnRzJztcbmltcG9ydCB0eXBlIHtcbiAgR2V0RmlsZVBhcmFtcyxcbiAgUGF0aE9yRmlsZVxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB0eXBlIHsgTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXIgfSBmcm9tICcuL2xpbmstdXBkYXRlLXByb2dyZXNzLnRzJztcbmltcG9ydCB0eXBlIHsgT2Zmc2V0UmFuZ2UgfSBmcm9tICcuL3JlZmVyZW5jZS50cyc7XG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NPcHRpb25zIH0gZnJvbSAnLi92YXVsdC50cyc7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuTGliRGVidWdnZXIgfSBmcm9tICcuL2RlYnVnLnRzJztcbmltcG9ydCB7XG4gIGFwcGx5Q29udGVudENoYW5nZXMsXG4gIGFwcGx5RmlsZUNoYW5nZXMsXG4gIGlzQ2FudmFzQ2hhbmdlLFxuICBpc0NvbnRlbnRDaGFuZ2Vcbn0gZnJvbSAnLi9maWxlLWNoYW5nZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRQYXRoLFxuICBpc0NhbnZhc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTlxufSBmcm9tICcuL2ZpbGUtc3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRDYWNoZVNhZmUsXG4gIGdldExpbmtzLFxuICBwYXJzZU1ldGFkYXRhLFxuICByZWdpc3RlckZpbGVzXG59IGZyb20gJy4vbWV0YWRhdGEtY2FjaGUudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9vYnNpZGlhbi1kZXYtdXRpbHMtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vb2JzaWRpYW4tc2V0dGluZ3MudHMnO1xuaW1wb3J0IHtcbiAgZXNjYXBlQWxpYXMsXG4gIGlzUGFyc2VMaW5rRnJvbnRtYXR0ZXJSZWZlcmVuY2UsXG4gIGlzUGFyc2VMaW5rUmVmZXJlbmNlLFxuICBwYXJzZUxpbmtcbn0gZnJvbSAnLi9wYXJzZS1saW5rLnRzJztcbmltcG9ydCB7XG4gIGlzQ2FudmFzRmlsZU5vZGVSZWZlcmVuY2UsXG4gIGlzUmVmZXJlbmNlSW5PZmZzZXRSYW5nZSxcbiAgcmVmZXJlbmNlVG9GaWxlQ2hhbmdlXG59IGZyb20gJy4vcmVmZXJlbmNlLnRzJztcblxuY29uc3QgRVNDQVBFRF9XSUtJTElOS19ESVZJREVSID0gU3RyaW5nLnJhd2BcXHxgO1xuXG4vKipcbiAqIE1hdGNoZXMgYSB3aWtpbGluayBkaXZpZGVyIHRvZ2V0aGVyIHdpdGggdGhlIGJhY2tzbGFzaCBlc2NhcGluZyBpdCwgaWYgYW55LiBBIGxvb2tiZWhpbmQgd291bGQgc2F5IFwidW5lc2NhcGVkXCJcbiAqIGRpcmVjdGx5LCBidXQgaXQgaXMgYSBzeW50YXggZXJyb3Igb24gaU9TIGJlZm9yZSAxNi40LCBiZWxvdyB0aGUgaU9TIDE1IE9ic2lkaWFuIG1vYmlsZSBzdGlsbCBzdXBwb3J0cy5cbiAqIFJlcGxhY2luZyBldmVyeSBtYXRjaCB3aXRoIGFuIGVzY2FwZWQgZGl2aWRlciBsZWF2ZXMgYW4gZXNjYXBlZCBvbmUgYXMgaXQgd2FzIGFuZCBlc2NhcGVzIGEgYmFyZSBvbmUuXG4gKi9cbmNvbnN0IE9QVElPTkFMTFlfRVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC9cXFxcP1xcfC9nO1xuXG4vKipcbiAqIFRlc3RzIGZvciBhIHdpa2lsaW5rIGRpdmlkZXIgbm8gYmFja3NsYXNoIGVzY2FwZXMuIE5vdCBnbG9iYWwsIHNvIGEgYHRlc3RgIGtlZXBzIG5vIGBsYXN0SW5kZXhgIGJldHdlZW4gY2FsbHMuXG4gKi9cbmNvbnN0IFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUCA9IC8oPzpefFteXFxcXF0pXFx8LztcblxuLyoqXG4gKiBUaGUgbGluayBpZGVudGl0eSBrZXkgcHJvdmlkZXIgZWFjaCBzbmFwc2hvdCB3YXMgYnVpbHQgd2l0aC4gS2VwdCBiZXNpZGUgdGhlIHNuYXBzaG90IHJhdGhlciB0aGFuIGluIGl0LCBzbyBhXG4gKiBzbmFwc2hvdCBzdGF5cyBhIHBsYWluIG1hcCBhbmQgdGhlIG9uZSBmdW5jdGlvbiB0aGF0IGtleWVkIGl0IGlzIGFsc28gdGhlIG9uZSB0aGF0IGxvb2tzIGl0IHVwIFx1MjAxNCBwYXNzaW5nIGFcbiAqIHByb3ZpZGVyIHRvIG9ubHkgb25lIG9mIHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fSBhbmQge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gdXNlZCB0byBsZWF2ZSBldmVyeVxuICogbGluayB1bm1hdGNoZWQsIGFuZCB0aGUgZWRpdCByZXdyb3RlIG5vdGhpbmcgd2l0aG91dCBhIHdvcmQuXG4gKi9cbmNvbnN0IHNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJzID0gbmV3IFdlYWtNYXA8QmFja2xpbmtzU25hcHNob3Q8dW5rbm93bj4sIChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZz4oKTtcblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rIHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtQYXRoU3R5bGUge1xuICAvKipcbiAgICogVXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZSB2YXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbcGF0aC9mcm9tL3RoZS92YXVsdC9yb290L3RhcmdldF1dYFxuICAgKi9cbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgcGF0aCBzdHlsZSBkZWZpbmVkIGluIE9ic2lkaWFuIHNldHRpbmdzLlxuICAgKi9cbiAgT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQgPSAnT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQnLFxuXG4gIC8qKlxuICAgKiBVc2UgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbLi4vLi4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICovXG4gIFJlbGF0aXZlUGF0aFRvVGhlU291cmNlID0gJ1JlbGF0aXZlUGF0aFRvVGhlU291cmNlJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBzaG9ydGVzdCBwYXRoIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3Nob3J0ZXN0LXBhdGgtdG8tdGFyZ2V0XV1gXG4gICAqL1xuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gKi9cbmV4cG9ydCBlbnVtIExpbmtTdHlsZSB7XG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiBtYXJrZG93biBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbYWxpYXNdKHBhdGgvdG8vdGFyZ2V0Lm1kKWBcbiAgICovXG4gIE1hcmtkb3duID0gJ01hcmtkb3duJyxcblxuICAvKipcbiAgICogVXNlIHRoZSBkZWZhdWx0IGxpbmsgc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogUHJlc2VydmUgdGhlIGV4aXN0aW5nIGxpbmsgc3R5bGUuXG4gICAqL1xuICBQcmVzZXJ2ZUV4aXN0aW5nID0gJ1ByZXNlcnZlRXhpc3RpbmcnLFxuXG4gIC8qKlxuICAgKiBGb3JjZSB0aGUgbGluayB0byBiZSBpbiB3aWtpbGluayBmb3JtYXQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvdG8vdGFyZ2V0fGFsaWFzXV1gXG4gICAqL1xuICBXaWtpbGluayA9ICdXaWtpbGluaydcbn1cblxuZW51bSBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBBYnNvbHV0ZVBhdGhJblZhdWx0ID0gJ0Fic29sdXRlUGF0aEluVmF1bHQnLFxuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZU5vdGUnLFxuICBTaG9ydGVzdFBhdGhXaGVuUG9zc2libGUgPSAnU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlJ1xufVxuXG4vKipcbiAqIFBhcmFtcyBwYXNzZWQgdG8gdGhlIGxpbmsgY29udmVydGVyIG9mIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXM8VFBheWxvYWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBsaW5rIGJlaW5nIGNvbnZlcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogVGhlIHBheWxvYWQgY2FwdHVyZWQgZm9yIHRoZSBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAgICpcbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgbGluayBpcyBub3QgaW4gdGhlIHNuYXBzaG90LCB3aGljaCBjYW4gb25seSBoYXBwZW4gaWZcbiAgICoge0BsaW5rIEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtcy5zaG91bGRWaXNpdFVubWF0Y2hlZExpbmtzfSBpcyBgdHJ1ZWAuXG4gICAqL1xuICByZWFkb25seSBwYXlsb2FkOiBUUGF5bG9hZCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgdGhlIG5vdGUgaG9sZGluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbWluaW1hbCBzaGFwZSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0gcmVhZHMgYSBzZXQgb2YgYmFja2xpbmtzIGZyb20uXG4gKlxuICogQm90aCBhIGBDdXN0b21BcnJheURpY3Q8UmVmZXJlbmNlPmAgXHUyMDE0IHdoYXRcbiAqIHtAbGluayAuLi9vYnNpZGlhbi9tZXRhZGF0YS1jYWNoZSFnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSB8IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlfSByZXR1cm5zIFx1MjAxNCBhbmQgYSBwbGFpblxuICogYE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPmAgc2F0aXNmeSBpdCwgc28gYSBjYWxsZXIgY2FuIHBhc3MgZWl0aGVyIHdpdGhvdXQgY29udmVydGluZyBmaXJzdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrbGlua3NMaWtlIHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpbmtzIHRoZSBub3RlIGF0IGBrZXlgIGhvbGRzLCBvciBhIG51bGxpc2ggdmFsdWUgd2hlbiBpdCBob2xkcyBub25lLlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHBhdGggb2YgdGhlIGJhY2tsaW5rLWhvbGRpbmcgbm90ZS5cbiAgICogQHJldHVybnMgVGhlIGxpbmtzLCBvciBhIG51bGxpc2ggdmFsdWUuXG4gICAqL1xuICBnZXQ6IChrZXk6IHN0cmluZykgPT4gbnVsbCB8IHJlYWRvbmx5IFJlZmVyZW5jZVtdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwYXRocyBvZiB0aGUgYmFja2xpbmstaG9sZGluZyBub3Rlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBhdGhzLlxuICAgKi9cbiAga2V5czogKCkgPT4gSXRlcmFibGU8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBBIGNhcHR1cmVkIHNuYXBzaG90IG9mIGEgc2V0IG9mIGJhY2tsaW5rczogdGhlIHBhdGggb2YgZWFjaCBiYWNrbGluay1ob2xkaW5nIG5vdGUsIG1hcHBlZCB0byB0aGUgaWRlbnRpdHlcbiAqIGtleXMgb2YgdGhhdCBub3RlJ3Mgb3duIGxpbmtzIHRvIHRoZSB0YXJnZXQocyksIGVhY2ggbWFwcGVkIHRvIHRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBpdC5cbiAqXG4gKiBUaGUgc25hcHNob3QgZXhpc3RzIHNvIHRoYXQgdGhlIGZldGNoIGFuZCB0aGUgcmV3cml0ZSBjYW4gaGFwcGVuIGF0IGRpZmZlcmVudCBtb21lbnRzLiBBIHJlbmFtZSBpbnZhbGlkYXRlc1xuICogdGhlIG1ldGFkYXRhIGNhY2hlIGZvciB0aGUgb2xkIHBhdGgsIHNvIGEgY2FsbGVyIHRoYXQgcmV3cml0ZXMgbGlua3MgKiphZnRlcioqIHJlbmFtaW5nIGhhcyB0byBjYXB0dXJlIHRoZVxuICogYmFja2xpbmtzICoqYmVmb3JlKiogXHUyMDE0IHdoaWNoIGlzIHdoeSB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fSB0YWtlcyBhIHNuYXBzaG90IHJhdGhlciB0aGFuIGEgcGF0aC5cbiAqXG4gKiBUaGUgcGF5bG9hZCBpcyB3aGF0ZXZlciB0aGUgY2FsbGVyIG5lZWRzIHRvIHJlbWVtYmVyIHBlciBsaW5rLiBJdCBpcyBgdW5kZWZpbmVkYCBmb3IgYSBzaW5nbGUtdGFyZ2V0XG4gKiByZXdyaXRlICh0aGUgdGFyZ2V0IGlzIGltcGxpZWQpLCBhbmQgdGhlIG9sZCB0YXJnZXQncyBwYXRoIGZvciBhIG11bHRpLXRhcmdldCBvbmUsIHdoZXJlIG9uZSBub3RlJ3MgbGlua3NcbiAqIG1heSBwb2ludCBhdCBzZXZlcmFsIGZpbGVzIHRoYXQgYWxsIG1vdmVkIGFuZCBlYWNoIGxpbmsgaGFzIHRvIGJlIHJlc29sdmVkIHRvIGl0cyBvd24gbmV3IHBhdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKi9cbmV4cG9ydCB0eXBlIEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPiA9IFJlYWRvbmx5TWFwPHN0cmluZywgUmVhZG9ubHlNYXA8c3RyaW5nLCBUUGF5bG9hZD4+O1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGJ1aWxkQmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IHtcbiAgLyoqXG4gICAqIFRoZSBiYWNrbGlua3MgdG8gcmVjb3JkLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja2xpbmtzOiBCYWNrbGlua3NMaWtlO1xuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgaWRlbnRpdHkga2V5IG9mIGEgbGluay5cbiAgICpcbiAgICogVGhlIHNuYXBzaG90IHJlbWVtYmVycyBpdCwgc28ge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gbG9va3MgdGhlIGxpbmtzIHVwIHdpdGggdGhlIHNhbWUgZnVuY3Rpb25cbiAgICogd2l0aG91dCBiZWluZyB0b2xkLiBXaGVuIHtAbGluayBCdWlsZEJhY2tsaW5rc1NuYXBzaG90UGFyYW1zLnRhcmdldH0gd2FzIGJ1aWx0IHdpdGggYSBwcm92aWRlciwgb21pdHRpbmdcbiAgICogdGhpcyByZXVzZXMgdGhhdCBvbmUsIGFuZCBwYXNzaW5nIGEgZGlmZmVyZW50IG9uZSB0aHJvd3M6IGEgc25hcHNob3Qga2V5ZWQgYnkgdHdvIGZ1bmN0aW9ucyBtYXRjaGVzXG4gICAqIG5vdGhpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBwcm92aWRlciBgdGFyZ2V0YCB3YXMgYnVpbHQgd2l0aCwgZWxzZSBgSlNPTi5zdHJpbmdpZnlgXG4gICAqL1xuICByZWFkb25seSBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcj86IChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZztcblxuICAvKipcbiAgICogUmV3cml0ZXMgdGhlIHBhdGggb2YgYSBiYWNrbGluay1ob2xkaW5nIG5vdGUgYXMgaXQgd2lsbCBiZSAqKmFmdGVyKiogdGhlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQSBub3RlIHRoYXQgaG9sZHMgYSBiYWNrbGluayBjYW4gaXRzZWxmIGJlIHJlbmFtZWQgb3IgbW92ZWQgYnkgdGhlIHNhbWUgb3BlcmF0aW9uIFx1MjAxNCBpbmNsdWRpbmcgdGhlXG4gICAqIHJlbmFtZWQgbm90ZSdzIG93biBzZWxmLWxpbmtzLiBSZW1hcHBpbmcgaGVyZSBrZXlzIHRoZSBzbmFwc2hvdCBieSB0aGUgcGF0aCB0aGUgcmV3cml0ZSB3aWxsIGFjdHVhbGx5XG4gICAqIG9wZW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IHRoZSBpZGVudGl0eSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aFJlbWFwcGVyPzogKGJhY2tsaW5rUGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFByb2R1Y2VzIHRoZSBwYXlsb2FkIHRvIHJlY29yZCBmb3IgYSBsaW5rLiBTZWUge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSBmb3Igd2hhdCBhIHBheWxvYWQgaXMgZm9yLlxuICAgKlxuICAgKiBAcGFyYW0gbGluayAtIFRoZSBsaW5rIGJlaW5nIHJlY29yZGVkLlxuICAgKiBAcmV0dXJucyBUaGUgcGF5bG9hZC5cbiAgICovXG4gIHJlYWRvbmx5IHBheWxvYWRQcm92aWRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gVFBheWxvYWQ7XG5cbiAgLyoqXG4gICAqIEFuIGV4aXN0aW5nIHNuYXBzaG90IHRvIG1lcmdlIGludG8sIHNvIHNldmVyYWwgc2V0cyBvZiBiYWNrbGlua3MgY2FuIGJlIGFjY3VtdWxhdGVkIGludG8gb25lLlxuICAgKlxuICAgKiBNZXJnaW5nIGlzIHdoYXQgbWFrZXMgYSBzaW5nbGUgcmV3cml0ZSBwYXNzIHBlciBub3RlIHBvc3NpYmxlIHdoZW4gYSBub3RlIGxpbmtzIHRvIHNldmVyYWwgbW92ZWRcbiAgICogdGFyZ2V0czogd2l0aG91dCBpdCwgY2FsbGluZyB0aGUgcmV3cml0ZSBvbmNlIHBlciB0YXJnZXQgd291bGQgb3BlbiBcdTIwMTQgYW5kIHdyaXRlIFx1MjAxNCB0aGUgc2FtZSBub3RlXG4gICAqIHJlcGVhdGVkbHkuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYSBuZXcgc25hcHNob3QgaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldD86IE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGFuIGVtcHR5IGFsaWFzIGZvciBlbWJlZHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGAhW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbms6IFJlZmVyZW5jZTtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1xcKlxcKmFsaWFzXFwqXFwqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbKiphbGlhcyoqXShsaW5rLm1kKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIHRoZSBhdHRhY2htZW50IGV4dGVuc2lvbiBpbiB0aGUgZW1iZWQgYWxpYXMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkfSBpcyBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbZm9vLnBuZ10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2Zvb10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGUgbmFtZSBhbGlhcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzfS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdEJhY2tsaW5rc1BhcmFtcyBleHRlbmRzIEVkaXRCYWNrbGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCByZXBvcnRlciBpbnZva2VkIG9uY2UgcGVyIGJhY2tsaW5rIGZpbGUgYWZ0ZXIgaXRzIGxpbmtzIGFyZSB1cGRhdGVkLCB3aXRoIHRoZSBydW5uaW5nXG4gICAqIGNvdW50IG9mIHByb2Nlc3NlZCBmaWxlcyBhbmQgdGhlIHRvdGFsLiBXaGVuIG9taXR0ZWQsIG5vIHByb2dyZXNzIGlzIHJlcG9ydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI/OiBMaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcjtcblxuICAvKipcbiAgICogVGhlIHBhdGggb3IgZmlsZSB0byBlZGl0IHRoZSBiYWNrbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZWRpdEJhY2tsaW5rc1NuYXBzaG90fS5cbiAqL1xuZXhwb3J0IHR5cGUgRWRpdEJhY2tsaW5rc1NuYXBzaG90T3B0aW9ucyA9IFByb2Nlc3NPcHRpb25zO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBlZGl0QmFja2xpbmtzU25hcHNob3R9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBheWxvYWQgLSBUaGUgcGF5bG9hZCByZWNvcmRlZCBmb3IgZWFjaCBsaW5rIHdoZW4gdGhlIHNuYXBzaG90IHdhcyBidWlsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0QmFja2xpbmtzU25hcHNob3RQYXJhbXM8VFBheWxvYWQ+IGV4dGVuZHMgRWRpdEJhY2tsaW5rc1NuYXBzaG90T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKHBhcmFtczogQmFja2xpbmtDb252ZXJzaW9uUGFyYW1zPFRQYXlsb2FkPikgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGlkZW50aXR5IGtleSBvZiBhIGxpbmsuXG4gICAqXG4gICAqIExlYXZlIGl0IG91dCBmb3IgYSBzbmFwc2hvdCBtYWRlIGJ5IHtAbGluayBidWlsZEJhY2tsaW5rc1NuYXBzaG90fTogdGhlIHNuYXBzaG90IGNhcnJpZXMgdGhlIHByb3ZpZGVyIGl0IHdhc1xuICAgKiBidWlsdCB3aXRoLCBhbmQgdGhhdCBvbmUgaXMgdXNlZC4gUGFzc2luZyBhIGRpZmZlcmVudCBvbmUgdGhyb3dzLCBiZWNhdXNlIHRoZSBzbmFwc2hvdCBpcyBrZXllZCBieSB0aGVcbiAgICogb3RoZXIgYW5kIG5vdCBhIHNpbmdsZSBsaW5rIHdvdWxkIG1hdGNoIFx1MjAxNCB0aGUgZWRpdCB3b3VsZCBjb21wbGV0ZSBhbmQgcmV3cml0ZSBub3RoaW5nLiBJdCBpcyBuZWVkZWQgb25seVxuICAgKiBmb3IgYSBzbmFwc2hvdCBhc3NlbWJsZWQgYnkgaGFuZC5cbiAgICpcbiAgICogQGRlZmF1bHQgdGhlIHByb3ZpZGVyIHRoZSBzbmFwc2hvdCB3YXMgYnVpbHQgd2l0aCwgZWxzZSBgSlNPTi5zdHJpbmdpZnlgXG4gICAqL1xuICByZWFkb25seSBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcj86IChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcmVwb3J0ZXIgaW52b2tlZCBvbmNlIHBlciBiYWNrbGluayBmaWxlIGFmdGVyIGl0cyBsaW5rcyBhcmUgdXBkYXRlZCwgd2l0aCB0aGUgcnVubmluZ1xuICAgKiBjb3VudCBvZiBwcm9jZXNzZWQgZmlsZXMgYW5kIHRoZSB0b3RhbC4gV2hlbiBvbWl0dGVkLCBubyBwcm9ncmVzcyBpcyByZXBvcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyPzogTGlua1VwZGF0ZVByb2dyZXNzUmVwb3J0ZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGNvbnZlcnRlciBpcyBhbHNvIHNob3duIGxpbmtzIHRoYXQgYXJlICoqbm90KiogaW4gdGhlIHNuYXBzaG90LCB3aXRoIGFuIGB1bmRlZmluZWRgXG4gICAqIHtAbGluayBCYWNrbGlua0NvbnZlcnNpb25QYXJhbXMucGF5bG9hZH0uXG4gICAqXG4gICAqIFRoZSBkZWZhdWx0IGZpbHRlcnMgdGhlbSBvdXQsIHdoaWNoIGlzIHdoYXQgYSBwbGFpbiByZW5hbWUgd2FudHM6IGEgbGluayBhYnNlbnQgZnJvbSB0aGUgc25hcHNob3Qgd2FzXG4gICAqIGVpdGhlciBuZXZlciB0aGUgY2FsbGVyJ3MgdG8gcmV3cml0ZSwgb3IgaGFzIGFscmVhZHkgYmVlbiByZXdyaXR0ZW4gYnkgc29tZW9uZSBlbHNlLiBTZXQgdGhpcyB0byBgdHJ1ZWBcbiAgICogb25seSB3aGVuIHRoZSBjYWxsZXIgaGFzIGl0cyBvd24gcmVhc29uIHRvIGxvb2sgYXQgdGhlbSBcdTIwMTQgYSB3aWRlbmVkIG1hdGNoIG9mIGl0cyBvd24sIG9yIGxvZ2dpbmcgYSBza2lwXG4gICAqIHRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHNpbGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVmlzaXRVbm1hdGNoZWRMaW5rcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjYXB0dXJlZCBiYWNrbGlua3MgdG8gZWRpdC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGVkaXRMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWRpdExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBlZGl0IHRoZSBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgZWFjaCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua0NvbnZlcnRlcjogKGxpbms6IFJlZmVyZW5jZSkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIEVkaXRMaW5rc0luQ29udGVudFBhcmFtcy5jb250ZW50fSwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nIHRoZSBwYXNzIHRvXG4gICAqIHRoZSBsaW5rcyBpbnNpZGUgaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgZWRpdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGNvbnRlbnQgXHUyMDE0IGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSBcdTIwMTQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxzbyBlZGl0IGV4dGVybmFsIGxpbmtzIHBhcnNlZCBmcm9tIHRoZSBub3RlIGJvZHkuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvXG4gICAqIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGZyb250bWF0dGVyIGV4dGVybmFsIGxpbmtzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gbXVsdGktbGluayAobXVsdGktdmFsdWUpIGZyb250bWF0dGVyIHZhbHVlcy4gV2hlblxuICAgKiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzbyByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBlYWNoIGV4dGVybmFsIGxpbmsgd2l0aGluIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSAoZWFjaCBsb2NhdGVkIGJ5IGl0cyBvZmZzZXRzLCBzbyBvbmx5IHRoYXQgbGluayBpcyBzcGxpY2VkIGJhY2sgaW4gcGxhY2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVkaXRMaW5rc30uXG4gKi9cbmV4cG9ydCB0eXBlIEVkaXRMaW5rc09wdGlvbnMgPSBQcm9jZXNzT3B0aW9ucztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZWRpdExpbmtzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGl0TGlua3NQYXJhbXMgZXh0ZW5kcyBFZGl0TGlua3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBlYWNoIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rQ29udmVydGVyOiAobGluazogUmVmZXJlbmNlKSA9PiBQcm9taXNhYmxlPE1heWJlUmV0dXJuPHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIGVkaXRlZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpcyBsZWZ0XG4gICAqIGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBmaWxlJ3MgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmtcbiAgICogZnJvbnRtYXR0ZXIgdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzXG4gICAqIHN1cHBsaWVkLlxuICAgKlxuICAgKiBUaGUgb2Zmc2V0cyBhcmUgaW50byB0aGUgY29udGVudCB0aGlzIGZ1bmN0aW9uIHJlYWRzIGZyb20gdGhlIHZhdWx0LiBCZWZvcmUgcmVhZGluZywgaXQgc2F2ZXMgYW55XG4gICAqIHVuc2F2ZWQgZWRpdG9yIGJ1ZmZlciBmb3IgdGhlIGZpbGUsIHNvIGEgcmFuZ2UgdGFrZW4gZnJvbSBhbiBvcGVuIGVkaXRvciB2aWEgYEVkaXRvci5wb3NUb09mZnNldGAgaXNcbiAgICogdmFsaWQuIFRoZSBjYWxsZXIgb3ducyBvbmx5IHRoZSBjYXNlIHdoZXJlIHRoZSBidWZmZXIgY2hhbmdlcyBiZXR3ZWVuIGNvbXB1dGluZyB0aGUgcmFuZ2UgYW5kIHRoaXNcbiAgICogY2FsbC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgdG8gZWRpdCB0aGUgbGlua3MgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbHNvIGVkaXQgZXh0ZXJuYWwgbGlua3MgcGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keS4gV2hlbiBgdHJ1ZWAsIHRoZSBjb252ZXJ0ZXIgYWxzb1xuICAgKiByZWNlaXZlcyByZWZlcmVuY2VzIGZvciBleHRlcm5hbCBsaW5rcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRWRpdEV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMuIFdoZW4gYHRydWVgLCB0aGUgY29udmVydGVyIGFsc29cbiAgICogcmVjZWl2ZXMgcmVmZXJlbmNlcyBmb3IgZnJvbnRtYXR0ZXIgZXh0ZXJuYWwgbGlua3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsc28gZWRpdCBleHRlcm5hbCBsaW5rcyBwYXJzZWQgZnJvbSBtdWx0aS1saW5rIChtdWx0aS12YWx1ZSkgZnJvbnRtYXR0ZXIgdmFsdWVzLiBXaGVuXG4gICAqIGB0cnVlYCwgdGhlIGNvbnZlcnRlciBhbHNvIHJlY2VpdmVzIHJlZmVyZW5jZXMgZm9yIGVhY2ggZXh0ZXJuYWwgbGluayB3aXRoaW4gYSBtdWx0aS1saW5rIGZyb250bWF0dGVyXG4gICAqIHZhbHVlIChlYWNoIGxvY2F0ZWQgYnkgaXRzIG9mZnNldHMsIHNvIG9ubHkgdGhhdCBsaW5rIGlzIHNwbGljZWQgYmFjayBpbiBwbGFjZSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXh0cmFjdExpbmtGaWxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRyYWN0TGlua0ZpbGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSByZWZlcmVuY2UgY2FjaGUgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IG5vbi1leGlzdGluZyBmaWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQWxsb3dOb25FeGlzdGluZ0ZpbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVNYXJrZG93bkxpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBub24tZXhpc3RpbmcgZmlsZXMuXG4gICAqXG4gICAqIElmIGBmYWxzZWAgYW5kIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBpcyBhIG5vbi1leGlzdGluZyBmaWxlLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhIHNpbmdsZSBzdWJwYXRoLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIHRhcmdldFBhdGhPckZpbGV9IGFuZCB7QGxpbmsgc291cmNlUGF0aE9yRmlsZX0gYXJlIHRoZSBzYW1lIGZpbGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbI3N1YnBhdGhdXWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW3NvdXJjZSNzdWJwYXRoXV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBoYXNFbWJlZFN5bnRheH1cbiAgICogLSB7QGxpbmsgbGlua1N0eWxlfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VBbmdsZUJyYWNrZXRzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc31cbiAgICogLSB7QGxpbmsgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc31cbiAgICpcbiAgICogVGhlc2UgaW5mZXJyZWQgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGlmIHNwZWNpZmllZC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1N0eWxlfSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW2FsaWFzXSg8cGF0aCB3aXRoIHNwYWNlcy5tZD4pYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFthbGlhc10ocGF0aCUyMHdpdGglMjBzcGFjZXMubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBkb3QuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2V9LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWy4vcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbcmVsYXRpdmUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBzdWJwYXRoIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBTaG91bGQgYmUgZW1wdHkgb3Igc3RhcnQgd2l0aCBgI2AuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1lbXB0eS1zdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGhdXWBcbiAgICogQGV4YW1wbGUgYFtbbGluay13aXRoLXN1YnBhdGgjc3VicGF0aCNuZXN0ZWQtc3VicGF0aF1dYFxuICAgKiBAZGVmYXVsdCBgJydgXG4gICAqL1xuICByZWFkb25seSBzdWJwYXRoPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBhbGlhcyBvZiB0aGUgbGluay4gRGVmYXVsdHMgdG8gYHVuZGVmaW5lZGAuXG4gICAqL1xuICByZWFkb25seSBhbGlhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEVzY2FwZUFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1c2UgYW5nbGUgYnJhY2tldHMuIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgaGFzV2lraWxpbmtTeW50YXh9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHRpdGxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIFVSTCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEge0BsaW5rIEJhY2tsaW5rc1NuYXBzaG90fSB3aGlsZSBpdCBpcyBzdGlsbCBiZWluZyBhY2N1bXVsYXRlZCBieSB7QGxpbmsgYnVpbGRCYWNrbGlua3NTbmFwc2hvdH0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKi9cbmV4cG9ydCB0eXBlIE11dGFibGVCYWNrbGlua3NTbmFwc2hvdDxUUGF5bG9hZD4gPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+O1xuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHNob3VsZFJlc2V0QWxpYXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNob3VsZFJlc2V0QWxpYXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgZGlzcGxheSB0ZXh0IG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcGxheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqL1xuICByZWFkb25seSBpc1dpa2lsaW5rPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG5ld1NvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCBzb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgb2xkU291cmNlUGF0aE9yRmlsZT86IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEFuIG9sZCB0YXJnZXQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IG9sZFRhcmdldFBhdGg6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgbGluayBpbnRvIGl0cyBsaW5rIHBhdGggYW5kIHN1YnBhdGguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3BsaXRTdWJwYXRoUmVzdWx0IHtcbiAgLyoqXG4gICAqIEEgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzdWJwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgc3VicGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRmlsZVVybExpbmtzSW5Db250ZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYm9ydCBzaWduYWwgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG5cbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCB0byBub3JtYWxpemUgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbi5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4ge0BsaW5rIFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcy5jb250ZW50fSwgaW4gY2hhcmFjdGVyIG9mZnNldHMsIHJlc3RyaWN0aW5nXG4gICAqIHRoZSBwYXNzIHRvIHRoZSBsaW5rcyBpbnNpZGUgaXQuIFdoZW4gb21pdHRlZCwgZXZlcnkgbGluayBpcyB2aXNpdGVkLlxuICAgKlxuICAgKiBBIGxpbmsgaXMgbm9ybWFsaXplZCBvbmx5IHdoZW4gaXQgaXMgKipmdWxseSBjb250YWluZWQqKiBpbiB0aGUgcmFuZ2U7IG9uZSB0aGF0IG1lcmVseSBvdmVybGFwcyBpdCBpc1xuICAgKiBsZWZ0IGFsb25lLCBiZWNhdXNlIHJld3JpdGluZyBwYXJ0IG9mIGEgbGluayBjb3JydXB0cyBpdC4gQm90aCBib3VuZHMgYXJlIGluY2x1c2l2ZSwgc28gYSByYW5nZSB3aG9zZVxuICAgKiBvZmZzZXRzIGNvaW5jaWRlIGV4YWN0bHkgd2l0aCBhIGxpbmsncyBkb2VzIGluY2x1ZGUgdGhhdCBsaW5rLlxuICAgKlxuICAgKiBBIHJlZmVyZW5jZSB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50IFx1MjAxNCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGluayBmcm9udG1hdHRlclxuICAgKiB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2UgXHUyMDE0IGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVtaXQgdGhlIG5vcm1hbGl6ZWQgbGlua3Mgd2l0aCBhbmdsZSBicmFja2V0cyBhbmQgcmF3IHNwYWNlcyBpbnN0ZWFkIG9mIGAlMjBgLWVuY29kaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVGaWxlVXJsTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUZpbGVVcmxMaW5rc0luRmlsZVBhcmFtcyBleHRlbmRzIFByb2Nlc3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzcyB0byB0aGUgbGlua3MgaW5zaWRlIGl0LlxuICAgKiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIG5vcm1hbGl6ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXNcbiAgICogbGVmdCBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgZmlsZSdzIGNvbnRlbnQgXHUyMDE0IGEgZnJvbnRtYXR0ZXIgbGluaywgYSBtdWx0aS1saW5rXG4gICAqIGZyb250bWF0dGVyIHZhbHVlIGVudHJ5LCBvciBhbnkgY2FudmFzIHJlZmVyZW5jZSBcdTIwMTQgaXMgbmV2ZXIgaW4gcmFuZ2UgYW5kIGlzIHNraXBwZWQgd2hlbmV2ZXIgYSByYW5nZSBpc1xuICAgKiBzdXBwbGllZC5cbiAgICpcbiAgICogVGhlIG9mZnNldHMgYXJlIGludG8gdGhlIGNvbnRlbnQgdGhpcyBmdW5jdGlvbiByZWFkcyBmcm9tIHRoZSB2YXVsdC4gQmVmb3JlIHJlYWRpbmcsIGl0IHNhdmVzIGFueVxuICAgKiB1bnNhdmVkIGVkaXRvciBidWZmZXIgZm9yIHRoZSBmaWxlLCBzbyBhIHJhbmdlIHRha2VuIGZyb20gYW4gb3BlbiBlZGl0b3IgdmlhIGBFZGl0b3IucG9zVG9PZmZzZXRgIGlzXG4gICAqIHZhbGlkLiBUaGUgY2FsbGVyIG93bnMgb25seSB0aGUgY2FzZSB3aGVyZSB0aGUgYnVmZmVyIGNoYW5nZXMgYmV0d2VlbiBjb21wdXRpbmcgdGhlIHJhbmdlIGFuZCB0aGlzXG4gICAqIGNhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvZmZzZXRSYW5nZT86IE9mZnNldFJhbmdlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIHRvIG5vcm1hbGl6ZSB0aGUgYGZpbGU6Ly9gIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbWl0IHRoZSBub3JtYWxpemVkIGxpbmtzIHdpdGggYW5nbGUgYnJhY2tldHMgYW5kIHJhdyBzcGFjZXMgaW5zdGVhZCBvZiBgJTIwYC1lbmNvZGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBhbiBlbXB0eSBhbGlhcyBmb3IgZW1iZWRzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rOiBSZWZlcmVuY2U7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIG1hcmtkb3duIGxpbmtzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3VGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRUYXJnZXRQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgdXBkYXRlTGlua3NJbkZpbGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUxpbmtzSW5GaWxlUGFyYW1zIGV4dGVuZHMgUHJvY2Vzc09wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSB0byB1cGRhdGUgdGhlIGxpbmtzIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50LCBpbiBjaGFyYWN0ZXIgb2Zmc2V0cywgcmVzdHJpY3RpbmcgdGhlIHBhc3MgdG8gdGhlIGxpbmtzIGluc2lkZSBpdC5cbiAgICogV2hlbiBvbWl0dGVkLCBldmVyeSBsaW5rIGlzIHZpc2l0ZWQuXG4gICAqXG4gICAqIEEgbGluayBpcyB1cGRhdGVkIG9ubHkgd2hlbiBpdCBpcyAqKmZ1bGx5IGNvbnRhaW5lZCoqIGluIHRoZSByYW5nZTsgb25lIHRoYXQgbWVyZWx5IG92ZXJsYXBzIGl0IGlzIGxlZnRcbiAgICogYWxvbmUsIGJlY2F1c2UgcmV3cml0aW5nIHBhcnQgb2YgYSBsaW5rIGNvcnJ1cHRzIGl0LiBCb3RoIGJvdW5kcyBhcmUgaW5jbHVzaXZlLCBzbyBhIHJhbmdlIHdob3NlXG4gICAqIG9mZnNldHMgY29pbmNpZGUgZXhhY3RseSB3aXRoIGEgbGluaydzIGRvZXMgaW5jbHVkZSB0aGF0IGxpbmsuXG4gICAqXG4gICAqIEEgcmVmZXJlbmNlIHRoYXQgY2FycmllcyBubyBwb3NpdGlvbiB3aXRoaW4gdGhlIGZpbGUncyBjb250ZW50IFx1MjAxNCBhIGZyb250bWF0dGVyIGxpbmssIGEgbXVsdGktbGlua1xuICAgKiBmcm9udG1hdHRlciB2YWx1ZSBlbnRyeSwgb3IgYW55IGNhbnZhcyByZWZlcmVuY2UgXHUyMDE0IGlzIG5ldmVyIGluIHJhbmdlIGFuZCBpcyBza2lwcGVkIHdoZW5ldmVyIGEgcmFuZ2UgaXNcbiAgICogc3VwcGxpZWQuXG4gICAqXG4gICAqIFRoZSBvZmZzZXRzIGFyZSBpbnRvIHRoZSBjb250ZW50IHRoaXMgZnVuY3Rpb24gcmVhZHMgZnJvbSB0aGUgdmF1bHQuIEJlZm9yZSByZWFkaW5nLCBpdCBzYXZlcyBhbnlcbiAgICogdW5zYXZlZCBlZGl0b3IgYnVmZmVyIGZvciB0aGUgZmlsZSwgc28gYSByYW5nZSB0YWtlbiBmcm9tIGFuIG9wZW4gZWRpdG9yIHZpYSBgRWRpdG9yLnBvc1RvT2Zmc2V0YCBpc1xuICAgKiB2YWxpZC4gVGhlIGNhbGxlciBvd25zIG9ubHkgdGhlIGNhc2Ugd2hlcmUgdGhlIGJ1ZmZlciBjaGFuZ2VzIGJldHdlZW4gY29tcHV0aW5nIHRoZSByYW5nZSBhbmQgdGhpc1xuICAgKiBjYWxsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHBhdGggb2YgdGhlIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVMaW5rVGV4dH0uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIHBhdGggb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHN1YnBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0YXJnZXQgZmlsZSBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGU6IFRGaWxlO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmt9LlxuICovXG5pbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93blN0eWxlTGlua1BhcmFtcyB7XG4gIC8qKlxuICAgKiBBIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBjb25maWc6IExpbmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZm9yIGdlbmVyYXRpbmcgdGhlIG1hcmtkb3duIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBtYXJrZG93bkxpbmtQYXJhbXM6IEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIHRhcmdldCBmaWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0RmlsZTogVEZpbGU7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2VuZXJhdGVXaWtpTGlua30uXG4gKi9cbmludGVyZmFjZSBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYW4gZW1iZWQgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBvZiB0aGUgbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1zIGZvciB7QGxpbmsgZ2V0RmlsZUNoYW5nZXN9LlxuICovXG5pbnRlcmZhY2UgR2V0RmlsZUNoYW5nZXNQYXJhbXMge1xuICAvKipcbiAgICogQW4gYWJvcnQgc2lnbmFsIHRvIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIG1ldGFkYXRhIGNhY2hlIHRvIGV4dHJhY3QgdGhlIGxpbmtzIGZyb20uXG4gICAqL1xuICByZWFkb25seSBjYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBjYWNoZSBiZWxvbmdzIHRvIGEgY2FudmFzIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBpc0NhbnZhc0ZpbGVDYWNoZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGVhY2ggbGluay5cbiAgICovXG4gIHJlYWRvbmx5IGxpbmtDb252ZXJ0ZXI6IChsaW5rOiBSZWZlcmVuY2UsIGFib3J0U2lnbmFsOiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzYWJsZTxNYXliZVJldHVybjxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQSByYW5nZSB3aXRoaW4gdGhlIGNvbnRlbnQsIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgY2hhbmdlcyB0byB0aGUgbGlua3MgZnVsbHkgY29udGFpbmVkXG4gICAqIGluIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9mZnNldFJhbmdlPzogT2Zmc2V0UmFuZ2U7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBleHRlcm5hbCBsaW5rcyAocGFyc2VkIGZyb20gdGhlIG5vdGUgYm9keSkgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBmcm9udG1hdHRlciB2YWx1ZXMpIGluIHRoZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbmNsdWRlIGV4dGVybmFsIGxpbmtzIChwYXJzZWQgZnJvbSBtdWx0aS1saW5rIGZyb250bWF0dGVyIHZhbHVlcykgaW4gdGhlIGNoYW5nZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIExpbmtDb25maWcge1xuICByZWFkb25seSBpc0VtYmVkOiBib29sZWFuO1xuICByZWFkb25seSBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBib29sZWFuO1xuICByZWFkb25seSBpc1dpa2lsaW5rOiBib29sZWFuO1xuICByZWFkb25seSBsaW5rUGF0aFN0eWxlOiBGaW5hbExpbmtQYXRoU3R5bGU7XG4gIHJlYWRvbmx5IHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzOiBib29sZWFuO1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhcmFtcyBmb3Ige0BsaW5rIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyfS5cbiAqL1xuaW50ZXJmYWNlIFJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMgZnVuY3Rpb24gYXNraW5nLCBuYW1lZCBpbiB0aGUgZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBjYWxsZXJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcm92aWRlciB0aGUgY2FsbGVyIHBhc3NlZCwgaWYgYW55LlxuICAgKi9cbiAgcmVhZG9ubHkgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogKChsaW5rOiBSZWZlcmVuY2UpID0+IHN0cmluZykgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB3aG9zZSByZWNvcmRlZCBwcm92aWRlciB3aW5zIHdoZW4gdGhlIGNhbGxlciBwYXNzZWQgbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90OiBCYWNrbGlua3NTbmFwc2hvdDx1bmtub3duPjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzaG91bGRVc2VXaWtpbGlua1N0eWxlfS5cbiAqL1xuaW50ZXJmYWNlIFNob3VsZFVzZVdpa2lsaW5rU3R5bGVQYXJhbXMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEFuIG9yaWdpbmFsIGxpbmsgdGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTGluaz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFRhYmxlUG9zaXRpb24ge1xuICBlbmQ6IG51bWJlcjtcbiAgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayB1cGRhdGVMaW5rc0luQ29udGVudH0uXG4gKi9cbmludGVyZmFjZSBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBjb250ZW50IHRvIHVwZGF0ZSB0aGUgbGlua3MgaW4uXG4gICAqL1xuICByZWFkb25seSBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHRoZSByZXN1bHQgbGluayBzdHlsZSBpcyB7QGxpbmsgTGlua1N0eWxlLk1hcmtkb3dufS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgIVtdKGZvby5wbmcpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYCFbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICByZWFkb25seSBsaW5rU3R5bGU/OiBMaW5rU3R5bGU7XG5cbiAgLyoqXG4gICAqIEEgbmV3IHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHJhbmdlIHdpdGhpbiB7QGxpbmsgVXBkYXRlTGlua3NJbkNvbnRlbnRQYXJhbXMuY29udGVudH0sIGluIGNoYXJhY3RlciBvZmZzZXRzLCByZXN0cmljdGluZyB0aGUgcGFzc1xuICAgKiB0byB0aGUgbGlua3MgaW5zaWRlIGl0LiBXaGVuIG9taXR0ZWQsIGV2ZXJ5IGxpbmsgaXMgdmlzaXRlZC5cbiAgICpcbiAgICogQSBsaW5rIGlzIHVwZGF0ZWQgb25seSB3aGVuIGl0IGlzICoqZnVsbHkgY29udGFpbmVkKiogaW4gdGhlIHJhbmdlOyBvbmUgdGhhdCBtZXJlbHkgb3ZlcmxhcHMgaXQgaXMgbGVmdFxuICAgKiBhbG9uZSwgYmVjYXVzZSByZXdyaXRpbmcgcGFydCBvZiBhIGxpbmsgY29ycnVwdHMgaXQuIEJvdGggYm91bmRzIGFyZSBpbmNsdXNpdmUsIHNvIGEgcmFuZ2Ugd2hvc2VcbiAgICogb2Zmc2V0cyBjb2luY2lkZSBleGFjdGx5IHdpdGggYSBsaW5rJ3MgZG9lcyBpbmNsdWRlIHRoYXQgbGluay5cbiAgICpcbiAgICogQSByZWZlcmVuY2UgdGhhdCBjYXJyaWVzIG5vIHBvc2l0aW9uIHdpdGhpbiB0aGUgY29udGVudCBcdTIwMTQgYSBmcm9udG1hdHRlciBsaW5rLCBhIG11bHRpLWxpbmsgZnJvbnRtYXR0ZXJcbiAgICogdmFsdWUgZW50cnksIG9yIGFueSBjYW52YXMgcmVmZXJlbmNlIFx1MjAxNCBpcyBuZXZlciBpbiByYW5nZSBhbmQgaXMgc2tpcHBlZCB3aGVuZXZlciBhIHJhbmdlIGlzIHN1cHBsaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2Zmc2V0UmFuZ2U/OiBPZmZzZXRSYW5nZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBwYXRoIG9yIGZpbGUuXG4gICAqL1xuICByZWFkb25seSBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlc2NhcGUgdGhlIGFsaWFzLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbXFwqXFwqYWxpYXNcXCpcXCpdKGxpbmsubWQpYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFsqKmFsaWFzKipdKGxpbmsubWQpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgb25seSBlbWJlZGRlZCBsaW5rcy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZSBuYW1lIGFsaWFzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhbmdsZSBicmFja2V0cy5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rU3R5bGV9IGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbYWxpYXNdKDxwYXRoIHdpdGggc3BhY2VzLm1kPilgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW2FsaWFzXShwYXRoJTIwd2l0aCUyMHNwYWNlcy5tZClgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGEgbGVhZGluZyBzbGFzaC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0fS5cbiAgICpcbiAgICogSWYgYHRydWVgOiBgW1svYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbYWJzb2x1dGUvcGF0aC90by90YXJnZXRdXWBcbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRocz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVjb3JkcyBhIHNldCBvZiBiYWNrbGlua3MgaW50byBhIHNuYXBzaG90IHRoYXQge0BsaW5rIGVkaXRCYWNrbGlua3NTbmFwc2hvdH0gY2FuIHJld3JpdGUgbGF0ZXIuXG4gKlxuICogQ2FsbCBpdCBvbmNlIHBlciB0YXJnZXQgYW5kIHBhc3Mge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSB0byBhY2N1bXVsYXRlIHNldmVyYWwgdGFyZ2V0c1xuICogaW50byBvbmUgc25hcHNob3QsIHNvIHRoYXQgYSBub3RlIGxpbmtpbmcgdG8gc2V2ZXJhbCBvZiB0aGVtIGlzIHN0aWxsIHJld3JpdHRlbiBleGFjdGx5IG9uY2UuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGJ1aWxkaW5nIHRoZSBzbmFwc2hvdC5cbiAqIEByZXR1cm5zIFRoZSBzbmFwc2hvdCBcdTIwMTQge0BsaW5rIEJ1aWxkQmFja2xpbmtzU25hcHNob3RQYXJhbXMudGFyZ2V0fSBpdHNlbGYgd2hlbiBvbmUgd2FzIHBhc3NlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+KHBhcmFtczogQnVpbGRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBNdXRhYmxlQmFja2xpbmtzU25hcHNob3Q8VFBheWxvYWQ+IHtcbiAgY29uc3Qge1xuICAgIGJhY2tsaW5rcyxcbiAgICBsaW5rSWRlbnRpdHlLZXlQcm92aWRlcjogZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcixcbiAgICBwYXRoUmVtYXBwZXIsXG4gICAgcGF5bG9hZFByb3ZpZGVyLFxuICAgIHRhcmdldFxuICB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IHNuYXBzaG90ID0gdGFyZ2V0ID8/IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBUUGF5bG9hZD4+KCk7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdidWlsZEJhY2tsaW5rc1NuYXBzaG90JyxcbiAgICBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIHNuYXBzaG90XG4gIH0pO1xuICBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5zZXQoc25hcHNob3QsIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyKTtcblxuICBmb3IgKGNvbnN0IGJhY2tsaW5rUGF0aCBvZiBiYWNrbGlua3Mua2V5cygpKSB7XG4gICAgY29uc3QgbmV3QmFja2xpbmtQYXRoID0gcGF0aFJlbWFwcGVyPy4oYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgbGV0IHBheWxvYWRzID0gc25hcHNob3QuZ2V0KG5ld0JhY2tsaW5rUGF0aCk7XG4gICAgaWYgKCFwYXlsb2Fkcykge1xuICAgICAgcGF5bG9hZHMgPSBuZXcgTWFwPHN0cmluZywgVFBheWxvYWQ+KCk7XG4gICAgICBzbmFwc2hvdC5zZXQobmV3QmFja2xpbmtQYXRoLCBwYXlsb2Fkcyk7XG4gICAgfVxuXG4gICAgLyogdjggaWdub3JlIG5leHQgLS0gQSBrZXkgeWllbGRlZCBieSBga2V5cygpYCBhbHdheXMgcmVzb2x2ZXM7IHRoZSBgPz8gW11gIGlzIGRlZmVuc2l2ZS4gKi9cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgYmFja2xpbmtzLmdldChiYWNrbGlua1BhdGgpID8/IFtdKSB7XG4gICAgICBwYXlsb2Fkcy5zZXQobGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayksIHBheWxvYWRQcm92aWRlcihsaW5rKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNuYXBzaG90O1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbGluayB0byBhIG5ldyBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgY29udmVydGluZyB0aGUgbGluay5cbiAqIEByZXR1cm5zIFRoZSBjb252ZXJ0ZWQgbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRMaW5rKHBhcmFtczogQ29udmVydExpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB0YXJnZXRGaWxlID0gZXh0cmFjdExpbmtGaWxlKHtcbiAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgbGluazogcGFyYW1zLmxpbmssXG4gICAgc291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUgPz8gcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGVcbiAgfSk7XG4gIHJldHVybiB0YXJnZXRGaWxlXG4gICAgPyB1cGRhdGVMaW5rKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxVcGRhdGVMaW5rUGFyYW1zPih7XG4gICAgICBhcHA6IHBhcmFtcy5hcHAsXG4gICAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHBhcmFtcy5pc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgICBsaW5rOiBwYXJhbXMubGluayxcbiAgICAgIGxpbmtQYXRoU3R5bGU6IHBhcmFtcy5saW5rUGF0aFN0eWxlLFxuICAgICAgbGlua1N0eWxlOiBwYXJhbXMubGlua1N0eWxlLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgICBuZXdUYXJnZXRQYXRoT3JGaWxlOiB0YXJnZXRGaWxlLFxuICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogcGFyYW1zLm9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRFc2NhcGVBbGlhczogcGFyYW1zLnNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXM6IHBhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM6IHBhcmFtcy5zaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzLFxuICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0czogcGFyYW1zLnNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgICAgc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoczogcGFyYW1zLnNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgICB9KSlcbiAgICA6IHBhcmFtcy5saW5rLm9yaWdpbmFsO1xufVxuXG4vKipcbiAqIEVkaXRzIHRoZSBiYWNrbGlua3MgZm9yIGEgZmlsZSBvciBwYXRoLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZWRpdGluZyB0aGUgYmFja2xpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBiYWNrbGlua3MgaGF2ZSBiZWVuIGVkaXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRCYWNrbGlua3MocGFyYW1zOiBFZGl0QmFja2xpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFja2xpbmtzID0gYXdhaXQgZ2V0QmFja2xpbmtzRm9yRmlsZVNhZmUoeyBhcHAsIHBhdGhPckZpbGUsIC4uLm9wdGlvbnMgfSk7XG4gIGNvbnN0IHNuYXBzaG90ID0gYnVpbGRCYWNrbGlua3NTbmFwc2hvdDx1bmRlZmluZWQ+KHtcbiAgICBiYWNrbGlua3MsXG4gICAgcGF5bG9hZFByb3ZpZGVyOiBnZXRVbmRlZmluZWRQYXlsb2FkXG4gIH0pO1xuICBhd2FpdCBlZGl0QmFja2xpbmtzU25hcHNob3Qobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczx1bmRlZmluZWQ+Pih7XG4gICAgYXBwLFxuICAgIGxpbmtDb252ZXJ0ZXI6ICh7IGxpbmsgfSkgPT4gbGlua0NvbnZlcnRlcihsaW5rKSxcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcixcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBFZGl0cyBhIGNhcHR1cmVkIHNuYXBzaG90IG9mIGJhY2tsaW5rcywgcmV3cml0aW5nIGVhY2ggYmFja2xpbmstaG9sZGluZyBub3RlIGV4YWN0bHkgb25jZS5cbiAqXG4gKiBUaGUgY291bnRlcnBhcnQgb2Yge0BsaW5rIGVkaXRCYWNrbGlua3N9IGZvciBjYWxsZXJzIHRoYXQgY2Fubm90IGZldGNoIHRoZSBiYWNrbGlua3MgYXQgcmV3cml0ZSB0aW1lIFx1MjAxNFxuICogYmVjYXVzZSB0aGUgcmVuYW1lIHRoYXQgaW52YWxpZGF0ZWQgdGhlbSBoYXMgYWxyZWFkeSBoYXBwZW5lZCBcdTIwMTQgb3IgdGhhdCByZXdyaXRlIGxpbmtzIHRvIHNldmVyYWwgdGFyZ2V0c1xuICogYXQgb25jZS4gU2VlIHtAbGluayBCYWNrbGlua3NTbmFwc2hvdH0gZm9yIGJvdGggY2FzZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGF5bG9hZCAtIFRoZSBwYXlsb2FkIHJlY29yZGVkIGZvciBlYWNoIGxpbmsgd2hlbiB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0LlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBiYWNrbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGJhY2tsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdEJhY2tsaW5rc1NuYXBzaG90PFRQYXlsb2FkPihwYXJhbXM6IEVkaXRCYWNrbGlua3NTbmFwc2hvdFBhcmFtczxUUGF5bG9hZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyLFxuICAgIGxpbmtJZGVudGl0eUtleVByb3ZpZGVyOiBleHBsaWNpdExpbmtJZGVudGl0eUtleVByb3ZpZGVyLFxuICAgIGxpbmtVcGRhdGVQcm9ncmVzc1JlcG9ydGVyLFxuICAgIHNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3MgPSBmYWxzZSxcbiAgICBzbmFwc2hvdCxcbiAgICAuLi5vcHRpb25zXG4gIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGxpbmtJZGVudGl0eUtleVByb3ZpZGVyID0gcmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXIoe1xuICAgIGNhbGxlck5hbWU6ICdlZGl0QmFja2xpbmtzU25hcHNob3QnLFxuICAgIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsXG4gICAgc25hcHNob3RcbiAgfSk7XG5cbiAgY29uc3QgYmFja2xpbmtOb3RlUGF0aHMgPSBbLi4uc25hcHNob3Qua2V5cygpXTtcbiAgbGV0IHByb2Nlc3NlZCA9IDA7XG4gIGZvciAoY29uc3QgYmFja2xpbmtOb3RlUGF0aCBvZiBiYWNrbGlua05vdGVQYXRocykge1xuICAgIGNvbnN0IHBheWxvYWRzID0gZW5zdXJlTm9uTnVsbGFibGUoc25hcHNob3QuZ2V0KGJhY2tsaW5rTm90ZVBhdGgpKTtcbiAgICBhd2FpdCBlZGl0TGlua3Moe1xuICAgICAgYXBwLFxuICAgICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgICAgY29uc3QgbGlua0lkZW50aXR5S2V5ID0gbGlua0lkZW50aXR5S2V5UHJvdmlkZXIobGluayk7XG4gICAgICAgIHJldHVybiAhcGF5bG9hZHMuaGFzKGxpbmtJZGVudGl0eUtleSkgJiYgIXNob3VsZFZpc2l0VW5tYXRjaGVkTGlua3NcbiAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgIDogbGlua0NvbnZlcnRlcih7XG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZHMuZ2V0KGxpbmtJZGVudGl0eUtleSksXG4gICAgICAgICAgICBzb3VyY2VQYXRoOiBiYWNrbGlua05vdGVQYXRoXG4gICAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcGF0aE9yRmlsZTogYmFja2xpbmtOb3RlUGF0aCxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9KTtcbiAgICBwcm9jZXNzZWQrKztcbiAgICBsaW5rVXBkYXRlUHJvZ3Jlc3NSZXBvcnRlcj8uKHtcbiAgICAgIGN1cnJlbnRQYXRoOiBiYWNrbGlua05vdGVQYXRoLFxuICAgICAgcHJvY2Vzc2VkLFxuICAgICAgdG90YWw6IGJhY2tsaW5rTm90ZVBhdGhzLmxlbmd0aFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGZvciBhIGZpbGUgb3IgcGF0aC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGVkaXRpbmcgdGhlIGxpbmtzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBsaW5rcyBoYXZlIGJlZW4gZWRpdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZWRpdExpbmtzKHBhcmFtczogRWRpdExpbmtzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGlua0NvbnZlcnRlcixcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuXG4gIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsaWRhdGVPZmZzZXRSYW5nZShvZmZzZXRSYW5nZSk7XG4gIH1cblxuICBhd2FpdCBhcHBseUZpbGVDaGFuZ2VzKHtcbiAgICBhcHAsXG4gICAgY2hhbmdlc1Byb3ZpZGVyOiBhc3luYyAoeyBhYm9ydFNpZ25hbCwgY29udGVudCB9KSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIHBhdGhPckZpbGUsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlIH0pO1xuICAgICAgY29uc3QgY2FjaGVkQ29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjb250ZW50ID09PSBjYWNoZWRDb250ZW50XG4gICAgICAgID8gKGF3YWl0IGdldEZpbGVDaGFuZ2VzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxHZXRGaWxlQ2hhbmdlc1BhcmFtcz4oe1xuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGNhY2hlLFxuICAgICAgICAgIGlzQ2FudmFzRmlsZUNhY2hlOiBpc0NhbnZhc0ZpbGUocGF0aE9yRmlsZSksXG4gICAgICAgICAgbGlua0NvbnZlcnRlcixcbiAgICAgICAgICBvZmZzZXRSYW5nZSxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgICBzaG91bGRJbmNsdWRlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgICAgfSkpKVxuICAgICAgICA6IG51bGw7XG4gICAgfSxcbiAgICBwYXRoT3JGaWxlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSk7XG59XG5cbi8qKlxuICogRWRpdHMgdGhlIGxpbmtzIGluIGEgY29udGVudCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBlZGl0aW5nIHRoZSBsaW5rcyBpbiB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIFRoZSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRMaW5rc0luQ29udGVudChwYXJhbXM6IEVkaXRMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBsaW5rQ29udmVydGVyLCBvZmZzZXRSYW5nZSwgc2hvdWxkRWRpdEV4dGVybmFsTGlua3MgPSBmYWxzZSwgc2hvdWxkRWRpdEZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlLCBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rcyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIGxldCB7IGFib3J0U2lnbmFsIH0gPSBwYXJhbXM7XG4gIGFib3J0U2lnbmFsID8/PSBhYm9ydFNpZ25hbE5ldmVyKCk7XG4gIGFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgaWYgKG9mZnNldFJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YWxpZGF0ZU9mZnNldFJhbmdlKG9mZnNldFJhbmdlKTtcbiAgfVxuXG4gIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBhcHBseUNvbnRlbnRDaGFuZ2VzKHtcbiAgICBhYm9ydFNpZ25hbCxcbiAgICBjaGFuZ2VzUHJvdmlkZXI6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgcGFyc2VNZXRhZGF0YShhcHAsIGNvbnRlbnQsIHtcbiAgICAgICAgc2hvdWxkUGFyc2VFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rcyxcbiAgICAgICAgc2hvdWxkUGFyc2VGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZFBhcnNlTXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3NcbiAgICAgIH0pO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBnZXRGaWxlQ2hhbmdlcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZUNoYW5nZXNQYXJhbXM+KHtcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBpc0NhbnZhc0ZpbGVDYWNoZTogZmFsc2UsXG4gICAgICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgICAgIG9mZnNldFJhbmdlLFxuICAgICAgICBzaG91bGRJbmNsdWRlRXh0ZXJuYWxMaW5rczogc2hvdWxkRWRpdEV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3MsXG4gICAgICAgIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiBzaG91bGRFZGl0TXVsdGlWYWx1ZUZyb250bWF0dGVyRXh0ZXJuYWxMaW5rc1xuICAgICAgfSkpO1xuICAgICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0sXG4gICAgY29udGVudCxcbiAgICBwYXRoOiAnJ1xuICB9KTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhc3NlcnROb25OdWxsYWJsZShuZXdDb250ZW50LCAnRmFpbGVkIHRvIHVwZGF0ZSBsaW5rcyBpbiBjb250ZW50Jyk7XG5cbiAgcmV0dXJuIG5ld0NvbnRlbnQ7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGEgbGluay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGV4dHJhY3RpbmcgdGhlIGxpbmsgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluaywgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMaW5rRmlsZShwYXJhbXM6IEV4dHJhY3RMaW5rRmlsZVBhcmFtcyk6IG51bGwgfCBURmlsZSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgbGluayxcbiAgICBzaG91bGRBbGxvd05vbkV4aXN0aW5nRmlsZSA9IGZhbHNlLFxuICAgIHNvdXJjZVBhdGhPckZpbGVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBsaW5rUGF0aCB9ID0gc3BsaXRTdWJwYXRoKGxpbmsubGluayk7XG4gIGNvbnN0IHNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgc291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IGZpbGUgPSBhcHAubWV0YWRhdGFDYWNoZS5nZXRGaXJzdExpbmtwYXRoRGVzdChsaW5rUGF0aCwgc291cmNlUGF0aCk7XG4gIGlmIChmaWxlKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBpZiAoIXNob3VsZEFsbG93Tm9uRXhpc3RpbmdGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAobGlua1BhdGguc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGdldEZpbGUoeyBhcHAsIHBhdGhPckZpbGU6IGxpbmtQYXRoLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCBmdWxsTGlua1BhdGggPSBqb2luKGRpcm5hbWUoc291cmNlUGF0aCksIGAuLyR7bGlua1BhdGh9YCk7XG5cbiAgcmV0dXJuIGZ1bGxMaW5rUGF0aC5zdGFydHNXaXRoKCcuLi8nKSA/IG51bGwgOiBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBmdWxsTGlua1BhdGgsIHNob3VsZEluY2x1ZGVOb25FeGlzdGluZzogdHJ1ZSB9KTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBtYXJrZG93biBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyB0aGUgbWFya2Rvd24gbGluay5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IERFRkFVTFRfUEFSQU1TOiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPiA9IHtcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQ6IHRydWVcbiAgfTtcblxuICBjb25zdCBjdXN0b21EZWZhdWx0UGFyYW1zID0gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCkubWFwKChkZWZhdWx0UGFyYW1zRnVuY3Rpb24pID0+IGRlZmF1bHRQYXJhbXNGdW5jdGlvbigpKTtcbiAgLy8gU3RyaXAgZXhwbGljaXQgYHVuZGVmaW5lZGBzIGZpcnN0LCBvbiBhIGNvcHkgc28gdGhlIGNhbGxlcidzIG9iamVjdCBpcyB1bnRvdWNoZWQuXG4gIC8vIEEgY2FsbGVyIGZvcndhcmRpbmcgZXZlcnkgb3B0aW9uYWwgcGFyYW0gc2VuZHMgb3duIGtleXMgaG9sZGluZyBgdW5kZWZpbmVkYCBmb3IgdGhlIG9uZXMgaXQgZGlkIG5vdCByZWNlaXZlLlxuICAvLyBUaG9zZSBhcmUgbm90IHJlbW92ZWQgYnkgYG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllc2AsIHdoaWNoIGlzIGEgdHlwZS1sZXZlbCBuby1vcC5cbiAgLy8gV2l0aG91dCB0aGUgc3RyaXAsIHN1Y2ggYSBrZXkgb3ZlcndyaXRlcyBhIGRlZmF1bHQgd2l0aCBgdW5kZWZpbmVkYCBpbnN0ZWFkIG9mIGZhbGxpbmcgdGhyb3VnaCB0byBpdC5cbiAgcGFyYW1zID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9QQVJBTVMsIC4uLmN1c3RvbURlZmF1bHRQYXJhbXMsIHJlbW92ZVVuZGVmaW5lZFByb3BlcnRpZXM8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KHsgLi4ucGFyYW1zIH0pKTtcbiAgY29uc3QgdGFyZ2V0RmlsZSA9IGdldEZpbGUobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdldEZpbGVQYXJhbXM+KHsgYXBwLCBwYXRoT3JGaWxlOiBwYXJhbXMudGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiBwYXJhbXMuaXNOb25FeGlzdGluZ0ZpbGVBbGxvd2VkIH0pKTtcblxuICB1c2luZyBfcmVnaXN0cmF0aW9uID0gcmVnaXN0ZXJGaWxlcyhhcHAsIFt0YXJnZXRGaWxlXSk7XG4gIHJldHVybiBnZW5lcmF0ZU1hcmtkb3duTGlua0ltcGwocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYXcgbWFya2Rvd24gbGluayBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgZ2VuZXJhdGluZyBhIHJhdyBtYXJrZG93biBsaW5rLlxuICogQHJldHVybnMgQSByYXcgbWFya2Rvd24gbGluay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHBhcmFtczogR2VuZXJhdGVSYXdNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBlbWJlZFByZWZpeCA9IHBhcmFtcy5pc0VtYmVkID8gJyEnIDogJyc7XG5cbiAgaWYgKHBhcmFtcy5pc1dpa2lsaW5rKSB7XG4gICAgY29uc3QgYWxpYXNQYXJ0ID0gcGFyYW1zLmFsaWFzID8gYHwke3BhcmFtcy5hbGlhc31gIDogJyc7XG4gICAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVtbJHtwYXJhbXMudXJsfSR7YWxpYXNQYXJ0fV1dYDtcbiAgfVxuXG4gIGNvbnN0IGFsaWFzID0gcGFyYW1zLmFsaWFzID8/ICcnO1xuICBjb25zdCBzaG91bGRFc2NhcGVBbGlhcyA9IHBhcmFtcy5zaG91bGRFc2NhcGVBbGlhcyA/PyBmYWxzZTtcbiAgY29uc3QgZXNjYXBlZEFsaWFzID0gc2hvdWxkRXNjYXBlQWxpYXMgPyBlc2NhcGVBbGlhcyhhbGlhcykgOiBhbGlhcztcblxuICBjb25zdCB1cmwgPSBwYXJhbXMuc2hvdWxkVXNlQW5nbGVCcmFja2V0c1xuICAgID8gYDwke3BhcmFtcy51cmx9PmBcbiAgICA6IGVuY29kZVVybChwYXJhbXMudXJsKTtcblxuICBjb25zdCB0aXRsZVBhcnQgPSBwYXJhbXMudGl0bGUgPyBgICR7SlNPTi5zdHJpbmdpZnkocGFyYW1zLnRpdGxlKX1gIDogJyc7XG5cbiAgcmV0dXJuIGAke2VtYmVkUHJlZml4fVske2VzY2FwZWRBbGlhc31dKCR7dXJsfSR7dGl0bGVQYXJ0fSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHNoYXJlZCwgbXV0YWJsZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZGVmYXVsdCBwYXJhbXMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKlxuICogRWFjaCBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIGV2ZXJ5IHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30gY2FsbCBhbmQgaXRzIHJlc3VsdCBpcyBtZXJnZWQgaW50byB0aGUgcGFyYW1zIChsYXRlclxuICogcmVnaXN0cmF0aW9ucyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgYnVpbHQtaW4gZGVmYXVsdHMsIGJ1dCBuZXZlciBvdmVyIGV4cGxpY2l0bHkgcGFzc2VkIHBhcmFtcykuIFJlZ2lzdGVyIGVudHJpZXNcbiAqIGJ5IGFkZGluZyBhIGBHZW5lcmF0ZU1hcmtkb3duTGlua0RlZmF1bHRQYXJhbXNDb21wb25lbnRgIHRvIGEgY29tcG9uZW50IHRyZWUgcmF0aGVyIHRoYW4gbXV0YXRpbmcgdGhpcyBsaXN0IGRpcmVjdGx5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBtdXRhYmxlIGxpc3Qgb2YgZGVmYXVsdC1wYXJhbXMgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zKCk6ICgoKSA9PiBQYXJ0aWFsPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPilbXSB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8KCgpID0+IFBhcnRpYWw8R2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXM+KVtdPignZ2VuZXJhdGVNYXJrZG93bkxpbmtEZWZhdWx0UGFyYW1zRm5zJywgW10pLnZhbHVlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgYSBsaW5rIHVzZXMgYW5nbGUgYnJhY2tldHMsIHBvc3NpYmx5IGVtYmVkOlxuICogYFt0aXRsZV0oPGxpbms+KWAsIGAhW3RpdGxlXSg8bGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayB1c2VzIGFuZ2xlIGJyYWNrZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNBbmdsZUJyYWNrZXRzKGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/Lmhhc0FuZ2xlQnJhY2tldHMgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaXMgYW4gZW1iZWQgbGluazpcbiAqIGAhW1tsaW5rXV1gLCBgIVt0aXRsZV0obGluaylgLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGFuIGVtYmVkIGxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VtYmVkU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzRW1iZWQgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBkb3QsIHBvc3NpYmx5IGVtYmVkOlxuICogYFtbLi9saW5rXV1gLCBgW3RpdGxlXSguL2xpbmspYCwgYFt0aXRsZV0oPC4vbGluaz4pYCxcbiAqIGAhW1suL2xpbmtdXWAsIGAhW3RpdGxlXSguL2xpbmspYCwgYCFbdGl0bGVdKDwuL2xpbms+KWAuXG4gKlxuICogQHBhcmFtIGxpbmsgLSBMaW5rIHRvIHRlc3RcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGxpbmsgaGFzIGEgbGVhZGluZyBkb3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0xlYWRpbmdEb3QobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy4vJykgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogVGVzdHMgd2hldGhlciBhIGxpbmsgaGFzIGEgbGVhZGluZyBzbGFzaCwgcG9zc2libHkgZW1iZWQ6XG4gKiBgW1svbGlua11dYCwgYFt0aXRsZV0oL2xpbmspYCwgYFt0aXRsZV0oPC9saW5rPilgLFxuICogYCFbWy9saW5rXV1gLCBgIVt0aXRsZV0oL2xpbmspYCwgYCFbdGl0bGVdKDwvbGluaz4pYC5cbiAqXG4gKiBAcGFyYW0gbGluayAtIExpbmsgdG8gdGVzdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgbGluayBoYXMgYSBsZWFkaW5nIHNsYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNMZWFkaW5nU2xhc2gobGluazogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhcnNlTGlua1Jlc3VsdCA9IHBhcnNlTGluayhsaW5rKTtcbiAgcmV0dXJuIHBhcnNlTGlua1Jlc3VsdD8udXJsLnN0YXJ0c1dpdGgoJy8nKSA/PyBmYWxzZTtcbn1cblxuLyoqXG4gKiBUZXN0cyB3aGV0aGVyIGEgbGluayBpcyBhIHdpa2lsaW5rLCBwb3NzaWJseSBlbWJlZDpcbiAqIGBbW2xpbmtdXWAsIGAhW1tsaW5rXV1gLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gTGluayB0byB0ZXN0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsaW5rIGlzIGEgd2lraWxpbmtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1dpa2lsaW5rU3ludGF4KGxpbms6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJzZUxpbmtSZXN1bHQgPSBwYXJzZUxpbmsobGluayk7XG4gIHJldHVybiBwYXJzZUxpbmtSZXN1bHQ/LmlzV2lraWxpbmsgPz8gZmFsc2U7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0aGUgYWxpYXMgb2YgYSBsaW5rIHNob3VsZCBiZSByZXNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGRldGVybWluaW5nIGlmIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhbGlhcyBzaG91bGQgYmUgcmVzZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRSZXNldEFsaWFzKHBhcmFtczogU2hvdWxkUmVzZXRBbGlhc1BhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGRpc3BsYXlUZXh0LFxuICAgIGlzV2lraWxpbmssXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGgsXG4gICAgdGFyZ2V0UGF0aE9yRmlsZVxuICB9ID0gcGFyYW1zO1xuICBpZiAoaXNXaWtpbGluayA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWRpc3BsYXlUZXh0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZSh7IGFwcCwgcGF0aE9yRmlsZTogdGFyZ2V0UGF0aE9yRmlsZSwgc2hvdWxkSW5jbHVkZU5vbkV4aXN0aW5nOiB0cnVlIH0pO1xuICBjb25zdCBuZXdTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG5ld1NvdXJjZVBhdGhPckZpbGUpO1xuICBjb25zdCBvbGRTb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIG9sZFNvdXJjZVBhdGhPckZpbGUgPz8gbmV3U291cmNlUGF0aE9yRmlsZSk7XG4gIGNvbnN0IG5ld1NvdXJjZUZvbGRlciA9IGRpcm5hbWUobmV3U291cmNlUGF0aCk7XG4gIGNvbnN0IG9sZFNvdXJjZUZvbGRlciA9IGRpcm5hbWUob2xkU291cmNlUGF0aCk7XG4gIGNvbnN0IGFsaWFzZXNUb1Jlc2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCBwYXRoT3JGaWxlIG9mIFt0YXJnZXRGaWxlLnBhdGgsIG9sZFRhcmdldFBhdGhdKSB7XG4gICAgaWYgKCFwYXRoT3JGaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChwYXRoKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQoYmFzZW5hbWUocGF0aCkpO1xuICAgIGFsaWFzZXNUb1Jlc2V0LmFkZChyZWxhdGl2ZShuZXdTb3VyY2VGb2xkZXIsIHBhdGgpKTtcbiAgICBhbGlhc2VzVG9SZXNldC5hZGQocmVsYXRpdmUob2xkU291cmNlRm9sZGVyLCBwYXRoKSk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHNvdXJjZVBhdGggb2YgW29sZFNvdXJjZVBhdGgsIG5ld1NvdXJjZVBhdGhdKSB7XG4gICAgYWxpYXNlc1RvUmVzZXQuYWRkKGFwcC5tZXRhZGF0YUNhY2hlLmZpbGVUb0xpbmt0ZXh0KHRhcmdldEZpbGUsIHNvdXJjZVBhdGgsIGZhbHNlKSk7XG4gIH1cblxuICBjb25zdCBjbGVhbkRpc3BsYXlUZXh0ID0gcmVwbGFjZUFsbCh7XG4gICAgJHN0cmluZzogbm9ybWFsaXplUGF0aChlbnN1cmVOb25OdWxsYWJsZShkaXNwbGF5VGV4dC5zcGxpdCgnID4gJywgMSlbMF0pKSxcbiAgICByZXBsYWNlcjogJycsXG4gICAgc2VhcmNoVmFsdWU6IC9eXFwuXFwvL2dcbiAgfSkudG9Mb3dlckNhc2UoKTtcblxuICBmb3IgKGNvbnN0IGFsaWFzIG9mIGFsaWFzZXNUb1Jlc2V0KSB7XG4gICAgaWYgKGFsaWFzLnRvTG93ZXJDYXNlKCkgPT09IGNsZWFuRGlzcGxheVRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZvbGRlciA9IGRpcm5hbWUoYWxpYXMpO1xuICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShhbGlhcywgZXh0bmFtZShhbGlhcykpO1xuICAgIGlmIChqb2luKGZvbGRlciwgYmFzZSkudG9Mb3dlckNhc2UoKSA9PT0gY2xlYW5EaXNwbGF5VGV4dCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGxpbmsgaW50byBpdHMgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICpcbiAqIEBwYXJhbSBsaW5rIC0gVGhlIGxpbmsgdG8gc3BsaXQuXG4gKiBAcmV0dXJucyBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgbGluayBwYXRoIGFuZCBzdWJwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRTdWJwYXRoKGxpbms6IHN0cmluZyk6IFNwbGl0U3VicGF0aFJlc3VsdCB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlTGlua3RleHQobm9ybWFsaXplU3RyaW5nKGxpbmspKTtcbiAgcmV0dXJuIHtcbiAgICBsaW5rUGF0aDogcGFyc2VkLnBhdGgsXG4gICAgc3VicGF0aDogcGFyc2VkLnN1YnBhdGhcbiAgfTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBgZmlsZTovL2AgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyB0byBhIHByZXR0eSBmb3JtLCBjb252ZXJ0aW5nIGJhY2tzbGFzaGVzIHRvIGZvcndhcmRcbiAqIHNsYXNoZXMuIE90aGVyIGxpbmtzIGFyZSBsZWZ0IHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIG5vcm1hbGl6aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCBub3JtYWxpemVkIGBmaWxlOi8vYCBsaW5rcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudChwYXJhbXM6IFVwZGF0ZUZpbGVVcmxMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgYXBwLCBjb250ZW50LCBvZmZzZXRSYW5nZSwgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyA9IGZhbHNlIH0gPSBwYXJhbXM7XG4gIHJldHVybiBhd2FpdCBlZGl0TGlua3NJbkNvbnRlbnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc0luQ29udGVudFBhcmFtcz4oe1xuICAgIGFib3J0U2lnbmFsOiBwYXJhbXMuYWJvcnRTaWduYWwsXG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IG5vcm1hbGl6ZUZpbGVVcmxMaW5rKGxpbmssIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMpLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIHNob3VsZEVkaXRFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWUsXG4gICAgc2hvdWxkRWRpdE11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3M6IHRydWVcbiAgfSkpO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgdGhlIGBmaWxlOi8vYCBsaW5rcyBpbiBhIGZpbGUgdG8gYSBwcmV0dHkgZm9ybSwgY29udmVydGluZyBiYWNrc2xhc2hlcyB0byBmb3J3YXJkIHNsYXNoZXMuXG4gKiBPdGhlciBsaW5rcyBhcmUgbGVmdCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciBub3JtYWxpemluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRmlsZVVybExpbmtzSW5GaWxlKHBhcmFtczogVXBkYXRlRmlsZVVybExpbmtzSW5GaWxlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzID0gZmFsc2UsXG4gICAgLi4ub3B0aW9uc1xuICB9ID0gcGFyYW1zO1xuICBhd2FpdCBlZGl0TGlua3Mobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEVkaXRMaW5rc1BhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rQ29udmVydGVyOiAobGluaykgPT4gbm9ybWFsaXplRmlsZVVybExpbmsobGluaywgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyksXG4gICAgLy8gRm9yd2FyZGVkIGJ5IG5hbWUgcmF0aGVyIHRoYW4gdGhyb3VnaCBgb3B0aW9uc2AsIHNvIGEgbGF0ZXIgcmVmYWN0b3IgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZSxcbiAgICBzaG91bGRFZGl0RXh0ZXJuYWxMaW5rczogdHJ1ZSxcbiAgICBzaG91bGRFZGl0RnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIHNob3VsZEVkaXRNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzOiB0cnVlLFxuICAgIC4uLm9wdGlvbnNcbiAgfSkpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgYSBsaW5rIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdXBkYXRpbmcgdGhlIGxpbmsuXG4gKiBAcmV0dXJucyBUaGUgdXBkYXRlZCBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlTGluayhwYXJhbXM6IFVwZGF0ZUxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rLFxuICAgIGxpbmtQYXRoU3R5bGUsXG4gICAgbGlua1N0eWxlLFxuICAgIG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgbmV3VGFyZ2V0UGF0aE9yRmlsZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9sZFRhcmdldFBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyA9IHRydWUsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG4gIGlmICghbmV3VGFyZ2V0UGF0aE9yRmlsZSkge1xuICAgIHJldHVybiBsaW5rLm9yaWdpbmFsO1xuICB9XG4gIGNvbnN0IG5ld1RhcmdldEZpbGUgPSBnZXRGaWxlKHsgYXBwLCBwYXRoT3JGaWxlOiBuZXdUYXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHRydWUgfSk7XG4gIGNvbnN0IG9sZFNvdXJjZVBhdGggPSBnZXRQYXRoKGFwcCwgb2xkU291cmNlUGF0aE9yRmlsZSA/PyBuZXdTb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgb2xkVGFyZ2V0UGF0aCA9IGdldFBhdGgoYXBwLCBvbGRUYXJnZXRQYXRoT3JGaWxlID8/IG5ld1RhcmdldFBhdGhPckZpbGUpO1xuICBjb25zdCBpc1dpa2lsaW5rID0gc2hvdWxkVXNlV2lraWxpbmtTdHlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkVXNlV2lraWxpbmtTdHlsZVBhcmFtcz4oe1xuICAgIGFwcCxcbiAgICBsaW5rU3R5bGUsXG4gICAgb3JpZ2luYWxMaW5rOiBsaW5rLm9yaWdpbmFsXG4gIH0pKTtcblxuICBjb25zdCB7IHN1YnBhdGggfSA9IHNwbGl0U3VicGF0aChsaW5rLmxpbmspO1xuXG4gIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBDYW52YXMgZmlsZSBub2RlIHJlZmVyZW5jZSBicmFuY2ggaXMgaGFyZCB0byByZXByb2R1Y2UgaW4gdW5pdCB0ZXN0cy4gKi9cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdTb3VyY2VQYXRoT3JGaWxlKSAmJiBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgcmV0dXJuIG5ld1RhcmdldEZpbGUucGF0aCArIHN1YnBhdGg7XG5cbiAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICB9XG5cbiAgY29uc3QgcGFyc2VMaW5rUmVzdWx0ID0gcGFyc2VMaW5rKGxpbmsub3JpZ2luYWwpO1xuICBsZXQgYWxpYXM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoaXNXaWtpbGluayAmJiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzKSB7XG4gICAgYWxpYXMgPSBwYXJzZUxpbmtSZXN1bHQuYWxpYXM7XG4gIH1cblxuICBhbGlhcyA/Pz0gc2hvdWxkUmVzZXRBbGlhcyhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8U2hvdWxkUmVzZXRBbGlhc1BhcmFtcz4oe1xuICAgICAgYXBwLFxuICAgICAgZGlzcGxheVRleHQ6IGxpbmsuZGlzcGxheVRleHQsXG4gICAgICBpc1dpa2lsaW5rLFxuICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgICBvbGRUYXJnZXRQYXRoLFxuICAgICAgdGFyZ2V0UGF0aE9yRmlsZTogbmV3VGFyZ2V0RmlsZVxuICAgIH0pKVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBwYXJzZUxpbmtSZXN1bHQ/LmFsaWFzO1xuXG4gIC8vIFJlZnJlc2ggYSBmaWxlLW5hbWUgYWxpYXMgdG8gdGhlIG5ldyBiYXNlIG5hbWUgd2hlbiB0aGUgZmxhZyBpcyBzZXQuXG4gIC8vIEEgZmlsZS1uYW1lIGFsaWFzIGVxdWFscyB0aGUgT0xEIGJhc2UgbmFtZSAod2l0aCBvciB3aXRob3V0IGV4dGVuc2lvbik7IGEgY3VzdG9tIGFsaWFzIGlzIGtlcHQuXG4gIC8vIEdhdGluZyBvbiB0aGUgZmxhZyBhbHNvIHJlZnJlc2hlcyB3aWtpbGlua3MgdGhhdCBjYXJyeSBhbiBleHBsaWNpdCBhbGlhcy5cbiAgLy8gVGhvc2UgcHJldmlvdXNseSBzaG9ydC1jaXJjdWl0ZWQgdGhlIHJlZnJlc2ggYW5kIGtlcHQgdGhlIHN0YWxlIG9sZCBiYXNlIG5hbWUuXG4gIGlmIChzaG91bGRVcGRhdGVGaWxlTmFtZUFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSBiYXNlbmFtZShvbGRUYXJnZXRQYXRoLCBleHRuYW1lKG9sZFRhcmdldFBhdGgpKSkge1xuICAgICAgYWxpYXMgPSBuZXdUYXJnZXRGaWxlLmJhc2VuYW1lO1xuICAgIH0gZWxzZSBpZiAoYWxpYXMgPT09IGJhc2VuYW1lKG9sZFRhcmdldFBhdGgpKSB7XG4gICAgICBhbGlhcyA9IG5ld1RhcmdldEZpbGUubmFtZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBuZXdMaW5rID0gZ2VuZXJhdGVNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlTWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgYWxpYXMsXG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBpc1NpbmdsZVN1YnBhdGhBbGxvd2VkOiBvbGRTb3VyY2VQYXRoID09PSBvbGRUYXJnZXRQYXRoICYmICEhcGFyc2VMaW5rUmVzdWx0Py5hbGlhcyxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBvcmlnaW5hbExpbms6IGxpbmsub3JpZ2luYWwsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzLFxuICAgIHNvdXJjZVBhdGhPckZpbGU6IG5ld1NvdXJjZVBhdGhPckZpbGUsXG4gICAgc3VicGF0aCxcbiAgICB0YXJnZXRQYXRoT3JGaWxlOiBuZXdUYXJnZXRGaWxlXG4gIH0pKTtcbiAgcmV0dXJuIG5ld0xpbms7XG59XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgbGlua3MgaW4gYSBjb250ZW50IHN0cmluZyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHVwZGF0aW5nIHRoZSBsaW5rcy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbnRlbnQgd2l0aCB1cGRhdGVkIGxpbmtzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkNvbnRlbnQocGFyYW1zOiBVcGRhdGVMaW5rc0luQ29udGVudFBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgY29udGVudCxcbiAgICBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWQsXG4gICAgbGlua1BhdGhTdHlsZSxcbiAgICBsaW5rU3R5bGUsXG4gICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICBvZmZzZXRSYW5nZSxcbiAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgIHNob3VsZFVwZGF0ZUVtYmVkT25seUxpbmtzLFxuICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gIH0gPSBwYXJhbXM7XG5cbiAgcmV0dXJuIGF3YWl0IGVkaXRMaW5rc0luQ29udGVudChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RWRpdExpbmtzSW5Db250ZW50UGFyYW1zPih7XG4gICAgYXBwLFxuICAgIGNvbnRlbnQsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgobGluay5vcmlnaW5hbCk7XG4gICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmtcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIG9mZnNldFJhbmdlXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsaW5rcyBpbiBhIGZpbGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB1cGRhdGluZyB0aGUgbGlua3MuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGxpbmtzIGFyZSB1cGRhdGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlTGlua3NJbkZpbGUocGFyYW1zOiBVcGRhdGVMaW5rc0luRmlsZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZCxcbiAgICBsaW5rUGF0aFN0eWxlLFxuICAgIGxpbmtTdHlsZSxcbiAgICBuZXdTb3VyY2VQYXRoT3JGaWxlLFxuICAgIG9mZnNldFJhbmdlLFxuICAgIG9sZFNvdXJjZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkRXNjYXBlQWxpYXMsXG4gICAgc2hvdWxkSW5jbHVkZUF0dGFjaG1lbnRFeHRlbnNpb25Ub0VtYmVkQWxpYXMsXG4gICAgc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MsXG4gICAgc2hvdWxkVXBkYXRlRmlsZU5hbWVBbGlhcyxcbiAgICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzLFxuICAgIHNob3VsZFVzZUxlYWRpbmdTbGFzaEZvckFic29sdXRlUGF0aHNcbiAgfSA9IHBhcmFtcztcblxuICBpZiAoaXNDYW52YXNGaWxlKG5ld1NvdXJjZVBhdGhPckZpbGUpICYmICFhcHAuaW50ZXJuYWxQbHVnaW5zLmdldEVuYWJsZWRQbHVnaW5CeUlkKEludGVybmFsUGx1Z2luTmFtZS5DYW52YXMpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZWRpdExpbmtzKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxFZGl0TGlua3NQYXJhbXM+KHtcbiAgICAuLi5wYXJhbXMsXG4gICAgbGlua0NvbnZlcnRlcjogKGxpbmspID0+IHtcbiAgICAgIGNvbnN0IGlzRW1iZWRMaW5rID0gaGFzRW1iZWRTeW50YXgobGluay5vcmlnaW5hbCk7XG4gICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRW1iZWRPbmx5TGlua3MgIT09IHVuZGVmaW5lZCAmJiBzaG91bGRVcGRhdGVFbWJlZE9ubHlMaW5rcyAhPT0gaXNFbWJlZExpbmtcbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBjb252ZXJ0TGluayhub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8Q29udmVydExpbmtQYXJhbXM+KHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbGlua1BhdGhTdHlsZSxcbiAgICAgICAgICBsaW5rU3R5bGUsXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZSxcbiAgICAgICAgICBvbGRTb3VyY2VQYXRoT3JGaWxlLFxuICAgICAgICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVBdHRhY2htZW50RXh0ZW5zaW9uVG9FbWJlZEFsaWFzLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXMsXG4gICAgICAgICAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRocyxcbiAgICAgICAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzXG4gICAgICAgIH0pKTtcbiAgICB9LFxuICAgIC8vIE5hbWVkIGJlc2lkZSB0aGUgYC4uLnBhcmFtc2Agc3ByZWFkLCBzbyBhIGxhdGVyIHJlZmFjdG9yIHRvIGV4cGxpY2l0IGZvcndhcmRpbmcgY2Fubm90IGRyb3AgaXQgc2lsZW50bHkuXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgcGF0aE9yRmlsZTogbmV3U291cmNlUGF0aE9yRmlsZVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcihsaW5rOiBSZWZlcmVuY2UpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGluayk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTGlua1RleHQocGFyYW1zOiBHZW5lcmF0ZUxpbmtUZXh0UGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhcHAsIGNvbmZpZywgc3VicGF0aCwgdGFyZ2V0RmlsZSB9ID0gcGFyYW1zO1xuICBsZXQgeyBzb3VyY2VQYXRoIH0gPSBwYXJhbXM7XG4gIGlmIChzb3VyY2VQYXRoID09PSAnLycpIHtcbiAgICBzb3VyY2VQYXRoID0gJyc7XG4gIH1cblxuICBsZXQgbGlua1RleHQ6IHN0cmluZztcblxuICBpZiAodGFyZ2V0RmlsZS5wYXRoID09PSBzb3VyY2VQYXRoICYmIHN1YnBhdGggJiYgY29uZmlnLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQpIHtcbiAgICBsaW5rVGV4dCA9ICcnO1xuICB9IGVsc2Uge1xuICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgYnJhbmNoZXMgY292ZXJlZCBidXQgdjggcmVwb3J0cyBzd2l0Y2ggYXMgcGFydGlhbC4gKi9cbiAgICBzd2l0Y2ggKGNvbmZpZy5saW5rUGF0aFN0eWxlKSB7XG4gICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgICBsaW5rVGV4dCA9IHRhcmdldEZpbGUucGF0aDtcbiAgICAgICAgaWYgKGNvbmZpZy5zaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAvJHtsaW5rVGV4dH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBGaW5hbExpbmtQYXRoU3R5bGUuUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2U6IHtcbiAgICAgICAgbGlua1RleHQgPSByZWxhdGl2ZShkaXJuYW1lKHNvdXJjZVBhdGgpLCB0YXJnZXRGaWxlLnBhdGgpO1xuICAgICAgICBpZiAoY29uZmlnLnNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzICYmICFsaW5rVGV4dC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgICBsaW5rVGV4dCA9IGAuLyR7bGlua1RleHR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZToge1xuICAgICAgICBjb25zdCBzaG9ydGVzdE5hbWUgPSBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKSA/IHRhcmdldEZpbGUuYmFzZW5hbWUgOiB0YXJnZXRGaWxlLm5hbWU7XG4gICAgICAgIGNvbnN0IG1hdGNoZWRGaWxlcyA9IGFwcC5tZXRhZGF0YUNhY2hlLmdldExpbmtwYXRoRGVzdChzaG9ydGVzdE5hbWUsIHNvdXJjZVBhdGgpO1xuICAgICAgICBsaW5rVGV4dCA9IG1hdGNoZWRGaWxlcy5sZW5ndGggPT09IDEgJiYgbWF0Y2hlZEZpbGVzWzBdID09PSB0YXJnZXRGaWxlID8gdGFyZ2V0RmlsZS5uYW1lIDogdGFyZ2V0RmlsZS5wYXRoO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAtLSBBbGwgdmFsaWQgRmluYWxMaW5rUGF0aFN0eWxlIHZhbHVlcyBhcmUgaGFuZGxlZCBhYm92ZS4gKi9cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoY29uZmlnLmxpbmtQYXRoU3R5bGUpO1xuICAgICAgfVxuICAgICAgICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xuICAgIH1cbiAgfVxuXG4gIGxpbmtUZXh0ID0gY29uZmlnLmlzV2lraWxpbmtcbiAgICA/IHRyaW1FbmQoe1xuICAgICAgJHN0cmluZzogbGlua1RleHQsXG4gICAgICBzdWZmaXg6IGAuJHtNQVJLRE9XTl9GSUxFX0VYVEVOU0lPTn1gXG4gICAgfSlcbiAgICA6IGxpbmtUZXh0O1xuICBsaW5rVGV4dCArPSBzdWJwYXRoO1xuXG4gIHJldHVybiBsaW5rVGV4dDtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVNYXJrZG93bkxpbmtJbXBsKHBhcmFtczogR2VuZXJhdGVNYXJrZG93bkxpbmtQYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICBjb25zdCB0YXJnZXRGaWxlID0gZ2V0RmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8R2V0RmlsZVBhcmFtcz4oeyBhcHAsIHBhdGhPckZpbGU6IHBhcmFtcy50YXJnZXRQYXRoT3JGaWxlLCBzaG91bGRJbmNsdWRlTm9uRXhpc3Rpbmc6IHBhcmFtcy5pc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQgfSkpO1xuICBjb25zdCBzb3VyY2VQYXRoID0gZ2V0UGF0aChhcHAsIHBhcmFtcy5zb3VyY2VQYXRoT3JGaWxlKTtcbiAgY29uc3Qgc3VicGF0aCA9IHBhcmFtcy5zdWJwYXRoID8/ICcnO1xuXG4gIGNvbnN0IGxpbmtDb25maWcgPSBnZXRMaW5rQ29uZmlnKHBhcmFtcyk7XG4gIGNvbnN0IGxpbmtUZXh0ID0gZ2VuZXJhdGVMaW5rVGV4dCh7XG4gICAgYXBwLFxuICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICBzb3VyY2VQYXRoLFxuICAgIHN1YnBhdGgsXG4gICAgdGFyZ2V0RmlsZVxuICB9KTtcblxuICByZXR1cm4gbGlua0NvbmZpZy5pc1dpa2lsaW5rXG4gICAgPyBnZW5lcmF0ZVdpa2lMaW5rKHtcbiAgICAgIGFsaWFzOiBwYXJhbXMuYWxpYXMsXG4gICAgICBpc0VtYmVkOiBsaW5rQ29uZmlnLmlzRW1iZWQsXG4gICAgICBsaW5rVGV4dFxuICAgIH0pXG4gICAgOiBnZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rKHtcbiAgICAgIGNvbmZpZzogbGlua0NvbmZpZyxcbiAgICAgIGxpbmtUZXh0LFxuICAgICAgbWFya2Rvd25MaW5rUGFyYW1zOiBwYXJhbXMsXG4gICAgICB0YXJnZXRGaWxlXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlTWFya2Rvd25TdHlsZUxpbmsocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duU3R5bGVMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBjb25maWcsIGxpbmtUZXh0LCBtYXJrZG93bkxpbmtQYXJhbXMsIHRhcmdldEZpbGUgfSA9IHBhcmFtcztcbiAgbGV0IGFsaWFzID0gbWFya2Rvd25MaW5rUGFyYW1zLmFsaWFzID8/ICcnO1xuICBsZXQgc2hvdWxkRXNjYXBlQWxpYXMgPSBtYXJrZG93bkxpbmtQYXJhbXMuc2hvdWxkRXNjYXBlQWxpYXMgPz8gZmFsc2U7XG4gIGlmICghYWxpYXMgJiYgKGlzTWFya2Rvd25GaWxlKHRhcmdldEZpbGUpIHx8ICFtYXJrZG93bkxpbmtQYXJhbXMuaXNFbXB0eUVtYmVkQWxpYXNBbGxvd2VkKSkge1xuICAgIGFsaWFzID0gIW1hcmtkb3duTGlua1BhcmFtcy5zaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcyB8fCBpc01hcmtkb3duRmlsZSh0YXJnZXRGaWxlKVxuICAgICAgPyB0YXJnZXRGaWxlLmJhc2VuYW1lXG4gICAgICA6IHRhcmdldEZpbGUubmFtZTtcbiAgICBzaG91bGRFc2NhcGVBbGlhcyA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsoe1xuICAgIGFsaWFzLFxuICAgIGlzRW1iZWQ6IGNvbmZpZy5pc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IGZhbHNlLFxuICAgIHNob3VsZEVzY2FwZUFsaWFzLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IGNvbmZpZy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzLFxuICAgIHVybDogbGlua1RleHRcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlV2lraUxpbmsocGFyYW1zOiBHZW5lcmF0ZVdpa2lMaW5rUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBhbGlhcywgaXNFbWJlZCwgbGlua1RleHQgfSA9IHBhcmFtcztcbiAgcmV0dXJuIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rKHtcbiAgICBpc0VtYmVkLFxuICAgIGlzV2lraWxpbms6IHRydWUsXG4gICAgLi4uKGFsaWFzPy50b0xvd2VyQ2FzZSgpID09PSBsaW5rVGV4dC50b0xvd2VyQ2FzZSgpXG4gICAgICA/IHsgdXJsOiBhbGlhcyB9XG4gICAgICA6IHtcbiAgICAgICAgYWxpYXMsXG4gICAgICAgIHVybDogbGlua1RleHRcbiAgICAgIH0pXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRGaWxlQ2hhbmdlcyhwYXJhbXM6IEdldEZpbGVDaGFuZ2VzUGFyYW1zKTogUHJvbWlzZTxGaWxlQ2hhbmdlW10+IHtcbiAgY29uc3Qge1xuICAgIGNhY2hlLFxuICAgIGlzQ2FudmFzRmlsZUNhY2hlLFxuICAgIGxpbmtDb252ZXJ0ZXIsXG4gICAgb2Zmc2V0UmFuZ2UsXG4gICAgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MgPSBmYWxzZSxcbiAgICBzaG91bGRJbmNsdWRlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzID0gZmFsc2UsXG4gICAgc2hvdWxkSW5jbHVkZU11bHRpVmFsdWVGcm9udG1hdHRlckV4dGVybmFsTGlua3MgPSBmYWxzZVxuICB9ID0gcGFyYW1zO1xuICBsZXQgeyBhYm9ydFNpZ25hbCB9ID0gcGFyYW1zO1xuICBhYm9ydFNpZ25hbCA/Pz0gYWJvcnRTaWduYWxOZXZlcigpO1xuICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuXG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBjaGFuZ2VzOiBGaWxlQ2hhbmdlW10gPSBbXTtcblxuICBjb25zdCB0YWJsZVBvc2l0aW9uczogVGFibGVQb3NpdGlvbltdID0gKGNhY2hlLnNlY3Rpb25zID8/IFtdKS5maWx0ZXIoKHNlY3Rpb24pID0+IHNlY3Rpb24udHlwZSA9PT0gJ3RhYmxlJykubWFwKChzZWN0aW9uKSA9PiAoe1xuICAgIGVuZDogc2VjdGlvbi5wb3NpdGlvbi5lbmQub2Zmc2V0LFxuICAgIHN0YXJ0OiBzZWN0aW9uLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldFxuICB9KSk7XG5cbiAgY29uc3QgZ2V0RmlsZUNoYW5nZXNEZWJ1Z2dlciA9IGdldE9ic2lkaWFuTGliRGVidWdnZXIoJ0xpbms6Z2V0RmlsZUNoYW5nZXMnKTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2YgZ2V0TGlua3MoeyBjYWNoZSwgc2hvdWxkSW5jbHVkZUV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVGcm9udG1hdHRlckV4dGVybmFsTGlua3MsIHNob3VsZEluY2x1ZGVNdWx0aVZhbHVlRnJvbnRtYXR0ZXJFeHRlcm5hbExpbmtzIH0pKSB7XG4gICAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICAgIGlmIChvZmZzZXRSYW5nZSAhPT0gdW5kZWZpbmVkICYmICFpc1JlZmVyZW5jZUluT2Zmc2V0UmFuZ2UobGluaywgb2Zmc2V0UmFuZ2UpKSB7XG4gICAgICBnZXRGaWxlQ2hhbmdlc0RlYnVnZ2VyKFxuICAgICAgICBpc1JlZmVyZW5jZUNhY2hlKGxpbmspXG4gICAgICAgICAgPyAnU2tpcHBpbmcgYSBsaW5rIHRoYXQgaXMgbm90IGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgb2Zmc2V0IHJhbmdlJ1xuICAgICAgICAgIDogJ1NraXBwaW5nIGEgbGluayB0aGF0IGNhcnJpZXMgbm8gcG9zaXRpb24gd2l0aGluIHRoZSBjb250ZW50LCBzbyBpdCBjYW4gbmV2ZXIgYmUgaW4gdGhlIG9mZnNldCByYW5nZScsXG4gICAgICAgIHsgbGluazogbGluay5vcmlnaW5hbCwgb2Zmc2V0UmFuZ2UgfVxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCBsaW5rQ29udmVydGVyKGxpbmssIGFib3J0U2lnbmFsKTtcbiAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGlmIChuZXdDb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVDaGFuZ2UgPSByZWZlcmVuY2VUb0ZpbGVDaGFuZ2UobGluaywgbmV3Q29udGVudCk7XG5cbiAgICBpZiAoaXNDYW52YXNGaWxlQ2FjaGUpIHtcbiAgICAgIGlmIChpc0NhbnZhc0NoYW5nZShmaWxlQ2hhbmdlKSkge1xuICAgICAgICBjaGFuZ2VzLnB1c2goZmlsZUNoYW5nZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbnN1cHBvcnRlZCBmaWxlIGNoYW5nZScsIGZpbGVDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zKSkge1xuICAgICAgICBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQgPSBmaWxlQ2hhbmdlLm5ld0NvbnRlbnQucmVwbGFjZUFsbChPUFRJT05BTExZX0VTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAsICgpID0+IEVTQ0FQRURfV0lLSUxJTktfRElWSURFUik7XG4gICAgICB9XG5cbiAgICAgIGNoYW5nZXMucHVzaChmaWxlQ2hhbmdlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZXM7XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsTGlua1BhdGhTdHlsZShhcHA6IEFwcCwgbGlua1BhdGhTdHlsZT86IExpbmtQYXRoU3R5bGUpOiBGaW5hbExpbmtQYXRoU3R5bGUge1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1BhdGhTdHlsZSA/PyBMaW5rUGF0aFN0eWxlLk9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0O1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdDoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5BYnNvbHV0ZVBhdGhJblZhdWx0O1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuT2JzaWRpYW5TZXR0aW5nc0RlZmF1bHQ6IHtcbiAgICAgIHJldHVybiByZXNvbHZlRmluYWxMaW5rUGF0aFN0eWxlRnJvbU9ic2lkaWFuU2V0dGluZ3MoYXBwKTtcbiAgICB9XG4gICAgY2FzZSBMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlJlbGF0aXZlUGF0aFRvVGhlU291cmNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtQYXRoU3R5bGUuU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldExpbmtDb25maWcocGFyYW1zOiBHZW5lcmF0ZU1hcmtkb3duTGlua1BhcmFtcyk6IExpbmtDb25maWcge1xuICBjb25zdCB7IGFwcCB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGlzRW1iZWQ6IHBhcmFtcy5pc0VtYmVkID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzRW1iZWRTeW50YXgocGFyYW1zLm9yaWdpbmFsTGluaykgOiBmYWxzZSksXG4gICAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZDogcGFyYW1zLmlzU2luZ2xlU3VicGF0aEFsbG93ZWQgPz8gdHJ1ZSxcbiAgICBpc1dpa2lsaW5rOiBzaG91bGRVc2VXaWtpbGlua1N0eWxlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zPih7XG4gICAgICBhcHAsXG4gICAgICBsaW5rU3R5bGU6IHBhcmFtcy5saW5rU3R5bGUsXG4gICAgICBvcmlnaW5hbExpbms6IHBhcmFtcy5vcmlnaW5hbExpbmtcbiAgICB9KSksXG4gICAgbGlua1BhdGhTdHlsZTogZ2V0RmluYWxMaW5rUGF0aFN0eWxlKGFwcCwgcGFyYW1zLmxpbmtQYXRoU3R5bGUpLFxuICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHM6IHBhcmFtcy5zaG91bGRVc2VBbmdsZUJyYWNrZXRzID8/IChwYXJhbXMub3JpZ2luYWxMaW5rID8gaGFzQW5nbGVCcmFja2V0cyhwYXJhbXMub3JpZ2luYWxMaW5rKSA6IHVuZGVmaW5lZCkgPz8gZmFsc2UsXG4gICAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM6IHBhcmFtcy5zaG91bGRVc2VMZWFkaW5nRG90Rm9yUmVsYXRpdmVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nRG90KHBhcmFtcy5vcmlnaW5hbExpbmspIDogdW5kZWZpbmVkKSA/PyBmYWxzZSxcbiAgICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzOiBwYXJhbXMuc2hvdWxkVXNlTGVhZGluZ1NsYXNoRm9yQWJzb2x1dGVQYXRoc1xuICAgICAgPz8gKHBhcmFtcy5vcmlnaW5hbExpbmsgPyBoYXNMZWFkaW5nU2xhc2gocGFyYW1zLm9yaWdpbmFsTGluaykgOiB1bmRlZmluZWQpID8/IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFBheWxvYWQoKTogdW5kZWZpbmVkIHtcbiAgLy8gQSBzaW5nbGUtdGFyZ2V0IHJld3JpdGUgaGFzIG5vdGhpbmcgdG8gcmVtZW1iZXIgcGVyIGxpbms6IHRoZSB0YXJnZXQgaXMgaW1wbGllZC5cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRmlsZVVybExpbmsobGluazogUmVmZXJlbmNlLCBzaG91bGRVc2VBbmdsZUJyYWNrZXRzOiBib29sZWFuKTogTWF5YmVSZXR1cm48c3RyaW5nPiB7XG4gIGlmIChpc1BhcnNlTGlua0Zyb250bWF0dGVyUmVmZXJlbmNlKGxpbmspKSB7XG4gICAgLy8gQSBmcm9udG1hdHRlciB2YWx1ZSBob2xkcyBhIGJhcmUgVVJMIChyZS1zZXJpYWxpemVkL3F1b3RlZCBhcyBZQU1MKSwgbm90IGEgYFthbGlhc10odXJsKWAgbWFya2Rvd24gbGluay5cbiAgICByZXR1cm4gbGluay5wYXJzZUxpbmtSZXN1bHQuaXNGaWxlVXJsID8gbm9ybWFsaXplRmlsZVVybChsaW5rLnBhcnNlTGlua1Jlc3VsdC51cmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFpc1BhcnNlTGlua1JlZmVyZW5jZShsaW5rKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgcGFyc2VMaW5rUmVzdWx0IH0gPSBsaW5rO1xuICByZXR1cm4gcGFyc2VMaW5rUmVzdWx0LmlzRmlsZVVybFxuICAgID8gZ2VuZXJhdGVSYXdNYXJrZG93bkxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPEdlbmVyYXRlUmF3TWFya2Rvd25MaW5rUGFyYW1zPih7XG4gICAgICBhbGlhczogcGFyc2VMaW5rUmVzdWx0LmFsaWFzLFxuICAgICAgaXNFbWJlZDogcGFyc2VMaW5rUmVzdWx0LmlzRW1iZWQsXG4gICAgICBpc1dpa2lsaW5rOiBmYWxzZSxcbiAgICAgIHNob3VsZFVzZUFuZ2xlQnJhY2tldHMsXG4gICAgICB1cmw6IG5vcm1hbGl6ZUZpbGVVcmwocGFyc2VMaW5rUmVzdWx0LnVybClcbiAgICB9KSlcbiAgICA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUZpbmFsTGlua1BhdGhTdHlsZUZyb21PYnNpZGlhblNldHRpbmdzKGFwcDogQXBwKTogRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgY29uc3QgbmV3TGlua0Zvcm1hdCA9IGdldE5ld0xpbmtGb3JtYXQoYXBwKTtcbiAgc3dpdGNoIChuZXdMaW5rRm9ybWF0KSB7XG4gICAgY2FzZSAnYWJzb2x1dGUnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLkFic29sdXRlUGF0aEluVmF1bHQ7XG4gICAgfVxuICAgIGNhc2UgJ3JlbGF0aXZlJzoge1xuICAgICAgcmV0dXJuIEZpbmFsTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZTtcbiAgICB9XG4gICAgY2FzZSAnc2hvcnRlc3QnOiB7XG4gICAgICByZXR1cm4gRmluYWxMaW5rUGF0aFN0eWxlLlNob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIobmV3TGlua0Zvcm1hdCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVTbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVyKHBhcmFtczogUmVzb2x2ZVNuYXBzaG90TGlua0lkZW50aXR5S2V5UHJvdmlkZXJQYXJhbXMpOiAobGluazogUmVmZXJlbmNlKSA9PiBzdHJpbmcge1xuICBjb25zdCB7IGNhbGxlck5hbWUsIGV4cGxpY2l0TGlua0lkZW50aXR5S2V5UHJvdmlkZXIsIHNuYXBzaG90IH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlY29yZGVkTGlua0lkZW50aXR5S2V5UHJvdmlkZXIgPSBzbmFwc2hvdExpbmtJZGVudGl0eUtleVByb3ZpZGVycy5nZXQoc25hcHNob3QpO1xuICBpZiAoXG4gICAgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAmJiByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyXG4gICAgJiYgZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciAhPT0gcmVjb3JkZWRMaW5rSWRlbnRpdHlLZXlQcm92aWRlclxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgJHtjYWxsZXJOYW1lfSB3YXMgcGFzc2VkIGEgbGlua0lkZW50aXR5S2V5UHJvdmlkZXIgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9uZSB0aGUgc25hcHNob3Qgd2FzIGJ1aWx0IHdpdGguIGBcbiAgICAgICAgKyAnVGhlIHNuYXBzaG90IGlzIGtleWVkIGJ5IHRoZSBvdGhlciwgc28gbm8gbGluayB3b3VsZCBtYXRjaC4gT21pdCB0aGUgcGFyYW1ldGVyIHRvIHVzZSB0aGUgc25hcHNob3RcXCdzIG93bi4nXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZXhwbGljaXRMaW5rSWRlbnRpdHlLZXlQcm92aWRlciA/PyByZWNvcmRlZExpbmtJZGVudGl0eUtleVByb3ZpZGVyID8/IGRlZmF1bHRMaW5rSWRlbnRpdHlLZXlQcm92aWRlcjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkRXNjYXBlV2lraWxpbmtEaXZpZGVyKGZpbGVDaGFuZ2U6IEZpbGVDaGFuZ2UsIHRhYmxlUG9zaXRpb25zOiBUYWJsZVBvc2l0aW9uW10pOiBib29sZWFuIHtcbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIGdldEZpbGVDaGFuZ2VzIG9ubHkgY2FsbHMgdGhpcyBmb3Igbm9uLWNhbnZhcyBmaWxlcyB3aGljaCBhbHdheXMgaGF2ZSBjb250ZW50IGNoYW5nZXMuICovXG4gIGlmICghaXNDb250ZW50Q2hhbmdlKGZpbGVDaGFuZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG5cbiAgcmV0dXJuIFVORVNDQVBFRF9XSUtJTElOS19ESVZJREVSX1JFR0VYUC50ZXN0KGZpbGVDaGFuZ2UubmV3Q29udGVudCkgJiYgdGFibGVQb3NpdGlvbnMuc29tZSgodGFibGVQb3NpdGlvbikgPT4gdGFibGVQb3NpdGlvbi5zdGFydCA8PSBmaWxlQ2hhbmdlLnJlZmVyZW5jZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQgJiYgZmlsZUNoYW5nZS5yZWZlcmVuY2UucG9zaXRpb24uZW5kLm9mZnNldCA8PSB0YWJsZVBvc2l0aW9uLmVuZCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZVdpa2lsaW5rU3R5bGUocGFyYW1zOiBTaG91bGRVc2VXaWtpbGlua1N0eWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgYXBwLCBsaW5rU3R5bGUsIG9yaWdpbmFsTGluayB9ID0gcGFyYW1zO1xuICBjb25zdCByZXNvbHZlZFN0eWxlID0gbGlua1N0eWxlID8/IExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nO1xuICBzd2l0Y2ggKHJlc29sdmVkU3R5bGUpIHtcbiAgICBjYXNlIExpbmtTdHlsZS5NYXJrZG93bjoge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5PYnNpZGlhblNldHRpbmdzRGVmYXVsdDoge1xuICAgICAgcmV0dXJuIHNob3VsZFVzZVdpa2lsaW5rcyhhcHApO1xuICAgIH1cbiAgICBjYXNlIExpbmtTdHlsZS5QcmVzZXJ2ZUV4aXN0aW5nOiB7XG4gICAgICByZXR1cm4gb3JpZ2luYWxMaW5rID09PSB1bmRlZmluZWQgPyBzaG91bGRVc2VXaWtpbGlua3MoYXBwKSA6IGhhc1dpa2lsaW5rU3ludGF4KG9yaWdpbmFsTGluayk7XG4gICAgfVxuICAgIGNhc2UgTGlua1N0eWxlLldpa2lsaW5rOiB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYXNzZXJ0TmV2ZXIocmVzb2x2ZWRTdHlsZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlT2Zmc2V0UmFuZ2Uob2Zmc2V0UmFuZ2U6IE9mZnNldFJhbmdlKTogdm9pZCB7XG4gIGlmIChvZmZzZXRSYW5nZS5zdGFydE9mZnNldCA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgc3RhcnQgb2Zmc2V0ICR7U3RyaW5nKG9mZnNldFJhbmdlLnN0YXJ0T2Zmc2V0KX0gbXVzdCBub3QgYmUgbmVnYXRpdmUuYCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UmFuZ2UuZW5kT2Zmc2V0IDwgb2Zmc2V0UmFuZ2Uuc3RhcnRPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgb2Zmc2V0IHJhbmdlOiB0aGUgZW5kIG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5lbmRPZmZzZXQpfSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhlIHN0YXJ0IG9mZnNldCAke1N0cmluZyhvZmZzZXRSYW5nZS5zdGFydE9mZnNldCl9LmApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQSw4QkFBaUM7QUFDakMsMEJBR087QUFDUCxrQkFNTztBQUNQLG9CQUlPO0FBQ1AseUJBSU87QUFDUCxpQkFHTztBQUNQLDZCQUdPO0FBQ1As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