@coderminer/vue-markdown 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/LICENSE +21 -0
  3. package/README.md +579 -3
  4. package/README.zh-CN.md +547 -0
  5. package/dist/chunks/MarkdownBlockquote-DVXziX2t.js +18 -0
  6. package/dist/chunks/MarkdownBlockquote-DVXziX2t.js.map +1 -0
  7. package/dist/chunks/MarkdownBreak-BwCi2Itt.js +18 -0
  8. package/dist/chunks/MarkdownBreak-BwCi2Itt.js.map +1 -0
  9. package/dist/chunks/MarkdownCode-B1k9tmW5.js +65 -0
  10. package/dist/chunks/MarkdownCode-B1k9tmW5.js.map +1 -0
  11. package/dist/chunks/MarkdownConfigProvider-5N3ylrIu.js +51 -0
  12. package/dist/chunks/MarkdownConfigProvider-5N3ylrIu.js.map +1 -0
  13. package/dist/chunks/MarkdownContent-BAK6dqo7.js +15 -0
  14. package/dist/chunks/MarkdownContent-BAK6dqo7.js.map +1 -0
  15. package/dist/chunks/MarkdownCustomTag-BBdn3-WO.js +42 -0
  16. package/dist/chunks/MarkdownCustomTag-BBdn3-WO.js.map +1 -0
  17. package/dist/chunks/MarkdownEmphasis-CppivOEu.js +18 -0
  18. package/dist/chunks/MarkdownEmphasis-CppivOEu.js.map +1 -0
  19. package/dist/chunks/MarkdownEmpty-Av5k6bqa.js +16 -0
  20. package/dist/chunks/MarkdownEmpty-Av5k6bqa.js.map +1 -0
  21. package/dist/chunks/MarkdownError-C0sPs5W0.js +19 -0
  22. package/dist/chunks/MarkdownError-C0sPs5W0.js.map +1 -0
  23. package/dist/chunks/MarkdownFootnoteReference-Dy3Khwyj.js +24 -0
  24. package/dist/chunks/MarkdownFootnoteReference-Dy3Khwyj.js.map +1 -0
  25. package/dist/chunks/MarkdownFootnotes-BRPzkbXv.js +23 -0
  26. package/dist/chunks/MarkdownFootnotes-BRPzkbXv.js.map +1 -0
  27. package/dist/chunks/MarkdownHeading-DaNcP0_6.js +31 -0
  28. package/dist/chunks/MarkdownHeading-DaNcP0_6.js.map +1 -0
  29. package/dist/chunks/MarkdownHorizontalRule-QNe_cuUI.js +18 -0
  30. package/dist/chunks/MarkdownHorizontalRule-QNe_cuUI.js.map +1 -0
  31. package/dist/chunks/MarkdownHtml-66lYkvwM.js +15 -0
  32. package/dist/chunks/MarkdownHtml-66lYkvwM.js.map +1 -0
  33. package/dist/chunks/MarkdownImage-BRy76svs.js +53 -0
  34. package/dist/chunks/MarkdownImage-BRy76svs.js.map +1 -0
  35. package/dist/chunks/MarkdownInlineCode-MXZYFwex.js +18 -0
  36. package/dist/chunks/MarkdownInlineCode-MXZYFwex.js.map +1 -0
  37. package/dist/chunks/MarkdownLink-Dbx3NwgV.js +47 -0
  38. package/dist/chunks/MarkdownLink-Dbx3NwgV.js.map +1 -0
  39. package/dist/chunks/MarkdownList-BJ-_C71k.js +22 -0
  40. package/dist/chunks/MarkdownList-BJ-_C71k.js.map +1 -0
  41. package/dist/chunks/MarkdownListItem-Z1EHIY26.js +18 -0
  42. package/dist/chunks/MarkdownListItem-Z1EHIY26.js.map +1 -0
  43. package/dist/chunks/MarkdownLoading-D-RYtXxf.js +17 -0
  44. package/dist/chunks/MarkdownLoading-D-RYtXxf.js.map +1 -0
  45. package/dist/chunks/MarkdownParagraph-BxLSmSaG.js +18 -0
  46. package/dist/chunks/MarkdownParagraph-BxLSmSaG.js.map +1 -0
  47. package/dist/chunks/MarkdownRenderer-DLRRfsdI.js +416 -0
  48. package/dist/chunks/MarkdownRenderer-DLRRfsdI.js.map +1 -0
  49. package/dist/chunks/MarkdownRoot-DEE6iVfh.js +25 -0
  50. package/dist/chunks/MarkdownRoot-DEE6iVfh.js.map +1 -0
  51. package/dist/chunks/MarkdownStrikethrough-CblvbqDk.js +18 -0
  52. package/dist/chunks/MarkdownStrikethrough-CblvbqDk.js.map +1 -0
  53. package/dist/chunks/MarkdownStrong-uU5MzAoJ.js +18 -0
  54. package/dist/chunks/MarkdownStrong-uU5MzAoJ.js.map +1 -0
  55. package/dist/chunks/MarkdownTable-DmBTg_CR.js +18 -0
  56. package/dist/chunks/MarkdownTable-DmBTg_CR.js.map +1 -0
  57. package/dist/chunks/MarkdownTableCell-eiCJe847.js +33 -0
  58. package/dist/chunks/MarkdownTableCell-eiCJe847.js.map +1 -0
  59. package/dist/chunks/MarkdownTableRow-DuJaPntg.js +18 -0
  60. package/dist/chunks/MarkdownTableRow-DuJaPntg.js.map +1 -0
  61. package/dist/chunks/MarkdownTableSection-PFHz-R33.js +26 -0
  62. package/dist/chunks/MarkdownTableSection-PFHz-R33.js.map +1 -0
  63. package/dist/chunks/MarkdownTaskItem-BcmKo1lk.js +40 -0
  64. package/dist/chunks/MarkdownTaskItem-BcmKo1lk.js.map +1 -0
  65. package/dist/chunks/MarkdownToc-BdOHF-Yo.js +51 -0
  66. package/dist/chunks/MarkdownToc-BdOHF-Yo.js.map +1 -0
  67. package/dist/chunks/MarkdownTocItem-DT9mR3vL.js +27 -0
  68. package/dist/chunks/MarkdownTocItem-DT9mR3vL.js.map +1 -0
  69. package/dist/chunks/MermaidLiveEditor-W-qf3G-5.js +416 -0
  70. package/dist/chunks/MermaidLiveEditor-W-qf3G-5.js.map +1 -0
  71. package/dist/chunks/VueSyntaxHighlighter-DyLsYMwy.js +262 -0
  72. package/dist/chunks/VueSyntaxHighlighter-DyLsYMwy.js.map +1 -0
  73. package/dist/chunks/adapters-CMwX_NEI.js +28 -0
  74. package/dist/chunks/adapters-CMwX_NEI.js.map +1 -0
  75. package/dist/chunks/asyncToGenerator-ChigusFD.js +26 -0
  76. package/dist/chunks/blank-line-Cb-JBP_5.js +90 -0
  77. package/dist/chunks/blank-line-Cb-JBP_5.js.map +1 -0
  78. package/dist/chunks/codemirror-DyphMAEg.js +84 -0
  79. package/dist/chunks/codemirror-DyphMAEg.js.map +1 -0
  80. package/dist/chunks/config-aRYo2R8_.js +12 -0
  81. package/dist/chunks/config-aRYo2R8_.js.map +1 -0
  82. package/dist/chunks/context-8NfW6fxI.js +32 -0
  83. package/dist/chunks/context-8NfW6fxI.js.map +1 -0
  84. package/dist/chunks/default-DWVS-I_8.js +23 -0
  85. package/dist/chunks/default-DWVS-I_8.js.map +1 -0
  86. package/dist/chunks/diagnostics-CtHoJyiX.js +25 -0
  87. package/dist/chunks/diagnostics-CtHoJyiX.js.map +1 -0
  88. package/dist/chunks/export-DZQ3cUry.js +1575 -0
  89. package/dist/chunks/export-DZQ3cUry.js.map +1 -0
  90. package/dist/chunks/hast-nodes-C0bX3M5Z.js +35 -0
  91. package/dist/chunks/hast-nodes-C0bX3M5Z.js.map +1 -0
  92. package/dist/chunks/highlightjs-BEh-YwEG.js +6041 -0
  93. package/dist/chunks/highlightjs-BEh-YwEG.js.map +1 -0
  94. package/dist/chunks/identity-jZEhX2d5.js +6244 -0
  95. package/dist/chunks/identity-jZEhX2d5.js.map +1 -0
  96. package/dist/chunks/labels-BtHiUTQI.js +49 -0
  97. package/dist/chunks/labels-BtHiUTQI.js.map +1 -0
  98. package/dist/chunks/lib-BQiWGWpu.js +5087 -0
  99. package/dist/chunks/lib-BQiWGWpu.js.map +1 -0
  100. package/dist/chunks/lib-LwqA_W3J.js +127 -0
  101. package/dist/chunks/lib-LwqA_W3J.js.map +1 -0
  102. package/dist/chunks/longest-streak-DZE_EqsU.js +10 -0
  103. package/dist/chunks/longest-streak-DZE_EqsU.js.map +1 -0
  104. package/dist/chunks/micromark-factory-space-Db040TnW.js +139 -0
  105. package/dist/chunks/micromark-factory-space-Db040TnW.js.map +1 -0
  106. package/dist/chunks/normalize-CRYv3Wqt.js +220 -0
  107. package/dist/chunks/normalize-CRYv3Wqt.js.map +1 -0
  108. package/dist/chunks/objectSpread2-CtBNx0TF.js +57 -0
  109. package/dist/chunks/plugin-DqkFHyny.js +28 -0
  110. package/dist/chunks/plugin-DqkFHyny.js.map +1 -0
  111. package/dist/chunks/preset-BjaOuJUL.js +46 -0
  112. package/dist/chunks/preset-BjaOuJUL.js.map +1 -0
  113. package/dist/chunks/registry-DLjr93-V.js +6144 -0
  114. package/dist/chunks/registry-DLjr93-V.js.map +1 -0
  115. package/dist/chunks/render-Cs8iKrgz.js +1724 -0
  116. package/dist/chunks/render-Cs8iKrgz.js.map +1 -0
  117. package/dist/chunks/runtime-DJMnzjah.js +546 -0
  118. package/dist/chunks/runtime-DJMnzjah.js.map +1 -0
  119. package/dist/chunks/security-y4EwUyAs.js +214 -0
  120. package/dist/chunks/security-y4EwUyAs.js.map +1 -0
  121. package/dist/chunks/shared-DNAvZ-UY.js +76 -0
  122. package/dist/chunks/shared-DNAvZ-UY.js.map +1 -0
  123. package/dist/chunks/space-separated-tokens-CmBjEPdR.js +1099 -0
  124. package/dist/chunks/space-separated-tokens-CmBjEPdR.js.map +1 -0
  125. package/dist/chunks/url-D2BoivaE.js +26 -0
  126. package/dist/chunks/url-D2BoivaE.js.map +1 -0
  127. package/dist/chunks/useActiveHeading-BaGVMJnB.js +316 -0
  128. package/dist/chunks/useActiveHeading-BaGVMJnB.js.map +1 -0
  129. package/dist/components/CodeBlock.d.ts +73 -0
  130. package/dist/components/CodeBlock.js +1 -0
  131. package/dist/components/Icon.d.ts +6 -0
  132. package/dist/components/MarkdownBlockquote.d.ts +18 -0
  133. package/dist/components/MarkdownBlockquote.js +1 -0
  134. package/dist/components/MarkdownBreak.d.ts +8 -0
  135. package/dist/components/MarkdownBreak.js +1 -0
  136. package/dist/components/MarkdownChildren.d.ts +17 -0
  137. package/dist/components/MarkdownCode.d.ts +29 -0
  138. package/dist/components/MarkdownCode.js +1 -0
  139. package/dist/components/MarkdownConfigProvider.d.ts +33 -0
  140. package/dist/components/MarkdownConfigProvider.js +1 -0
  141. package/dist/components/MarkdownContent.d.ts +16 -0
  142. package/dist/components/MarkdownContent.js +1 -0
  143. package/dist/components/MarkdownCustomTag.d.ts +20 -0
  144. package/dist/components/MarkdownCustomTag.js +1 -0
  145. package/dist/components/MarkdownEmphasis.d.ts +18 -0
  146. package/dist/components/MarkdownEmphasis.js +1 -0
  147. package/dist/components/MarkdownEmpty.d.ts +8 -0
  148. package/dist/components/MarkdownEmpty.js +1 -0
  149. package/dist/components/MarkdownError.d.ts +11 -0
  150. package/dist/components/MarkdownError.js +1 -0
  151. package/dist/components/MarkdownFootnoteReference.d.ts +19 -0
  152. package/dist/components/MarkdownFootnoteReference.js +1 -0
  153. package/dist/components/MarkdownFootnotes.d.ts +17 -0
  154. package/dist/components/MarkdownFootnotes.js +1 -0
  155. package/dist/components/MarkdownHeading.d.ts +18 -0
  156. package/dist/components/MarkdownHeading.js +1 -0
  157. package/dist/components/MarkdownHorizontalRule.d.ts +8 -0
  158. package/dist/components/MarkdownHorizontalRule.js +1 -0
  159. package/dist/components/MarkdownHtml.d.ts +8 -0
  160. package/dist/components/MarkdownHtml.js +1 -0
  161. package/dist/components/MarkdownImage.d.ts +15 -0
  162. package/dist/components/MarkdownImage.js +1 -0
  163. package/dist/components/MarkdownInlineCode.d.ts +18 -0
  164. package/dist/components/MarkdownInlineCode.js +1 -0
  165. package/dist/components/MarkdownLink.d.ts +22 -0
  166. package/dist/components/MarkdownLink.js +1 -0
  167. package/dist/components/MarkdownList.d.ts +18 -0
  168. package/dist/components/MarkdownList.js +1 -0
  169. package/dist/components/MarkdownListItem.d.ts +18 -0
  170. package/dist/components/MarkdownListItem.js +1 -0
  171. package/dist/components/MarkdownLoading.d.ts +8 -0
  172. package/dist/components/MarkdownLoading.js +1 -0
  173. package/dist/components/MarkdownMath.d.ts +12 -0
  174. package/dist/components/MarkdownMath.js +1 -0
  175. package/dist/components/MarkdownMermaid.d.ts +78 -0
  176. package/dist/components/MarkdownMermaid.js +1 -0
  177. package/dist/components/MarkdownParagraph.d.ts +18 -0
  178. package/dist/components/MarkdownParagraph.js +1 -0
  179. package/dist/components/MarkdownRenderer.d.ts +170 -0
  180. package/dist/components/MarkdownRenderer.js +1 -0
  181. package/dist/components/MarkdownRoot.d.ts +24 -0
  182. package/dist/components/MarkdownRoot.js +1 -0
  183. package/dist/components/MarkdownStrikethrough.d.ts +18 -0
  184. package/dist/components/MarkdownStrikethrough.js +1 -0
  185. package/dist/components/MarkdownStrong.d.ts +18 -0
  186. package/dist/components/MarkdownStrong.js +1 -0
  187. package/dist/components/MarkdownTable.d.ts +18 -0
  188. package/dist/components/MarkdownTable.js +1 -0
  189. package/dist/components/MarkdownTableCell.d.ts +20 -0
  190. package/dist/components/MarkdownTableCell.js +1 -0
  191. package/dist/components/MarkdownTableRow.d.ts +18 -0
  192. package/dist/components/MarkdownTableRow.js +1 -0
  193. package/dist/components/MarkdownTableSection.d.ts +18 -0
  194. package/dist/components/MarkdownTableSection.js +1 -0
  195. package/dist/components/MarkdownTaskItem.d.ts +20 -0
  196. package/dist/components/MarkdownTaskItem.js +1 -0
  197. package/dist/components/MarkdownToc.d.ts +36 -0
  198. package/dist/components/MarkdownToc.js +1 -0
  199. package/dist/components/MarkdownTocItem.d.ts +14 -0
  200. package/dist/components/MarkdownTocItem.js +1 -0
  201. package/dist/components/MermaidBlock.d.ts +50 -0
  202. package/dist/components/MermaidBlock.js +1 -0
  203. package/dist/components/MermaidLiveEditor.d.ts +44 -0
  204. package/dist/components/MermaidLiveEditor.js +1 -0
  205. package/dist/components/VueSyntaxHighlighter.d.ts +39 -0
  206. package/dist/components/VueSyntaxHighlighter.js +1 -0
  207. package/dist/components/codeRegion.d.ts +14 -0
  208. package/dist/components/config.d.ts +7 -0
  209. package/dist/components/context.d.ts +45 -0
  210. package/dist/components/index.d.ts +42 -0
  211. package/dist/components/index.js +38 -0
  212. package/dist/components/render.d.ts +9 -0
  213. package/dist/components/scroll-lock.d.ts +7 -0
  214. package/dist/components/types.d.ts +29 -0
  215. package/dist/composables/useActiveHeading.d.ts +12 -0
  216. package/dist/composables/useCodeHighlighter.d.ts +30 -0
  217. package/dist/composables/useLineWindow.d.ts +38 -0
  218. package/dist/composables/useMarkdownDocument.d.ts +23 -0
  219. package/dist/core/adapters.d.ts +7 -0
  220. package/dist/core/config.d.ts +5 -0
  221. package/dist/core/diagnostics.d.ts +9 -0
  222. package/dist/core/finalize.d.ts +18 -0
  223. package/dist/core/hast-nodes.d.ts +6 -0
  224. package/dist/core/highlight-lines.d.ts +8 -0
  225. package/dist/core/identity.d.ts +4 -0
  226. package/dist/core/labels.d.ts +4 -0
  227. package/dist/core/manifest.d.ts +38 -0
  228. package/dist/core/memo.d.ts +5 -0
  229. package/dist/core/model-hast.d.ts +8 -0
  230. package/dist/core/model.d.ts +10 -0
  231. package/dist/core/normalize.d.ts +27 -0
  232. package/dist/core/parts.d.ts +135 -0
  233. package/dist/core/preset.d.ts +10 -0
  234. package/dist/core/run.d.ts +16 -0
  235. package/dist/core/search.d.ts +5 -0
  236. package/dist/core/security.d.ts +21 -0
  237. package/dist/core/slugger.d.ts +6 -0
  238. package/dist/core/types.d.ts +390 -0
  239. package/dist/core/url.d.ts +10 -0
  240. package/dist/editor/codemirror.d.ts +14 -0
  241. package/dist/editor/index.d.ts +2 -0
  242. package/dist/editor/index.js +1 -0
  243. package/dist/export/index.d.ts +6 -0
  244. package/dist/headless.d.ts +21 -0
  245. package/dist/headless.js +12 -0
  246. package/dist/highlight/highlightjs.d.ts +7 -0
  247. package/dist/highlight/index.d.ts +3 -0
  248. package/dist/highlight/index.js +3 -0
  249. package/dist/highlight/shared.d.ts +16 -0
  250. package/dist/highlight/shiki.d.ts +7 -0
  251. package/dist/highlight/shiki.js +76 -0
  252. package/dist/highlight/shiki.js.map +1 -0
  253. package/dist/html/index.d.ts +17 -0
  254. package/dist/html/index.js +13 -0
  255. package/dist/html/index.js.map +1 -0
  256. package/dist/index.d.ts +24 -0
  257. package/dist/index.js +55 -0
  258. package/dist/index.js.map +1 -0
  259. package/dist/math/index.d.ts +4 -0
  260. package/dist/math/index.js +583 -0
  261. package/dist/math/index.js.map +1 -0
  262. package/dist/math/katex.d.ts +4 -0
  263. package/dist/math/plugin.d.ts +20 -0
  264. package/dist/mermaid/index.d.ts +5 -0
  265. package/dist/mermaid/index.js +3 -0
  266. package/dist/mermaid/plugin.d.ts +14 -0
  267. package/dist/mermaid/runtime.d.ts +12 -0
  268. package/dist/mermaid/sanitize.d.ts +12 -0
  269. package/dist/node-components.d.ts +1 -0
  270. package/dist/node-components.js +39 -0
  271. package/dist/pipeline/custom.d.ts +8 -0
  272. package/dist/pipeline/identity.d.ts +12 -0
  273. package/dist/pipeline/index.d.ts +5 -0
  274. package/dist/pipeline/official.d.ts +6 -0
  275. package/dist/pipeline.d.ts +1 -0
  276. package/dist/pipeline.js +1 -0
  277. package/dist/plugins/builtin.d.ts +15 -0
  278. package/dist/plugins/define.d.ts +7 -0
  279. package/dist/plugins/registry.d.ts +16 -0
  280. package/dist/plugins/source.d.ts +7 -0
  281. package/dist/plugins.d.ts +3 -0
  282. package/dist/plugins.js +1 -0
  283. package/dist/presets.d.ts +3 -0
  284. package/dist/presets.js +1 -0
  285. package/dist/style.css +2 -0
  286. package/dist/styles/components.css +712 -0
  287. package/dist/styles/index.d.ts +1 -0
  288. package/dist/styles/math-full.css +3 -0
  289. package/dist/styles/math.css +18 -0
  290. package/dist/styles/tokens.css +96 -0
  291. package/package.json +211 -6
@@ -0,0 +1,214 @@
1
+ import { t as e } from "./url-D2BoivaE.js";
2
+ // src/core/security.ts
3
+ var t = /* @__PURE__ */ new Set(/* @__PURE__ */ "p.h1.h2.h3.h4.h5.h6.em.strong.del.a.img.ul.ol.li.blockquote.hr.table.thead.tbody.tfoot.tr.th.td.caption.colgroup.col.pre.code.br.input.section.div.span.sup.sub.kbd.mark.abbr.details.summary.dl.dt.dd.figure.figcaption.time.b.i.s.u.q.ins.picture.source.ruby.rp.rt.samp.var.tt.strike".split(".")), n = /* @__PURE__ */ new Set([
4
+ "script",
5
+ "style",
6
+ "iframe",
7
+ "object",
8
+ "embed",
9
+ "link",
10
+ "meta",
11
+ "base",
12
+ "form",
13
+ "textarea",
14
+ "select",
15
+ "option",
16
+ "template",
17
+ "noscript",
18
+ "svg",
19
+ "math"
20
+ ]), r = /* @__PURE__ */ new Set([
21
+ "href",
22
+ "src",
23
+ "cite",
24
+ "poster",
25
+ "action",
26
+ "formaction",
27
+ "data",
28
+ "srcset",
29
+ "xlink:href"
30
+ ]), i = /* @__PURE__ */ new Set([
31
+ "id",
32
+ "class",
33
+ "title",
34
+ "lang",
35
+ "dir",
36
+ "role",
37
+ "tabindex",
38
+ "hidden",
39
+ "align"
40
+ ]), a = {
41
+ a: [
42
+ "href",
43
+ "target",
44
+ "rel",
45
+ "download",
46
+ "hreflang",
47
+ "type",
48
+ "name"
49
+ ],
50
+ img: [
51
+ "src",
52
+ "alt",
53
+ "width",
54
+ "height",
55
+ "loading",
56
+ "decoding",
57
+ "srcset",
58
+ "sizes",
59
+ "referrerpolicy",
60
+ "crossorigin"
61
+ ],
62
+ ol: [
63
+ "start",
64
+ "reversed",
65
+ "type"
66
+ ],
67
+ ul: ["type"],
68
+ li: ["value"],
69
+ input: [
70
+ "type",
71
+ "checked",
72
+ "disabled",
73
+ "name",
74
+ "value"
75
+ ],
76
+ td: [
77
+ "colspan",
78
+ "rowspan",
79
+ "headers",
80
+ "scope"
81
+ ],
82
+ th: [
83
+ "colspan",
84
+ "rowspan",
85
+ "headers",
86
+ "scope",
87
+ "abbr"
88
+ ],
89
+ table: ["summary"],
90
+ col: ["span", "width"],
91
+ colgroup: ["span"],
92
+ blockquote: ["cite"],
93
+ q: ["cite"],
94
+ del: ["cite", "datetime"],
95
+ ins: ["cite", "datetime"],
96
+ time: ["datetime"],
97
+ source: [
98
+ "src",
99
+ "srcset",
100
+ "sizes",
101
+ "media",
102
+ "type"
103
+ ],
104
+ details: ["open"],
105
+ code: ["class"],
106
+ pre: ["class"],
107
+ abbr: ["title"],
108
+ section: ["data-footnotes", "data-footnote-ref"],
109
+ sup: ["data-footnote-ref"]
110
+ }, o = {
111
+ classname: "class",
112
+ htmlfor: "for",
113
+ srcset: "srcset",
114
+ colspan: "colspan",
115
+ rowspan: "rowspan",
116
+ charset: "charset",
117
+ httpequiv: "http-equiv",
118
+ tabindex: "tabindex",
119
+ readonly: "readonly",
120
+ maxlength: "maxlength",
121
+ minlength: "minlength",
122
+ autocomplete: "autocomplete",
123
+ referrerpolicy: "referrerpolicy",
124
+ crossorigin: "crossorigin",
125
+ datetime: "datetime"
126
+ };
127
+ function s(e) {
128
+ return e.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/[_\s]+/g, "-").toLowerCase();
129
+ }
130
+ function c(e) {
131
+ return /^data[A-Z]/.test(e) ? `data-${s(e.slice(4))}` : /^aria[A-Z]/.test(e) ? `aria-${e.slice(4).toLowerCase()}` : o[e.toLowerCase()] || (e.includes("-") ? e.toLowerCase() : s(e));
132
+ }
133
+ function l(e, t) {
134
+ if (t.startsWith("on") || t === "style" || t === "srcdoc") return !1;
135
+ if (t.startsWith("aria-") || t.startsWith("data-") || i.has(t)) return !0;
136
+ let n = a[e];
137
+ return n ? n.includes(t) : /^[a-z][a-z0-9-]*$/.test(t);
138
+ }
139
+ function u(t, n) {
140
+ return t.trim() === "" || e(t, n) !== "";
141
+ }
142
+ function d(e) {
143
+ let t = [], n = 0;
144
+ for (; n < e.length;) {
145
+ for (; n < e.length && /[\s,]/.test(e[n]);) n++;
146
+ if (n >= e.length) break;
147
+ let r = n;
148
+ for (; n < e.length && !/\s/.test(e[n]);) n++;
149
+ let i = e.slice(r, n), a = !1;
150
+ for (; i.endsWith(",");) i = i.slice(0, -1), a = !0;
151
+ let o = "";
152
+ if (!a) {
153
+ let t = n;
154
+ for (; n < e.length && e[n] !== ",";) n++;
155
+ o = e.slice(t, n).trim();
156
+ }
157
+ i && t.push({
158
+ url: i,
159
+ descriptor: o
160
+ }), n < e.length && e[n] === "," && n++;
161
+ }
162
+ return t;
163
+ }
164
+ function f(e, t) {
165
+ if (t === "srcset") {
166
+ let t = [];
167
+ for (let n of d(e)) u(n.url, "src") && t.push(n.descriptor ? `${n.url} ${n.descriptor}` : n.url);
168
+ return t.length > 0 ? t.join(", ") : void 0;
169
+ }
170
+ return u(e, t) ? e : void 0;
171
+ }
172
+ var p = /* @__PURE__ */ new Set([
173
+ "color",
174
+ "background-color",
175
+ "font-style",
176
+ "font-weight",
177
+ "text-decoration",
178
+ "opacity"
179
+ ]), m = /url\s*\(|expression\s*\(|javascript\s*:|@import|behavior\s*:|-moz-binding|[<>{}]/i;
180
+ function h(e) {
181
+ let t = [];
182
+ for (let n of e.split(";")) {
183
+ let e = n.indexOf(":");
184
+ if (e <= 0) continue;
185
+ let r = n.slice(0, e).trim().toLowerCase(), i = n.slice(e + 1).trim();
186
+ r && i && (m.test(i) || (p.has(r) || /^--shiki-[a-z0-9-]+$/.test(r)) && t.push(`${r}: ${i}`));
187
+ }
188
+ return t.length > 0 ? t.join("; ") : void 0;
189
+ }
190
+ function g(e, t, n = {}) {
191
+ let i = {};
192
+ if (!t) return i;
193
+ for (let a of Object.keys(t)) {
194
+ let o = t[a];
195
+ if (o == null || o === !1) continue;
196
+ let s = c(a), u;
197
+ if (u = o === !0 ? "" : Array.isArray(o) ? o.join(" ") : String(o), s === "style") {
198
+ if (!n.allowStyle) continue;
199
+ let e = h(u);
200
+ if (e === void 0) continue;
201
+ i.style = e;
202
+ } else if (l(e, s)) {
203
+ if (r.has(s)) {
204
+ let e = f(u, s);
205
+ if (e === void 0) continue;
206
+ i[s] = e;
207
+ } else i[s] = u;
208
+ }
209
+ }
210
+ return i;
211
+ }
212
+ export { f as a, g as i, n, r, t };
213
+
214
+ //# sourceMappingURL=security-y4EwUyAs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-y4EwUyAs.js","names":["defaultUrlTransform","ALLOWED_TAGS","DANGEROUS_TAGS","URL_ATTRIBUTES","GLOBAL_ATTRIBUTES","TAG_ATTRIBUTES","ATTRIBUTE_ALIASES","kebab","value","toAttributeName","key","isAllowedAttribute","name","tagAttributes","tag","isSafeUrl","parseSrcset","candidates","index","urlStart","url","commaSeparated","descriptor","descriptorStart","sanitizeUrlValue","safe","candidate","ALLOWED_STYLE_PROPERTIES","UNSAFE_STYLE","sanitizeStyleValue","declarations","part","separator","rawValue","propertiesToAttrs","attrs","properties","raw","options","safeStyle"],"sources":["../../src/core/security.ts"],"sourcesContent":["import type { Properties } from 'hast'\r\nimport { defaultUrlTransform } from './url'\r\n\r\n/** Tags that may appear in the normalized model. */\r\nexport const ALLOWED_TAGS = new Set([\r\n 'p',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'em',\r\n 'strong',\r\n 'del',\r\n 'a',\r\n 'img',\r\n 'ul',\r\n 'ol',\r\n 'li',\r\n 'blockquote',\r\n 'hr',\r\n 'table',\r\n 'thead',\r\n 'tbody',\r\n 'tfoot',\r\n 'tr',\r\n 'th',\r\n 'td',\r\n 'caption',\r\n 'colgroup',\r\n 'col',\r\n 'pre',\r\n 'code',\r\n 'br',\r\n 'input',\r\n 'section',\r\n 'div',\r\n 'span',\r\n 'sup',\r\n 'sub',\r\n 'kbd',\r\n 'mark',\r\n 'abbr',\r\n 'details',\r\n 'summary',\r\n 'dl',\r\n 'dt',\r\n 'dd',\r\n 'figure',\r\n 'figcaption',\r\n 'time',\r\n 'b',\r\n 'i',\r\n 's',\r\n 'u',\r\n 'q',\r\n 'ins',\r\n 'picture',\r\n 'source',\r\n 'ruby',\r\n 'rp',\r\n 'rt',\r\n 'samp',\r\n 'var',\r\n 'tt',\r\n 'strike',\r\n])\r\n\r\n/** Tags whose content must never reach the model. */\r\nexport const DANGEROUS_TAGS = new Set([\r\n 'script',\r\n 'style',\r\n 'iframe',\r\n 'object',\r\n 'embed',\r\n 'link',\r\n 'meta',\r\n 'base',\r\n 'form',\r\n 'textarea',\r\n 'select',\r\n 'option',\r\n 'template',\r\n 'noscript',\r\n 'svg',\r\n 'math',\r\n])\r\n\r\nconst URL_ATTRIBUTES = new Set([\r\n 'href',\r\n 'src',\r\n 'cite',\r\n 'poster',\r\n 'action',\r\n 'formaction',\r\n 'data',\r\n 'srcset',\r\n 'xlink:href',\r\n])\r\n\r\nexport { URL_ATTRIBUTES }\r\n\r\nconst GLOBAL_ATTRIBUTES = new Set([\r\n 'id',\r\n 'class',\r\n 'title',\r\n 'lang',\r\n 'dir',\r\n 'role',\r\n 'tabindex',\r\n 'hidden',\r\n 'align',\r\n])\r\n\r\nconst TAG_ATTRIBUTES: Record<string, readonly string[]> = {\r\n a: ['href', 'target', 'rel', 'download', 'hreflang', 'type', 'name'],\r\n img: [\r\n 'src',\r\n 'alt',\r\n 'width',\r\n 'height',\r\n 'loading',\r\n 'decoding',\r\n 'srcset',\r\n 'sizes',\r\n 'referrerpolicy',\r\n 'crossorigin',\r\n ],\r\n ol: ['start', 'reversed', 'type'],\r\n ul: ['type'],\r\n li: ['value'],\r\n input: ['type', 'checked', 'disabled', 'name', 'value'],\r\n td: ['colspan', 'rowspan', 'headers', 'scope'],\r\n th: ['colspan', 'rowspan', 'headers', 'scope', 'abbr'],\r\n table: ['summary'],\r\n col: ['span', 'width'],\r\n colgroup: ['span'],\r\n blockquote: ['cite'],\r\n q: ['cite'],\r\n del: ['cite', 'datetime'],\r\n ins: ['cite', 'datetime'],\r\n time: ['datetime'],\r\n source: ['src', 'srcset', 'sizes', 'media', 'type'],\r\n details: ['open'],\r\n code: ['class'],\r\n pre: ['class'],\r\n abbr: ['title'],\r\n section: ['data-footnotes', 'data-footnote-ref'],\r\n sup: ['data-footnote-ref'],\r\n}\r\n\r\nconst ATTRIBUTE_ALIASES: Record<string, string> = {\r\n classname: 'class',\r\n htmlfor: 'for',\r\n srcset: 'srcset',\r\n colspan: 'colspan',\r\n rowspan: 'rowspan',\r\n charset: 'charset',\r\n httpequiv: 'http-equiv',\r\n tabindex: 'tabindex',\r\n readonly: 'readonly',\r\n maxlength: 'maxlength',\r\n minlength: 'minlength',\r\n autocomplete: 'autocomplete',\r\n referrerpolicy: 'referrerpolicy',\r\n crossorigin: 'crossorigin',\r\n datetime: 'datetime',\r\n}\r\n\r\nfunction kebab(value: string): string {\r\n return value\r\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n .replace(/[_\\s]+/g, '-')\r\n .toLowerCase()\r\n}\r\n\r\nexport function toAttributeName(key: string): string {\r\n if (/^data[A-Z]/.test(key)) return `data-${kebab(key.slice(4))}`\r\n // ARIA attribute names are lowercase concatenations, not kebab-case:\r\n // ariaLabelledBy -> aria-labelledby, ariaValueText -> aria-valuetext.\r\n if (/^aria[A-Z]/.test(key)) return `aria-${key.slice(4).toLowerCase()}`\r\n const alias = ATTRIBUTE_ALIASES[key.toLowerCase()]\r\n if (alias) return alias\r\n return key.includes('-') ? key.toLowerCase() : kebab(key)\r\n}\r\n\r\nexport function isAllowedAttribute(tag: string, name: string): boolean {\r\n if (name.startsWith('on')) return false\r\n if (name === 'style' || name === 'srcdoc') return false\r\n if (name.startsWith('aria-') || name.startsWith('data-')) return true\r\n if (GLOBAL_ATTRIBUTES.has(name)) return true\r\n const tagAttributes = TAG_ATTRIBUTES[tag]\r\n if (tagAttributes) return tagAttributes.includes(name)\r\n // Unknown tags are plugin/custom tags: accept safe named props, but still\r\n // reject event handlers and validate URL-bearing attributes below.\r\n return /^[a-z][a-z0-9-]*$/.test(name)\r\n}\r\n\r\nfunction isSafeUrl(value: string, key: string): boolean {\r\n return value.trim() === '' || defaultUrlTransform(value, key) !== ''\r\n}\r\n\r\ninterface SrcsetCandidate {\r\n url: string\r\n descriptor: string\r\n}\r\n\r\n/**\r\n * Split a `srcset` value without breaking commas inside a `data:` URL. The URL\r\n * runs until whitespace, matching the HTML candidate grammar; a trailing comma\r\n * separates the next candidate.\r\n */\r\nfunction parseSrcset(value: string): SrcsetCandidate[] {\r\n const candidates: SrcsetCandidate[] = []\r\n let index = 0\r\n\r\n while (index < value.length) {\r\n while (index < value.length && /[\\s,]/.test(value[index]!)) index++\r\n if (index >= value.length) break\r\n\r\n const urlStart = index\r\n while (index < value.length && !/\\s/.test(value[index]!)) index++\r\n let url = value.slice(urlStart, index)\r\n let commaSeparated = false\r\n while (url.endsWith(',')) {\r\n url = url.slice(0, -1)\r\n commaSeparated = true\r\n }\r\n\r\n let descriptor = ''\r\n if (!commaSeparated) {\r\n const descriptorStart = index\r\n while (index < value.length && value[index] !== ',') index++\r\n descriptor = value.slice(descriptorStart, index).trim()\r\n }\r\n\r\n if (url) candidates.push({ url, descriptor })\r\n if (index < value.length && value[index] === ',') index++\r\n }\r\n\r\n return candidates\r\n}\r\n\r\n/**\r\n * Validate one URL-bearing attribute value. `srcset` holds a comma-separated\r\n * candidate list, so each candidate is checked individually.\r\n */\r\nexport function sanitizeUrlValue(\r\n value: string,\r\n key: string,\r\n): string | undefined {\r\n if (key === 'srcset') {\r\n const safe: string[] = []\r\n for (const candidate of parseSrcset(value)) {\r\n if (!isSafeUrl(candidate.url, 'src')) continue\r\n safe.push(\r\n candidate.descriptor\r\n ? `${candidate.url} ${candidate.descriptor}`\r\n : candidate.url,\r\n )\r\n }\r\n return safe.length > 0 ? safe.join(', ') : undefined\r\n }\r\n return isSafeUrl(value, key) ? value : undefined\r\n}\r\n\r\n// Inline styles are rejected for document content. Trusted engine output\r\n// (highlighters, math) may opt in to a small, non-executable subset so token\r\n// colors survive normalization.\r\nconst ALLOWED_STYLE_PROPERTIES = new Set([\r\n 'color',\r\n 'background-color',\r\n 'font-style',\r\n 'font-weight',\r\n 'text-decoration',\r\n 'opacity',\r\n])\r\n\r\nconst UNSAFE_STYLE =\r\n /url\\s*\\(|expression\\s*\\(|javascript\\s*:|@import|behavior\\s*:|-moz-binding|[<>{}]/i\r\n\r\nexport function sanitizeStyleValue(value: string): string | undefined {\r\n const declarations: string[] = []\r\n for (const part of value.split(';')) {\r\n const separator = part.indexOf(':')\r\n if (separator <= 0) continue\r\n const name = part.slice(0, separator).trim().toLowerCase()\r\n const rawValue = part.slice(separator + 1).trim()\r\n if (!name || !rawValue) continue\r\n if (UNSAFE_STYLE.test(rawValue)) continue\r\n const allowed =\r\n ALLOWED_STYLE_PROPERTIES.has(name) || /^--shiki-[a-z0-9-]+$/.test(name)\r\n if (!allowed) continue\r\n declarations.push(`${name}: ${rawValue}`)\r\n }\r\n return declarations.length > 0 ? declarations.join('; ') : undefined\r\n}\r\n\r\nexport interface PropertiesToAttrsOptions {\r\n /** Allow a constrained inline-style subset for trusted engine output. */\r\n allowStyle?: boolean\r\n}\r\n\r\n/** Convert hast properties into safe, normalized attributes. */\r\nexport function propertiesToAttrs(\r\n tag: string,\r\n properties: Properties | undefined,\r\n options: PropertiesToAttrsOptions = {},\r\n): Record<string, string> {\r\n const attrs: Record<string, string> = {}\r\n if (!properties) return attrs\r\n\r\n for (const key of Object.keys(properties)) {\r\n const raw = properties[key]\r\n if (raw === null || raw === undefined || raw === false) continue\r\n const name = toAttributeName(key)\r\n\r\n let value: string\r\n if (raw === true) {\r\n value = ''\r\n } else if (Array.isArray(raw)) {\r\n value = raw.join(' ')\r\n } else {\r\n value = String(raw)\r\n }\r\n\r\n if (name === 'style') {\r\n if (!options.allowStyle) continue\r\n const safeStyle = sanitizeStyleValue(value)\r\n if (safeStyle === undefined) continue\r\n attrs.style = safeStyle\r\n continue\r\n }\r\n\r\n if (!isAllowedAttribute(tag, name)) continue\r\n\r\n if (URL_ATTRIBUTES.has(name)) {\r\n const safe = sanitizeUrlValue(value, name)\r\n if (safe === undefined) continue\r\n attrs[name] = safe\r\n continue\r\n }\r\n\r\n attrs[name] = value\r\n }\r\n\r\n return attrs\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { t as e } from "./objectSpread2-CtBNx0TF.js";
2
+ import { n as t, t as n } from "./hast-nodes-C0bX3M5Z.js";
3
+ // src/highlight/shared.ts
4
+ var r = 256, i = /* @__PURE__ */ new Map();
5
+ function a(e, t = "") {
6
+ return {
7
+ language: t,
8
+ nodes: [{
9
+ kind: "text",
10
+ key: "highlight-0",
11
+ value: e
12
+ }]
13
+ };
14
+ }
15
+ function o(e) {
16
+ return t(e);
17
+ }
18
+ function s(e) {
19
+ return n(e);
20
+ }
21
+ function c(e, t, n, r) {
22
+ var i, a;
23
+ return [
24
+ e.id,
25
+ n,
26
+ (i = r.theme) == null ? "" : i,
27
+ (a = r.colorScheme) == null ? "" : a,
28
+ JSON.stringify(r),
29
+ t
30
+ ].join("");
31
+ }
32
+ function l() {
33
+ i.clear();
34
+ }
35
+ function u(e) {
36
+ if (!e || typeof e != "object") return !1;
37
+ let t = e;
38
+ return typeof t.language == "string" && Array.isArray(t.nodes);
39
+ }
40
+ function d(e, t, n, o = {}) {
41
+ if (!e) return a(t, n);
42
+ let s = c(e, t, n, o), l = i.get(s);
43
+ if (l) return l;
44
+ let d;
45
+ try {
46
+ let r = e.highlight(t, n, o);
47
+ d = u(r) ? r : a(t, n);
48
+ } catch (e) {
49
+ d = a(t, n);
50
+ }
51
+ if (i.set(s, d), i.size > r) {
52
+ let e = i.keys().next().value;
53
+ e !== void 0 && i.delete(e);
54
+ }
55
+ return d;
56
+ }
57
+ function f(t) {
58
+ let n = 0, r = () => `line-${n++}`, i = (t) => t.kind === "text" ? t.value.split("\n").map((e) => e === "" ? [] : [{
59
+ kind: "text",
60
+ key: r(),
61
+ value: e
62
+ }]) : !("children" in t) || !Array.isArray(t.children) ? [[t]] : a(t.children).map((n) => [e(e({}, t), {}, {
63
+ key: r(),
64
+ children: n
65
+ })]), a = (e) => {
66
+ let t = [[]];
67
+ for (let n of e) i(n).forEach((e, n) => {
68
+ n > 0 && t.push([]), t[t.length - 1].push(...e);
69
+ });
70
+ return t;
71
+ };
72
+ return a(t);
73
+ }
74
+ export { d as a, a as i, s as n, f as o, o as r, l as t };
75
+
76
+ //# sourceMappingURL=shared-DNAvZ-UY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-DNAvZ-UY.js","names":["_objectSpread2","htmlToMarkdownNodes","hastToMarkdownNodes","MAX_CACHE","cache","plaintextHighlight","code","highlightedNodesFromHtml","html","highlightedNodesFromHast","nodes","cacheKey","_options$theme","_options$colorScheme","highlighter","language","options","clearHighlightCache","isResult","value","result","runHighlighter","key","cached","_unused","oldest","splitHighlightLines","nextKey","splitNode","node","part","splitNodes","lines","list","index","line"],"sources":["../../src/highlight/shared.ts"],"sourcesContent":["import type {\r\n HighlightOptions,\r\n HighlightResult,\r\n MarkdownHighlighter,\r\n MarkdownNode,\r\n} from '../core/types'\r\nimport {\r\n hastToMarkdownNodes,\r\n htmlToMarkdownNodes,\r\n} from '../core/hast-nodes'\r\n\r\nconst MAX_CACHE = 256\r\nconst cache = new Map<string, HighlightResult>()\r\n\r\nexport function plaintextHighlight(\r\n code: string,\r\n language = '',\r\n): HighlightResult {\r\n return {\r\n language,\r\n nodes: [{ kind: 'text', key: 'highlight-0', value: code }],\r\n }\r\n}\r\n\r\n/** Convert trusted engine HTML into normalized nodes. */\r\nexport function highlightedNodesFromHtml(html: string): MarkdownNode[] {\r\n return htmlToMarkdownNodes(html)\r\n}\r\n\r\n/** Convert an already-parsed hast subtree into normalized nodes. */\r\nexport function highlightedNodesFromHast(\r\n nodes: Parameters<typeof hastToMarkdownNodes>[0],\r\n): MarkdownNode[] {\r\n return hastToMarkdownNodes(nodes)\r\n}\r\n\r\nexport function cacheKey(\r\n highlighter: MarkdownHighlighter,\r\n code: string,\r\n language: string,\r\n options: HighlightOptions,\r\n): string {\r\n return [\r\n highlighter.id,\r\n language,\r\n options.theme ?? '',\r\n options.colorScheme ?? '',\r\n JSON.stringify(options),\r\n code,\r\n ].join('\\u001e')\r\n}\r\n\r\nexport function clearHighlightCache(): void {\r\n cache.clear()\r\n}\r\n\r\nfunction isResult(value: unknown): value is HighlightResult {\r\n if (!value || typeof value !== 'object') return false\r\n const result = value as HighlightResult\r\n return typeof result.language === 'string' && Array.isArray(result.nodes)\r\n}\r\n\r\n/**\r\n * Run one adapter safely. Invalid adapters, thrown errors, and malformed\r\n * results fall back to plain text instead of breaking the document.\r\n */\r\nexport function runHighlighter(\r\n highlighter: MarkdownHighlighter | undefined,\r\n code: string,\r\n language: string,\r\n options: HighlightOptions = {},\r\n): HighlightResult {\r\n if (!highlighter) return plaintextHighlight(code, language)\r\n const key = cacheKey(highlighter, code, language, options)\r\n const cached = cache.get(key)\r\n if (cached) return cached\r\n\r\n let result: HighlightResult\r\n try {\r\n const value = highlighter.highlight(code, language, options)\r\n result = isResult(value) ? value : plaintextHighlight(code, language)\r\n } catch {\r\n result = plaintextHighlight(code, language)\r\n }\r\n\r\n cache.set(key, result)\r\n if (cache.size > MAX_CACHE) {\r\n const oldest = cache.keys().next().value\r\n if (oldest !== undefined) cache.delete(oldest)\r\n }\r\n return result\r\n}\r\n\r\n/** Split highlighted nodes into lines while preserving element wrappers. */\r\nexport function splitHighlightLines(\r\n nodes: readonly MarkdownNode[],\r\n): MarkdownNode[][] {\r\n let key = 0\r\n\r\n const nextKey = (): string => `line-${key++}`\r\n\r\n const splitNode = (node: MarkdownNode): MarkdownNode[][] => {\r\n if (node.kind === 'text') {\r\n return node.value.split('\\n').map((part) =>\r\n part === '' ? [] : [{ kind: 'text', key: nextKey(), value: part }],\r\n )\r\n }\r\n if (!('children' in node) || !Array.isArray(node.children)) {\r\n return [[node]]\r\n }\r\n return splitNodes(node.children).map((children) => [\r\n { ...node, key: nextKey(), children } as MarkdownNode,\r\n ])\r\n }\r\n\r\n const splitNodes = (list: readonly MarkdownNode[]): MarkdownNode[][] => {\r\n const lines: MarkdownNode[][] = [[]]\r\n for (const node of list) {\r\n const nodeLines = splitNode(node)\r\n nodeLines.forEach((line, index) => {\r\n if (index > 0) lines.push([])\r\n lines[lines.length - 1]!.push(...line)\r\n })\r\n }\r\n return lines\r\n }\r\n\r\n return splitNodes(nodes)\r\n}\r\n"],"mappings":";;;AAWA,IAAMG,IAAY,KACZC,oBAAQ,IAAI,IAA6B;AAE/C,SAAgBC,EACd,GACA,IAAW,IACM;CACjB,OAAO;EACL;EACA,OAAO,CAAC;GAAE,MAAM;GAAQ,KAAK;GAAe,OAAOC;EAAK,CAAC;CAC3D;AACF;AAGA,SAAgBC,EAAyB,GAA8B;CACrE,OAAON,EAAoBO,CAAI;AACjC;AAGA,SAAgBC,EACd,GACgB;CAChB,OAAOP,EAAoBQ,CAAK;AAClC;AAEA,SAAgBC,EACd,GACA,GACA,GACA,GACQ;;CACR,OAAO;EACLG,EAAY;EACZC;GACA,IAAAC,EAAQ,UAAA,OAAS,KAATJ;GACR,IAAAI,EAAQ,gBAAA,OAAe,KAAfH;EACR,KAAK,UAAUG,CAAO;EACtBV;CACF,CAAC,CAAC,KAAK,GAAQ;AACjB;AAEA,SAAgBW,IAA4B;CAC1C,EAAM,MAAM;AACd;AAEA,SAASC,EAAS,GAA0C;CAC1D,IAAI,CAACC,KAAS,OAAOA,KAAU,UAAU,OAAO;CAChD,IAAMC,IAASD;CACf,OAAO,OAAOC,EAAO,YAAa,YAAY,MAAM,QAAQA,EAAO,KAAK;AAC1E;AAMA,SAAgBC,EACd,GACA,GACA,GACA,IAA4B,CAAC,GACZ;CACjB,IAAI,CAACP,GAAa,OAAOT,EAAmBC,GAAMS,CAAQ;CAC1D,IAAMO,IAAMX,EAASG,GAAaR,GAAMS,GAAUC,CAAO,GACnDO,IAASnB,EAAM,IAAIkB,CAAG;CAC5B,IAAIC,GAAQ,OAAOA;CAEnB,IAAIH;CACJ,IAAI;EACF,IAAMD,IAAQL,EAAY,UAAUR,GAAMS,GAAUC,CAAO;EAC3D,IAASE,EAASC,CAAK,IAAIA,IAAQd,EAAmBC,GAAMS,CAAQ;CACtE,SAAAS,GAAQ;EACN,IAASnB,EAAmBC,GAAMS,CAAQ;CAC5C;CAGA,IADAX,EAAM,IAAIkB,GAAKF,CAAM,GACjBhB,EAAM,OAAOD,GAAW;EAC1B,IAAMsB,IAASrB,EAAM,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EACnC,AAAIqB,MAAW,KAAA,KAAWrB,EAAM,OAAOqB,CAAM;CAC/C;CACA,OAAOL;AACT;AAGA,SAAgBM,EACd,GACkB;CAClB,IAAIJ,IAAM,GAEJK,UAAwB,QAAQ,OAEhCC,KAAa,MACbC,EAAK,SAAS,SACTA,EAAK,MAAM,MAAM,IAAI,CAAC,CAAC,KAAK,MACjCC,MAAS,KAAK,CAAC,IAAI,CAAC;EAAE,MAAM;EAAQ,KAAKH,EAAQ;EAAG,OAAOG;CAAK,CAAC,CACnE,IAEE,EAAE,cAAcD,MAAS,CAAC,MAAM,QAAQA,EAAK,QAAQ,IAChD,CAAC,CAACA,CAAI,CAAC,IAETE,EAAWF,EAAK,QAAQ,CAAC,CAAC,KAAK,MAAa,CAAA7B,EAAAA,EAAA,CAAA,GAC5C6B,CAAA,GAAA,CAAA,GAAA;EAAM,KAAKF,EAAQ;EAAG;CAAS,CAAA,CACtC,CAAC,GAGGI,KAAc,MAAoD;EACtE,IAAMC,IAA0B,CAAC,CAAC,CAAC;EACnC,KAAK,IAAMH,KAAQI,GAEjB,EAD4BJ,CAC5B,CAAA,CAAU,SAAS,GAAM,MAAU;GAEjC,AADIK,IAAQ,KAAGF,EAAM,KAAK,CAAC,CAAC,GAC5BA,EAAMA,EAAM,SAAS,EAAE,CAAE,KAAK,GAAGG,CAAI;EACvC,CAAC;EAEH,OAAOH;CACT;CAEA,OAAOD,EAAWrB,CAAK;AACzB"}