hitloop 0.0.0-stage → 0.1.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 (469) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +218 -2
  3. package/dist/agent.js +318 -0
  4. package/dist/cli.js +897 -0
  5. package/dist/client/assets/app.css +1 -0
  6. package/dist/client/assets/chunks/abap-EINPUMCJ.js +1 -0
  7. package/dist/client/assets/chunks/abnfDiagram-S7VZAUFO-W2CM2W6D.js +1 -0
  8. package/dist/client/assets/chunks/actionscript-3-O776AQUO.js +1 -0
  9. package/dist/client/assets/chunks/ada-WLOTXRTV.js +1 -0
  10. package/dist/client/assets/chunks/ahk-EF37A2DY.js +1 -0
  11. package/dist/client/assets/chunks/ahk2-FH4K3CKT.js +1 -0
  12. package/dist/client/assets/chunks/angular-html-ZALQFV2H.js +1 -0
  13. package/dist/client/assets/chunks/angular-ts-4IWMF7QO.js +1 -0
  14. package/dist/client/assets/chunks/apache-44AYOEWM.js +1 -0
  15. package/dist/client/assets/chunks/apex-XRYPID42.js +1 -0
  16. package/dist/client/assets/chunks/apl-5HBALFOI.js +1 -0
  17. package/dist/client/assets/chunks/applescript-2DZEHZEC.js +1 -0
  18. package/dist/client/assets/chunks/ara-ZGZQBLXL.js +1 -0
  19. package/dist/client/assets/chunks/architecture-WOLXFQ4H-EJGENNRL.js +1 -0
  20. package/dist/client/assets/chunks/architectureDiagram-YGSQEFNW-2VHWSKO6.js +36 -0
  21. package/dist/client/assets/chunks/asciidoc-GSQAKCPO.js +1 -0
  22. package/dist/client/assets/chunks/asm-BFURM5BK.js +1 -0
  23. package/dist/client/assets/chunks/astro-VJORWDZJ.js +1 -0
  24. package/dist/client/assets/chunks/awk-BSHTWXXX.js +1 -0
  25. package/dist/client/assets/chunks/ballerina-HAOQJ4B2.js +1 -0
  26. package/dist/client/assets/chunks/bat-OSH45EOF.js +1 -0
  27. package/dist/client/assets/chunks/beancount-RBATIHOV.js +1 -0
  28. package/dist/client/assets/chunks/berry-CZUIOUM4.js +1 -0
  29. package/dist/client/assets/chunks/bibtex-KCL2UWHE.js +1 -0
  30. package/dist/client/assets/chunks/bicep-SZJZB3SG.js +1 -0
  31. package/dist/client/assets/chunks/bird2-XBF5YQQV.js +1 -0
  32. package/dist/client/assets/chunks/blade-Q24LEVFC.js +1 -0
  33. package/dist/client/assets/chunks/blockDiagram-APKKGZFW-53LXSOOT.js +140 -0
  34. package/dist/client/assets/chunks/bpmnIcons-APHXDYXF-FMBRQNTY.js +1 -0
  35. package/dist/client/assets/chunks/bsl-TI44NWFB.js +1 -0
  36. package/dist/client/assets/chunks/c-NLHY4Y4N.js +1 -0
  37. package/dist/client/assets/chunks/c3-BUTEM6PO.js +1 -0
  38. package/dist/client/assets/chunks/c4Diagram-KJ2TOQU5-O53G4GQH.js +38 -0
  39. package/dist/client/assets/chunks/cadence-JIRTEU64.js +1 -0
  40. package/dist/client/assets/chunks/cairo-3W6NVDNW.js +1 -0
  41. package/dist/client/assets/chunks/chapel-BPBJ2E7K.js +1 -0
  42. package/dist/client/assets/chunks/chunk-25KVF5ZE.js +1 -0
  43. package/dist/client/assets/chunks/chunk-2CJKSQOI.js +1 -0
  44. package/dist/client/assets/chunks/chunk-2QIJRTWR.js +1 -0
  45. package/dist/client/assets/chunks/chunk-2ZCRJZGF.js +2 -0
  46. package/dist/client/assets/chunks/chunk-3ILNDZNY.js +213 -0
  47. package/dist/client/assets/chunks/chunk-3M2OOQ7S.js +1 -0
  48. package/dist/client/assets/chunks/chunk-3M57NTNK.js +1 -0
  49. package/dist/client/assets/chunks/chunk-3MR6DCZJ.js +1 -0
  50. package/dist/client/assets/chunks/chunk-3WGHS7F7.js +1 -0
  51. package/dist/client/assets/chunks/chunk-4JK75V33.js +1 -0
  52. package/dist/client/assets/chunks/chunk-4NXNVEWK.js +1 -0
  53. package/dist/client/assets/chunks/chunk-4RNNBDFQ.js +1 -0
  54. package/dist/client/assets/chunks/chunk-4T4NVH7V.js +1 -0
  55. package/dist/client/assets/chunks/chunk-4TFFBC35.js +1 -0
  56. package/dist/client/assets/chunks/chunk-4WYBE67P.js +1 -0
  57. package/dist/client/assets/chunks/chunk-56ITEUFA.js +1 -0
  58. package/dist/client/assets/chunks/chunk-5DXRE7IH.js +1 -0
  59. package/dist/client/assets/chunks/chunk-5IMADCNU.js +1 -0
  60. package/dist/client/assets/chunks/chunk-5XZPGKN4.js +1 -0
  61. package/dist/client/assets/chunks/chunk-6O32UKSP.js +1 -0
  62. package/dist/client/assets/chunks/chunk-7BAEB64Q.js +1 -0
  63. package/dist/client/assets/chunks/chunk-7FMWBHZO.js +1 -0
  64. package/dist/client/assets/chunks/chunk-7GFDITUT.js +1 -0
  65. package/dist/client/assets/chunks/chunk-7H4MLBHI.js +1 -0
  66. package/dist/client/assets/chunks/chunk-7OJ4MEEB.js +1 -0
  67. package/dist/client/assets/chunks/chunk-7RSEISFE.js +1 -0
  68. package/dist/client/assets/chunks/chunk-7YNZZQVT.js +1 -0
  69. package/dist/client/assets/chunks/chunk-AB7TIL2G.js +1 -0
  70. package/dist/client/assets/chunks/chunk-ADDF76FL.js +1 -0
  71. package/dist/client/assets/chunks/chunk-AF6UTCD4.js +321 -0
  72. package/dist/client/assets/chunks/chunk-AJ2K6ASU.js +1 -0
  73. package/dist/client/assets/chunks/chunk-AUBAENQZ.js +1 -0
  74. package/dist/client/assets/chunks/chunk-BJEYVZ65.js +1 -0
  75. package/dist/client/assets/chunks/chunk-BLRM6LXA.js +1 -0
  76. package/dist/client/assets/chunks/chunk-BOCTYCDZ.js +1 -0
  77. package/dist/client/assets/chunks/chunk-BU4VRYN7.js +1 -0
  78. package/dist/client/assets/chunks/chunk-CALYHV7D.js +1 -0
  79. package/dist/client/assets/chunks/chunk-CF4W3RZ4.js +1 -0
  80. package/dist/client/assets/chunks/chunk-DCZ2OBSL.js +1 -0
  81. package/dist/client/assets/chunks/chunk-DUFPBTHD.js +1 -0
  82. package/dist/client/assets/chunks/chunk-DUICIQBC.js +88 -0
  83. package/dist/client/assets/chunks/chunk-EH2N475V.js +1 -0
  84. package/dist/client/assets/chunks/chunk-EHLLNPZT.js +1 -0
  85. package/dist/client/assets/chunks/chunk-EIBFAW37.js +1 -0
  86. package/dist/client/assets/chunks/chunk-EO3ER3GN.js +1 -0
  87. package/dist/client/assets/chunks/chunk-FH24BIIA.js +1 -0
  88. package/dist/client/assets/chunks/chunk-FNOXGAL5.js +2 -0
  89. package/dist/client/assets/chunks/chunk-FTY6WLQF.js +3 -0
  90. package/dist/client/assets/chunks/chunk-FZFME6UK.js +1 -0
  91. package/dist/client/assets/chunks/chunk-FZJZZYYO.js +1 -0
  92. package/dist/client/assets/chunks/chunk-G4Z6L7OO.js +1 -0
  93. package/dist/client/assets/chunks/chunk-GNCEAN2B.js +1 -0
  94. package/dist/client/assets/chunks/chunk-GQJIKV3T.js +1 -0
  95. package/dist/client/assets/chunks/chunk-GUMNOKT2.js +1 -0
  96. package/dist/client/assets/chunks/chunk-GXRORAF3.js +1 -0
  97. package/dist/client/assets/chunks/chunk-H36ABDKY.js +1 -0
  98. package/dist/client/assets/chunks/chunk-HAR5NYVW.js +1 -0
  99. package/dist/client/assets/chunks/chunk-HIGPS4L2.js +1 -0
  100. package/dist/client/assets/chunks/chunk-HMOBGTME.js +1 -0
  101. package/dist/client/assets/chunks/chunk-HNO6SQ7M.js +1 -0
  102. package/dist/client/assets/chunks/chunk-HYVZ3GYN.js +1 -0
  103. package/dist/client/assets/chunks/chunk-I6TGFOQS.js +1 -0
  104. package/dist/client/assets/chunks/chunk-IHIOJK7I.js +1 -0
  105. package/dist/client/assets/chunks/chunk-IHJNUMSC.js +1 -0
  106. package/dist/client/assets/chunks/chunk-IP7PB2OC.js +1 -0
  107. package/dist/client/assets/chunks/chunk-ISDTMH2Y.js +1 -0
  108. package/dist/client/assets/chunks/chunk-J65M2LNT.js +1 -0
  109. package/dist/client/assets/chunks/chunk-JCWYZ7X2.js +62 -0
  110. package/dist/client/assets/chunks/chunk-JENWYTLI.js +1 -0
  111. package/dist/client/assets/chunks/chunk-JJ6YWJQS.js +1 -0
  112. package/dist/client/assets/chunks/chunk-JMUVGGX7.js +32 -0
  113. package/dist/client/assets/chunks/chunk-JNQUFMM4.js +1 -0
  114. package/dist/client/assets/chunks/chunk-JPTECOAL.js +1 -0
  115. package/dist/client/assets/chunks/chunk-JZNK4LKS.js +1 -0
  116. package/dist/client/assets/chunks/chunk-KPNXJBIW.js +1 -0
  117. package/dist/client/assets/chunks/chunk-KZO2GZL7.js +1 -0
  118. package/dist/client/assets/chunks/chunk-L2REESOQ.js +1 -0
  119. package/dist/client/assets/chunks/chunk-LJPJXR7R.js +1 -0
  120. package/dist/client/assets/chunks/chunk-LOEZMLCI.js +1 -0
  121. package/dist/client/assets/chunks/chunk-MLYC6FSE.js +1 -0
  122. package/dist/client/assets/chunks/chunk-MMDGEZYU.js +1 -0
  123. package/dist/client/assets/chunks/chunk-MYXE7CGE.js +1 -0
  124. package/dist/client/assets/chunks/chunk-NBH7YOBD.js +15 -0
  125. package/dist/client/assets/chunks/chunk-NCOVM3YF.js +1 -0
  126. package/dist/client/assets/chunks/chunk-NCWOBVU7.js +1 -0
  127. package/dist/client/assets/chunks/chunk-NLRIHHEH.js +1 -0
  128. package/dist/client/assets/chunks/chunk-NUPEOYK6.js +1 -0
  129. package/dist/client/assets/chunks/chunk-O4MVOA7X.js +1 -0
  130. package/dist/client/assets/chunks/chunk-OBHQQZ4H.js +1 -0
  131. package/dist/client/assets/chunks/chunk-OKPNJIIR.js +1 -0
  132. package/dist/client/assets/chunks/chunk-OLMPB57R.js +1 -0
  133. package/dist/client/assets/chunks/chunk-P2FYOAEV.js +1 -0
  134. package/dist/client/assets/chunks/chunk-PI3SNP4C.js +1 -0
  135. package/dist/client/assets/chunks/chunk-PRDTEROB.js +1 -0
  136. package/dist/client/assets/chunks/chunk-PZELHD2H.js +136 -0
  137. package/dist/client/assets/chunks/chunk-QR2Q34LM.js +1 -0
  138. package/dist/client/assets/chunks/chunk-R4GIXL6S.js +1 -0
  139. package/dist/client/assets/chunks/chunk-RORF4F5V.js +1 -0
  140. package/dist/client/assets/chunks/chunk-S73BYTLL.js +1 -0
  141. package/dist/client/assets/chunks/chunk-SFC5MRYR.js +1 -0
  142. package/dist/client/assets/chunks/chunk-SVM2H22K.js +2 -0
  143. package/dist/client/assets/chunks/chunk-SZ6UCGVD.js +1 -0
  144. package/dist/client/assets/chunks/chunk-SZYM6GIJ.js +127 -0
  145. package/dist/client/assets/chunks/chunk-TT5KJZKM.js +1 -0
  146. package/dist/client/assets/chunks/chunk-UFBKUYNH.js +1 -0
  147. package/dist/client/assets/chunks/chunk-UL57AD4T.js +1 -0
  148. package/dist/client/assets/chunks/chunk-UNEI7LMM.js +1 -0
  149. package/dist/client/assets/chunks/chunk-VNQBBFIY.js +1 -0
  150. package/dist/client/assets/chunks/chunk-WGVITPII.js +1 -0
  151. package/dist/client/assets/chunks/chunk-WRA6KJHX.js +10 -0
  152. package/dist/client/assets/chunks/chunk-WS5EHW43.js +1 -0
  153. package/dist/client/assets/chunks/chunk-XE6SLBBE.js +3 -0
  154. package/dist/client/assets/chunks/chunk-XF5T2P7U.js +72 -0
  155. package/dist/client/assets/chunks/chunk-XFRY5WKO.js +1 -0
  156. package/dist/client/assets/chunks/chunk-XWYV4OPA.js +1 -0
  157. package/dist/client/assets/chunks/chunk-YCE5ECKY.js +1 -0
  158. package/dist/client/assets/chunks/chunk-YIN5CSIF.js +1 -0
  159. package/dist/client/assets/chunks/chunk-YLFUX6XH.js +1 -0
  160. package/dist/client/assets/chunks/chunk-YNXJICZM.js +1 -0
  161. package/dist/client/assets/chunks/chunk-YOHF7NGD.js +1 -0
  162. package/dist/client/assets/chunks/chunk-YORIST7Z.js +1 -0
  163. package/dist/client/assets/chunks/chunk-YUL7CG4R.js +1 -0
  164. package/dist/client/assets/chunks/chunk-YUN7JSFJ.js +2 -0
  165. package/dist/client/assets/chunks/chunk-YZ7D2IT7.js +1 -0
  166. package/dist/client/assets/chunks/chunk-Z7LAPMFJ.js +1 -0
  167. package/dist/client/assets/chunks/chunk-ZE325LPC.js +1 -0
  168. package/dist/client/assets/chunks/chunk-ZN7TN6PO.js +1 -0
  169. package/dist/client/assets/chunks/chunk-ZST3EVPO.js +1 -0
  170. package/dist/client/assets/chunks/chunk-ZZHMDDZN.js +1 -0
  171. package/dist/client/assets/chunks/clarity-RKRYQ7WF.js +1 -0
  172. package/dist/client/assets/chunks/classDiagram-v2-L25IHNXF-Y67HVDZV.js +217 -0
  173. package/dist/client/assets/chunks/clojure-2X2DQECJ.js +1 -0
  174. package/dist/client/assets/chunks/cmake-LH5524XE.js +1 -0
  175. package/dist/client/assets/chunks/cobol-7DALQF3W.js +1 -0
  176. package/dist/client/assets/chunks/codeowners-52SZU5P5.js +1 -0
  177. package/dist/client/assets/chunks/codeql-EISH3KUP.js +1 -0
  178. package/dist/client/assets/chunks/coffee-VAWSGA7Y.js +1 -0
  179. package/dist/client/assets/chunks/common-lisp-4MVK2AN6.js +1 -0
  180. package/dist/client/assets/chunks/coq-4VRYZRZV.js +1 -0
  181. package/dist/client/assets/chunks/core-BRBMZSD2.js +12 -0
  182. package/dist/client/assets/chunks/cose-bilkent-JH36ORCC-BIOOHSAA.js +1 -0
  183. package/dist/client/assets/chunks/cpp-RFECMSKD.js +1 -0
  184. package/dist/client/assets/chunks/crystal-ZBGGFAOI.js +1 -0
  185. package/dist/client/assets/chunks/csharp-BZDPMKKW.js +1 -0
  186. package/dist/client/assets/chunks/css-3WWGM6UD.js +1 -0
  187. package/dist/client/assets/chunks/csv-AB4GNWSB.js +1 -0
  188. package/dist/client/assets/chunks/cue-2E46MZP2.js +1 -0
  189. package/dist/client/assets/chunks/cynefin-EF2NZ3EQ-TLFQLWUN.js +1 -0
  190. package/dist/client/assets/chunks/cynefinDiagram-L36ESFBY-FLPXCSSG.js +62 -0
  191. package/dist/client/assets/chunks/cypher-HR3ILFOL.js +1 -0
  192. package/dist/client/assets/chunks/d-TARSZPOL.js +1 -0
  193. package/dist/client/assets/chunks/dagre-SPEB5RXH-7EGEINJ2.js +4 -0
  194. package/dist/client/assets/chunks/dart-SALLJHVI.js +1 -0
  195. package/dist/client/assets/chunks/dax-WYMRGMXC.js +1 -0
  196. package/dist/client/assets/chunks/desktop-ND5CGLLJ.js +1 -0
  197. package/dist/client/assets/chunks/diagram-3B7GL73J-6USY4HZX.js +200 -0
  198. package/dist/client/assets/chunks/diagram-DNEMPZML-BNSOC4VW.js +24 -0
  199. package/dist/client/assets/chunks/diagram-L3MUGCDN-5V5FZYIG.js +41 -0
  200. package/dist/client/assets/chunks/diagram-LA4NIPWU-25VLY2CO.js +24 -0
  201. package/dist/client/assets/chunks/diagram-MHCOC4E2-G2LFP3JU.js +3 -0
  202. package/dist/client/assets/chunks/diagram-XPFHEONP-E6HBBIBV.js +30 -0
  203. package/dist/client/assets/chunks/diff-PWYGPM7B.js +1 -0
  204. package/dist/client/assets/chunks/docker-A4D7DT7W.js +1 -0
  205. package/dist/client/assets/chunks/dotenv-VWQWV2DY.js +1 -0
  206. package/dist/client/assets/chunks/dream-maker-M5YDQS35.js +1 -0
  207. package/dist/client/assets/chunks/ebnfDiagram-UZSYDL2S-BMXXZZPI.js +1 -0
  208. package/dist/client/assets/chunks/edge-3QXIDJHI.js +1 -0
  209. package/dist/client/assets/chunks/elixir-3OX2UHIZ.js +1 -0
  210. package/dist/client/assets/chunks/elk-XV6XMXQE-IPR65FON.js +27 -0
  211. package/dist/client/assets/chunks/elm-CTS65NCT.js +1 -0
  212. package/dist/client/assets/chunks/emacs-lisp-HHS2IDO7.js +1 -0
  213. package/dist/client/assets/chunks/engine-javascript-DNHSF67B.js +141 -0
  214. package/dist/client/assets/chunks/erDiagram-EYBAPDEH-3GEHFWHG.js +99 -0
  215. package/dist/client/assets/chunks/erb-ICYWK6HS.js +1 -0
  216. package/dist/client/assets/chunks/erlang-BDQPNCKX.js +1 -0
  217. package/dist/client/assets/chunks/eventmodeling-K75KTNOO-B27BJTZL.js +1 -0
  218. package/dist/client/assets/chunks/fennel-4ONBA2PH.js +1 -0
  219. package/dist/client/assets/chunks/fish-ATLPBZSD.js +1 -0
  220. package/dist/client/assets/chunks/flowDiagram-MALGAFMO-5PCLR4AE.js +1 -0
  221. package/dist/client/assets/chunks/fluent-GGMONBVW.js +1 -0
  222. package/dist/client/assets/chunks/fortran-fixed-form-5MSBDRWQ.js +1 -0
  223. package/dist/client/assets/chunks/fortran-free-form-TT3RBL75.js +1 -0
  224. package/dist/client/assets/chunks/fsharp-PAGHNW4O.js +1 -0
  225. package/dist/client/assets/chunks/ganttDiagram-23REXITY-VE5MVBTO.js +292 -0
  226. package/dist/client/assets/chunks/gdresource-5OTP326D.js +1 -0
  227. package/dist/client/assets/chunks/gdscript-VPWHSCLF.js +1 -0
  228. package/dist/client/assets/chunks/gdshader-FYLPXFE5.js +1 -0
  229. package/dist/client/assets/chunks/genie-UYMEEMA2.js +1 -0
  230. package/dist/client/assets/chunks/gherkin-SU7D5DMY.js +1 -0
  231. package/dist/client/assets/chunks/git-commit-5CF5QAG7.js +1 -0
  232. package/dist/client/assets/chunks/git-rebase-X72BAUZI.js +1 -0
  233. package/dist/client/assets/chunks/gitGraph-VSP46ZUC-J6CJ5YZF.js +1 -0
  234. package/dist/client/assets/chunks/gitGraphDiagram-STJD7YCW-7YJGT6ZP.js +106 -0
  235. package/dist/client/assets/chunks/gleam-LR42YRKO.js +1 -0
  236. package/dist/client/assets/chunks/glimmer-js-JPF67FJU.js +1 -0
  237. package/dist/client/assets/chunks/glimmer-ts-BYPAVIZT.js +1 -0
  238. package/dist/client/assets/chunks/glsl-GTGUULBN.js +1 -0
  239. package/dist/client/assets/chunks/gn-NMDQA4K3.js +1 -0
  240. package/dist/client/assets/chunks/gnuplot-UUAMYBCZ.js +1 -0
  241. package/dist/client/assets/chunks/go-4RERSTNP.js +1 -0
  242. package/dist/client/assets/chunks/graphql-5A6RK6YF.js +1 -0
  243. package/dist/client/assets/chunks/groovy-O7BJONCU.js +1 -0
  244. package/dist/client/assets/chunks/hack-7QGTNPDP.js +1 -0
  245. package/dist/client/assets/chunks/haml-ON5GAWN4.js +1 -0
  246. package/dist/client/assets/chunks/handlebars-6UOQSUBP.js +1 -0
  247. package/dist/client/assets/chunks/haskell-OIZXZ26Y.js +1 -0
  248. package/dist/client/assets/chunks/haxe-7FFVS4FO.js +1 -0
  249. package/dist/client/assets/chunks/hcl-XFUFQJHV.js +1 -0
  250. package/dist/client/assets/chunks/hjson-QDBHMTD5.js +1 -0
  251. package/dist/client/assets/chunks/hlsl-4LP25FFN.js +1 -0
  252. package/dist/client/assets/chunks/html-7RNQXAAV.js +1 -0
  253. package/dist/client/assets/chunks/html-derivative-ESOY72Q2.js +1 -0
  254. package/dist/client/assets/chunks/http-SAD4PMBD.js +1 -0
  255. package/dist/client/assets/chunks/hurl-ZSJJXPQH.js +1 -0
  256. package/dist/client/assets/chunks/hxml-HJCC37RK.js +1 -0
  257. package/dist/client/assets/chunks/hy-CLDE3P4K.js +1 -0
  258. package/dist/client/assets/chunks/imba-REB34U5V.js +1 -0
  259. package/dist/client/assets/chunks/info-OHQRW6UA-EQQKXR77.js +1 -0
  260. package/dist/client/assets/chunks/infoDiagram-KBXO4MBG-F6KGZCGS.js +2 -0
  261. package/dist/client/assets/chunks/ini-PDFEMGRA.js +1 -0
  262. package/dist/client/assets/chunks/ishikawaDiagram-M35NCXHK-5D6ZOZ34.js +70 -0
  263. package/dist/client/assets/chunks/java-KB6XENAD.js +1 -0
  264. package/dist/client/assets/chunks/javascript-3JX5T423.js +1 -0
  265. package/dist/client/assets/chunks/jinja-V4UNU6K4.js +1 -0
  266. package/dist/client/assets/chunks/jison-KH5XNLJP.js +1 -0
  267. package/dist/client/assets/chunks/journeyDiagram-OPLOXDXO-ANDOJZKW.js +139 -0
  268. package/dist/client/assets/chunks/json-HPXFRRPY.js +1 -0
  269. package/dist/client/assets/chunks/json5-LJM6TXWM.js +1 -0
  270. package/dist/client/assets/chunks/jsonc-UZWRU3JV.js +1 -0
  271. package/dist/client/assets/chunks/jsonl-RFZD5UN4.js +1 -0
  272. package/dist/client/assets/chunks/jsonnet-GFZABBL6.js +1 -0
  273. package/dist/client/assets/chunks/jssm-2YIGBISJ.js +1 -0
  274. package/dist/client/assets/chunks/jsx-KLV2ZWUT.js +1 -0
  275. package/dist/client/assets/chunks/julia-3TZDIPPO.js +1 -0
  276. package/dist/client/assets/chunks/just-UHCONBQS.js +1 -0
  277. package/dist/client/assets/chunks/kanban-definition-BZKZHSQY-GF5I5NVD.js +89 -0
  278. package/dist/client/assets/chunks/katex-PIN72PQZ.js +257 -0
  279. package/dist/client/assets/chunks/kdl-DARTFOCL.js +1 -0
  280. package/dist/client/assets/chunks/kotlin-7KT5DW6Y.js +1 -0
  281. package/dist/client/assets/chunks/kusto-EKYXZTC5.js +1 -0
  282. package/dist/client/assets/chunks/langs-GO3UQR4H.js +1 -0
  283. package/dist/client/assets/chunks/latex-T57MIHR5.js +1 -0
  284. package/dist/client/assets/chunks/lean-5QVPRMV6.js +1 -0
  285. package/dist/client/assets/chunks/less-K6QEH5TN.js +1 -0
  286. package/dist/client/assets/chunks/liquid-3LCNNEIV.js +1 -0
  287. package/dist/client/assets/chunks/llvm-O32ZIVRF.js +1 -0
  288. package/dist/client/assets/chunks/log-C4YPJ5BB.js +1 -0
  289. package/dist/client/assets/chunks/logo-JPMO43A6.js +1 -0
  290. package/dist/client/assets/chunks/lua-YKVSOG7K.js +1 -0
  291. package/dist/client/assets/chunks/luau-K4EECYSO.js +1 -0
  292. package/dist/client/assets/chunks/make-VHSYMHHW.js +1 -0
  293. package/dist/client/assets/chunks/markdown-GC5J46H4.js +1 -0
  294. package/dist/client/assets/chunks/marko-U45YFADC.js +1 -0
  295. package/dist/client/assets/chunks/matlab-AMOKC4LU.js +1 -0
  296. package/dist/client/assets/chunks/mdc-DIGA2UXP.js +1 -0
  297. package/dist/client/assets/chunks/mdx-BZUGCKQA.js +1 -0
  298. package/dist/client/assets/chunks/mermaid-WHDP6ZPA.js +1 -0
  299. package/dist/client/assets/chunks/mermaid.core-SQMPMUDN.js +10 -0
  300. package/dist/client/assets/chunks/mindmap-definition-I2QAS2VK-4NH5S56C.js +98 -0
  301. package/dist/client/assets/chunks/mipsasm-2S4CUGQV.js +1 -0
  302. package/dist/client/assets/chunks/mojo-ZOL2PNKT.js +1 -0
  303. package/dist/client/assets/chunks/moonbit-U3BDAIFE.js +1 -0
  304. package/dist/client/assets/chunks/move-YSXALBWA.js +1 -0
  305. package/dist/client/assets/chunks/narrat-DHFIAUJH.js +1 -0
  306. package/dist/client/assets/chunks/nextflow-ESAKNTI3.js +1 -0
  307. package/dist/client/assets/chunks/nextflow-groovy-FKDSPJUI.js +1 -0
  308. package/dist/client/assets/chunks/nginx-XYAYERLO.js +1 -0
  309. package/dist/client/assets/chunks/nim-XOWBVFDH.js +1 -0
  310. package/dist/client/assets/chunks/nix-RVSTQSHC.js +1 -0
  311. package/dist/client/assets/chunks/nsis-KMDUKQRL.js +1 -0
  312. package/dist/client/assets/chunks/nushell-SKJHHZ7U.js +1 -0
  313. package/dist/client/assets/chunks/objective-c-3B3KXQ7Q.js +1 -0
  314. package/dist/client/assets/chunks/objective-cpp-6JDULPJS.js +1 -0
  315. package/dist/client/assets/chunks/ocaml-TMRFXBVO.js +1 -0
  316. package/dist/client/assets/chunks/odin-IN3PLCK7.js +1 -0
  317. package/dist/client/assets/chunks/openscad-P52IKPNH.js +1 -0
  318. package/dist/client/assets/chunks/org-N3SJ2PIA.js +1 -0
  319. package/dist/client/assets/chunks/packet-JDAUHWVQ-4SWIKSKP.js +1 -0
  320. package/dist/client/assets/chunks/pascal-T7CUWCQ4.js +1 -0
  321. package/dist/client/assets/chunks/pegDiagram-FD4XPPHP-WDKZSEGN.js +1 -0
  322. package/dist/client/assets/chunks/perl-LCZ4KODH.js +1 -0
  323. package/dist/client/assets/chunks/php-4XHMBVR5.js +1 -0
  324. package/dist/client/assets/chunks/pie-XZMESJXO-PSSWOWGV.js +1 -0
  325. package/dist/client/assets/chunks/pieDiagram-J4AKIIQI-BDW5I5ON.js +39 -0
  326. package/dist/client/assets/chunks/pkl-OACG5B67.js +1 -0
  327. package/dist/client/assets/chunks/plsql-7E5C7CJX.js +1 -0
  328. package/dist/client/assets/chunks/po-ZSREFRRP.js +1 -0
  329. package/dist/client/assets/chunks/polar-4GBINVA7.js +1 -0
  330. package/dist/client/assets/chunks/postcss-B7RPVGFW.js +1 -0
  331. package/dist/client/assets/chunks/powerquery-6UFMTY4G.js +1 -0
  332. package/dist/client/assets/chunks/powershell-3STRPCNT.js +1 -0
  333. package/dist/client/assets/chunks/prisma-4TPSPIZ5.js +1 -0
  334. package/dist/client/assets/chunks/prolog-HEAYPKQW.js +1 -0
  335. package/dist/client/assets/chunks/proto-Y3Y3VKXM.js +1 -0
  336. package/dist/client/assets/chunks/pug-7PBPMG3M.js +1 -0
  337. package/dist/client/assets/chunks/puppet-FR35R4OI.js +1 -0
  338. package/dist/client/assets/chunks/purescript-OUHXQAOW.js +1 -0
  339. package/dist/client/assets/chunks/python-SNDG7FNU.js +1 -0
  340. package/dist/client/assets/chunks/qml-UVIOSWP4.js +1 -0
  341. package/dist/client/assets/chunks/qmldir-6JGUNYL5.js +1 -0
  342. package/dist/client/assets/chunks/qss-ZCC466IZ.js +1 -0
  343. package/dist/client/assets/chunks/quadrantDiagram-XTYBLID2-5VKXWVJ6.js +7 -0
  344. package/dist/client/assets/chunks/r-4XW4O3ZF.js +1 -0
  345. package/dist/client/assets/chunks/racket-YJAYXOOG.js +1 -0
  346. package/dist/client/assets/chunks/radar-ABXABTNO-3AXZCEY2.js +1 -0
  347. package/dist/client/assets/chunks/railroad-I3PHUGI6-2PLXYPOT.js +1 -0
  348. package/dist/client/assets/chunks/railroad-abnf-LNEFI6M7-M4DGICQX.js +1 -0
  349. package/dist/client/assets/chunks/railroad-ebnf-DWYD2UWJ-UEIHQMSZ.js +1 -0
  350. package/dist/client/assets/chunks/railroad-peg-JR7BVNR7-I7VLIBXM.js +1 -0
  351. package/dist/client/assets/chunks/railroadDiagram-MRQ6NCDL-Y6IYWEFL.js +1 -0
  352. package/dist/client/assets/chunks/raku-63NEL5JK.js +1 -0
  353. package/dist/client/assets/chunks/razor-J3CJP523.js +1 -0
  354. package/dist/client/assets/chunks/rbs-6GQLT7NW.js +1 -0
  355. package/dist/client/assets/chunks/reg-6Q3OEC2C.js +1 -0
  356. package/dist/client/assets/chunks/regexp-LPIMILT3.js +1 -0
  357. package/dist/client/assets/chunks/rel-TOQGUTHB.js +1 -0
  358. package/dist/client/assets/chunks/requirementDiagram-Y7LWUY3S-CIWXVVWJ.js +84 -0
  359. package/dist/client/assets/chunks/riscv-UELGBOXE.js +1 -0
  360. package/dist/client/assets/chunks/ron-FW7LCJJH.js +1 -0
  361. package/dist/client/assets/chunks/rosmsg-O63VHE3L.js +1 -0
  362. package/dist/client/assets/chunks/rst-3WJXGLA7.js +1 -0
  363. package/dist/client/assets/chunks/ruby-7S7L6JTH.js +1 -0
  364. package/dist/client/assets/chunks/rust-LIK4HRRI.js +1 -0
  365. package/dist/client/assets/chunks/sankeyDiagram-WGJFYUXA-OGNQPX5V.js +40 -0
  366. package/dist/client/assets/chunks/sas-FHDPZ2JH.js +1 -0
  367. package/dist/client/assets/chunks/sass-UI4HW2FN.js +1 -0
  368. package/dist/client/assets/chunks/scala-KN7RQSUJ.js +1 -0
  369. package/dist/client/assets/chunks/scheme-5R527YZ5.js +1 -0
  370. package/dist/client/assets/chunks/scss-KZ6DRE4A.js +1 -0
  371. package/dist/client/assets/chunks/sdbl-FHOCL5SL.js +1 -0
  372. package/dist/client/assets/chunks/sequenceDiagram-5NDRBG5M-QX2V24ZU.js +169 -0
  373. package/dist/client/assets/chunks/shaderlab-2TLHUS2H.js +1 -0
  374. package/dist/client/assets/chunks/shellscript-PIB6ZBDM.js +1 -0
  375. package/dist/client/assets/chunks/shellsession-5KL7NFNN.js +1 -0
  376. package/dist/client/assets/chunks/sizeCapture-INFHLROL-LCS2PIHM.js +1 -0
  377. package/dist/client/assets/chunks/smalltalk-JFLFU247.js +1 -0
  378. package/dist/client/assets/chunks/smithy-HONEXZAM.js +1 -0
  379. package/dist/client/assets/chunks/solidity-SJ3INJFZ.js +1 -0
  380. package/dist/client/assets/chunks/soy-ND4SWTM2.js +1 -0
  381. package/dist/client/assets/chunks/sparql-YB2JQBZD.js +1 -0
  382. package/dist/client/assets/chunks/splunk-UXIDDAWL.js +1 -0
  383. package/dist/client/assets/chunks/sql-K6OMG7SQ.js +1 -0
  384. package/dist/client/assets/chunks/ssh-config-I7KJY3KQ.js +1 -0
  385. package/dist/client/assets/chunks/stata-DNZ3DTFJ.js +1 -0
  386. package/dist/client/assets/chunks/stateDiagram-v2-FJ4FJNEA-LVAUWF3A.js +291 -0
  387. package/dist/client/assets/chunks/stylus-GWPR6IQY.js +1 -0
  388. package/dist/client/assets/chunks/surrealql-KQNHBWLC.js +1 -0
  389. package/dist/client/assets/chunks/svelte-YQKF25S4.js +1 -0
  390. package/dist/client/assets/chunks/swift-ZCIZUJXA.js +1 -0
  391. package/dist/client/assets/chunks/swimlanes-UMQ2AFYF-B3RQOARQ.js +1 -0
  392. package/dist/client/assets/chunks/swimlanesDiagram-OMPLPG4O-JOE33EOV.js +8 -0
  393. package/dist/client/assets/chunks/system-verilog-Y7E6FIO3.js +1 -0
  394. package/dist/client/assets/chunks/systemd-WHC7NBZP.js +1 -0
  395. package/dist/client/assets/chunks/talonscript-WC7SODAH.js +1 -0
  396. package/dist/client/assets/chunks/tasl-QHY2GTCB.js +1 -0
  397. package/dist/client/assets/chunks/tcl-VAMIL5PJ.js +1 -0
  398. package/dist/client/assets/chunks/temml-ISNSX3VV.js +96 -0
  399. package/dist/client/assets/chunks/templ-B3BHKWV4.js +1 -0
  400. package/dist/client/assets/chunks/terraform-Q4UEK6FK.js +1 -0
  401. package/dist/client/assets/chunks/tex-63OWCYAB.js +1 -0
  402. package/dist/client/assets/chunks/timeline-definition-SEUHKTQE-FDFTVAJG.js +120 -0
  403. package/dist/client/assets/chunks/toml-7Z4IPGES.js +1 -0
  404. package/dist/client/assets/chunks/treeView-D4JQ5SDB-ABSGRAGI.js +1 -0
  405. package/dist/client/assets/chunks/treemap-SAJKECNS-MYX2CBJN.js +1 -0
  406. package/dist/client/assets/chunks/ts-tags-DT62HE52.js +1 -0
  407. package/dist/client/assets/chunks/tsv-RTXHWADP.js +1 -0
  408. package/dist/client/assets/chunks/tsx-UANUBOC7.js +1 -0
  409. package/dist/client/assets/chunks/turtle-QVOUNUUL.js +1 -0
  410. package/dist/client/assets/chunks/twig-ZPC4BPDA.js +1 -0
  411. package/dist/client/assets/chunks/typescript-WGWKIMMW.js +1 -0
  412. package/dist/client/assets/chunks/typespec-TYCVR32J.js +1 -0
  413. package/dist/client/assets/chunks/typst-PIBFYUO6.js +1 -0
  414. package/dist/client/assets/chunks/usecaseDiagram-AFA6YXN4-KW7ADINR.js +370 -0
  415. package/dist/client/assets/chunks/v-3ERNWBSP.js +1 -0
  416. package/dist/client/assets/chunks/vala-UCBCT2GS.js +1 -0
  417. package/dist/client/assets/chunks/vb-DGI3VTPA.js +1 -0
  418. package/dist/client/assets/chunks/vennDiagram-NNMJR3RB-RDGLGOGM.js +34 -0
  419. package/dist/client/assets/chunks/verilog-G72NZROS.js +1 -0
  420. package/dist/client/assets/chunks/vhdl-PYGA77XE.js +1 -0
  421. package/dist/client/assets/chunks/viml-OOC5B5UU.js +1 -0
  422. package/dist/client/assets/chunks/vue-GTNHIOPG.js +1 -0
  423. package/dist/client/assets/chunks/vue-html-DKAMJV55.js +1 -0
  424. package/dist/client/assets/chunks/vue-vine-WTM5HREV.js +1 -0
  425. package/dist/client/assets/chunks/vyper-RHYEHOJM.js +1 -0
  426. package/dist/client/assets/chunks/wardley-7MLQ67FV-QJL2HSBT.js +1 -0
  427. package/dist/client/assets/chunks/wardleyDiagram-S7YFUSEH-A4XX3UJR.js +78 -0
  428. package/dist/client/assets/chunks/wasm-ZMM2Z5XV.js +1 -0
  429. package/dist/client/assets/chunks/wenyan-HF5UTKSJ.js +1 -0
  430. package/dist/client/assets/chunks/wgsl-O7D7OPO7.js +1 -0
  431. package/dist/client/assets/chunks/wikitext-T7BSWSKQ.js +1 -0
  432. package/dist/client/assets/chunks/wit-TKCHPPT6.js +1 -0
  433. package/dist/client/assets/chunks/wolfram-7MN66A7N.js +1 -0
  434. package/dist/client/assets/chunks/xml-NLTLAWOD.js +1 -0
  435. package/dist/client/assets/chunks/xsl-NZ4ECK3P.js +1 -0
  436. package/dist/client/assets/chunks/xychartDiagram-GGNKY7IX-OXJILWHR.js +7 -0
  437. package/dist/client/assets/chunks/yaml-HRJLEV3V.js +1 -0
  438. package/dist/client/assets/chunks/zenscript-4LLRSLPI.js +1 -0
  439. package/dist/client/assets/chunks/zig-Y7MUQFUO.js +1 -0
  440. package/dist/client/assets/icon.svg +1 -0
  441. package/dist/client/assets/main.js +254 -0
  442. package/dist/client/index.html +59 -0
  443. package/dist/diff.js +119 -0
  444. package/dist/fs/files.js +233 -0
  445. package/dist/fs/git.js +369 -0
  446. package/dist/fs/glob.js +89 -0
  447. package/dist/fs/notes.js +368 -0
  448. package/dist/fs/search.js +136 -0
  449. package/dist/fs/watch.js +69 -0
  450. package/dist/fs/zip.js +100 -0
  451. package/dist/hooks.js +65 -0
  452. package/dist/http.js +81 -0
  453. package/dist/hub/atomic.js +77 -0
  454. package/dist/hub/notify.js +239 -0
  455. package/dist/hub/registry.js +219 -0
  456. package/dist/mcp.js +500 -0
  457. package/dist/q/agent.js +215 -0
  458. package/dist/q/model.js +633 -0
  459. package/dist/q/schema.js +133 -0
  460. package/dist/q/store.js +413 -0
  461. package/dist/r/model.js +323 -0
  462. package/dist/r/schema.js +53 -0
  463. package/dist/r/store.js +489 -0
  464. package/dist/server.js +246 -0
  465. package/dist/settings.js +30 -0
  466. package/dist/workspace.js +639 -0
  467. package/package.json +73 -4
  468. package/schema/questions.schema.json +1670 -0
  469. package/schema/reviews.schema.json +151 -0
@@ -0,0 +1,254 @@
1
+ import{a as ca}from"./chunks/chunk-FTY6WLQF.js";import"./chunks/chunk-7FMWBHZO.js";var k=e=>document.getElementById(e),p=e=>String(e).replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t]),Z=e=>{let t=tt(e),n=t.lastIndexOf(".");return n>0?t.slice(n+1).toLowerCase():""},tt=e=>e.slice(e.lastIndexOf("/")+1),Me=e=>e.includes("/")?e.slice(0,e.lastIndexOf("/")):"",W=(...e)=>e.filter(Boolean).join("/"),Pr=e=>e.split("/").map(encodeURIComponent).join("/"),Lt={project:""},pa=()=>Lt.project?"p/"+encodeURIComponent(Lt.project)+"/":"",ae=e=>/^(api|raw)\//.test(e)?pa()+e:e,B=(e,t)=>(t!==void 0?"p/"+encodeURIComponent(t)+"/":pa())+"raw/"+Pr(e);function Kn(e){let t=[];for(let n of e.split("/"))n===".."?t.pop():n&&n!=="."&&t.push(n);return t.join("/")}var Tt=e=>e<1024?e+" B":e<1048576?(e/1024).toFixed(e<10240?1:0)+" KB":e<1073741824?(e/1048576).toFixed(1)+" MB":(e/1073741824).toFixed(2)+" GB",D=e=>{let t=(Date.now()-e)/1e3;return t<60?"just now":t<3600?Math.floor(t/60)+" min ago":t<86400?Math.floor(t/3600)+" h ago":t<86400*30?Math.floor(t/86400)+" d ago":new Date(e).toLocaleDateString()},ua=new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"});function R(e,t){try{if(t===void 0)return localStorage.getItem("hitl:"+e);t===null?localStorage.removeItem("hitl:"+e):localStorage.setItem("hitl:"+e,t)}catch{return null}}async function E(e,t={}){t.hub||(e=ae(e));let{hub:n,...s}=t;t=s;let a={...t,headers:{...t.headers||{}}};t.json!==void 0&&(a.body=JSON.stringify(t.json),a.headers["content-type"]="application/json",delete a.json);let o=await fetch(e,a),i=(o.headers.get("content-type")||"").includes("json")?await o.json():await o.text();if(!o.ok)throw new Error(i&&i.error||typeof i=="string"&&i||o.statusText);return i}async function K(e,t="Copied"){try{await navigator.clipboard.writeText(e)}catch{let n=document.createElement("textarea");n.value=e,document.body.append(n),n.select(),document.execCommand("copy"),n.remove()}O(t)}var da;function O(e){let t=k("toast");t||(t=document.createElement("div"),t.id="toast",t.className="toast",t.setAttribute("role","status"),document.body.append(t)),t.textContent=e,t.classList.add("show"),clearTimeout(da),da=setTimeout(()=>t.classList.remove("show"),1800)}function ne(e,t){let n;return(...s)=>{clearTimeout(n),n=setTimeout(()=>e(...s),t)}}var Wn=new Map,Fe=(e,t)=>(Wn.get(e)||Wn.set(e,new Set).get(e)).add(t),$e=(e,t)=>Wn.get(e)?.forEach(n=>n(t)),nt=e=>p(e).replaceAll("/","/<wbr>");var v={hub:{projects:[],mode:"hub",version:""},project:"",info:{name:"",git:!1,author:"",readOnly:!1,notes:{json:"",md:"",prompt:""}},cache:new Map,git:null,changes:new Map,folderStates:new Map,ignored:[],comments:[],settings:{theme:R("theme")||"auto",ignored:R("ignored")||"dim",wrap:R("wrap")==="1",review:R("review")==="1",resolved:R("resolved")!=="0",author:R("author")||"",stopHook:R("stopHook")==="1"}};function ha(e){return v.project===e?!1:(v.project=e,Lt.project=e,v.cache=new Map,v.git=null,v.changes=new Map,v.folderStates=new Map,v.ignored=[],v.comments=[],!0)}var st=(e=v.project)=>v.hub.projects.find(t=>t.key===e);function at(e,t){v.settings[e]=t,R(e,typeof t=="boolean"?t?"1":"0":t)}var sn=()=>v.settings.author||v.info.author||"reviewer",ma=["open","view","m","q","show","scope","line","tab","opts","inc"],_r=/^\/p\/([^/?]+)\/files(\/[^?]*)?(?:\?(.*))?$/;function q(){let e=location.hash.slice(1)||"/",t=_r.exec(e),n={folder:t?decodeURIComponent(t[2]||"/").replace(/^\/+|\/+$/g,""):""},s=new URLSearchParams(t&&t[3]||"");for(let a of ma)n[a]=s.get(a)||"";return n}function ue(e,t=Lt.project){let n=new URLSearchParams;for(let a of ma)e[a]&&n.set(a,e[a]);let s=n.toString();return"#/p/"+encodeURIComponent(t)+"/files/"+(e.folder||"").split("/").filter(Boolean).map(encodeURIComponent).join("/")+(s?"?"+s:"")}function se(e){location.hash=ue({view:q().view,...e})}function _(e,t=!1){let n=ue({...q(),...e});t?history.replaceState(null,"",n):location.hash=n}var Q=(e,t={},n)=>ue({folder:Me(e),open:e.slice(e.lastIndexOf("/")+1),...t},n),zr=e=>[...e].sort((t,n)=>(n.type==="folder")-(t.type==="folder")||ua.compare(t.name,n.name));async function ot(e){if(v.cache.has(e))return v.cache.get(e);let t=await E("api/list?p="+encodeURIComponent(e)),n=zr(t.entries);return v.cache.set(e,n),n}var fa={conflict:6,deleted:5,modified:4,renamed:3,added:2,new:1};async function Qn(){if(v.info.git)try{let e=await E("api/git/status");v.git=e,v.changes=new Map(e.changes.map(n=>[n.path,n])),v.ignored=e.ignored;let t=new Map;for(let n of e.changes){let s=Me(n.path);for(;;){let a=t.get(s);if((!a||fa[n.state]>fa[a])&&t.set(s,n.state),!s)break;s=Me(s)}}v.folderStates=t}catch{v.git=null}}function Ce(e){for(let t of v.ignored)if(t.endsWith("/")?e===t.slice(0,-1)||e.startsWith(t):e===t)return!0;return!1}var an={new:"U",added:"A",modified:"M",deleted:"D",renamed:"R",conflict:"!"},Ae={new:"New (untracked)",added:"Added",modified:"Changed",deleted:"Deleted",renamed:"Renamed",conflict:"Conflict",ignored:"Ignored"};async function Mt(){try{v.comments=(await E("api/comments")).comments}catch{v.comments=[]}}var ie=e=>v.comments.filter(t=>t.path===e);function on(e){let t=e?e+"/":"";return v.comments.filter(n=>n.status==="open"&&(n.path===e||n.path.startsWith(t))).length}var ga={sparkles:'<path d="M12 3l1.8 4.7L18.5 9.5l-4.7 1.8L12 16l-1.8-4.7L5.5 9.5l4.7-1.8z"/><path d="M19 15l.8 2.2L22 18l-2.2.8L19 21l-.8-2.2L16 18l2.2-.8z"/>',star:'<path d="m12 2 3.1 6.3 6.9 1-5 4.9 1.2 6.8L12 17.8 5.8 21l1.2-6.8-5-4.9 6.9-1z"/>',home:'<path d="M3 10.5 12 3l9 7.5V20a1 1 0 0 1-1 1h-5v-6h-6v6H4a1 1 0 0 1-1-1z"/>',cards:'<rect x="6" y="3" width="12" height="18" rx="2"/><path d="M3 6v12M21 6v12"/>',pen:'<path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/><path d="m15 5 3 3"/>',"arrow-left":'<path d="M19 12H5M12 19l-7-7 7-7"/>',"arrow-right":'<path d="M5 12h14M12 5l7 7-7 7"/>',"arrow-up":'<path d="M12 19V5M5 12l7-7 7 7"/>',"arrow-down":'<path d="M12 5v14M19 12l-7 7-7-7"/>',menu:'<path d="M4 6h16M4 12h16M4 18h16"/>',x:'<path d="M18 6 6 18M6 6l12 12"/>',"chevron-left":'<path d="m15 18-6-6 6-6"/>',"chevron-right":'<path d="m9 18 6-6-6-6"/>',"chevron-down":'<path d="m6 9 6 6 6-6"/>',check:'<path d="M20 6 9 17l-5-5"/>',plus:'<path d="M12 5v14M5 12h14"/>',search:'<circle cx="11" cy="11" r="7"/><path d="m20 20-3.6-3.6"/>',settings:'<path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/>',chat:'<path d="M21 12a8 8 0 0 1-11.6 7.14L4 20.5l1.36-4.9A8 8 0 1 1 21 12z"/>',sun:'<circle cx="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>',moon:'<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9z"/>',monitor:'<rect x="2" y="3" width="20" height="14" rx="2"/><path d="M8 21h8M12 17v4"/>',copy:'<rect x="8" y="8" width="14" height="14" rx="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/>',external:'<path d="M15 3h6v6M10 14 21 3M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>',wrap:'<path d="M3 6h18M3 12h15a3 3 0 1 1 0 6h-4"/><path d="m16 16-2 2 2 2M3 18h7"/>',refresh:'<path d="M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8"/><path d="M21 3v5h-5M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16"/><path d="M8 16H3v5"/>',clock:'<circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/>',trash:'<path d="M3 6h18M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/>',edit:'<path d="M12 20h9"/><path d="M16.38 3.62a1 1 0 0 1 3 3L7.37 18.64a2 2 0 0 1-.86.5l-2.87.84a.5.5 0 0 1-.62-.62l.84-2.87a2 2 0 0 1 .5-.86z"/>',link:'<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/>',file:'<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/>',image:'<rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.09-3.09a2 2 0 0 0-2.82 0L6 21"/>',grid:'<rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/>',list:'<path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/>',folder:'<path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2z"/>',table:'<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M3 9h18M3 15h18M9 3v18"/>',code:'<path d="m16 18 6-6-6-6M8 6l-6 6 6 6"/>',download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3"/>',eye:'<path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z"/><circle cx="12" cy="12" r="3"/>',filter:'<path d="M22 3H2l8 9.46V19l4 2v-8.54z"/>',sort:'<path d="m3 16 4 4 4-4M7 20V4M21 8l-4-4-4 4M17 4v16"/>',book:'<path d="M12 7v14M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/>',hash:'<path d="M4 9h16M4 15h16M10 3 8 21M16 3l-2 18"/>',braces:'<path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"/>',undo:'<path d="M9 14 4 9l5-5"/><path d="M4 9h10.5a5.5 5.5 0 0 1 0 11H11"/>',reply:'<path d="m9 17-5-5 5-5"/><path d="M20 18v-2a4 4 0 0 0-4-4H4"/>',music:'<path d="M9 18V5l12-2v13"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="16" r="3"/>',video:'<rect x="2" y="6" width="14" height="12" rx="2"/><path d="m22 8-6 4 6 4z"/>',warning:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4M12 17h.01"/>',info:'<circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/>',more:'<circle cx="12" cy="12" r="1"/><circle cx="19" cy="12" r="1"/><circle cx="5" cy="12" r="1"/>',layers:'<path d="m12 2 10 5-10 5L2 7z"/><path d="m2 17 10 5 10-5M2 12l10 5 10-5"/>',tree:'<path d="M6 3v12"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/>',"git-branch":'<circle cx="6" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><circle cx="18" cy="8" r="3"/><path d="M6 9v6M18 11a6 6 0 0 1-6 6H9"/>',diff:'<path d="M12 3v14M5 10h14M5 21h14"/>',"folder-open":'<path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2"/>'},g=(e,t=18)=>`<svg class="i" width="${t}" height="${t}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${ga[e]||ga.file}</svg>`;function Xn(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Ve=Xn();function Ma(e){Ve=e}var Ke={exec:()=>null};function We(e){let t=[];return n=>{let s=Math.max(0,Math.min(3,n-1)),a=t[s];return a||(a=e(s),t[s]=a),a}}function j(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(a,o)=>{let r=typeof o=="string"?o:o.source;return r=r.replace(F.caret,"$1"),n=n.replace(a,r),s},getRegex:()=>new RegExp(n,t)};return s}var Ca=((e="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+e)}catch{return!1}})(),F={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,listInterruptsParagraph:/^ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+)[ \t]*)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,blockquoteMarkerWhitespace:/^( {0,3}>)([ \t]+)/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\][ \t]+\S/,listReplaceTask:/^\[[ xX]\][ \t]+/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,numericCharacterReferenceOrAmpersand:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:We(e=>new RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:We(e=>new RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:We(e=>new RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:We(e=>new RegExp(`^ {0,${e}}#{1,6}(?:\\s|$)`)),pedanticHeadingBeginRegex:We(e=>new RegExp(`^ {0,${e}}#`)),htmlBeginRegex:We(e=>new RegExp(`^ {0,${e}}(?:</?(?:${qt})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)`,"i")),blockquoteBeginRegex:We(e=>new RegExp(`^ {0,${e}}>`)),nestedContainerMarkers:/^(?: {0,3}(?:(?:[*+-]|\d{1,9}[.)])[ \t]+|>[ \t]?))+/},Br=/^(?:[ \t]*(?:\n|$))+/,Dr=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Ur=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}(?:(?=`)\1`*|(?=~)\1~*) *(?=\n|$)|$)/,Et=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Fr=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Gn=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Aa=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+)[ \t]*(?:\n+|$)/,Ea=j(Aa).replace(/bull/g,Gn).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Wr=j(Aa).replace(/bull/g,Gn).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Jn=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,Kr=/^[^\n]+/,es=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\\n]|\n(?![ \t]*\n))+/,Qr=j(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",es).replace("title",/(?:"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\\n]|\n(?!\n))*'|\((?:\\[\s\S]|[^()\\])*\))/).getRegex(),Vr=j(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,Gn).getRegex(),qt="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",ts=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Zr=j("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?:[ \\t]+|\\n|/?>|$)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",ts).replace("tag",qt).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),qa=e=>j(Jn).replace("hr",Et).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list",e).replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qt).getRegex(),Yr=qa(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),Xr=qa(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),Gr=j(/^( {0,3}> ?(?:(?![ \t]*(?:\n|$))(paragraph)|[^\n]*)(?:\n|$))+/).replace("paragraph",Xr).getRegex(),ns={blockquote:Gr,code:Dr,def:Qr,fences:Ur,heading:Fr,hr:Et,html:Zr,lheading:Ea,list:Vr,newline:Br,paragraph:Yr,table:Ke,text:Kr},ba=j("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Et).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qt).getRegex(),Jr={...ns,lheading:Wr,table:ba,paragraph:j(Jn).replace("hr",Et).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ba).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html"," {0,3}(?:</?(?:tag)(?: +|\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\s>]|$)|!--)|<\\?|<![A-Za-z]|<!\\[CDATA\\[)").replace("tag",qt).getRegex()},ei={...ns,html:j(`^ *(?:comment(?: *\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1>(?: *\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?>(?: *\\n{2,}|\\s*$))`).replace("comment",ts).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Ke,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:j(Jn).replace("hr",Et).replace("heading",` *#{1,6} *[^
2
+ ]`).replace("lheading",Ea).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},ti=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ni=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,ja=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,si=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,we=/[\p{P}\p{S}]/u,lt=/[\s\p{P}\p{S}]/u,jt=/[^\s\p{P}\p{S}]/u,ai=j(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,lt).getRegex(),oi=/[\p{Pi}\p{Ps}"']/u,Ia=/(?!~)[\p{P}\p{S}]/u,ri=/(?!~)[\s\p{P}\p{S}]/u,ii=/(?:[^\s\p{P}\p{S}]|~)/u,li=j(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Ca?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Ha=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,ci=j(Ha,"u").replace(/punct/g,we).getRegex(),di=j(Ha,"u").replace(/punct/g,Ia).getRegex(),pi=/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,ui=j(pi,"u").replace(/openQuote/g,oi).replace(/punct/g,we).getRegex(),Ra="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",fi=j(Ra,"gu").replace(/notPunctSpace/g,jt).replace(/punctSpace/g,lt).replace(/punct/g,we).getRegex(),hi=j(Ra,"gu").replace(/notPunctSpace/g,ii).replace(/punctSpace/g,ri).replace(/punct/g,Ia).getRegex(),mi="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)",gi=j(mi,"gu").replace(/notPunctSpace/g,jt).replace(/punctSpace/g,lt).replace(/punct/g,we).getRegex(),bi=j("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,jt).replace(/punctSpace/g,lt).replace(/punct/g,we).getRegex(),$i="^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)",wi=j($i,"gu").replace(/notPunctSpace/g,jt).replace(/punctSpace/g,lt).replace(/punct/g,we).getRegex(),ki=j(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,we).getRegex(),vi="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",yi=j(vi,"gu").replace(/notPunctSpace/g,jt).replace(/punctSpace/g,lt).replace(/punct/g,we).getRegex(),xi=j(/\\(punct)/,"gu").replace(/punct/g,we).getRegex(),Si=j(/(`+)(?:[^`]|[^`][\s\S]*?[^`])\1(?!`)|`+|\\(punct)/,"gu").replace(/punct/g,we).getRegex(),Li=j(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Ti=j(ts).replace("(?:-->|$)","-->").getRegex(),Mi=j("^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Ti).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Oa=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,cn=j(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace("brackets",Oa).getRegex(),Ci=j(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace("label",cn).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|\((?:\\[\s\S]|[^)\\])*\)/).getRegex(),Ai=j(/^!?\[(label)\]\[(ref)\]/).replace("label",cn).replace("ref",es).getRegex(),Ei=j(/^!?\[(ref)\](?:\[\])?/).replace("ref",es).getRegex(),$a=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,qi=j(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace("brackets",Oa).getRegex(),ji=j("reflink|nolink(?!\\()","g").replace("reflink",j(/^!?\[(label)\]\[(ref)\]/).replace("label",qi).replace("ref",$a).getRegex()).replace("nolink",j(/^!?\[(ref)\](?:\[\])?/).replace("ref",$a).getRegex()).getRegex(),wa=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Ii=/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/,Hi=j(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,Ii).getRegex(),ss={_backpedal:Ke,anyPunctuation:xi,anyPunctuationOutsideCode:Si,autolink:Li,blockSkip:li,br:ja,code:ni,del:Ke,delLDelim:Ke,delRDelim:Ke,emStrongLDelim:ci,emStrongRDelimAst:fi,emStrongRDelimUnd:bi,escape:ti,link:Ci,nolink:Ei,punctuation:ai,reflink:Ai,reflinkSearch:ji,tag:Mi,text:si,url:Ke},Ri={...ss,emStrongLDelim:ui,emStrongRDelimAst:gi,emStrongRDelimUnd:wi,link:j(/^!?\[(label)\]\((.*?)\)/).replace("label",cn).getRegex(),reflink:j(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",cn).getRegex()},Vn={...ss,emStrongRDelimAst:hi,emStrongLDelim:di,delLDelim:ki,delRDelim:yi,url:j(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("emailProtocol",Hi).replace("protocol",wa).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:j(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|wwwStart|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace("protocol",wa).replace(/emailProtocol/g,/(?:mailto|xmpp):/).replace("wwwStart",Ca?"(?<![^\\s*_~(])www\\.":"www\\.").getRegex()},Oi={...Vn,br:j(ja).replace("{2,}","*").getRegex(),text:j(Vn.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},rn={normal:ns,gfm:Jr,pedantic:ei},Ct={normal:ss,gfm:Vn,breaks:Oi,pedantic:Ri},Ni={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ka=e=>Ni[e];function oe(e,t){if(t){if(F.escapeTest.test(e))return e.replace(F.escapeReplace,ka)}else if(F.escapeTestNoEncode.test(e))return e.replace(F.escapeReplaceNoEncode,ka);return e}function Pi(e){return F.numericCharacterReference.test(e)?e.replace(F.numericCharacterReferenceOrAmpersand,(t,n,s)=>{if(n===void 0&&s===void 0)return"&amp;";let a=n===void 0?Number.parseInt(s,16):Number.parseInt(n,10);return a===0||a>1114111||a>=55296&&a<=57343?"\uFFFD":a===38?"&amp;":String.fromCodePoint(a)}):e}function va(e){try{e=encodeURI(e).replace(F.percentDecode,"%")}catch{return null}return e}function ya(e,t){let n=e.replace(F.findPipe,(o,r,i)=>{let l=!1,c=r;for(;--c>=0&&i[c]==="\\";)l=!l;return l?"|":" |"}),s=n.split(F.splitPipe),a=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;a<s.length;a++)s[a]=s[a].trim().replace(F.slashPipe,"|");return s}function Ee(e,t,n){let s=e.length;if(s===0)return"";let a=0;for(;a<s;){let o=e.charAt(s-a-1);if(o===t&&!n)a++;else if(o!==t&&n)a++;else break}return e.slice(0,s-a)}function xa(e){let t=e.split(`
3
+ `),n=t.length-1;for(;n>=0&&F.blankLine.test(t[n]);)n--;return t.length-n<=2?e:t.slice(0,n+1).join(`
4
+ `)}function dn(e){return e.trim().replace(F.multipleSpaceGlobal," ").toLowerCase().toUpperCase().toLowerCase()}function Sa(e,t){if(e.indexOf(t[0])===-1&&e.indexOf(t[1])===-1)return-1;let n=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])n++;else if(e[s]===t[1]&&(n--,n<0))return s;return n>0?-2:-1}var it=new WeakMap;function as(e){let t={"*":-1,_:-1},n=-1,s=e.length;for(let a=0;a<s;a++){let o=e[a];if(o!=="*"&&o!=="_"&&o!=="~")continue;let r=a===0?`
5
+ `:e[a-1],i=a+1;for(;i<s&&e[i]===o;)i++;r!==" "&&r!==" "&&r!==`
6
+ `&&r!=="\r"&&r!=="\f"&&(o==="~"?n=a:t[o]=a),a=i-1}return{maskedSrc:e,lastPossibleEmStrongCloserIndex:t,lastPossibleDelCloserIndex:n}}function _i(e,t){let n=as(t),s=it.get(e);s?s.push(n):it.set(e,[n])}function zi(e){let t=it.get(e);t&&(t.pop(),t.length===0&&it.delete(e))}function Bi(e,t,n){let s=it.get(e)?.at(-1);return s&&s.maskedSrc===t?s.lastPossibleEmStrongCloserIndex[n]:as(t).lastPossibleEmStrongCloserIndex[n]}function Di(e,t){let n=it.get(e)?.at(-1);return n&&n.maskedSrc===t?n.lastPossibleDelCloserIndex:as(t).lastPossibleDelCloserIndex}function ln(e,t=0){let n=t,s="";for(let a of e)if(a===" "){let o=4-n%4;s+=" ".repeat(o),n+=o}else s+=a,n++;return s}function La(e,t,n,s,a){let o=t.href,r=t.title||null,i=e[1].replace(a.other.outputLinkReplace,"$1"),l=e[0].charAt(0)==="!",c=s.state.inLink,d=s.state.linkEmitted,u=s.state.inRawBlock;s.state.inLink=!0,s.state.linkEmitted=!1;let $=s.inlineTokens(i),h=s.state.linkEmitted;if(s.state.linkEmitted=d,s.state.inLink=c,!l){if(h){s.state.inRawBlock=u;return}s.state.linkEmitted=!0}return{type:l?"image":"link",raw:n,href:o,title:r,text:i,tokens:$}}function Ui(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let a=s[1];return t.split(`
7
+ `).map(o=>{let r=o.match(n.other.beginningSpace);if(r===null)return o;let[i]=r;return o.slice(Math.min(i.length,a.length))}).join(`
8
+ `)}function Ta(e,t,n,s){if(!t.includes("<"))return!1;for(let a=0;a<t.length;a++){if(t[a]==="\\"){a++;continue}if(t[a]==="`"){let i=s.inline.code.exec(t.slice(a));if(i){a+=i[0].length-1;continue}}if(t[a]!=="<")continue;let o=e.slice(n+a),r=s.inline.tag.exec(o)||s.inline.autolink.exec(o);if(r){if(r[0].length>t.length-a)return!0;a+=r[0].length-1}}return!1}var rt=class{options;rules;lexer;constructor(e){this.options=e||Ve}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:"space",raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:xa(t[0]),s=n.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:n,codeBlockStyle:"indented",text:s}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Ui(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=Ee(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:"heading",raw:Ee(t[0],`
9
+ `),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:Ee(t[0],`
10
+ `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=Ee(t[0],`
11
+ `).split(`
12
+ `),s="",a="",o=[];for(;n.length>0;){let r=!1,i=[],l;for(l=0;l<n.length;l++)if(this.rules.other.blockquoteStart.test(n[l]))i.push(n[l]),r=!0;else if(!r)i.push(n[l]);else break;n=n.slice(l);let c=i.join(`
13
+ `),d=c.replace(this.rules.other.blockquoteMarkerWhitespace,(h,m,b)=>m+ln(b,m.length)).replace(this.rules.other.blockquoteSetextReplace,`
14
+ $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
15
+ ${c}`:c,a=a?`${a}
16
+ ${d}`:d;let u=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(d,o,!0),this.lexer.state.top=u,n.length===0)break;let $=o.at(-1);if($?.type==="code"||$?.type==="heading"||$?.type==="hr"||$?.type==="html"||$?.type==="table")break;if($?.type==="blockquote"){let h=$,m=n.join(`
17
+ `),b=h.raw+`
18
+ `+m.replace(this.rules.other.blockquoteSetextReplace2,""),w=this.blockquote(b);o[o.length-1]=w;let x=b.substring(w.raw.length).replace(/^\n/,""),y=x?x.split(`
19
+ `).length:0,S=y?n.slice(0,-y):n;if(S.length>0&&(s=`${s}
20
+ ${S.join(`
21
+ `)}`),a=a.substring(0,a.length-h.text.length)+w.text,n=n.slice(S.length),n.length>0&&this.rules.other.blockquoteStart.test(n[0]))continue;break}else if($?.type==="list"){let h=$,m=h.raw+`
22
+ `+n.join(`
23
+ `),b=this.list(m);o[o.length-1]=b;let w=b.raw.length>h.raw.length?m.slice(h.raw.length+1,b.raw.length).split(`
24
+ `).length:0;if(w>0){let x=n.slice(0,w).join(`
25
+ `);s=`${s}
26
+ ${x}`,a=`${a}
27
+ ${x}`}n=n.slice(w);continue}}return{type:"blockquote",raw:s,tokens:o,text:a}}}list(e){let t=this.rules.block.list.exec(e);if(t){if(!this.options.pedantic&&this.lexer.state.lastToken?.type==="text"&&!this.rules.other.listInterruptsParagraph.test(e))return;let n=e,s=()=>n.length-e.length,a=t[1].trim(),o=a.length>1,r={type:"list",raw:"",ordered:o,start:o?+a.slice(0,-1):"",loose:!1,items:[]};a=o?`\\d{1,9}\\${a.slice(-1)}`:`\\${a}`,this.options.pedantic&&(a=o?a:"[*+-]");let i=this.rules.other.listItemRegex(a),l=!1;for(;e;){let d=!1,u="";if(!(t=i.exec(e))||this.rules.block.hr.test(e))break;let $=s();e=e.substring(t[0].length);let h=t[2].split(`
28
+ `,1)[0],m=t[1].length,b=this.options.pedantic?ln(h,m):h.replace(this.rules.other.leadingSpaceTab,M=>ln(M,m)),w=e.split(`
29
+ `,1)[0],x=!b.trim(),y=0;if(this.options.pedantic?(y=2,u=b.trimStart()):x?y=m+1:(y=b.search(this.rules.other.nonSpaceChar),y=y>4?1:y,u=b.slice(y),y+=m),x&&this.rules.other.blankLine.test(w)&&(e=e.substring(w.length+1),d=!0),!d){let M=this.rules.other.nextBulletRegex(y),C=this.rules.other.hrRegex(y),A=this.rules.other.fencesBeginRegex(y),H=this.options.pedantic?this.rules.other.pedanticHeadingBeginRegex(y):this.rules.other.headingBeginRegex(y),L=this.rules.other.htmlBeginRegex(y),I=this.rules.other.blockquoteBeginRegex(y),z=!1;for(;e;){let V=e.split(`
30
+ `,1)[0],Y;if(w=V,this.options.pedantic?(w=w.replace(this.rules.other.listReplaceNesting," "),Y=w):Y=w.replace(this.rules.other.leadingSpaceTab,Un=>ln(Un)),A.test(w)||H.test(w)||L.test(w)||I.test(w)||M.test(w)||C.test(w))break;if(Y.search(this.rules.other.nonSpaceChar)>=y||!w.trim())u+=`
31
+ `+Y.slice(y),z=!1;else{if(x||b.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||A.test(b)||H.test(b)||L.test(b)||C.test(b))break;if(!this.options.pedantic&&!z){let Fn=b.replace(this.rules.other.nestedContainerMarkers,"");if(this.rules.block.fences.test(Fn)||this.rules.block.heading.test(Fn)||this.rules.block.hr.test(Fn))break}let Un=!this.options.pedantic&&/^ {0,3}(?:=+|-+) *$/.test(w)&&this.rules.block.lheading.test(`${b}
32
+ ${w}`)?` ${Y.replace(/^ {0,3}/,"")}`:w;u+=`
33
+ `+Un,z=!0}x=!w.trim(),e=e.substring(V.length+1),b=Y.slice(y)}}let S=n.slice($,s());r.loose||(l?r.loose=!0:this.rules.other.doubleBlankLine.test(S)&&(l=!0)),r.items.push({type:"list_item",raw:S,task:!!this.options.gfm&&this.rules.other.listIsTask.test(u),loose:!1,text:u,tokens:[]})}let c=r.items.at(-1);if(c)c.raw=c.raw.trimEnd(),c.text=c.text.trimEnd();else return;r.raw=n.slice(0,s()).trimEnd();for(let d of r.items)if(this.lexer.state.top=!1,d.tokens=this.lexer.blockTokens(d.text,[]),!r.loose){let u=d.tokens.filter(h=>h.type==="space"),$=u.length>0&&u.some(h=>this.rules.other.anyLine.test(h.raw));r.loose=$}for(let d of r.items){let u=d.tokens[0];if(d.task&&(u?.type==="text"||u?.type==="paragraph")){d.text=d.text.replace(this.rules.other.listReplaceTask,""),u.raw=u.raw.replace(this.rules.other.listReplaceTask,""),u.text=u.text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}let $=this.rules.other.listTaskCheckbox.exec(d.raw);if($){let h={type:"checkbox",raw:$[0]+" ",checked:$[0]!=="[ ]"};d.checked=h.checked,r.loose?d.tokens[0]&&["paragraph","text"].includes(d.tokens[0].type)&&"tokens"in d.tokens[0]&&d.tokens[0].tokens?(d.tokens[0].raw=h.raw+d.tokens[0].raw,d.tokens[0].text=h.raw+d.tokens[0].text,d.tokens[0].tokens.unshift(h)):d.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):d.tokens.unshift(h)}}else d.task&&(d.task=!1)}if(r.loose)for(let d of r.items){d.loose=!0;for(let u of d.tokens)u.type==="text"&&(u.type="paragraph")}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=xa(t[0]);return{type:"html",block:!0,raw:n,pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){if(!this.rules.other.startAngleBracket.test(t[2])&&Sa(t[2],"()")!==-1)return;let n=dn(t[1]),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",a=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:Ee(t[0],`
34
+ `),href:s,title:a}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=ya(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),a=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
35
+ `):[],o={type:"table",raw:Ee(t[0],`
36
+ `),header:[],align:[],rows:[]};if(n.length===s.length){for(let r of s)this.rules.other.tableAlignRight.test(r)?o.align.push("right"):this.rules.other.tableAlignCenter.test(r)?o.align.push("center"):this.rules.other.tableAlignLeft.test(r)?o.align.push("left"):o.align.push(null);for(let r=0;r<n.length;r++)o.header.push({text:n[r],tokens:this.lexer.inline(n[r]),header:!0,align:o.align[r]});for(let r of a)o.rows.push(ya(r,o.header.length).map((i,l)=>({text:i,tokens:this.lexer.inline(i),header:!1,align:o.align[l]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:"heading",raw:Ee(t[0],`
37
+ `),depth:t[2].charAt(0)==="="?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
38
+ `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:"text",raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:"escape",raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&Ta(e,t[1],n,this.rules))return;let s=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=Ee(s.slice(0,-1),"\\");if((s.length-i.length)%2===0)return}else{let i=Sa(t[2],"()");if(i===-2)return;if(i>-1){let l=(t[0].indexOf("!")===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,l).trim(),t[3]=""}}let a=Ee(t[0].slice(0,-1),"\\");if((t[0].length-a.length)%2===0)return;let o=t[2],r="";if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(o);i&&(o=i[1],r=i[3])}else r=t[3]?t[3].slice(1,-1):"";return o=o.trim(),this.rules.other.startAngleBracket.test(o)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?o=o.slice(1):o=o.slice(1,-1)),La(t,{href:o&&o.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=n[0].charAt(0)==="!"?2:1;if(!this.options.pedantic&&Ta(e,n[1],s,this.rules))return;let a=t[dn(n[2]||n[1])];if(!a){let o=n[0].charAt(0);return{type:"text",raw:o,text:o}}return La(n,a,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4])return;let a=s[0][0],o=n===a,r=t.length-e.length,i=r;for(;!this.options.pedantic&&i>0&&t[i-1]===a;)i--;let l=[...t.slice(Math.max(0,i-2),i)].at(-1)??"",c=l==="*"||l==="_"||!!this.rules.inline.punctuation.exec(l);i<r&&(n=l);let d=i<r?c:n==="*"||n==="_"||!!this.rules.inline.punctuation.exec(n);if(s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;let u=s[1]||s[3]||"";if(!u||!n||d){let $=[...s[0]].length-1,h,m,b=$,w=0,x=r-i+$,y=!this.options.pedantic&&!!l.trim()&&(!!u||a==="*"&&!c);if(a!=="*"&&a!=="_")return;let S=a==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd,M=Bi(this,t,a),C=t.length-e.length+$;if(M<C)return;t=t.slice(-1*e.length+$);let A=M-C;for(S.lastIndex=0;(s=S.exec(t))!==null&&!(s.index>A);){if(h=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!h)continue;if(m=[...h].length,s[3]||s[4]){b+=m;continue}else if(s[5]||s[6]||y){if(o&&(s[5]||s[6]))break;if(x%3&&!((x+m)%3)){w+=m;continue}}if(b-=m,b>0)continue;m=Math.min(m,m+b+w);let H=[...s[0]][0].length,L=e.slice(0,$+s.index+H+m);if(Math.min($,m)%2){let z=L.slice(1,-1);return{type:"em",raw:L,text:z,tokens:this.lexer.inlineTokens(z)}}let I=L.slice(2,-2);return{type:"strong",raw:L,text:I,tokens:this.lexer.inlineTokens(I)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),a=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&a&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e,t,n=""){let s=this.rules.inline.delLDelim.exec(e);if(s&&(!s[1]||!n||this.rules.inline.punctuation.exec(n))){let a=[...s[0]].length-1,o,r,i=a,l=this.rules.inline.delRDelim,c=Di(this,t),d=t.length-e.length+a;if(c<d)return;t=t.slice(-1*e.length+a);let u=c-d;for(l.lastIndex=0;(s=l.exec(t))!==null&&!(s.index>u);){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o||(r=[...o].length,r!==a))continue;if(s[3]||s[4]){i+=r;continue}if(i-=r,i>0)continue;r=Math.min(r,r+i);let $=[...s[0]][0].length,h=e.slice(0,a+s.index+$+r),m=h.slice(a,-a);return{type:"del",raw:h,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let a;do a=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(a!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:n?t[0]:Pi(t[0]),escaped:n}}}},fe=class Zn{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||Ve,this.options.tokenizer=this.options.tokenizer||new rt,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let n={other:F,block:rn.normal,inline:Ct.normal};this.options.pedantic?(n.block=rn.pedantic,n.inline=Ct.pedantic):this.options.gfm&&(n.block=rn.gfm,this.options.breaks?n.inline=Ct.breaks:n.inline=Ct.gfm),this.tokenizer.rules=n}static get rules(){return{block:rn,inline:Ct}}static lex(t,n){return new Zn(n).lex(t)}static lexInline(t,n){return new Zn(n).inlineTokens(t)}lex(t){t=t.replace(F.carriageReturn,`
39
+ `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.state.inRawBlock=!1,this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],s=!1){this.tokenizer.lexer=this;let a=this.state.lastToken;this.options.pedantic&&(t=t.replace(F.tabCharGlobal," ").replace(F.spaceLine,""));let o=1/0;for(;t;){if(t.length<o)o=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}this.state.lastToken=n.at(-1);let r;if(this.options.extensions?.block?.some(l=>(r=l.call({lexer:this},t,n))?(t=t.substring(r.raw.length),n.push(r),!0):!1))continue;if(r=this.tokenizer.space(t)){t=t.substring(r.raw.length);let l=n.at(-1);r.raw.length===1&&l!==void 0?l.raw+=`
40
+ `:n.push(r);continue}if(r=this.tokenizer.code(t)){t=t.substring(r.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
41
+ `)?"":`
42
+ `)+r.raw,l.text+=`
43
+ `+r.text,this.inlineQueue.at(-1).src=l.text):n.push(r);continue}if(r=this.tokenizer.fences(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.heading(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.hr(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.blockquote(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.list(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.html(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.def(t)){t=t.substring(r.raw.length);let l=n.at(-1);l?.type==="paragraph"||l?.type==="text"?(l.raw+=(l.raw.endsWith(`
44
+ `)?"":`
45
+ `)+r.raw,l.text+=`
46
+ `+r.raw,this.inlineQueue.at(-1).src=l.text):(this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title}),n.push(r));continue}if(r=this.tokenizer.table(t)){t=t.substring(r.raw.length),n.push(r);continue}if(r=this.tokenizer.lheading(t)){t=t.substring(r.raw.length),n.push(r);continue}let i=t;if(this.options.extensions?.startBlock){let l=1/0,c=t.slice(1),d;this.options.extensions.startBlock.forEach(u=>{d=u.call({lexer:this},c),typeof d=="number"&&d>=0&&(l=Math.min(l,d))}),l<1/0&&l>=0&&(i=t.substring(0,l+1))}if(this.state.top&&(r=this.tokenizer.paragraph(i))){let l=n.at(-1);s&&l?.type==="paragraph"?(l.raw+=(l.raw.endsWith(`
47
+ `)?"":`
48
+ `)+r.raw,l.text+=`
49
+ `+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(r),s=i.length!==t.length,t=t.substring(r.raw.length);continue}if(r=this.tokenizer.text(t)){t=t.substring(r.raw.length);let l=n.at(-1);l?.type==="text"?(l.raw+=(l.raw.endsWith(`
50
+ `)?"":`
51
+ `)+r.raw,l.text+=`
52
+ `+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=l.text):n.push(r);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return this.state.top=!0,this.state.lastToken=a,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}linkInText(t){if(!t.includes("["))return!1;let n=this.tokenizer.rules.inline.link;for(let s of t.matchAll(this.tokenizer.rules.inline.blockSkip))if(n.test(s[0])&&t.charAt(s.index-1)!=="!")return!0;for(let s of t.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let a=s[0],o=a.lastIndexOf("[");if(!(a.charAt(0)==="!"||!Object.hasOwn(this.tokens.links,dn(a.slice(o+1,-1))))&&!(o>1&&this.linkInText(a.slice(1,o-1))))return!0}return!1}inlineTokens(t,n=[]){this.tokenizer.lexer=this;let s=this.state.linkParenPossible;this.state.linkParenPossible=s&&t.includes(")");try{return this.#e(t,n)}finally{this.state.linkParenPossible=s}}#e(t,n){let s=t.includes("*")||t.includes("_")||t.includes("~")||this.options.hooks?.emStrongMask||this.tokenizer.emStrong!==rt.prototype.emStrong||this.tokenizer.del!==rt.prototype.del?this.#s(t):t;_i(this.tokenizer,s);try{return this.#t(t,s,n)}finally{zi(this.tokenizer)}}#t(t,n,s){let a=!1,o="",r=1/0;for(;t;){if(t.length<r)r=t.length;else{this.infiniteLoopError(t.charCodeAt(0));break}a||(o=""),a=!1;let i;if(this.options.extensions?.inline?.some(c=>(i=c.call({lexer:this},t,s))?(t=t.substring(i.raw.length),s.push(i),!0):!1))continue;if(i=this.tokenizer.escape(t)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.tag(t)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.link(t)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(i.raw.length);let c=s.at(-1);i.type==="text"&&c?.type==="text"?(c.raw+=i.raw,c.text+=i.text):s.push(i);continue}if(i=this.tokenizer.emStrong(t,n,o)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.codespan(t)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.br(t)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.del(t,n,o)){t=t.substring(i.raw.length),s.push(i);continue}if(i=this.tokenizer.autolink(t)){t=t.substring(i.raw.length),s.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(t))){t=t.substring(i.raw.length),s.push(i);continue}let l=t;if(this.options.extensions?.startInline){let c=1/0,d=t.slice(1),u;this.options.extensions.startInline.forEach($=>{u=$.call({lexer:this},d),typeof u=="number"&&u>=0&&(c=Math.min(c,u))}),c<1/0&&c>=0&&(l=t.substring(0,c+1))}if(i=this.tokenizer.inlineText(l)){t=t.substring(i.raw.length),i.raw.slice(-1)!=="_"&&(o=i.raw.slice(-1)),a=!0;let c=s.at(-1);c?.type==="text"?(c.raw+=i.raw,c.text+=i.text):s.push(i);continue}if(t){this.infiniteLoopError(t.charCodeAt(0));break}}return s}#n(t){let{blockSkip:n,tag:s,autolink:a}=this.tokenizer.rules.inline,o="",r=0,i;for(n.lastIndex=0;i=n.exec(t);){let l=i.index+(i[2]?i[2].length:0),c=i.index+i[0].length;if(t.charAt(l)==="<"){let d=t.slice(l),u=s.exec(d)||a.exec(d);if(!u){n.lastIndex=l+1;continue}c=l+u[0].length,n.lastIndex=c}o+=t.slice(r,l)+"["+"a".repeat(c-l-2)+"]",r=c}return o+t.slice(r)}#s(t){let n=t;if(this.tokens.links&&t.includes("[")){let s=this.tokenizer.rules.inline.reflinkSearch,a=o=>{let r=o.lastIndexOf("[");if(!Object.hasOwn(this.tokens.links,dn(o.slice(r+1,-1))))return o;if(r>1&&o.charAt(0)!=="!"){let i=o.slice(1,r-1);if(this.linkInText(i))return"["+i.replace(s,a)+"]["+"a".repeat(o.length-r-2)+"]"}return"["+"a".repeat(o.length-2)+"]"};n=n.replace(s,a)}return n=n.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode,(s,a,o)=>o?"+".repeat(s.length):a?a+s.slice(a.length,-a.length).replace(/`/g,"+")+a:s),n=this.#n(n),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n,n}infiniteLoopError(t){let n="Infinite loop on byte: "+t;if(this.options.silent)console.error(n);else throw new Error(n)}},pn=class{options;parser;constructor(e){this.options=e||Ve}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(F.notSpaceStart)?.[0],a=e?e.replace(F.endingNewline,"")+`
53
+ `:"";return s?'<pre><code class="language-'+oe(s)+'">'+(n?a:oe(a,!0))+`</code></pre>
54
+ `:"<pre><code>"+(n?a:oe(a,!0))+`</code></pre>
55
+ `}blockquote({tokens:e}){return`<blockquote>
56
+ ${this.parser.parse(e)}</blockquote>
57
+ `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
58
+ `}hr(e){return`<hr>
59
+ `}list(e){let t=e.ordered,n=e.start,s="";for(let r=0;r<e.items.length;r++){let i=e.items[r];s+=this.listitem(i)}let a=t?"ol":"ul",o=t&&n!==1?' start="'+n+'"':"";return"<"+a+o+`>
60
+ `+s+"</"+a+`>
61
+ `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
62
+ `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
63
+ `}table(e){let t="",n="";for(let a=0;a<e.header.length;a++)n+=this.tablecell(e.header[a]);t+=this.tablerow({text:n});let s="";for(let a=0;a<e.rows.length;a++){let o=e.rows[a];n="";for(let r=0;r<o.length;r++)n+=this.tablecell(o[r]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
64
+ <thead>
65
+ `+t+`</thead>
66
+ `+s+`</table>
67
+ `}tablerow({text:e}){return`<tr>
68
+ ${e}</tr>
69
+ `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
70
+ `}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${oe(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:s,autolink:a}){let o=a?oe(n,!0):this.parser.parseInline(s),r=va(e);if(r===null)return o;e=oe(r,a);let i='<a href="'+e+'"';return t&&(i+=' title="'+oe(t)+'"'),i+=">"+o+"</a>",i}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let a=va(e);if(a===null)return oe(n);e=a;let o=`<img src="${oe(e)}" alt="${oe(n)}"`;return t&&(o+=` title="${oe(t)}"`),o+=">",o}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:oe(e.text)}},os=class{parser;strong({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}em({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}codespan({text:e}){return e}del({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}html({text:e}){return e}text({text:e}){return e}link({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}image({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}br(){return`
71
+ `}checkbox({raw:e}){return e}},he=class Yn{options;renderer;textRenderer;constructor(t){this.options=t||Ve,this.options.renderer=this.options.renderer||new pn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new os,this.textRenderer.parser=this}static parse(t,n){return new Yn(n).parse(t)}static parseInline(t,n){return new Yn(n).parseInline(t)}parse(t){this.renderer.parser=this;let n="";for(let s=0;s<t.length;s++){let a=t[s];if(this.options.extensions?.renderers?.[a.type]){let r=a,i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||!["space","hr","heading","code","table","blockquote","list","checkbox","html","def","paragraph","text"].includes(r.type)){n+=i===!1?"":i??"";continue}}let o=a;switch(o.type){case"space":{n+=this.renderer.space(o);break}case"hr":{n+=this.renderer.hr(o);break}case"heading":{n+=this.renderer.heading(o);break}case"code":{n+=this.renderer.code(o);break}case"table":{n+=this.renderer.table(o);break}case"blockquote":{n+=this.renderer.blockquote(o);break}case"list":{n+=this.renderer.list(o);break}case"checkbox":{n+=this.renderer.checkbox(o);break}case"html":{n+=this.renderer.html(o);break}case"def":{n+=this.renderer.def(o);break}case"paragraph":{n+=this.renderer.paragraph(o);break}case"text":{n+=this.renderer.text(o);break}default:{let r='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return n}parseInline(t,n=this.renderer){this.renderer.parser=this;let s="";for(let a=0;a<t.length;a++){let o=t[a];if(this.options.extensions?.renderers?.[o.type]){let i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||!["escape","html","link","image","checkbox","strong","em","codespan","br","del","text"].includes(o.type)){s+=i===!1?"":i??"";continue}}let r=o;switch(r.type){case"escape":{s+=n.text(r);break}case"html":{s+=n.html(r);break}case"link":{s+=n.link(r);break}case"image":{s+=n.image(r);break}case"checkbox":{s+=n.checkbox(r);break}case"strong":{s+=n.strong(r);break}case"em":{s+=n.em(r);break}case"codespan":{s+=n.codespan(r);break}case"br":{s+=n.br(r);break}case"del":{s+=n.del(r);break}case"text":{s+=n.text(r);break}default:{let i='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(i),"";throw new Error(i)}}}return s}},At=class{options;block;constructor(e){this.options=e||Ve}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?fe.lex:fe.lexInline}provideParser(e=this.block){return e?he.parse:he.parseInline}};function Pe(e,t){if(Array.isArray(t))for(let n=0;n<t.length;n++)e.push(t[n]);else e.push(t)}var rs=class{defaults=Xn();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=he;Renderer=pn;TextRenderer=os;Lexer=fe;Tokenizer=rt;Hooks=At;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(Pe(n,t.call(this,s)),s.type){case"table":{let a=s;for(let o of a.header)Pe(n,this.walkTokens(o.tokens,t));for(let o of a.rows)for(let r of o)Pe(n,this.walkTokens(r.tokens,t));break}case"list":{let a=s;Pe(n,this.walkTokens(a.items,t));break}default:{let a=s;this.defaults.extensions?.childTokens?.[a.type]?this.defaults.extensions.childTokens[a.type].forEach(o=>{let r=a[o].flat(1/0);Pe(n,this.walkTokens(r,t))}):a.tokens&&Pe(n,this.walkTokens(a.tokens,t))}}return n}use(...e){let t=this.defaults.extensions||{renderers:Object.create(null),childTokens:Object.create(null)};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let o=t.renderers[a.name];o?t.renderers[a.name]=function(...r){let i=a.renderer.apply(this,r);return i===!1&&(i=o.apply(this,r)),i}:t.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=t[a.level];o?o.unshift(a.tokenizer):t[a.level]=[a.tokenizer],a.start&&(a.level==="block"?t.startBlock?t.startBlock.push(a.start):t.startBlock=[a.start]:a.level==="inline"&&(t.startInline?t.startInline.push(a.start):t.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(t.childTokens[a.name]=a.childTokens)}),s.extensions=t),n.renderer){let a=this.defaults.renderer||new pn(this.defaults);for(let o in n.renderer){if(!(o in a))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let r=o,i=n.renderer[r],l=a[r];a[r]=(...c)=>{let d=i.apply(a,c);return d===!1&&(d=l.apply(a,c)),d===!1?"":d??""}}s.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new rt(this.defaults);for(let o in n.tokenizer){if(!(o in a))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let r=o,i=n.tokenizer[r],l=a[r];a[r]=(...c)=>{let d=i.apply(a,c);return d===!1&&(d=l.apply(a,c)),d}}s.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new At;for(let o in n.hooks){if(!(o in a))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let r=o,i=n.hooks[r],l=a[r];At.passThroughHooks.has(o)?a[r]=c=>{if(a.options.async&&At.passThroughHooksRespectAsync.has(o))return(async()=>{let u=await i.call(a,c);return l.call(a,u)})();let d=i.call(a,c);return l.call(a,d)}:a[r]=(...c)=>{if(a.options.async)return(async()=>{let u=await i.apply(a,c);return u===!1&&(u=await l.apply(a,c)),u})();let d=i.apply(a,c);return d===!1&&(d=l.apply(a,c)),d}}s.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(r){let i=[];return Pe(i,o.call(this,r)),a&&Pe(i,a.call(this,r)),i}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return fe.lex(e,t??this.defaults)}parser(e,t){return he.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},a={...this.defaults,...s},o=this.onError(!!a.silent,!!a.async);if(this.defaults.async===!0&&s.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof t>"u"||t===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(t)+", string expected"));if(a.hooks&&(a.hooks.options=a,a.hooks.block=e),a.async)return(async()=>{let r=a.hooks?await a.hooks.preprocess(t):t,i=await(a.hooks?await a.hooks.provideLexer(e):e?fe.lex:fe.lexInline)(r,a),l=a.hooks?await a.hooks.processAllTokens(i):i;a.walkTokens&&await Promise.all(this.walkTokens(l,a.walkTokens));let c=await(a.hooks?await a.hooks.provideParser(e):e?he.parse:he.parseInline)(l,a);return a.hooks?await a.hooks.postprocess(c):c})().catch(o);try{a.hooks&&(t=a.hooks.preprocess(t));let r=(a.hooks?a.hooks.provideLexer(e):e?fe.lex:fe.lexInline)(t,a);a.hooks&&(r=a.hooks.processAllTokens(r)),a.walkTokens&&this.walkTokens(r,a.walkTokens);let i=(a.hooks?a.hooks.provideParser(e):e?he.parse:he.parseInline)(r,a);return a.hooks&&(i=a.hooks.postprocess(i)),i}catch(r){return o(r)}}}onError(e,t){return n=>{if(n.message+=`
72
+ Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+oe(n.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Qe=new rs;function N(e,t){return Qe.parse(e,t)}N.options=N.setOptions=function(e){return Qe.setOptions(e),N.defaults=Qe.defaults,Ma(N.defaults),N};N.getDefaults=Xn;N.defaults=Ve;function Fi(...e){return Qe.use(...e),N.defaults=Qe.defaults,Ma(N.defaults),N}N.use=Fi;N.walkTokens=function(e,t){return Qe.walkTokens(e,t)};N.parseInline=Qe.parseInline;N.Parser=he;N.parser=he.parse;N.Renderer=pn;N.TextRenderer=os;N.Lexer=fe;N.lexer=fe.lex;N.Tokenizer=rt;N.Hooks=At;N.parse=N;var wd=N.options,kd=N.setOptions,vd=N.walkTokens,yd=N.parseInline;var xd=he.parse,Sd=fe.lex;function Wi(e,t){let n={type:"footnotes",raw:t,rawItems:[],items:[]};return{name:"footnote",level:"block",childTokens:["content"],tokenizer(s){e.hasFootnotes||(this.lexer.tokens.push(n),e.tokens=this.lexer.tokens,e.hasFootnotes=!0,n.rawItems=[],n.items=[]);let a=/^\[\^([^\]\n]+)\]:(?:[ \t]+|[\n]*?|$)([^\n]*?(?:\n|$)(?:\n*?[ ]{4,}[^\n]*)*)/.exec(s);if(a){let[o,r,i=""]=a,l=i.split(`
73
+ `).reduce((u,$)=>u+`
74
+ `+$.replace(/^(?:[ ]{4}|[\t])/,""),""),c=l.trimEnd().split(`
75
+ `).pop();l+=c&&/^[ \t]*?[>\-*][ ]|[`]{3,}$|^[ \t]*?[|].+[|]$/.test(c)?`
76
+
77
+ `:"";let d={type:"footnote",raw:o,label:r,refs:[],content:this.lexer.blockTokens(l)};return n.rawItems.push(d),d}},renderer(){return""}}}function Ki(e){return e.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function Qi(e,t=!1,n=!1){let s=0;return{name:"footnoteRef",level:"inline",tokenizer(a){let o=/^\[\^([^\]\n]+)\]/.exec(a);if(o){let[r,i]=o,l=this.lexer.tokens[0],c=l.rawItems.filter(h=>h.label===i);if(!c.length)return;let d=c[0],u=l.items.filter(h=>h.label===i)[0],$={type:"footnoteRef",raw:r,index:d.refs.length,id:"",label:i};return u?($.id=u.refs[0].id,u.refs.push($)):(s++,$.id=String(s),d.refs.push($),l.items.push(d)),$}},renderer({index:a,id:o,label:r}){s=0;let i=encodeURIComponent(r),l=n?Ki(r):o,c=a>0?`-${a+1}`:"";return`<sup><a id="${e}ref-${i}${c}" href="#${e+i}" data-${e}ref aria-describedby="${e}label">${t?`[${l}]`:l}</a></sup>`}}}function Vi(e,t,n,s,a,o){return{name:"footnotes",renderer({raw:r,items:i=[]}){if(i.length===0)return"";let l=i.reduce(($,{label:h,content:m,refs:b})=>{let w=encodeURIComponent(h),x=this.parser.parse(m).trimEnd(),y=x.endsWith("</p>"),S=`<li id="${e+w}">
78
+ `;return S+=y?x.replace(/<\/p>$/,""):x,b.forEach((M,C)=>{let A=o.replace("{0}",h),H,L;if(C>0){let I=C+1;H=`\u21A9<sup>${I}</sup>`,L=`-${I}`}else H="\u21A9",L="";S+=` <a href="#${e}ref-${w}${L}" data-${e}backref aria-label="${A}">${H}</a>`}),S+=y?`</p>
79
+ `:`
80
+ `,S+=`</li>
81
+ `,$+S},""),c="";n&&(c+=`<hr data-${t}footnotes>
82
+ `);let d="";s&&(d=` class="${s}"`);let u="";return a&&(u=` class="${a}"`),c+=`<section${d} data-${t}footnotes>
83
+ `,c+=`<h2 id="${e}label"${u}>${r.trimEnd()}</h2>
84
+ `,c+=`<ol>
85
+ ${l}</ol>
86
+ `,c+=`</section>
87
+ `,c}}}function Na(e={}){let{prefixId:t="footnote-",prefixData:n="",description:s="Footnotes",refMarkers:a=!1,footnoteDivider:o=!1,keepLabels:r=!1,sectionClass:i="footnotes",headingClass:l="sr-only",backRefLabel:c="Back to reference {0}"}=e,d={hasFootnotes:!1,tokens:[]};return{extensions:[Wi(d,s),Qi(t,a,r),Vi(t,n,o,i,l,c)],walkTokens(u){u.type==="footnotes"&&d.tokens.indexOf(u)===0&&u.items.length&&(d.tokens[0]={type:"space",raw:""},d.tokens.push(u)),d.hasFootnotes&&(d.hasFootnotes=!1)}}}var Zi="abstract any as async await boolean break case catch class const constructor continue debugger declare default delete do else enum export extends false finally for from function get if implements import in infer instanceof interface is keyof let module namespace never new null number object of package private protected public readonly require return satisfies set static string super switch symbol this throw true try type typeof undefined unique unknown var void while with yield",Yi="auto bool break case char class const constexpr continue default delete do double else enum explicit extern false float for friend goto if inline int long namespace new nullptr operator private protected public register return short signed sizeof static struct switch template this throw true try typedef typename union unsigned using virtual void volatile while include define ifdef ifndef endif pragma",Xi="abstract as base bool boolean break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extends extern false final finally fixed float for foreach goto if implicit implements import in int interface internal is lock long namespace new null object operator out override package params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct super switch synchronized this throw throws true try typeof uint ulong unchecked unsafe ushort using var virtual void volatile while async await get set record yield",Gi="break case chan const continue default defer else fallthrough for func go goto if import interface map package range return select struct switch type var nil true false iota string int bool error byte rune float64 int64 uint",Ji="as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self Self static struct super trait true type unsafe use where while i32 i64 u8 u32 u64 usize f32 f64 bool str String Vec Option Some None Result Ok Err",el="and as assert async await break class continue def del elif else except False finally for from global if import in is lambda None nonlocal not or pass raise return True try while with yield self print match case",tl="if then else elif fi for while until do done case esac in function return local export source alias echo exit set unset readonly shift trap cd test true false",nl="alias and begin break case class def defined do else elsif end ensure false for if in module next nil not or redo rescue retry return self super then true undef unless until when while yield require attr_accessor",sl="select from where and or not insert into values update set delete create table index view drop alter add primary key foreign references join left right inner outer on group by order asc desc limit offset having as distinct union all null is in like between case when then else end exists default unique check constraint begin commit rollback with returning integer text varchar boolean",al="and break do else elseif end false for function goto if in local nil not or repeat return then true until while",ol="begin break catch class continue data do dynamicparam else elseif end exit filter finally for foreach from function if in param process return switch throw trap try until using while",rl="important media import supports keyframes font-face from to and not only screen print",X=e=>new Set(e.split(" ")),Pa={js:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:X(Zi),regex:!0},c:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:X(Yi),pre:!0},cs:{line:"//",block:["/*","*/"],quotes:['"',"'"],kw:X(Xi),at:!0},go:{line:"//",block:["/*","*/"],quotes:['"',"'","`"],kw:X(Gi)},rs:{line:"//",block:["/*","*/"],quotes:['"'],kw:X(Ji)},py:{line:"#",quotes:['"""',"'''",'"',"'"],kw:X(el),at:!0},sh:{line:"#",quotes:['"',"'"],kw:X(tl),vars:!0},rb:{line:"#",quotes:['"',"'"],kw:X(nl)},yaml:{line:"#",quotes:['"',"'"],kw:X("true false null yes no on off"),keys:!0},toml:{line:"#",quotes:['"""','"',"'"],kw:X("true false"),keys:!0},ini:{line:";",alt:"#",quotes:['"'],kw:X("true false"),keys:!0},sql:{line:"--",block:["/*","*/"],quotes:["'",'"'],kw:X(sl),nocase:!0},lua:{line:"--",quotes:['"',"'"],kw:X(al)},ps:{line:"#",block:["<#","#>"],quotes:['"',"'"],kw:X(ol),vars:!0,nocase:!0},css:{block:["/*","*/"],quotes:['"',"'"],kw:X(rl),css:!0},json:{line:"//",block:["/*","*/"],quotes:['"'],kw:X("true false null")},md:{md:!0},html:{html:!0}},il={js:"js",mjs:"js",cjs:"js",jsx:"js",ts:"js",mts:"js",cts:"js",tsx:"js",vue:"html",svelte:"html",astro:"html",c:"c",h:"c",cpp:"c",cc:"c",hpp:"c",cxx:"c",m:"c",glsl:"c",frag:"c",vert:"c",wgsl:"rs",hlsl:"c",shader:"c",cs:"cs",java:"cs",kt:"cs",kts:"cs",scala:"cs",swift:"cs",dart:"cs",groovy:"cs",gradle:"cs",php:"cs",go:"go",rs:"rs",zig:"rs",py:"py",pyi:"py",ipy:"py",r:"py",jl:"py",nim:"py",sh:"sh",bash:"sh",zsh:"sh",fish:"sh",env:"sh",dockerfile:"sh",makefile:"sh",mk:"sh",cmake:"sh",gitignore:"sh",npmrc:"ini",editorconfig:"ini",rb:"rb",rake:"rb",gemspec:"rb",pl:"rb",ex:"rb",exs:"rb",cr:"rb",yml:"yaml",yaml:"yaml",toml:"toml",ini:"ini",cfg:"ini",conf:"ini",properties:"ini",sql:"sql",lua:"lua",ps1:"ps",psm1:"ps",psd1:"ps",css:"css",scss:"css",sass:"css",less:"css",styl:"css",json:"json",jsonc:"json",json5:"json",webmanifest:"json",map:"json",lock:"json",har:"json",ipynb:"json",geojson:"json",gltf:"json",md:"md",markdown:"md",mdx:"md",html:"html",htm:"html",xml:"html",svg:"html",xhtml:"html",plist:"html",csproj:"html",xaml:"html"};function ll(e){let t=e.toLowerCase();if(t==="dockerfile"||t==="makefile"||t.startsWith(".env")||t===".gitignore"||t===".gitattributes"||t===".dockerignore")return"sh";let n=t.includes(".")?t.slice(t.lastIndexOf(".")+1):"";return il[n]||""}var qe=e=>e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),is=new Map;function cl(e){if(is.has(e))return is.get(e);let t=Pa[e],n=[];t.block&&n.push(`${qe(t.block[0])}[\\s\\S]*?(?:${qe(t.block[1])}|$)`),t.line&&n.push(`${qe(t.line)}[^\\n]*`),t.alt&&n.push(`${qe(t.alt)}[^\\n]*`);let s=(t.quotes||[]).map(r=>r.length===3?`${qe(r)}[\\s\\S]*?(?:${qe(r)}|$)`:r==="`"?"`(?:\\\\[\\s\\S]|[^`\\\\])*`?":`${qe(r)}(?:\\\\.|[^${qe(r)}\\\\\\n])*${qe(r)}?`),a=[];n.length&&a.push(`(?<com>${n.join("|")})`),s.length&&a.push(`(?<str>${s.join("|")})`),t.vars&&a.push("(?<var>\\$\\{?[\\w@#?*!-]+\\}?)"),(t.at||e==="js")&&a.push("(?<at>@[\\w.]+)"),t.css?a.push("(?<at>@[\\w-]+)|(?<num>#[\\da-fA-F]{3,8}\\b|-?\\d*\\.?\\d+(?:px|em|rem|vh|vw|%|s|ms|deg|fr|ch)?\\b)|(?<key>[\\w-]+(?=\\s*:[^:]))|(?<word>[\\w-]+)"):(a.push("(?<num>\\b(?:0[xX][\\da-fA-F_]+|0[bB][01_]+|\\d[\\d_]*(?:\\.[\\d_]+)?(?:[eE][+-]?\\d+)?)[nlLfFuU]*\\b)"),t.pre&&a.push("(?<pre>^\\s*#\\s*\\w+)"),a.push("(?<word>[A-Za-z_$][\\w$]*)"));let o=new RegExp(a.join("|"),"gm");return is.set(e,o),o}function _a(e,t){let n=ll(t);if(!n)return ls(e);if(n==="md")return fl(e);if(n==="html")return hl(e);let s=Pa[n],a=cl(n),o=[],r=0;a.lastIndex=0;let i;for(;i=a.exec(e);){if(i[0]===""){a.lastIndex++;continue}i.index>r&&o.push(["",e.slice(r,i.index)]);let l=i.groups,c="";if(l.com)c="com";else if(l.str)c=/^\s*:/.test(e.slice(a.lastIndex,a.lastIndex+3))&&!s.css?"key":"str";else if(l.num)c="num";else if(l.at)c="at";else if(l.var)c="var";else if(l.pre)c="kw";else if(l.key)c="key";else if(l.word){let d=l.word,u=e.slice(a.lastIndex,a.lastIndex+2);ul.has(d)?c="lit":s.kw.has(s.nocase?d.toLowerCase():d)?c="kw":s.keys&&/^\s*[:=]/.test(u)&&dl(e,i.index)?c="key":s.css?c="":u[0]==="("?c="fn":/^[A-Z][a-z0-9]/.test(d)&&n!=="sql"?c="type":/^[A-Z][A-Z0-9_]+$/.test(d)&&d.length>1&&(c="const")}o.push([c,i[0]]),r=a.lastIndex}return r<e.length&&o.push(["",e.slice(r)]),za(o)}function dl(e,t){let n=e.lastIndexOf(`
88
+ `,t-1)+1;return/^[\s-]*$/.test(e.slice(n,t))}var pl={com:"comment",str:"string",num:"number",const:"number",kw:"keyword",lit:"literal",pre:"keyword"},ul=new Set(["true","false","null","undefined","None","True","False","nil","NaN","Infinity"]);function za(e){let t=[""];for(let[n,s]of e){let a=pl[n]||"";s.split(`
89
+ `).forEach((r,i)=>{i>0&&t.push(""),r&&(t[t.length-1]+=a?`<span class="tok-${a}">${p(r)}</span>`:p(r))})}return t.map(n=>n.replace(/\r/g,""))}var ls=e=>e.replace(/\r/g,"").split(`
90
+ `).map(p);function fl(e){let t=!1;return e.replace(/\r/g,"").split(`
91
+ `).map(n=>/^\s*(```|~~~)/.test(n)?(t=!t,`<span class="tok-comment">${p(n)}</span>`):t?`<span class="tok-string">${p(n)}</span>`:/^#{1,6} /.test(n)?`<span class="tok-keyword">${p(n)}</span>`:/^\s*>/.test(n)?`<span class="tok-comment">${p(n)}</span>`:p(n).replace(/^(\s*)([-*+]|\d+\.)(\s)/,'$1<span class="tok-number">$2</span>$3').replace(/`[^`]+`/g,s=>`<span class="tok-string">${s}</span>`).replace(/\[[^\]]*\]\([^)]*\)/g,s=>`<span class="tok-keyword">${s}</span>`))}function hl(e){let t=/(?<com><!--[\s\S]*?(?:-->|$))|(?<tag><\/?[A-Za-z][\w:.-]*|\/?>)|(?<attr>[\w:@.#-]+(?=\s*=))|(?<str>"[^"]*"?|'[^']*'?)|(?<ent>&[#\w]+;)/g,n=[],s=0,a=!1,o;for(;o=t.exec(e);){o.index>s&&n.push(["",e.slice(s,o.index)]);let r=o.groups,i="";r.com?i="com":r.tag?(i="kw",a=!r.tag.endsWith(">")):r.attr?i=a?"key":"":r.str?i=a?"str":"":r.ent&&(i="num"),n.push([i,o[0]]),s=t.lastIndex}return s<e.length&&n.push(["",e.slice(s)]),za(n)}var Wa={name:"folderview-scopes",type:"light",fg:"#000000",bg:"#ffffff",settings:[]},ml=[["comment","comment"],["punctuation.definition.comment","comment"],["string","string"],["punctuation.definition.string","string"],["constant.numeric","number"],["constant.language","literal"],["support.constant","literal"],["constant.character","literal"],["keyword.operator","plain"],["keyword","keyword"],["storage","keyword"],["markup.heading","keyword"],["markup.inline.raw","string"],["markup.fenced_code","string"],["entity.name.tag","keyword"]];function gl(e){for(let t=e.length-1;t>=0;t--){let n=e[t],s=ml.find(([a])=>n===a||n.startsWith(a+"."));if(s)return s[1]}return"plain"}var Ba={dockerfile:"docker",makefile:"make","cmakelists.txt":"cmake",".gitignore":"shellscript",".dockerignore":"shellscript",".npmrc":"ini",".editorconfig":"ini",".prettierrc":"json",".eslintrc":"json","tsconfig.json":"jsonc","jsconfig.json":"jsonc",".babelrc":"json",gemfile:"ruby",rakefile:"ruby",jenkinsfile:"groovy",caddyfile:"shellscript"},Da={h:"c",hpp:"cpp",cc:"cpp",cxx:"cpp",cs:"csharp",kt:"kotlin",kts:"kotlin",rs:"rust",py:"python",pyi:"python",rb:"ruby",sh:"shellscript",bash:"shellscript",zsh:"shellscript",env:"dotenv",ps1:"powershell",psm1:"powershell",psd1:"powershell",yml:"yaml",md:"markdown",mdx:"mdx",htm:"html",xhtml:"html",svg:"xml",plist:"xml",csproj:"xml",xaml:"xml",ipynb:"json",gltf:"json",webmanifest:"json",geojson:"json",map:"json",har:"json",jl:"julia",ex:"elixir",exs:"elixir",erl:"erlang",hs:"haskell",ml:"ocaml",fs:"fsharp",clj:"clojure",tf:"terraform",hcl:"hcl",vert:"glsl",frag:"glsl",wgsl:"wgsl",mjs:"javascript",cjs:"javascript",mts:"typescript",cts:"typescript",conf:"ini",cfg:"ini",properties:"properties",mmd:"mermaid",mermaid:"mermaid",gradle:"groovy",txt:"",log:"log",lock:""};function ct(e){let t=e.toLowerCase().slice(e.lastIndexOf("/")+1);if(Ba[t])return Ba[t];if(t.startsWith(".env"))return"dotenv";if(t.startsWith("dockerfile"))return"docker";let n=t.includes(".")?t.slice(t.lastIndexOf(".")+1):"";return n in Da?Da[n]:n}var Ua,bl,ds,ps=new Set,cs=new Map,$l=()=>bl??=import("./chunks/langs-GO3UQR4H.js").then(({bundledLanguages:e,bundledLanguagesAlias:t})=>new Map([...Object.entries(t),...Object.entries(e)]));async function wl(e){let t=(await $l()).get(e);if(!t)return!1;Ua??=Promise.all([import("./chunks/core-BRBMZSD2.js"),import("./chunks/engine-javascript-DNHSF67B.js")]).then(([{createHighlighterCore:s},{createJavaScriptRegexEngine:a}])=>s({themes:[Wa],langs:[],engine:a({forgiving:!0})}));let n=await Ua;return await n.loadLanguage(t),ds=n,ps.add(e),!0}function Ze(e){let t=ct(e);return t?ps.has(t)?Promise.resolve(!0):(cs.has(t)||cs.set(t,wl(t).catch(()=>!1)),cs.get(t)):Promise.resolve(!1)}var kl=4e5,Fa=8e3;function je(e,t){let n=ct(t);if(n&&ps.has(n)&&e.length<kl){let s=vl(e,n);if(s)return s}return _a(e,t)}function vl(e,t){if(ds&&!(e.split(`
92
+ `,Fa+1).length>Fa))try{return ds.codeToTokensBase(e.replace(/\r\n?/g,`
93
+ `),{lang:t,theme:Wa.name,includeExplanation:"scopeName"}).map(s=>{let a="",o="plain",r="",i=()=>{r&&(a+=o==="plain"?p(r):`<span class="tok-${o}">${p(r)}</span>`,r="")};for(let l of s){let c=l.explanation??[{content:l.content,scopes:[]}];for(let d of c){let u=gl(d.scopes.map($=>$.scopeName));u!==o&&(i(),o=u),r+=d.content}}return i(),a})}catch{return}}var yl=/<svg\b[^>]*>/,xl=/viewBox="\s*[-\d.]+[\s,]+[-\d.]+[\s,]+([\d.]+)[\s,]+([\d.]+)\s*"/,Sl=/\s(?:width|height)="[^"]*"/g;function Ll(e){let t=yl.exec(e)?.[0],n=t&&xl.exec(t);return!t||!n?e:e.replace(t,t.replace(Sl,"").replace(/^<svg/,`<svg width="${n[1]}" height="${n[2]}"`))}function Tl(e,t,n){t.style.color=`var(${n})`,e.clearRect(0,0,1,1),e.fillStyle=getComputedStyle(t).color,e.fillRect(0,0,1,1);let[s,a,o,r]=e.getImageData(0,0,1,1).data;return r===0?void 0:"#"+[s,a,o].map(i=>i.toString(16).padStart(2,"0")).join("")}function Ml(){let e=document.createElement("canvas").getContext("2d",{willReadFrequently:!0});if(!e)return;let t=document.createElement("span");document.body.append(t);try{let[n,s,a,o,r,i]=["--bg","--surface-2","--border-strong","--text","--text-dim","--accent"].map(c=>Tl(e,t,c)),l=getComputedStyle(document.documentElement).getPropertyValue("--font").trim();return!n||!s||!a||!o||!r||!i?void 0:{font:l,background:n,surface:s,border:a,text:o,muted:r,accent:i}}finally{t.remove()}}function Cl(e,t){return{theme:"base",fontFamily:e.font,themeVariables:{darkMode:t,fontFamily:e.font,fontSize:"14px",background:e.background,primaryColor:e.surface,primaryBorderColor:e.border,primaryTextColor:e.text,secondaryColor:e.surface,secondaryBorderColor:e.border,secondaryTextColor:e.text,tertiaryColor:e.background,tertiaryBorderColor:e.border,tertiaryTextColor:e.text,mainBkg:e.surface,nodeBorder:e.border,nodeTextColor:e.text,lineColor:e.muted,textColor:e.text,clusterBkg:e.background,clusterBorder:e.border,edgeLabelBackground:e.background,titleColor:e.text,noteBkgColor:e.surface,noteBorderColor:e.accent,noteTextColor:e.text,actorBorder:e.border,actorBkg:e.surface}}}var Ka,Qa=Promise.resolve(),Va=0,Al=()=>matchMedia("(prefers-color-scheme: dark)").matches?document.documentElement.dataset.theme!=="light":document.documentElement.dataset.theme==="dark";function El(e){let t=Qa.then(async()=>{Ka??=import("./chunks/mermaid.core-SQMPMUDN.js").then(o=>o.default);let n=await Ka,s=Ml(),a=Al();n.initialize({startOnLoad:!1,securityLevel:"strict",...s?Cl(s,a):{theme:a?"dark":"default"}});try{let{svg:o}=await n.render(`folderview-diagram-${++Va}`,e);return{ok:!0,svg:Ll(o)}}catch(o){return document.getElementById(`dfolderview-diagram-${Va}`)?.remove(),{ok:!1,problem:o instanceof Error?o.message:String(o)}}});return Qa=t.catch(()=>{}),t}async function ke(e,t){e.innerHTML='<div class="skeleton" style="width:60%;height:120px"></div>';let n=await El(t);if(!n.ok){e.innerHTML=`<p class="problem">This diagram couldn't be drawn: ${ql(n.problem)}</p>`;return}let s=URL.createObjectURL(new Blob([n.svg],{type:"image/svg+xml"})),a=document.createElement("img");a.src=s,a.alt="Diagram",a.onclick=()=>window.open(s,"_blank","noopener"),a.onload=()=>{let o=e.clientWidth-26,r=a.naturalWidth;r>o&&(a.style.width=(r<=o*1.8?o:Math.round(r*.6))+"px")},e.replaceChildren(a)}var ql=e=>String(e).replace(/[&<>]/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;"})[t]);function dt(e,t,n=t||"text"){let s="x."+(t||"txt"),a=je(e.replace(/\n$/,""),s);return`<figure class="ui-code${v.settings.wrap?" wrapped":""}" data-lang="${p(t)}"><figcaption class="cbar"><span class="caption">${p(n)}</span><span class="ctools"><button class="icon-btn${v.settings.wrap?" on":""}" data-cb="wrap" title="Wrap long lines" aria-label="Wrap long lines">${g("wrap",16)}</button><button class="icon-btn" data-cb="copy" title="Copy code" aria-label="Copy code">${g("copy",16)}</button></span></figcaption><pre class="code" tabindex="0"><code>${a.join(`
94
+ `)}</code></pre><textarea hidden>${p(e)}</textarea></figure>`}var Za={name:"mathBlock",level:"block",start:e=>e.match(/^\$\$/m)?.index,tokenizer(e){let t=/^\$\$[ \t]*\n?([\s\S]+?)\n?[ \t]*\$\$[ \t]*(?:\n+|$)/.exec(e);if(t)return{type:"mathBlock",raw:t[0],text:t[1].trim()}},renderer:e=>`<div class="md-math-wrap"><div class="md-math md-math-block" data-tex="${encodeURIComponent(e.text)}">${p(e.text)}</div></div>
95
+ `},jl={name:"mathInline",level:"inline",start:e=>e.indexOf("$"),tokenizer(e){let t=new RegExp("^\\$(?![\\s$])((?:\\\\.|[^\\\\$\\n])+?)(?<![\\s\\\\])\\$(?![\\d$])").exec(e);if(t)return{type:"mathInline",raw:t[0],text:t[1]}},renderer:e=>`<span class="md-math" data-tex="${encodeURIComponent(e.text)}">${p(e.text)}</span>`},Ya=()=>{let e=new Map;return t=>{let n=t.toLowerCase().replace(/<[^>]+>/g,"").replace(/[^\p{L}\p{N}\s-]/gu,"").trim().replace(/\s+/g,"-")||"section",s=e.get(n)||0;return e.set(n,s+1),s?`${n}-${s}`:n}};function Il(){let e=Ya(),t=new rs({gfm:!0});return t.use(Na({description:"Footnotes"})),t.use({extensions:[Za,jl],hooks:{preprocess(n){return e=Ya(),n}},renderer:{code({text:n,lang:s}){let a=(s||"").trim().split(/\s+/)[0].toLowerCase();return a==="mermaid"?`<div class="md-diagram" data-diagram="${encodeURIComponent(n)}"></div>`:a==="math"||a==="latex"||a==="tex"?Za.renderer({text:n}):dt(n,a)},heading({tokens:n,depth:s}){let a=this.parser.parseInline(n),o=e(a);return`<h${s} id="${o}">${a}<a class="anchor" href="#" data-anchor="${o}" aria-label="Link to this section">#</a></h${s}>
96
+ `}}}),t}var Hl=Il();function Rl(e){let t=/^---\r?\n([\s\S]*?)\r?\n---\r?\n/.exec(e);if(!t)return{body:e,front:""};let n=t[1].split(/\r?\n/).map(s=>/^([\w.-]+):\s*(.*)$/.exec(s)).filter(Boolean).map(([,s,a])=>`<tr><td>${p(s)}</td><td>${p(a)}</td></tr>`).join("");return{body:e.slice(t[0].length),front:n?`<div class="md-table front"><table>${n}</table></div>`:""}}var Ol={NOTE:["note","info"],TIP:["tip","sparkles"],IMPORTANT:["important","warning"],WARNING:["warning","warning"],CAUTION:["caution","warning"]};function le(e,t,n){let{body:s,front:a}=Rl(t),o=ca.sanitize(a+Hl.parse(s),{ADD_ATTR:["target","data-anchor","data-diagram","data-tex","data-lang","data-cb"],FORBID_TAGS:["style","form"],FORBID_ATTR:["style"]});e.innerHTML=o,Nl(e,n)}function Nl(e,t){for(let s of e.querySelectorAll("table")){if(s.parentElement?.classList.contains("md-table"))continue;let a=document.createElement("div");a.className="md-table",s.replaceWith(a),a.append(s)}for(let s of e.querySelectorAll("a[href]")){if(s.dataset.anchor)continue;let a=s.getAttribute("href")||"";if(/^(https?:|mailto:|tel:)/i.test(a))s.target="_blank",s.rel="noopener noreferrer";else if(a.startsWith("#"))s.dataset.anchor=decodeURIComponent(a.slice(1)),s.setAttribute("href","#");else if(/^[a-z][a-z0-9+.-]*:/i.test(a))s.removeAttribute("href");else{let[o,r=""]=a.split("#"),i=Kn(o.startsWith("/")?o:W(t,decodeURIComponent(o))),l=/^L(\d+)(?:-L?(\d+))?/.exec(r);o.endsWith("/")||!o?s.setAttribute("href",ue({folder:i})):s.setAttribute("href",Q(i,l?{line:l[2]?`${l[1]}-${l[2]}`:l[1]}:{}))}}for(let s of e.querySelectorAll("img[src]")){let a=s.getAttribute("src")||"";/^(https?:|data:image\/|blob:)/i.test(a)||(s.src=B(Kn(a.startsWith("/")?a:W(t,decodeURIComponent(a))))),s.loading="lazy"}for(let s of e.querySelectorAll("blockquote")){let a=s.querySelector("p"),o=a&&/^\s*\[!(NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]\s*/i.exec(a.innerHTML);if(!o)continue;let[r,i]=Ol[o[1].toUpperCase()];a.innerHTML=a.innerHTML.slice(o[0].length).replace(/^<br>\s*/,""),!a.textContent.trim()&&!a.querySelector("img")&&a.remove(),s.classList.add("alert",r),s.insertAdjacentHTML("afterbegin",`<div class="alert-title">${g(i,16)}${o[1][0].toUpperCase()+o[1].slice(1).toLowerCase()}</div>`)}for(let s of e.querySelectorAll("[data-diagram]"))ke(s,decodeURIComponent(s.dataset.diagram));let n=e.querySelectorAll("[data-tex]");n.length&&import("./chunks/temml-ISNSX3VV.js").then(({default:s})=>{for(let a of n)try{a.innerHTML=s.renderToString(decodeURIComponent(a.dataset.tex),{displayMode:a.classList.contains("md-math-block"),throwOnError:!1})}catch{}}),un(e)}function un(e){for(let t of e.querySelectorAll("figure.ui-code[data-lang]")){let n=t.dataset.lang;n&&Ze("x."+n).then(s=>{if(!s||!t.isConnected)return;let a=t.querySelector("textarea")?.value??"";t.querySelector("code").innerHTML=je(a.replace(/\n$/,""),"x."+n).join(`
97
+ `)})}}document.addEventListener("click",e=>{let t=e.target.closest("[data-cb]");if(t){let s=t.closest(".ui-code");if(t.dataset.cb==="wrap")s.classList.toggle("wrapped"),t.classList.toggle("on",s.classList.contains("wrapped"));else if(t.dataset.cb==="copy"){let a=s.querySelector("textarea")?.value??s.querySelector("code")?.textContent??"";K(a,"Code copied").then(()=>{t.innerHTML=g("check",16),t.classList.add("copied"),setTimeout(()=>{t.innerHTML=g("copy",16),t.classList.remove("copied")},1600)})}return}let n=e.target.closest("a[data-anchor]");if(n){e.preventDefault();let s=n.closest(".md")||document,a=n.dataset.anchor;(s.querySelector("#"+CSS.escape(a))||s.querySelector(`[id="user-content-${CSS.escape(a)}"]`)||document.getElementById(a))?.scrollIntoView({behavior:"smooth",block:"start"})}});function Ye(e,t){let n=document.createElement("div");return le(n,e,t),n.innerHTML}var Pl=2048,fn=()=>`<label class="btn photo-btn" title="Attach photos or screenshots">${g("image",16)}<span>Photo</span><input type="file" accept="image/*" multiple hidden data-photos></label>`,hn=e=>[...e.querySelectorAll(".photo-list [data-photo]")||[]].map(t=>t.dataset.photo),mn=e=>e.length?`<div class="photos">${e.map(t=>`<a href="${p(t)}" target="_blank" rel="noopener"><img src="${p(t)}" alt="A photo" loading="lazy"></a>`).join("")}</div>`:"";async function _l(e){let t=URL.createObjectURL(e);try{let n=await new Promise((o,r)=>{let i=new Image;i.onload=()=>o(i),i.onerror=()=>r(new Error("That picture couldn't be read")),i.src=t}),s=Math.min(1,Pl/Math.max(n.naturalWidth,n.naturalHeight)),a=document.createElement("canvas");return a.width=Math.max(1,Math.round(n.naturalWidth*s)),a.height=Math.max(1,Math.round(n.naturalHeight*s)),a.getContext("2d").drawImage(n,0,0,a.width,a.height),e.type==="image/png"&&e.size<1.5*1048576?a.toDataURL("image/png"):a.toDataURL("image/jpeg",.85)}finally{URL.revokeObjectURL(t)}}document.addEventListener("change",async e=>{let t=e.target.closest?.("[data-photos]");if(!t)return;let s=t.closest("form")?.querySelector(".photo-list");if(s){for(let a of[...t.files].slice(0,8))try{let o=await _l(a),r=document.createElement("span");r.className="photo-thumb",r.dataset.photo=o,r.innerHTML=`<img src="${o}" alt=""><button type="button" class="mini" aria-label="Remove">${g("x",12)}</button>`,r.querySelector("button").onclick=()=>r.remove(),s.append(r)}catch(o){O(o.message)}t.value=""}});var zl=e=>e.line?e.endLine?`L${e.line}\u2013${e.endLine}`:`L${e.line}`:e.strokes?.length?`Area ${pt(e)}`:e.path?"File":"Note",pt=e=>ie(e.path).filter(t=>t.strokes?.length).findIndex(t=>t.id===e.id)+1;async function gn(){await Mt(),$e("comments")}function It(e,t){let n=(e.replies||[]).map(o=>`<div class="reply${o.from==="agent"||o.author==="agent"?" agent":""}"><div class="cmt-head"><b>${o.from==="agent"||o.author==="agent"?`${g("sparkles",13)} agent`:p(o.author)}</b><span class="faint">${D(Date.parse(o.at))}</span></div><div class="cmt-body md">${Ye(o.body,t)}</div></div>`).join(""),s=e.status==="resolved",a=v.info.readOnly;return`<div class="cmt${s?" resolved":""}" data-cid="${p(e.id)}">
98
+ <div class="cmt-head"><b>${p(e.author||"reviewer")}</b><span class="faint">${D(Date.parse(e.createdAt))}</span>${s?'<span class="pill ok">Resolved</span>':""}
99
+ ${a?"":`<span class="cmt-acts"><button class="mini" data-cact="${s?"reopen":"resolve"}" title="${s?"Reopen":"Resolve"}">${s?g("undo",14)+" Reopen":g("check",14)+" Resolve"}</button><button class="mini" data-cact="edit" title="Edit" aria-label="Edit">${g("edit",14)}</button><button class="mini" data-cact="delete" title="Delete" aria-label="Delete">${g("trash",14)}</button></span>`}</div>
100
+ <div class="cmt-body md">${Ye(e.body,t)}</div>
101
+ ${mn((e.photos||[]).map(o=>ae(`api/comments/${p(e.id)}/photo/${p(o.slice(o.lastIndexOf("/")+1))}`)))}
102
+ ${n}
103
+ ${a?"":`<form class="reply-form" data-cid="${p(e.id)}"><textarea rows="1" placeholder="Reply\u2026"></textarea><button class="btn small" type="submit">Reply</button></form>`}
104
+ </div>`}function ve(e,t,n){let s=t?n&&n!==t?`lines ${t}\u2013${n}`:`line ${t}`:e?"this file":"anything";return`<form class="composer" data-path="${p(e)}" data-line="${t||""}" data-end="${n||""}">
105
+ <div class="composer-head">A note for the agent on ${s} <span class="faint">as ${p(sn())}</span></div>
106
+ <textarea rows="3" placeholder="What should change? Markdown works. Ctrl+Enter to save."></textarea>
107
+ <div class="photo-list"></div>
108
+ <div class="composer-acts"><button class="btn primary" type="submit">Save note</button>${fn()}<button class="btn" type="button" data-cancel>Cancel</button></div>
109
+ </form>`}function Ht(e,t){return ie(e).filter(s=>!s.line&&(v.settings.resolved||s.status==="open")).map(s=>`<div class="thread">${s.strokes?.length?`<div class="thread-where"><span class="pin static ${s.status}">${pt(s)}</span> Marked area</div>`:""}${It(s,t)}</div>`).join("")}document.addEventListener("click",async e=>{let t=e.target.closest("[data-cact]");if(!t)return;let n=t.closest("[data-cid]"),s=n?.dataset.cid;if(!s)return;let a=t.dataset.cact;try{if(a==="resolve"||a==="reopen")await E("api/comments/"+s,{method:"PATCH",json:{status:a==="resolve"?"resolved":"open"}});else if(a==="delete"){if(!confirm("Delete this comment?"))return;await E("api/comments/"+s,{method:"DELETE"})}else if(a==="edit"){let o=v.comments.find(i=>i.id===s),r=n.querySelector(":scope > .cmt-body");r.outerHTML=`<form class="edit-form" data-cid="${p(s)}"><textarea rows="3">${p(o?.body||"")}</textarea><div class="composer-acts"><button class="btn primary" type="submit">Save</button><button class="btn" type="button" data-cancel-edit>Cancel</button></div></form>`,n.querySelector(".edit-form textarea").focus();return}await gn()}catch(o){O(o.message)}});document.addEventListener("click",e=>{e.target.closest("[data-cancel-edit]")&&gn();let t=e.target.closest("[data-cancel]");t&&(t.closest(".composer")?.remove(),$e("composer-closed"))});document.addEventListener("keydown",e=>{e.key==="Enter"&&(e.ctrlKey||e.metaKey)&&e.target.matches("form textarea")&&(e.preventDefault(),e.target.form.requestSubmit()),e.key==="Escape"&&e.target.matches(".composer textarea")&&(e.stopPropagation(),e.target.closest(".composer").remove(),$e("composer-closed"))});document.addEventListener("submit",async e=>{let t=e.target;if(!t.matches(".composer, .reply-form, .edit-form"))return;e.preventDefault();let n=t.querySelector("textarea").value.trim(),s=t.matches(".composer")?hn(t):[];if(!n&&!s.length)return;let a=t.querySelector("[type=submit]");a.disabled=!0;try{if(t.matches(".composer")){let o={path:t.dataset.path,body:n,author:sn(),...s.length?{photos:s}:{}};if(t.dataset.line&&(o.line=Number(t.dataset.line)),t.dataset.end&&(o.endLine=Number(t.dataset.end)),t.getMarks){let r=await t.getMarks();if(!r){a.disabled=!1;return}Object.assign(o,r)}await E("api/comments",{method:"POST",json:o}),t.remove(),$e("composer-closed")}else t.matches(".reply-form")?await E(`api/comments/${t.dataset.cid}/replies`,{method:"POST",json:{body:n,author:sn()}}):await E("api/comments/"+t.dataset.cid,{method:"PATCH",json:{body:n}});await gn()}catch(o){a.disabled=!1,O(o.message)}});document.addEventListener("input",e=>{e.target.matches(".reply-form textarea, .composer textarea, .edit-form textarea")&&(e.target.style.height="auto",e.target.style.height=Math.min(e.target.scrollHeight+2,320)+"px")});function ut(e,t,n){let s=v.comments,a=s.filter(m=>m.status==="open"),o=t==="resolved"?s.filter(m=>m.status==="resolved"):t==="all"?s:a,r=new Map;for(let m of[...o].sort((b,w)=>b.path.localeCompare(w.path)||(b.line||0)-(w.line||0)))r.has(m.path)||r.set(m.path,[]),r.get(m.path).push(m);let{md:i}=v.info.notes,l=i&&!i.startsWith("..")?Q(i):"",c=[["open",`Open (${a.length})`],["resolved",`Resolved (${s.length-a.length})`],["all",`All (${s.length})`]].map(([m,b])=>`<button class="seg-btn${(t||"open")===m?" on":""}" data-rf="${m}">${b}</button>`).join(""),d=[...r].map(([m,b])=>`<section class="rgroup"><h3 class="group-title${m?"":" plain"}">${m?`<a href="${Q(m)}">${p(m)}</a>`:`${g("chat",15)} Not about a file`}<span class="faint">${b.length}</span></h3>${b.map(w=>`<div class="rcard">${m?`<div class="rwhere"><a class="pill" href="${Q(m,w.line?{line:String(w.line)}:{})}">${zl(w)}</a>${w.commit?`<span class="faint">@ ${p(w.commit)}</span>`:""}</div>`:""}${w.quote?`<pre class="quote">${p(w.quote)}</pre>`:""}${w.image?`<a href="${Q(m)}"><img class="rimg" src="${ae(`api/comments/${p(w.id)}/image.png`)}" alt="The marked area" loading="lazy"></a>`:""}${It(w,m.includes("/")?m.slice(0,m.lastIndexOf("/")):"")}</div>`).join("")}</section>`).join(""),u=v.info.readOnly;e.innerHTML=`<div class="page-wrap notes-page"><header class="page-hero"><div><span class="eyebrow">${p(v.info.name)}</span><h1>Notes for the agent</h1></div></header>
110
+ <p class="lede">Write on any file, any line (tap its number) or any picture (mark an area), or here about anything. Add photos from your phone. The agent reads them with <code>npx hitloop news</code>, works through them, and resolves each with a reply you'll see here.</p>
111
+ ${u?"":`<div class="new-note" id="new-note">${ve("",0,0)}</div>`}
112
+ <div class="page-tools"><div class="seg">${c}</div><span class="grow"></span>
113
+ ${l?`<a class="btn" href="${l}">${g("file",16)} NOTES.md</a>`:""}
114
+ <button class="btn" id="copy-prompt" title="Copy instructions to paste into your agent">${g("copy",16)} Prompt for an agent</button>
115
+ ${s.length-a.length&&!u?'<button class="btn" id="clear-resolved">Clear resolved</button>':""}
116
+ <label class="switch" title="Tap any line of a file to write a note on it"><input type="checkbox" id="rmode" ${v.settings.review?"checked":""}> Tap a line to note it</label></div>
117
+ ${d||`<p class="empty">${t==="resolved"?"Nothing resolved yet.":t==="all"?"No notes yet.":"No open notes."} Open a file and tap a line number, mark an area of a picture, or write one above.</p>`}</div>`;let $=e.querySelector("#new-note .composer");$&&$.querySelector("[data-cancel]").remove(),e.querySelectorAll("[data-rf]").forEach(m=>m.onclick=()=>n(m.dataset.rf==="open"?"":m.dataset.rf)),e.querySelector("#rmode").onchange=m=>{at("review",m.target.checked),$e("settings")},e.querySelector("#copy-prompt").onclick=()=>K(v.info.notes.prompt,"Prompt copied");let h=e.querySelector("#clear-resolved");h&&(h.onclick=async()=>{confirm("Remove every resolved note?")&&(await E("api/comments?resolved=1",{method:"DELETE"}),await gn())})}function us(){let e=v.comments.filter(n=>n.status==="open").length,t=k("review-count");t&&(t.textContent=String(e),t.hidden=!e)}var Rt=null,Bl="#ff2d55";function Xa({path:e,stage:t,pic:n,tools:s,step:a}){let o={path:e,stage:t,pic:n,tools:s,wrap:t.querySelector(".picwrap"),strokes:[],drawing:!1,canvas:null};Rt=o,fs(o),n.onclick=()=>{o.drawing||t.classList.toggle("actual")};let r=null;t.addEventListener("touchstart",i=>{r=i.touches.length===1?{x:i.touches[0].clientX,y:i.touches[0].clientY,t:Date.now()}:null},{passive:!0}),t.addEventListener("touchend",i=>{let l=r;if(r=null,!l||o.drawing||t.classList.contains("actual")||!i.changedTouches.length)return;let c=i.changedTouches[0].clientX-l.x,d=i.changedTouches[0].clientY-l.y;Math.abs(c)>60&&Math.abs(c)>1.5*Math.abs(d)&&Date.now()-l.t<800&&a(c<0?1:-1)}),s.onclick=i=>{let l=i.target.closest("[data-ink]");if(!l)return;let c=l.dataset.ink;c==="start"?Dl(o):c==="undo"?(o.strokes.pop(),ce(o)):c==="clear"?(o.strokes=[],ce(o)):c==="cancel"&&Ga(o)},hs()}function fs(e){let t=v.info.readOnly,n=matchMedia("(pointer: coarse)").matches;e.tools.innerHTML=e.drawing?`<span class="ink-hint">${g("pen",14)} Draw on the picture around what you mean, then say what should change.</span><span class="grow"></span><button class="btn small" data-ink="undo">${g("undo",14)} Undo</button><button class="btn small" data-ink="clear">Clear</button><button class="btn small" data-ink="cancel">Cancel</button>`:`${t?"":`<button class="btn small" data-ink="start">${g("pen",14)} Mark an area</button>`}<span class="faint hint">${n?"Tap to zoom \xB7 swipe for the next file":"Click to see it at full size"}</span>`}function Dl(e){if(e.drawing)return;e.drawing=!0,e.strokes=[],e.stage.classList.remove("actual"),e.wrap.classList.add("drawing");let t=document.createElement("canvas");t.className="ink",e.wrap.append(t),e.canvas=t;let n=null,s=o=>{let r=t.getBoundingClientRect();return[Math.min(1,Math.max(0,(o.clientX-r.left)/r.width)),Math.min(1,Math.max(0,(o.clientY-r.top)/r.height))]};t.onpointerdown=o=>{o.preventDefault(),t.setPointerCapture(o.pointerId),n=[...s(o)],e.strokes.push(n),ce(e)},t.onpointermove=o=>{if(!n)return;let[r,i]=s(o),l=n[n.length-2],c=n[n.length-1];Math.hypot(r-l,i-c)<.002||(n.push(r,i),ce(e))},t.onpointerup=t.onpointercancel=()=>n=null,fs(e),e.tools.insertAdjacentHTML("afterend",ve(e.path,0,0));let a=e.tools.nextElementSibling;a.classList.add("ink-composer"),a.querySelector(".composer-head").firstChild.textContent="Comment on the marked area ",a.getMarks=()=>eo(e),new ResizeObserver(()=>ce(e)).observe(t),ce(e)}function Ga(e){e.drawing&&(e.drawing=!1,e.canvas?.remove(),e.canvas=null,e.strokes=[],e.wrap.classList.remove("drawing"),e.tools.parentElement?.querySelector(".ink-composer")?.remove(),fs(e))}Fe("composer-closed",()=>{Rt?.drawing&&!Rt.tools.parentElement?.querySelector(".ink-composer")&&Ga(Rt)});function ce(e){let t=e.canvas;if(!t)return;let n=t.getBoundingClientRect(),s=devicePixelRatio||1;t.width=Math.max(1,Math.round(n.width*s)),t.height=Math.max(1,Math.round(n.height*s));let a=t.getContext("2d");Ja(a,e.strokes,t.width,t.height,3*s)}function Ja(e,t,n,s,a){e.lineCap="round",e.lineJoin="round";for(let[o,r]of[["rgba(255,255,255,.85)",a*2],[Bl,a]]){e.strokeStyle=o,e.lineWidth=r;for(let i of t){e.beginPath(),e.moveTo(i[0]*n,i[1]*s),i.length===2&&e.lineTo(i[0]*n+.1,i[1]*s);for(let l=2;l<i.length;l+=2)e.lineTo(i[l]*n,i[l+1]*s);e.stroke()}}}async function eo(e){if(!e.strokes.length)return O("Draw on the picture first"),null;let t=e.pic,n=t.naturalWidth||t.clientWidth*2,s=t.naturalHeight||t.clientHeight*2,a=1,o=1,r=0,i=0;for(let d of e.strokes)for(let u=0;u<d.length;u+=2)a=Math.min(a,d[u]),r=Math.max(r,d[u]),o=Math.min(o,d[u+1]),i=Math.max(i,d[u+1]);let l=.01;a=Math.max(0,a-l),o=Math.max(0,o-l),r=Math.min(1,r+l),i=Math.min(1,i+l);let c={strokes:e.strokes.map(d=>d.map(u=>Math.round(u*1e4)/1e4)),area:{x:Math.round(a*n),y:Math.round(o*s),w:Math.max(1,Math.round((r-a)*n)),h:Math.max(1,Math.round((i-o)*s))}};try{let d=Math.min(1,2048/Math.max(n,s)),u=document.createElement("canvas");u.width=Math.max(1,Math.round(n*d)),u.height=Math.max(1,Math.round(s*d));let $=u.getContext("2d");$.drawImage(t,0,0,u.width,u.height),Ja($,c.strokes,u.width,u.height,Math.max(3,u.width/250)),c.snapshot=u.toDataURL("image/png")}catch{}return c}function hs(){let e=Rt;if(!e||!e.wrap.isConnected)return;let t=e.wrap.querySelector(".marks"),n=e.wrap.querySelector(".pins"),s=ie(e.path).filter(a=>a.strokes?.length&&(v.settings.resolved||a.status==="open"));t.innerHTML=s.map(a=>a.strokes.map(o=>`<polyline class="${a.status}" points="${to(o)}"/>`).join("")).join(""),n.innerHTML=s.map(a=>`<button class="pin ${a.status}" data-pin="${a.id}" style="left:${a.strokes[0][0]*100}%;top:${a.strokes[0][1]*100}%" title="Marked area ${pt(a)}" aria-label="Marked area ${pt(a)}">${pt(a)}</button>`).join(""),n.onclick=a=>{let o=a.target.closest("[data-pin]"),r=o&&document.querySelector(`#file-threads [data-cid="${o.dataset.pin}"]`);r&&(r.scrollIntoView({block:"center",behavior:"smooth"}),r.classList.remove("flash"),r.offsetWidth,r.classList.add("flash"))}}var to=e=>{let t=[];for(let n=0;n<e.length;n+=2)t.push(`${e[n]},${e[n+1]}`);return t.length===1&&t.push(t[0]),t.join(" ")};function no(e,t){let n={wrap:e,pic:t,strokes:[],drawing:!0,canvas:null};e.classList.add("drawing");let s=document.createElement("canvas");s.className="ink",e.append(s),n.canvas=s;let a=null,o=i=>{let l=s.getBoundingClientRect();return[Math.min(1,Math.max(0,(i.clientX-l.left)/l.width)),Math.min(1,Math.max(0,(i.clientY-l.top)/l.height))]};s.onpointerdown=i=>{i.preventDefault(),s.setPointerCapture(i.pointerId),a=[...o(i)],n.strokes.push(a),ce(n)},s.onpointermove=i=>{if(!a)return;let[l,c]=o(i);Math.hypot(l-a[a.length-2],c-a[a.length-1])<.002||(a.push(l,c),ce(n))},s.onpointerup=s.onpointercancel=()=>a=null;let r=new ResizeObserver(()=>ce(n));return r.observe(s),ce(n),{count:()=>n.strokes.length,undo:()=>{n.strokes.pop(),ce(n)},clear:()=>{n.strokes=[],ce(n)},stop:()=>{r.disconnect(),s.remove(),e.classList.remove("drawing")},marks:()=>eo(n)}}var so=(e,t="")=>e.map(n=>`<polyline class="${t}" points="${to(n)}"/>`).join("");var ms=6e4;function Ul(e){let t=/^(\d+)(?:-(\d+))?$/.exec(e||"");if(!t)return null;let n=Number(t[1]),s=Number(t[2]||t[1]);return[Math.min(n,s),Math.max(n,s)]}function $s(e){let t=[],n=[],s=null,a=0,o=0;for(let r of e.replace(/\r/g,"").split(`
118
+ `)){let i=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@(.*)$/.exec(r);if(i){s={header:r,ctx:i[3].trim(),lines:[]},t.push(s),a=Number(i[1]),o=Number(i[2]);continue}if(!s){n.push(r);continue}r.startsWith("+")?s.lines.push({t:"+",text:r.slice(1),n:o++}):r.startsWith("-")?s.lines.push({t:"-",text:r.slice(1),o:a++}):r.startsWith(" ")?s.lines.push({t:" ",text:r.slice(1),o:a++,n:o++}):r.startsWith("\\")&&s.lines.push({t:"\\",text:r})}return{head:n,hunks:t}}function oo(e){let t=new Map;for(let n of e.hunks){let s=0;for(let a=0;a<n.lines.length;a++){let o=n.lines[a];o.t==="-"?s++:o.t==="+"?(t.set(o.n,s>0?"mod":"add"),s>0&&s--):(s>0&&o.n&&t.set(o.n,t.get(o.n)||"del"),s=0)}}return t}var bn=250;function Fl(e){if(e.length<=bn)return e.join("");let t=[];for(let n=0;n<e.length;n+=bn)t.push(`<div class="lblock" style="contain-intrinsic-size:auto ${Math.min(bn,e.length-n)*21}px">${e.slice(n,n+bn).join("")}</div>`);return t.join("")}function $n(e,{download:t}={}){return`<figcaption class="cbar"><span class="caption">${p(e)}</span><span class="ctools"><button class="icon-btn${v.settings.wrap?" on":""}" data-cv="wrap" title="Wrap long lines" aria-label="Wrap long lines">${g("wrap",16)}</button><button class="icon-btn" data-cv="copy" title="Copy" aria-label="Copy">${g("copy",16)}</button>${t?`<a class="icon-btn" href="${t}" download title="Download" aria-label="Download">${g("download",16)}</a>`:""}</span></figcaption>`}function ws(e,{path:t,text:n,folder:s,marks:a,caption:o,download:r}){let i=n.length>4e6?n.slice(0,4e6):n,l=()=>{let y=je(i,t);return y.length>1&&y[y.length-1]===""&&i.endsWith(`
119
+ `)&&y.pop(),y},c=i.length>3e5,d=c?ls(i):l();c&&d.length>1&&d[d.length-1]===""&&i.endsWith(`
120
+ `)&&d.pop();let u=d.slice(0,ms),$=ue({...q(),line:"00000"}),h=u.map((y,S)=>{let M=S+1,C=a?.get(M);return`<div class="ln" data-n="${M}"><a class="gut" href="${$.replace("line=00000","line="+M)}" data-n="${M}">${M}</a><span class="mk${C?" "+C:""}"></span><span class="src">${y||" "}</span></div>`}),m=ct(t),b=o??`${m||"text"} \xB7 ${u.length.toLocaleString()} ${u.length===1?"line":"lines"}`;e.innerHTML=`<figure class="ui-code">${$n(b,{download:r})}<div class="code${v.settings.wrap?" wrap":""}${v.settings.review?" review":""}" tabindex="0" data-path="${p(t)}" data-folder="${p(s)}">${Fl(h)}</div></figure>${d.length>ms?`<p class="note">Showing the first ${ms.toLocaleString()} of ${d.length.toLocaleString()} lines.</p>`:""}`;let w=e.querySelector(".code");w.lines=u.length,w.text=n,Wl(w,t),ks(w);let x=Ul(q().line);return x&&bs(w,x[0],x[1],!0),(c?new Promise(y=>setTimeout(()=>y(!0),80)):Ze(t)).then(y=>{if(!y||!w.isConnected)return;let S=l(),M=w.querySelectorAll(".ln > .src"),C=0,A=()=>{if(!w.isConnected)return;let H=Math.min(M.length,C+600);for(;C<H;C++)S[C]!==void 0&&(M[C].innerHTML=S[C]||" ");C<M.length&&(window.requestIdleCallback||(L=>setTimeout(L,16)))(A)};A()}),w}document.addEventListener("click",e=>{let t=e.target.closest("[data-cv]");if(!t)return;let s=t.closest(".ui-code")?.querySelector(".code");if(s){if(t.dataset.cv==="wrap")at("wrap",!v.settings.wrap),document.querySelectorAll(".ui-code > .code").forEach(a=>a.classList.toggle("wrap",v.settings.wrap)),document.querySelectorAll('[data-cv="wrap"]').forEach(a=>a.classList.toggle("on",v.settings.wrap));else if(t.dataset.cv==="copy"){let a=s.text??[...s.querySelectorAll(".src, .dsrc")].map(o=>o.textContent).join(`
121
+ `);K(a,"Copied").then(()=>{t.innerHTML=g("check",16),t.classList.add("copied"),setTimeout(()=>{t.innerHTML=g("copy",16),t.classList.remove("copied")},1600)})}}});function ks(e){if(!e)return;let t=e.dataset.path,n=e.dataset.folder;e.querySelectorAll(".threads").forEach(o=>o.remove()),e.querySelectorAll(".ln.has-c").forEach(o=>o.classList.remove("has-c","has-open"));let s=ie(t).filter(o=>o.line&&(v.settings.resolved||o.status==="open")),a=new Map;for(let o of s){let r=Math.min(o.endLine||o.line,e.lines||1);a.has(r)||a.set(r,[]),a.get(r).push(o);for(let i=o.line;i<=(o.endLine||o.line);i++){let l=e.querySelector(`.ln[data-n="${i}"]`);l?.classList.add("has-c"),o.status==="open"&&l?.classList.add("has-open")}}for(let[o,r]of a){let i=e.querySelector(`.ln[data-n="${o}"]`);if(!i)continue;let l=document.createElement("div");l.className="threads",l.innerHTML=r.map(c=>`<div class="thread"><div class="thread-where">${c.endLine?`Lines ${c.line}\u2013${c.endLine}`:`Line ${c.line}`}${c.line>e.lines?" (past the end of the file now)":""}</div>${It(c,n)}</div>`).join(""),i.after(l)}}function bs(e,t,n,s){e.sel=[t,n],e.querySelectorAll(".ln.sel").forEach(i=>i.classList.remove("sel"));for(let i=t;i<=n;i++)e.querySelector(`.ln[data-n="${i}"]`)?.classList.add("sel");e.querySelector(".selbar")?.remove();let a=e.querySelector(`.ln[data-n="${n}"]`);if(!a)return;let o=document.createElement("div");o.className="selbar";let r=t===n?`Line ${t}`:`Lines ${t}\u2013${n}`;o.innerHTML=`<span class="faint">${r}</span>${v.info.readOnly?"":`<button class="btn small primary" data-sb="comment">${g("chat",14)} Comment</button>`}<button class="btn small" data-sb="link">${g("link",14)} Link</button><button class="btn small" data-sb="ref">path:line</button><button class="btn small" data-sb="text">${g("copy",14)} Lines</button><button class="mini" data-sb="clear" title="Clear the selection" aria-label="Clear the selection">${g("x",14)}</button>`,a.after(o),s&&requestAnimationFrame(()=>e.querySelector(`.ln[data-n="${t}"]`)?.scrollIntoView({block:"center"}))}function ao(e){e.sel=null,e.querySelectorAll(".ln.sel").forEach(t=>t.classList.remove("sel")),e.querySelector(".selbar")?.remove(),_({line:""},!0)}function gs(e,t,n,s){e.querySelectorAll(".composer").forEach(i=>i.remove());let a=e.querySelector(`.ln[data-n="${s}"]`);if(!a)return;(a.nextElementSibling?.classList.contains("threads")?a.nextElementSibling:a).insertAdjacentHTML("afterend",ve(t,n,s)),e.querySelector(".selbar")?.remove();let r=e.querySelector(".composer textarea");r.focus(),r.scrollIntoView({block:"nearest"})}function Wl(e,t){e.addEventListener("click",n=>{let s=n.target.closest(".gut"),a=n.target.closest("[data-sb]");if(s){n.preventDefault();let r=Number(s.dataset.n),[i,l]=n.shiftKey&&e.sel?[Math.min(e.sel[0],r),Math.max(e.sel[1],r)]:[r,r];if(!n.shiftKey&&e.sel&&e.sel[0]===r&&e.sel[1]===r)return ao(e);bs(e,i,l,!1),_({line:i===l?String(i):`${i}-${l}`},!0),v.settings.review&&!v.info.readOnly&&!n.shiftKey&&gs(e,t,i,l);return}if(a&&e.sel){let[r,i]=e.sel,l=a.dataset.sb;if(l==="comment")gs(e,t,r,i);else if(l==="link")K(location.href,"Link copied");else if(l==="ref")K(`${t}:${r}${r!==i?"-"+i:""}`,"Copied");else if(l==="text"){let c=[];for(let d=r;d<=i;d++)c.push(e.querySelector(`.ln[data-n="${d}"] .src`)?.textContent??"");K(c.join(`
122
+ `),"Lines copied")}else l==="clear"&&ao(e);return}let o=n.target.closest(".ln");if(o&&v.settings.review&&!v.info.readOnly&&!String(getSelection()).trim()){let r=Number(o.dataset.n),[i,l]=n.shiftKey&&e.sel?[Math.min(e.sel[0],r),Math.max(e.sel[1],r)]:[r,r];bs(e,i,l,!1),_({line:i===l?String(i):`${i}-${l}`},!0),gs(e,t,i,l)}})}function _e(e,t,n,{comments:s=!0,caption:a=""}={}){if(!t.trim()){e.innerHTML='<p class="note">No changes against the last commit.</p>';return}let o=$s(t),r=o.head.filter(b=>b&&!/^(diff --git|index |--- |\+\+\+ |(new|deleted) file mode|similarity index|rename (from|to) )/.test(b)),i=o.hunks.flatMap(b=>b.lines.filter(w=>w.t!=="\\")),l=()=>{let b=new Map;for(let w of o.hunks)for(let x of["o","n"]){let y=w.lines.filter(M=>M.t!=="\\"&&(x==="o"?M.t!=="+":M.t!=="-")),S=je(y.map(M=>M.text).join(`
123
+ `),n);y.forEach((M,C)=>{(x==="n"||M.t==="-")&&b.set(M,S[C]||" ")})}return b},c=l(),d=[];for(let b of o.hunks){d.push(`<div class="dh"><span>${p(b.header.replace(/@@(.*)$/,"@@"))}</span>${b.ctx?`<span class="faint">${p(b.ctx)}</span>`:""}</div>`);for(let w of b.lines){if(w.t==="\\"){d.push(`<div class="dl meta"><span class="on"></span><span class="nn"></span><span class="dsrc faint">${p(w.text)}</span></div>`);continue}let x=w.t==="+"?"add":w.t==="-"?"del":"";d.push(`<div class="dl ${x}"${w.n?` data-n="${w.n}"`:""}><span class="on">${w.o??""}</span><span class="nn">${w.n?`<a class="gut" data-n="${w.n}">${w.n}</a>`:""}</span><span class="dsrc"><i>${w.t===" "?" ":w.t}</i><span class="dt">${c.get(w)}</span></span></div>`)}}let u=!o.hunks.length&&/Binary files/.test(t),$=i.filter(b=>b.t==="+").length,h=i.filter(b=>b.t==="-").length;e.innerHTML=`${r.length?`<pre class="commit-head">${p(r.join(`
124
+ `))}</pre>`:""}${u?'<p class="note">A binary file changed; no line diff.</p>':o.hunks.length?`<figure class="ui-code">${$n(`${a||n} \xB7 +${$} \u2212${h}`)}<div class="diff code${v.settings.wrap?" wrap":""}${v.settings.review&&s?" review":""}" tabindex="0" data-path="${p(n)}">${d.join("")}</div></figure>`:'<p class="note">No lines changed (only its name or mode).</p>'}`;let m=e.querySelector(".diff");m&&(m.text=t,Ze(n).then(b=>{if(!b||!m.isConnected)return;let w=l();m.querySelectorAll(".dt").forEach((x,y)=>{let S=w.get(i[y]);S!==void 0&&(x.innerHTML=S)})})),!(!m||!s)&&(Ot(m),m.addEventListener("click",b=>{if(v.info.readOnly||b.target.closest(".threads, .composer"))return;let w=b.target.closest(".gut")||(v.settings.review&&!String(getSelection()).trim()?b.target.closest(".dl[data-n]"):null);if(!w)return;let x=Number(w.dataset.n);m.querySelectorAll(":scope > .composer").forEach(M=>M.remove());let y=m.querySelector(`.dl[data-n="${x}"]`);(y.nextElementSibling?.classList.contains("threads")?y.nextElementSibling:y).insertAdjacentHTML("afterend",ve(n,x,x)),m.querySelector(".composer textarea").focus()}))}function Ot(e){if(!e)return;e.querySelectorAll(":scope > .threads").forEach(s=>s.remove());let t=e.dataset.path,n=t.includes("/")?t.slice(0,t.lastIndexOf("/")):"";for(let s of ie(t).filter(a=>a.line&&(v.settings.resolved||a.status==="open"))){let a=e.querySelector(`.dl[data-n="${s.endLine||s.line}"]`);if(!a)continue;let o=a.nextElementSibling?.classList.contains("threads")?a.nextElementSibling:null;o||(o=document.createElement("div"),o.className="threads",a.after(o)),o.insertAdjacentHTML("beforeend",`<div class="thread"><div class="thread-where">${s.endLine?`Lines ${s.line}\u2013${s.endLine}`:`Line ${s.line}`}</div>${It(s,n)}</div>`)}}var Xe=new Set(["png","jpg","jpeg","gif","webp","avif","svg","ico","bmp"]),Kl=new Set(["mp3","ogg","oga","wav","flac","m4a","aac","opus"]),Ql=new Set(["mp4","m4v","webm","ogv","mov"]),Vl=new Set(["woff","woff2","ttf","otf"]),Zl=new Set(["zip","gz","tgz","bz2","xz","7z","rar","tar","exe","dll","so","dylib","bin","dat","glb","fbx","blend","vox","wasm","class","jar","o","a","pyc","db","sqlite","psd","ai","sketch","fig","xlsx","docx","pptx","ktx2","basis","dds","hdr","exr","mid","midi"]),lo={csv:",",tsv:" "},Yl=()=>v.info.maxFile||5*1048576,co=e=>B(e)+"?download=1",Xl=e=>matchMedia("(max-width: 759px)").matches?document.scrollingElement:e;function Gl(e){let t=Z(e);return t==="svg"?"svg":Xe.has(t)?"image":Kl.has(t)?"audio":Ql.has(t)?"video":Vl.has(t)?"font":t==="pdf"?"pdf":Zl.has(t)?"binary":t==="md"||t==="markdown"||t==="mdx"?"markdown":t==="html"||t==="htm"?"html":t==="ipynb"?"notebook":t==="mmd"||t==="mermaid"?"diagram":t in lo?"table":t==="json"||t==="geojson"||t==="webmanifest"||t==="gltf"?"json":"text"}var ro={image:"Image",svg:"Image",audio:"Player",video:"Player",font:"Font",pdf:"PDF",markdown:"Rendered",html:"Preview",notebook:"Notebook",table:"Table",json:"Tree",binary:"Hex",diagram:"Diagram"},Jl=new Set(["svg","markdown","html","notebook","table","json","text","diagram"]),Ie={path:"",token:0};function vs(){Ie={path:"",token:Ie.token+1}}async function wn(e,t=!1){let{folder:n,open:s,tab:a}=q(),o=W(n,s);if(!t&&Ie.path===o&&Ie.tab===(a||""))return;let r=Xl(e),i=t&&Ie.path===o?r.scrollTop:0,l=++Ie.token;Ie={path:o,tab:a||"",token:l};let d=(v.cache.get(n)||[]).find(I=>I.name===s),u=v.changes.get(o),$=!d&&u?.state==="deleted",h=Gl(s),m=[];$?m.push(["deleted","Last committed"]):(ro[h]&&m.push(["preview",ro[h]]),Jl.has(h)&&m.push(["source","Source"])),u&&u.state!=="ignored"&&m.push(["diff","Changes"]),u&&(h==="image"||h==="svg")&&u.state!=="new"&&u.state!=="added"&&m.push(["compare","Compare"]),v.git&&u?.state!=="new"&&!Ce(o)&&m.push(["history","History"]);let b=m.some(([I])=>I===a)?a:m[0]?.[0]||"source",w=B(o),x=u&&u.state!=="ignored"?u.state:"",y=ie(o).filter(I=>I.status==="open").length;if(!v.cache.has(n)&&(await ot(n).catch(()=>[]),l!==Ie.token))return;let[S,M]=po(n,s),C=`<header class="file-head">
125
+ <button class="icon-btn back" id="back" aria-label="Back to the folder" title="Back to the folder">${g("chevron-left")}</button>
126
+ <span class="file-name" title="${p(o)}">${p(s)}</span>
127
+ ${x?`<span class="badge s-${x}" title="${Ae[x]}">${an[x]||"\xB7"}</span>`:""}
128
+ ${y?`<span class="pill warn" title="Open comments">${g("chat",12)} ${y}</span>`:""}
129
+ <span class="grow"></span>
130
+ <button class="icon-btn" id="prev-file" ${S?`title="Previous: ${p(S)} ( [ )" aria-label="Previous file: ${p(S)}"`:'disabled title="No previous file" aria-label="No previous file"'}>${g("arrow-left")}</button>
131
+ <button class="icon-btn" id="next-file" ${M?`title="Next: ${p(M)} ( ] )" aria-label="Next file: ${p(M)}"`:'disabled title="No next file" aria-label="No next file"'}>${g("arrow-right")}</button>
132
+ <button class="icon-btn hide-sm" id="copy-path" title="Copy the path" aria-label="Copy the path">${g("link")}</button>
133
+ ${v.info.readOnly?"":`<button class="icon-btn" id="comment-file" title="Comment on the whole file" aria-label="Comment on the whole file">${g("chat")}</button>`}
134
+ ${$?"":`<a class="icon-btn" href="${co(o)}" download="${p(s)}" title="Download" aria-label="Download">${g("download")}</a><a class="icon-btn hide-sm" href="${w}" target="_blank" rel="noopener" title="Open the raw file" aria-label="Open the raw file">${g("external")}</a>`}
135
+ <button class="icon-btn" id="close" aria-label="Close the file" title="Close (Esc)">${g("x")}</button>
136
+ </header>
137
+ <div class="meta" id="fmeta">${p(o)}${d?" \xB7 "+Tt(d.size)+" \xB7 "+D(d.mtime):$?" \xB7 deleted":""}${u?.add!==void 0?` \xB7 <span class="plus">+${u.add}</span> <span class="minus">\u2212${u.del||0}</span>`:""}</div>
138
+ <div id="file-threads">${Ht(o,n)}</div>
139
+ ${m.length>1?`<div class="tabs">${m.map(([I,z])=>`<button class="btn${I===b?" on":""}" data-tab="${I}">${z}</button>`).join("")}</div>`:""}
140
+ <div id="fbody"><div class="skeleton" style="width:70%"></div></div>`;e.innerHTML=C,r.scrollTop=0,k("close").onclick=()=>_({open:"",tab:"",line:""}),k("back").onclick=()=>_({open:"",tab:"",line:""}),k("copy-path").onclick=()=>K(o,"Path copied"),k("prev-file").onclick=()=>Nt(-1),k("next-file").onclick=()=>Nt(1);let A=k("comment-file");A&&(A.onclick=()=>{k("file-threads").querySelector(".composer")||(k("file-threads").insertAdjacentHTML("beforeend",ve(o,0,0)),k("file-threads").querySelector(".composer textarea").focus())}),e.querySelectorAll("[data-tab]").forEach(I=>I.onclick=()=>_({tab:I.dataset.tab===m[0][0]?"":I.dataset.tab,line:""}));let H=k("fbody"),L=()=>l!==Ie.token;try{await ec(b,{body:H,path:o,folder:n,kind:h,url:w,e:d,change:u,stale:L})}catch(I){L()||(H.innerHTML=`<p class="note">${p(I.message)}</p>`)}i&&!L()&&(r.scrollTop=i)}function po(e,t){let n=(v.cache.get(e)||[]).filter(a=>a.type!=="folder");v.settings.ignored==="hide"&&(n=n.filter(a=>!Ce(W(e,a.name))));let s=n.findIndex(a=>a.name===t);return s<0?["",""]:[n[s-1]?.name||"",n[s+1]?.name||""]}function Nt(e){let{folder:t,open:n}=q();if(!n)return;let s=po(t,n)[e<0?0:1];s&&_({open:s,tab:"",line:""})}function uo(e){let{folder:t,open:n}=q(),s=e.querySelector("#file-threads");if(!s||!n)return;let a=s.querySelector(".composer");s.innerHTML=Ht(W(t,n),t),a&&s.append(a),ks(e.querySelector("#fbody > .code, #fbody .code:not(.diff)")),Ot(e.querySelector(".diff")),hs()}async function ec(e,t){let{body:n,path:s,folder:a,kind:o,url:r,e:i,stale:l}=t,c=async()=>{if(i&&i.size>Yl())throw new Error(`Too large to show here (${Tt(i.size)}). Download it instead.`);return(await fetch(r)).text()};if(e==="diff"){let d=await E("api/git/diff?p="+encodeURIComponent(s));if(l())return;_e(n,d,s,{caption:"Changes since the last commit"});return}if(e==="deleted"){let d=await E("api/git/show?p="+encodeURIComponent(s));if(l())return;n.innerHTML='<p class="note">This file was deleted. It looked like this at the last commit:</p><div id="code-host"></div>',ws(k("code-host"),{path:s,text:d,folder:a});return}if(e==="history")return tc(n,s,l);if(e==="compare"){n.innerHTML=`<div class="compare"><figure><figcaption>Last commit</figcaption><div class="stage"><img src="${ae(`api/git/raw?p=${encodeURIComponent(s)}`)}" alt="Before"></div></figure><figure><figcaption>Now</figcaption><div class="stage"><img src="${r}?t=${Date.now()}" alt="After"></div></figure></div>`;return}if(e==="source"||o==="text"){let d=await c();if(l())return;if(d.includes("\0"))return io(n,r,l);let u=t.change?.state==="new"||t.change?.state==="added";n.innerHTML='<div id="code-host"></div>';let $=ws(k("code-host"),{path:s,text:d,folder:a,marks:u?new Map(d.split(`
141
+ `).map((h,m)=>[m+1,"add"])):void 0,download:co(s)});if(t.change&&!u&&t.change.state!=="ignored"){let h=await E("api/git/diff?p="+encodeURIComponent(s)).catch(()=>"");if(l()||!$.isConnected)return;for(let[m,b]of oo($s(h)))$.querySelector(`.ln[data-n="${m}"] .mk`)?.classList.add(b)}return}switch(o){case"image":case"svg":{n.innerHTML=`<div class="stage" id="stage"><div class="picwrap" id="picwrap"><img id="pic" src="${r}?t=${i?i.mtime:0}" alt="${p(s)}" draggable="false"><svg class="marks" id="marks" viewBox="0 0 1 1" preserveAspectRatio="none" aria-hidden="true"></svg><div class="pins" id="pins"></div></div></div><div class="img-tools" id="img-tools"></div>`;let d=k("pic");Xa({path:s,stage:k("stage"),pic:d,tools:k("img-tools"),step:Nt}),d.onload=()=>{let u=k("fmeta");u&&!u.dataset.dim&&(u.dataset.dim="1",u.insertAdjacentHTML("beforeend",` \xB7 ${d.naturalWidth} \xD7 ${d.naturalHeight}`))};return}case"audio":n.innerHTML=`<div class="stage"><audio controls preload="metadata" src="${r}"></audio></div>`;return;case"video":n.innerHTML=`<div class="stage"><video controls preload="metadata" src="${r}"></video></div>`;return;case"pdf":n.innerHTML=`<div class="stage"><iframe src="${r}" title="${p(s)}"></iframe></div>`;return;case"font":return nc(n,r);case"binary":return io(n,r,l);case"markdown":{let d=await c();if(l())return;n.innerHTML='<article class="md card"></article>',le(n.firstElementChild,d,a);return}case"diagram":{let d=await c();if(l())return;n.innerHTML='<div class="stage diagram"></div>',await ke(n.firstElementChild,d);return}case"html":n.innerHTML=`<p class="faint hint">Shown sandboxed: scripts don't run.</p><div class="stage page"><iframe sandbox="" src="${r}?as=page" title="${p(s)}"></iframe></div>`;return;case"table":{let d=await c();return l()?void 0:ys(n,d,lo[Z(s)])}case"json":{let d=await c();if(l())return;let u;try{u=JSON.parse(d)}catch($){n.innerHTML=`<p class="note">Not valid JSON: ${p($.message)}</p>`;return}n.innerHTML=`<div class="code-foot"><button class="btn small" data-jt="open">Expand all</button><button class="btn small" data-jt="close">Collapse all</button></div><div class="jtree">${Pt(u,0)}</div>`,n.querySelectorAll("[data-jt]").forEach($=>$.onclick=()=>n.querySelectorAll(".jtree details").forEach(h=>h.open=$.dataset.jt==="open"));return}case"notebook":{let d=await c();return l()?void 0:ac(n,d,a)}}}async function tc(e,t,n){let{commits:s,more:a}=await E("api/git/log?p="+encodeURIComponent(t));if(n())return;if(!s.length){e.innerHTML='<p class="note">No commits touch this file yet.</p>';return}let o=c=>`<button class="commit" data-h="${p(c.hash)}"><code>${p(c.hash)}</code><span class="subj">${p(c.subject)}</span><span class="faint">${p(c.author)} \xB7 ${D(c.time)}</span></button>`;e.innerHTML=`<div class="commits">${s.map(o).join("")}</div>${a?'<button class="btn small" id="log-more">Show older commits</button>':""}<div id="commit-diff"></div>`;let r=s.length,i=k("log-more");i&&(i.onclick=async()=>{i.disabled=!0;let c=await E(`api/git/log?p=${encodeURIComponent(t)}&skip=${r}`).catch(()=>null);if(n()||!c)return void(i.disabled=!1);r+=c.commits.length,e.querySelector(".commits").insertAdjacentHTML("beforeend",c.commits.map(o).join("")),c.more?i.disabled=!1:i.remove()}),e.querySelector(".commits").onclick=c=>{let d=c.target.closest("[data-h]");d&&l(d).catch(()=>{})};async function l(c){e.querySelectorAll(".commit").forEach(u=>u.classList.toggle("on",u===c));let d=await E(`api/git/commit?p=${encodeURIComponent(t)}&h=${c.dataset.h}`);n()||(_e(k("commit-diff"),d,t,{comments:!1,caption:c.dataset.h}),k("commit-diff").insertAdjacentHTML("afterbegin",`<a class="btn small" href="${ue({folder:q().folder,m:"history",q:c.dataset.h})}">${g("diff",14)} The whole commit</a>`),k("commit-diff").scrollIntoView({block:"nearest"}))}}async function io(e,t,n){let s=await fetch(t,{headers:{range:"bytes=0-8191"}}),a=new Uint8Array(await s.arrayBuffer());if(n())return;let o=[];for(let r=0;r<a.length;r+=16){let i=[...a.slice(r,r+16)],l=i.map(d=>d.toString(16).padStart(2,"0")).join(" "),c=i.map(d=>d>=32&&d<127?String.fromCharCode(d):".").join("");o.push(`<span class="faint">${r.toString(16).padStart(8,"0")}</span> ${l.padEnd(47)} ${p(c)}`)}e.innerHTML=`<p class="faint hint">No preview for this kind of file. The first ${a.length.toLocaleString()} bytes:</p><pre class="hex">${o.join(`
142
+ `)}</pre>`}async function nc(e,t){let n="fs-font-"+Math.random().toString(36).slice(2),s=new FontFace(n,`url("${t}")`);try{await s.load(),document.fonts.add(s)}catch{e.innerHTML='<p class="note">This font could not be loaded.</p>';return}let a="The quick brown fox jumps over the lazy dog";e.innerHTML=`<div class="font" style="font-family:'${n}'">
143
+ <input class="font-sample" value="${a}" aria-label="Sample text">
144
+ ${[64,40,28,20,14].map(o=>`<p style="font-size:${o}px" data-s>${a}</p>`).join("")}
145
+ <p style="font-size:22px">ABCDEFGHIJKLMNOPQRSTUVWXYZ<br>abcdefghijklmnopqrstuvwxyz<br>0123456789 !@#$%^&amp;*()[]{}?</p></div>`,e.querySelector(".font-sample").oninput=o=>e.querySelectorAll("[data-s]").forEach(r=>r.textContent=o.target.value||a)}function sc(e,t){let n=[],s=[],a="",o=!1;for(let r=0;r<e.length;r++){let i=e[r];if(o)i==='"'&&e[r+1]==='"'?(a+='"',r++):i==='"'?o=!1:a+=i;else if(i==='"'&&a==="")o=!0;else if(i===t)s.push(a),a="";else if(i===`
146
+ `||i==="\r"){if(i==="\r"&&e[r+1]===`
147
+ `&&r++,s.push(a),n.push(s),s=[],a="",n.length>5e3)break}else a+=i}return(a||s.length)&&(s.push(a),n.push(s)),n}function ys(e,t,n){let s=sc(t,n);if(!s.length){e.innerHTML='<p class="note">Empty.</p>';return}let[a,...o]=s,r=o.slice(0,2e3),i=a.map((u,$)=>r.length>0&&r.every(h=>h[$]===void 0||h[$]===""||!isNaN(Number(h[$]))));e.innerHTML=`<div class="code-foot"><input class="filter" placeholder="Filter rows"><span class="faint">${o.length.toLocaleString()} rows \xB7 ${a.length} columns${o.length>r.length?` \xB7 showing ${r.length}`:""}</span></div>
148
+ <div class="tablewrap"><table class="grid-table"><thead><tr><th>#</th>${a.map((u,$)=>`<th data-col="${$}">${p(u)}</th>`).join("")}</tr></thead><tbody>${r.map((u,$)=>`<tr><td class="faint">${$+1}</td>${a.map((h,m)=>`<td${i[m]?' class="num"':""}>${p(u[m]??"")}</td>`).join("")}</tr>`).join("")}</tbody></table></div>`;let l=e.querySelector("tbody");e.querySelector(".filter").oninput=u=>{let $=u.target.value.toLowerCase();for(let h of l.rows)h.hidden=!!$&&!h.textContent.toLowerCase().includes($)};let c=-1,d=!0;e.querySelectorAll("th[data-col]").forEach(u=>u.onclick=()=>{let $=Number(u.dataset.col);d=c===$?!d:!0,c=$;let h=[...l.rows];h.sort((m,b)=>{let w=m.cells[$+1].textContent,x=b.cells[$+1].textContent,y=i[$]?Number(w)-Number(x):w.localeCompare(x,void 0,{numeric:!0});return d?y:-y}),l.append(...h),e.querySelectorAll("th").forEach(m=>m.dataset.sort=""),u.dataset.sort=d?"\u25B2":"\u25BC"})}function Pt(e,t){if(e===null)return'<span class="tok-literal">null</span>';if(typeof e=="string")return`<span class="tok-string">"${p(e.length>2e3?e.slice(0,2e3)+"\u2026":e)}"</span>`;if(typeof e=="number")return`<span class="tok-number">${e}</span>`;if(typeof e=="boolean")return`<span class="tok-literal">${e}</span>`;let n=Array.isArray(e),s=n?e.map((i,l)=>[l,i]):Object.entries(e);if(!s.length)return n?"[]":"{}";let a=s.slice(0,1e3),o=a.map(([i,l])=>`<div class="jrow">${n?`<span class="faint">${i}</span>`:`<span class="jkey">${p(i)}</span>`}: ${Pt(l,t+1)}</div>`).join(""),r=s.length>a.length?`<div class="faint">\u2026 ${s.length-a.length} more</div>`:"";return`<details${t<2?" open":""}><summary>${n?`[ ${s.length} ]`:`{ ${s.length} }`}</summary><div class="jkids">${o}${r}</div></details>`}function ac(e,t,n){let s;try{s=JSON.parse(t)}catch(i){e.innerHTML=`<p class="note">Not a valid notebook: ${p(i.message)}</p>`;return}let a=i=>Array.isArray(i)?i.join(""):i||"",o=s.metadata?.language_info?.file_extension||".py",r=(s.cells||[]).map(i=>{if(i.cell_type==="markdown")return`<div class="nb-md md" data-md="${p(a(i.source))}"></div>`;let l=dt(a(i.source),ct("x"+o),`In [${i.execution_count??" "}]`),c=(i.outputs||[]).map(d=>{let u=d.data||{};if(u["image/png"])return`<img class="nb-img" src="data:image/png;base64,${a(u["image/png"]).replace(/\s/g,"")}" alt="">`;if(u["image/jpeg"])return`<img class="nb-img" src="data:image/jpeg;base64,${a(u["image/jpeg"]).replace(/\s/g,"")}" alt="">`;let $=u["text/plain"]?a(u["text/plain"]):d.text?a(d.text):d.ename?`${d.ename}: ${d.evalue}`:"";return $?`<pre class="nb-out${d.output_type==="error"?" err":""}">${p($.replace(/\x1b\[[\d;]*m/g,""))}</pre>`:""}).join("");return`<div class="nb-cell"><span class="nb-n faint"></span><div>${l}${c}</div></div>`});e.innerHTML=`<div class="nb">${r.join("")||'<p class="note">An empty notebook.</p>'}</div>`;for(let i of e.querySelectorAll("[data-md]"))le(i,i.dataset.md,n)}var ye=!1;function kn(){let e=k("scope"),t=q().folder;e.textContent=ye&&t?`in ${tt(t)}`:"everywhere",e.title=ye&&t?`Searching ${t}/ (click to search everywhere)`:"Searching every folder (click to search only the open folder)",e.classList.toggle("on",ye&&!!t)}function vn(e){ye=e==="here",kn(),k("q").focus(),k("q").select()}function fo(){k("search-form").onsubmit=t=>{t.preventDefault();let n=k("q").value.trim();if(!n)return;let s=q();se({folder:s.folder,m:"search",q:n,scope:ye&&s.folder?"here":"",opts:s.m==="search"?s.opts:"",inc:s.m==="search"?s.inc:""})},k("scope").onclick=()=>{ye=!ye,kn(),q().m==="search"&&_({scope:ye?"here":""}),k("q").focus()},addEventListener("hashchange",()=>{let t=q();t.m==="search"&&(k("q").value=t.q,ye=t.scope==="here"),kn()});let e=q();e.m==="search"&&(k("q").value=e.q,ye=e.scope==="here"),kn()}var oc=(e,t)=>{let n="",s=0;for(let[a,o]of t)n+=p(e.slice(s,a))+"<mark>"+p(e.slice(a,o))+"</mark>",s=o;return n+p(e.slice(s))},xs=0;async function ho(e){let t=q(),n=t.opts||"",s=t.scope==="here"&&t.folder,a=(b,w,x)=>`<button class="btn small${n.includes(b)?" on":""}" data-o="${b}" title="${x}">${w}</button>`;e.innerHTML=`<header class="head"><h2 class="page-title">${g("search")} \u201C${p(t.q)}\u201D</h2></header>
149
+ <div class="head search-opts">
150
+ ${a("c","Aa","Match case")}${a("w","<u>ab</u>","Whole word")}${a("r",".*","Regular expression")}
151
+ <input class="filter" id="inc" placeholder="Files to include: *.ts, src/**, !*.test.ts" value="${p(t.inc)}" aria-label="Files to include">
152
+ <span class="scope-chips"><button class="btn small${s?"":" on"}" data-sc="">Everywhere</button>${t.folder?`<button class="btn small${s?" on":""}" data-sc="here">In ${p(t.folder)}/</button>`:""}</span>
153
+ </div>
154
+ <div id="results"><p class="note">Searching\u2026</p></div>`,e.querySelectorAll("[data-o]").forEach(b=>b.onclick=()=>_({opts:n.includes(b.dataset.o)?n.replace(b.dataset.o,""):n+b.dataset.o})),e.querySelectorAll("[data-sc]").forEach(b=>b.onclick=()=>_({scope:b.dataset.sc}));let o=k("inc");o.onchange=()=>_({inc:o.value.trim()}),o.onkeydown=b=>b.key==="Enter"&&o.blur();let r=++xs,i=new URLSearchParams({q:t.q,scope:s?t.folder:"",include:t.inc||""});n.includes("c")&&i.set("case","1"),n.includes("w")&&i.set("word","1"),n.includes("r")&&i.set("regex","1");let l;try{l=await E("api/search?"+i)}catch(b){r===xs&&(k("results").innerHTML=`<p class="note">${p(b.message)}</p>`);return}if(r!==xs)return;if(l.error){k("results").innerHTML=`<p class="note">${p(l.error)}</p>`;return}let c=l.files.filter(b=>b.name),d=l.files.filter(b=>b.matches.length),$=`${d.reduce((b,w)=>b+w.matches.length,0).toLocaleString()} matching lines in ${d.length.toLocaleString()} files${c.length?` \xB7 ${c.length} file names`:""} \xB7 searched ${l.searched.toLocaleString()} files in ${l.ms} ms${l.truncated?" \xB7 stopped early, narrow the search":""}`,h=c.length?`<section class="sgroup"><h3 class="group-title">Files named like this</h3><div class="rows">${c.slice(0,100).map(b=>`<a class="row fit" href="${Q(b.path)}"><span class="ico">${g("file",18)}</span><span class="nm">${nt(b.path)}</span><span class="marks">${de(ze(b.path,"file"))}</span></a>`).join("")}</div></section>`:"",m=d.map(b=>{let w=ze(b.path,"file");return`<section class="sfile"><h3 class="group-title"><a href="${Q(b.path)}">${p(b.path)}</a>${de(w)}<span class="faint">${b.matches.length}</span></h3><div class="slines">${b.matches.map(x=>`<a class="sline" href="${Q(b.path,{line:String(x.line)})}"><span class="sn">${x.line}</span><code>${oc(x.text,x.hits)}</code></a>`).join("")}</div></section>`}).join("");k("results").innerHTML=`<p class="meta">${$}</p>${h}${m||(c.length?"":'<p class="empty">Nothing found.</p>')}`}var _t=null,mo=()=>_t=null;function rc(e,t){let n=e.toLowerCase(),s=t.toLowerCase(),a=s.lastIndexOf("/")+1,o=0,r=0,i=0,l=[];for(let c of n){if(c===" ")continue;let d=s.indexOf(c,o);if(d<0)return null;i=d===o?i+1:0,r+=1+i*2+(d===0||"/._-".includes(s[d-1])?3:0)+(d>=a?2:0),l.push(d),o=d+1}return s.slice(a).startsWith(n)&&(r+=10),{total:r-t.length*.02,hits:l}}async function Ss(){if(k("qo"))return;let e=document.createElement("div");e.id="qo",e.className="modal-back",e.innerHTML=`<div class="modal qo" role="dialog" aria-label="Go to a file"><label class="qo-in">${g("search")}<input id="qo-in" placeholder="Go to a file or folder\u2026" autocomplete="off" spellcheck="false" enterkeyhint="go"></label><div id="qo-list" class="qo-list"><p class="note">Loading\u2026</p></div><div class="qo-foot faint">\u2191\u2193 to move \xB7 Enter to open \xB7 Esc to close \xB7 type <b>?</b> then words to search inside files</div></div>`,document.body.append(e);let t=k("qo-in"),n=k("qo-list");t.focus();let s=()=>e.remove();if(e.onclick=l=>l.target===e&&s(),!_t){let l=(await E("api/files")).files,c=new Set;for(let d of l)for(let u=Me(d);u&&!c.has(u);u=Me(u))c.add(u);_t=[...l,...[...c].map(d=>d+"/")]}let a=[],o=0,r=()=>{let l=t.value.trim();if(l.startsWith("?")){a=l.length>1?[{search:l.slice(1).trim()}]:[],n.innerHTML=a.length?`<button class="qo-item on" data-i="0">${g("search",16)} Search everywhere for \u201C${p(a[0].search)}\u201D</button>`:'<p class="note">Type what to search for.</p>',o=0;return}l?a=_t.map(c=>({p:c,s:rc(l,c)})).filter(c=>c.s).sort((c,d)=>d.s.total-c.s.total).slice(0,60).map(c=>({p:c.p,hits:c.s.hits})):a=_t.filter(c=>!c.endsWith("/")).slice(0,60).map(c=>({p:c,hits:[]})),o=Math.min(o,Math.max(0,a.length-1)),n.innerHTML=a.length?a.map((c,d)=>{let u=new Set(c.hits),$=[...c.p].map((b,w)=>u.has(w)?`<b>${p(b)}</b>`:p(b)).join(""),h=c.p.endsWith("/"),m=ze(h?c.p.slice(0,-1):c.p,h?"folder":"file");return`<button class="qo-item${d===o?" on":""}${m?" s-"+m:""}" data-i="${d}">${g(h?"folder":"file",16)}<span class="nm">${$}</span>${de(m,h)}</button>`}).join(""):'<p class="note">No file matches. Start with ? to search inside files.</p>',n.querySelector(".on")?.scrollIntoView({block:"nearest"})},i=l=>{let c=a[l];c&&(s(),c.search?se({m:"search",q:c.search}):c.p.endsWith("/")?se({folder:c.p.slice(0,-1)}):location.hash=Q(c.p))};t.oninput=ne(()=>{o=0,r()},30),t.onkeydown=l=>{l.key==="ArrowDown"||l.key==="ArrowUp"?(l.preventDefault(),o=Math.max(0,Math.min(a.length-1,o+(l.key==="ArrowDown"?1:-1))),n.querySelectorAll(".qo-item").forEach((c,d)=>c.classList.toggle("on",d===o)),n.querySelector(".on")?.scrollIntoView({block:"nearest"})):l.key==="Enter"?(l.preventDefault(),i(o)):l.key==="Escape"&&(l.preventDefault(),s())},n.onclick=l=>{let c=l.target.closest("[data-i]");c&&i(Number(c.dataset.i))},r()}var Be="",xn=()=>Be="",Ge=R("sort")||"name",ic=new Set(["ts","tsx","js","mjs","cjs","jsx","md","mdx","json","css","scss","html","vue","py","rs","go"]),lc={png:"image",jpg:"image",jpeg:"image",gif:"image",webp:"image",svg:"image",mp3:"music",wav:"music",ogg:"music",mp4:"video",webm:"video",mov:"video",csv:"table",tsv:"table",pdf:"book",zip:"layers",gz:"layers"};function cc(e,t){if(e.type==="folder")return`<span class="ico folder">${g("folder",18)}</span>`;let n=Z(e.name);return Xe.has(n)&&e.size<4*1048576&&!e.ghost?`<span class="ico"><img loading="lazy" src="${B(W(t,e.name))}" alt=""></span>`:ic.has(n)?`<span class="ico lang-${n}"><span class="ext">${p(n.slice(0,4))}</span></span>`:`<span class="ico">${g(lc[n]||"file",18)}</span>`}function ze(e,t){return t==="folder"?v.folderStates.get(e)||(Ce(e)?"ignored":""):v.changes.get(e)?.state||(Ce(e)?"ignored":"")}function de(e,t){return!e||e==="ignored"&&!t?"":t?e==="ignored"?"":`<span class="dot s-${e}" title="Something inside is ${Ae[e].toLowerCase()}"></span>`:`<span class="badge s-${e}" title="${Ae[e]}">${an[e]||"\xB7"}</span>`}function dc(e){let t=(n,s)=>(s.type==="folder")-(n.type==="folder");return Ge==="size"?[...e].sort((n,s)=>t(n,s)||s.size-n.size):Ge==="mtime"?[...e].sort((n,s)=>t(n,s)||s.mtime-n.mtime):e}function pc(e,t){if(e.length<=300)return e.join("");let n=[];for(let s=0;s<e.length;s+=200)n.push(`<div class="rblock" style="contain-intrinsic-size:auto ${Math.min(200,e.length-s)*t}px">${e.slice(s,s+200).join("")}</div>`);return n.join("")}var Ls=new Map;async function yn(e){let{folder:t,open:n,view:s}=q(),a;try{a=await ot(t)}catch(L){e.innerHTML=`<p class="empty">${p(L.message)}</p>`;return}let o=[...v.changes.values()].filter(L=>L.state==="deleted"&&(L.path.includes("/")?L.path.slice(0,L.path.lastIndexOf("/")):"")===t).map(L=>({name:L.path.slice(L.path.lastIndexOf("/")+1),type:"file",size:0,mtime:0,ghost:!0})).filter(L=>!a.some(I=>I.name===L.name)),r=[...a,...o];v.settings.ignored==="hide"&&(r=r.filter(L=>!Ce(W(t,L.name))));let i=r.filter(L=>Xe.has(Z(L.name))).length,l=s?s==="grid":i>=4&&i>=r.length/2,c=dc(Be?r.filter(L=>L.name.toLowerCase().includes(Be)):r),d=t?t.split("/"):[],u=[`<button class="crumb${d.length?"":" current"}" data-f="">${p(v.info.name)}</button>`,...d.map((L,I)=>`<span class="sep">/</span><button class="crumb${I===d.length-1?" current":""}" data-f="${p(d.slice(0,I+1).join("/"))}">${p(L)}</button>`)].join(""),$=r.filter(L=>L.type==="folder").length,h=L=>{let I=W(t,L.name),z=L.ghost?"deleted":ze(I,L.type),V=on(I);return`<button class="${["row",L.name===n?"open":"",z?"s-"+z:"",L.ghost?"ghost":""].filter(Boolean).join(" ")}" data-e="${p(L.name)}" data-k="${L.type}" title="${p(L.name)}${z?" \xB7 "+Ae[z]:""}">${cc(L,t)}<span class="nm">${p(L.name)}${L.link?' <span class="faint">\u21AA</span>':""}</span><span class="marks">${V?`<span class="pill warn">${g("chat",12)}${V}</span>`:""}${de(z,L.type==="folder")}</span><span class="sz">${L.type==="folder"||L.ghost?"":Tt(L.size)}</span><span class="tm">${L.ghost?"deleted":D(L.mtime)}</span></button>`},m=L=>{let I=W(t,L.name),z=Z(L.name),V=L.ghost?"deleted":ze(I,L.type),Y=L.type==="folder"?g("folder",34):Xe.has(z)&&!L.ghost?`<img loading="lazy" src="${B(I)}" alt="">`:`<span class="ext">.${p(z||"file")}</span>`;return`<button class="tile${L.name===n?" open":""}${V?" s-"+V:""}" data-e="${p(L.name)}" data-k="${L.type}" title="${p(L.name)}"><div class="thumb">${Y}${de(V,L.type==="folder")}</div><div class="nm">${p(L.name)}</div></button>`},b=c.length?l?`<div class="grid">${c.map(m).join("")}</div>`:`<div class="rows">${pc(c.map(h),40)}</div>`:`<p class="empty">${Be?"Nothing matches.":"Nothing in this folder."}</p>`,w=a.find(L=>/^readme(.md|.markdown|.txt)?$/i.test(L.name)&&L.type==="file"),x=(t?d[d.length-1]:v.info.name)+".zip",y=`<nav class="crumbs" aria-label="Folder trail">${u}</nav>
155
+ <a class="icon-btn" href="${ae(`api/zip?p=${encodeURIComponent(t)}`)}" download="${p(x)}" title="Download this folder as a .zip" aria-label="Download this folder as a .zip">${g("download")}</a>`,S=`<span class="seg"><button class="btn${l?"":" on"}" data-v="list" title="List" aria-label="List">${g("list",16)}</button><button class="btn${l?" on":""}" data-v="grid" title="Thumbnails" aria-label="Thumbnails">${g("grid",16)}</button></span>
156
+ <select class="btn" id="sort" aria-label="Sort by"><option value="name"${Ge==="name"?" selected":""}>Name</option><option value="mtime"${Ge==="mtime"?" selected":""}>Newest</option><option value="size"${Ge==="size"?" selected":""}>Largest</option></select>
157
+ <button class="btn" id="search-here" title="Search inside this folder">${g("search",16)}<span class="hide-sm">Search here</span></button>`,M=w&&!n?`<section class="card readme"><div class="card-head">${g("book",16)} ${p(w.name)}</div><article class="md" id="readme"></article></section>`:"",C=e.querySelector(":scope > .folder-page"),A=C&&C.dataset.folder===t&&k("filter"),H=M?W(t,w.name)+"@"+w.mtime:"";if(A){C.querySelector(".f-head").innerHTML=y,C.querySelector(".f-tools").innerHTML=S,C.querySelector(".f-meta").textContent=`${$} folders \xB7 ${r.length-$} files`,C.querySelector(".f-body").innerHTML=b;let L=C.querySelector(".f-readme");L.dataset.key!==H&&(L.dataset.key=H,L.innerHTML=M)}else{e.innerHTML=`<div class="folder-page" data-folder="${p(t)}"><header class="head f-head">${y}</header>
158
+ <div class="head"><input class="filter" id="filter" type="search" placeholder="Filter this folder" value="${p(Be)}" aria-label="Filter this folder" autocomplete="off" spellcheck="false" enterkeyhint="go">
159
+ <div class="tools f-tools">${S}</div>
160
+ <span class="meta f-meta">${$} folders \xB7 ${r.length-$} files</span></div>
161
+ <div class="f-body">${b}</div>
162
+ <div class="f-readme" data-key="${p(H)}">${M}</div></div>`;let L=k("filter");L.oninput=()=>{Be=L.value.toLowerCase(),yn(e)},L.onkeydown=I=>{I.key==="Enter"&&e.querySelector(".f-body [data-e]")?.click()}}if(k("sort").onchange=L=>{Ge=L.target.value,R("sort",Ge),yn(e)},k("search-here").onclick=()=>vn("here"),w&&!n&&!k("readme")?.childElementCount){let L=W(t,w.name),I=L+"@"+w.mtime,z=V=>{let Y=k("readme");!Y||q().folder!==t||(/\.txt$/i.test(w.name)||!/\./.test(w.name)?Y.innerHTML=`<pre>${p(V)}</pre>`:le(Y,String(V),t))};Ls.has(I)?z(Ls.get(I)):(k("readme").innerHTML='<div class="skeleton" style="width:50%"></div>',E(B(L)).then(V=>{Ls.set(I,String(V)),z(String(V))}).catch(V=>{let Y=k("readme");Y&&(Y.innerHTML=`<p class="note">${p(V.message)}</p>`)}))}}function go(e){e.addEventListener("click",t=>{let n=t.target,s=n.closest("[data-f]"),a=n.closest("[data-e]"),o=n.closest("[data-v]"),r=q();s?(Be="",se({folder:s.dataset.f})):o?_({view:o.dataset.v}):a&&(a.dataset.k==="folder"?(Be="",se({folder:W(r.folder,a.dataset.e)})):se({folder:r.folder,open:a.dataset.e}))})}var xe=new Set([""]),bo=null,$o=()=>"open:"+v.project;function uc(){if(bo!==v.project){bo=v.project;try{xe=new Set(JSON.parse(R($o())||'[""]'))}catch{xe=new Set([""])}}}function wo(e,t,n){let s=xe.has(e),a=s&&v.cache.has(e)?v.cache.get(e).filter(i=>i.type==="folder"):[];v.settings.ignored==="hide"&&(a=a.filter(i=>!Ce(W(e,i.name))));let o=e?ze(e,"folder"):"",r=e?on(e):0;return`<li><div class="item"><button class="twist" data-t="${p(e)}" aria-expanded="${s}" aria-label="${s?"Close":"Open"} ${p(t)}">${g("chevron-right",14)}</button><button class="node${n===e?" chosen":""}${o?" s-"+o:""}" data-c="${p(e)}">${g(s?"folder-open":"folder",16)}<span class="nm">${p(t)}</span>${r?`<span class="pill warn">${r}</span>`:""}${de(o,!0)}</button></div>${s?`<ul class="level">${a.map(i=>wo(W(e,i.name),i.name,n)).join("")}</ul>`:""}</li>`}async function ft(){uc();let e=q().folder,t=e?e.split("/"):[];for(let n=0;n<=t.length;n++)xe.add(t.slice(0,n).join("/"));await Promise.all([...xe].map(n=>ot(n).catch(()=>xe.delete(n)))),R($o(),JSON.stringify([...xe])),k("tree").innerHTML=wo("",v.info.name,e),k("tree").querySelector(".chosen")?.scrollIntoView({block:"nearest"})}function ko(){k("tree").addEventListener("click",e=>{let t=e.target.closest("[data-t]"),n=e.target.closest("[data-c]");if(t){let s=t.dataset.t;xe.has(s)?xe.delete(s):xe.add(s),ft()}else n&&(xn(),se({folder:n.dataset.c}))})}var Es=e=>Xe.has(Z(e))||Z(e)==="svg",Ts=["conflict","modified","renamed","added","new","deleted"];function Bt(){let e=v.git;if(!e)return"";let t=[e.ahead?`\u2191${e.ahead}`:"",e.behind?`\u2193${e.behind}`:""].filter(Boolean).join(" ");return`<span class="branch" title="${p(e.upstream?`Tracking ${e.upstream}`:"No upstream")}">${g("git-branch",14)}${p(e.branch||"detached")}${e.head?` <span class="faint">${p(e.head)}</span>`:""}${t?` <span class="sync">${t}</span>`:""}</span>`}function Hs(e){let t=v.git?.changes.length||0;return`<div class="tabs gtabs"><button class="btn${e==="changes"?" on":""}" data-gt="changes">Uncommitted${t?` <span class="count-pill">${t}</span>`:""}</button><button class="btn${e==="history"?" on":""}" data-gt="history">${g("clock",14)} History</button></div>`}function Rs(e){e.querySelectorAll("[data-gt]").forEach(t=>t.onclick=()=>se({folder:q().folder,m:t.dataset.gt}))}var xo=e=>e.innerHTML='<p class="empty">This folder isn\u2019t in a git repository, so there are no changes to show.</p>';async function So(e){let t=v.git;if(!t)return xo(e);let s=q().q==="all",a={};for(let c of t.changes)a[c.state]=(a[c.state]||0)+1;let o=[...t.changes].sort((c,d)=>Ts.indexOf(c.state)-Ts.indexOf(d.state)||c.path.localeCompare(d.path)),r=t.changes.reduce((c,d)=>c+(d.add||0),0),i=t.changes.reduce((c,d)=>c+(d.del||0),0),l=Ts.filter(c=>a[c]).map(c=>`<span class="legend">${de(c)} ${a[c]} ${Ae[c].toLowerCase()}</span>`).join("");if(e.innerHTML=`<header class="head"><h2 class="page-title">${g("diff")} Changes</h2>${Bt()}</header>
163
+ ${Hs("changes")}
164
+ ${o.length?`<div class="head"><span class="meta"><span class="plus">+${r}</span> <span class="minus">\u2212${i}</span> in ${o.length} files</span>${l}<span class="grow"></span>
165
+ <button class="btn${s?"":" on"}" data-cv="">Files</button><button class="btn${s?" on":""}" data-cv="all">All diffs</button></div>
166
+ <div class="rows">${o.map(c=>Lo(c,Q(c.path,{tab:"diff"}),c.staged)).join("")}</div>
167
+ ${s?'<div id="all-diffs"></div>':""}`:'<p class="empty">Nothing has changed since the last commit. \u2728</p>'}`,Rs(e),e.querySelectorAll("[data-cv]").forEach(c=>c.onclick=()=>_({q:c.dataset.cv})),!!o.length){if(!s){for(let c of o.slice(0,ht)){let d="api/git/diff?p="+encodeURIComponent(c.path);Es(c.path)||E(d).then(u=>qs.set(d,u)).catch(()=>{})}return}To(e.querySelector("#all-diffs"),o,{url:c=>"api/git/diff?p="+encodeURIComponent(c.path),link:c=>Q(c.path,{tab:"diff"}),comments:!v.info.readOnly,key:"now",picture:c=>Es(c.path)&&{before:c.state==="new"||c.state==="added"?"":ae(`api/git/raw?p=${encodeURIComponent(c.from||c.path)}`),after:c.state==="deleted"?"":B(c.path)}})}}function Lo(e,t,n){return`<a class="row s-${e.state}" href="${t}"><span class="ico">${g(e.state==="deleted"?"trash":"file",18)}</span><span class="nm">${nt(e.path)}${e.from?` <span class="faint">\u2190 ${nt(e.from)}</span>`:""}</span><span class="marks">${n?'<span class="pill" title="Staged">staged</span>':""}${de(e.state)}</span><span class="sz">${e.add!==void 0?`<span class="plus">+${e.add}</span> <span class="minus">\u2212${e.del||0}</span>`:""}</span><span class="tm">${Ae[e.state]}</span></a>`}var ht=50,Sn=new Map;function To(e,t,n){let s=t.length,a=Sn.get(n.key)||{page:0,all:!1};Sn.set(n.key,a),a.page=Math.min(a.page,Math.max(0,Math.ceil(s/ht)-1));let o=r=>{let i=a.all?0:a.page*ht,l=a.all?s:Math.min(s,i+ht),c=s<=ht?"":`<div class="pager">${a.all?`<span class="meta">All ${s.toLocaleString()} files</span>`:`<button class="btn small" data-pg="-1"${a.page?"":" disabled"}>${g("chevron-left",14)}<span class="hide-sm"> Previous</span></button><span class="meta">Files ${i+1}\u2013${l} of ${s.toLocaleString()}</span><button class="btn small" data-pg="1"${l<s?"":" disabled"}><span class="hide-sm">Next </span>${g("chevron-right",14)}</button>`}<span class="grow"></span><button class="btn small${a.all?" on":""}" data-pg="all" aria-pressed="${a.all}" title="${a.all?"Show 50 files at a time":"Show every file\u2019s diff on one page (slow with hundreds)"}">View all</button></div>`;e.innerHTML=`${c}<div class="pdiffs"></div>${c}`,hc(e.querySelector(".pdiffs"),t.slice(i,l),n),e.querySelectorAll("[data-pg]").forEach(d=>d.onclick=()=>{d.dataset.pg==="all"?a.all=!a.all:a.page+=Number(d.dataset.pg),o(!0)}),r&&e.scrollIntoView({block:"start"})};o(!1)}function fc(e,t){let n=Sn.get(e)||{page:0,all:!1};n.all||(n.page=Math.floor(t/ht)),Sn.set(e,n)}function hc(e,t,{url:n,link:s,comments:a,key:o,picture:r}){let i=d=>o+":"+d.path;e.innerHTML=`<div class="diffs-bar"><span class="faint">${a?"Tap a line number to comment on that line.":""}</span><span class="grow"></span><button class="btn small" data-fold="all"></button></div>`;for(let d of t){let u=document.createElement("section"),$=zt.has(i(d));u.className="diff-file"+($?" folded":""),u.dataset.path=d.path,u.dataset.fk=i(d),u.innerHTML=`<h3 class="group-title"><button class="mini fold" data-fold="one" aria-expanded="${!$}" title="Collapse or expand" aria-label="Collapse or expand ${p(d.path)}">${g("chevron-down",16)}</button><a href="${s(d)}">${nt(d.path)}</a>${de(d.state)}${d.add!==void 0?`<span class="sz faint"><span class="plus">+${d.add}</span> <span class="minus">\u2212${d.del||0}</span></span>`:""}<span class="ncom"></span><span class="grow"></span>${a?`<button class="mini" data-fcom title="Comment on the whole file" aria-label="Comment on ${p(d.path)}">${g("chat",14)}<span class="hide-sm"> Comment</span></button>`:""}</h3><div class="fold-body"><div class="fthreads"></div><div class="dbody"></div></div>`,e.append(u),a&&Mo(u);let h=u.querySelector(".dbody"),m=r?.(d);if(m){h.innerHTML=`<div class="compare">${m.before?`<figure><figcaption>Before</figcaption><div class="stage"><img src="${m.before}" alt="Before" loading="lazy"></div></figure>`:""}${m.after?`<figure><figcaption>${m.before?"After":"Added"}</figcaption><div class="stage"><img src="${m.after}" alt="After" loading="lazy"></div></figure>`:"<figure><figcaption>Deleted</figcaption></figure>"}</div>`;continue}let b=n(d),w=qs.get(b),x=y=>_e(h,y,d.path,{comments:a,caption:d.path});w!==void 0?x(w):h.innerHTML='<p class="note">Loading\u2026</p>',!(w!==void 0&&o!=="now")&&E(b).then(y=>{qs.set(b,y),y!==w&&h.isConnected&&x(y)}).catch(y=>{w===void 0&&(h.innerHTML=`<p class="note">${p(y.message)}</p>`)})}let l=e.querySelector('[data-fold="all"]'),c=()=>{let d=t.some(u=>!zt.has(i(u)));l.innerHTML=`${g(d?"chevron-right":"chevron-down",14)} ${d?"Collapse all":"Expand all"}`,l.dataset.to=d?"collapse":"expand"};c(),e.onclick=d=>{let u=d.target.closest("[data-fold], [data-fcom]");if(u){if(u.dataset.fold==="all"){let $=u.dataset.to==="collapse";for(let h of e.querySelectorAll(".diff-file"))Ms(h,$)}else if(u.dataset.fold==="one"){let $=u.closest(".diff-file");Ms($,!$.classList.contains("folded"))}else{let $=u.closest(".diff-file");Ms($,!1);let h=$.querySelector(".fthreads");h.querySelector(".composer")||h.insertAdjacentHTML("beforeend",ve($.dataset.path,0,0)),h.querySelector(".composer textarea").focus()}c()}}}var qs=new Map,zt=new Set(JSON.parse(mc("folded")||"[]"));function mc(e){try{return sessionStorage.getItem("folderview:"+e)}catch{return null}}function Ms(e,t){e.classList.toggle("folded",t),e.querySelector('[data-fold="one"]').setAttribute("aria-expanded",String(!t)),t?zt.add(e.dataset.fk):zt.delete(e.dataset.fk);try{sessionStorage.setItem("folderview:folded",JSON.stringify([...zt]))}catch{}}function Mo(e){let t=e.dataset.path,n=t.includes("/")?t.slice(0,t.lastIndexOf("/")):"",s=e.querySelector(".fthreads"),a=s.querySelector(".composer");s.innerHTML=Ht(t,n),a&&s.append(a);let o=ie(t).filter(r=>r.status==="open").length;e.querySelector(".ncom").innerHTML=o?`<span class="pill warn" title="Open comments">${g("chat",12)} ${o}</span>`:""}function Co(e){for(let t of e.querySelectorAll("#all-diffs .diff-file"))t.querySelector(".fthreads")&&(Mo(t),Ot(t.querySelector(".diff")))}var js={local:["arrow-up","Not pushed","Only in this copy: not pushed yet"],pushed:["check","Pushed","On a remote"],incoming:["arrow-down","Not pulled","On the upstream, not pulled here yet"],unknown:["","",""]};function Cs(e){let[t,n,s]=js[e.state];return`<a class="commit s-${e.state}" href="${p(Is(e.hash))}"><code>${p(e.hash)}</code><span class="subj">${p(e.subject)}</span><span class="faint">${p(e.author)} \xB7 ${D(e.time)}</span>${n?`<span class="push ${e.state}" title="${s}">${g(t,12)}<span class="hide-sm"> ${n}</span></span>`:""}</a>`}var Is=e=>ue({folder:q().folder,m:"history",q:e}),re=null,Ao=()=>matchMedia("(max-width: 759px)").matches?document.scrollingElement:document.getElementById("main");async function Eo(e){if(!v.git)return xo(e);let t=q().q;if(t)return bc(e,t);let n=re?.find||"";e.innerHTML=`<header class="head"><h2 class="page-title">${g("diff")} Changes</h2>${Bt()}</header>${Hs("history")}
168
+ <div class="hist-find"><input class="filter" id="hist-q" type="search" placeholder="Find a commit: words from its message, or a hash" value="${p(n)}" aria-label="Find a commit"></div>
169
+ <div id="hist"><div class="skeleton" style="width:60%"></div></div>`,Rs(e);let s=e.querySelector("#hist-q"),a=0;if(s.oninput=()=>{clearTimeout(a),a=setTimeout(()=>vo(e,s.value.trim()),300)},re&&re.head===v.git.head&&re.find===n){qo(e);let o=re.scroll||0;requestAnimationFrame(()=>Ao().scrollTop=o)}else await vo(e,n)}async function vo(e,t){let n=e.querySelector("#hist");try{let s=await E("api/git/history"+(t?"?q="+encodeURIComponent(t):""));if(!n.isConnected)return;re={head:v.git.head,find:t,...s}}catch(s){n.innerHTML=`<p class="note">${p(s.message)}</p>`;return}qo(e)}function qo(e){let t=re,n=e.querySelector("#hist");if(!n)return;let s=t.find?`${t.commits.length}${t.more?"+":""} ${t.commits.length===1&&!t.more?"commit matches":"commits match"}.`:t.remotes?[t.upstream?`Tracking <code>${p(t.upstream)}</code>.`:"No upstream branch.",t.localTotal&&t.localTotal!=="0"?`${t.localTotal} not pushed.`:"Everything is pushed.",t.incomingTotal?`${t.incomingTotal} not pulled yet${t.incomingTotal>t.incoming.length?` (the newest ${t.incoming.length} below)`:""}.`:""].filter(Boolean).join(" "):"No remote: nothing here has been pushed anywhere.";n.innerHTML=`<p class="meta hist-sum">${s}</p>
170
+ ${!t.find&&t.incoming.length?`<h3 class="group-title">${g("arrow-down",14)} Not pulled yet</h3><div class="commits">${t.incoming.map(Cs).join("")}</div><h3 class="group-title">This branch</h3>`:""}
171
+ ${t.commits.length?`<div class="commits" id="hist-list">${t.commits.map(Cs).join("")}</div>`:`<p class="empty">${t.find?"No commit matches that.":"No commits yet."}</p>`}
172
+ <div id="hist-more-box">${t.more?'<button class="btn" id="hist-more">Show more</button>':""}</div>`,n.onclick=i=>{i.target.closest("a.commit")&&(re.scroll=Ao().scrollTop)};let a=n.querySelector("#hist-more");if(!a)return;let o=async()=>{if(a.disabled||re!==t)return;a.disabled=!0,a.textContent="Loading\u2026";let i=await E(`api/git/history?skip=${t.commits.length}${t.find?"&q="+encodeURIComponent(t.find):""}`).catch(()=>null);if(re!==t||!a.isConnected||(a.disabled=!1,a.textContent="Show more",!i))return;let l=new Set(t.commits.map(d=>d.full)),c=i.commits.filter(d=>!l.has(d.full));t.commits.push(...c),t.more=i.more,n.querySelector("#hist-list")?.insertAdjacentHTML("beforeend",c.map(Cs).join("")),t.more?a.getBoundingClientRect().top<innerHeight+600&&o():(r.disconnect(),a.remove())};a.onclick=o;let r=new IntersectionObserver(i=>i.some(l=>l.isIntersecting)&&o(),{rootMargin:"600px"});r.observe(a)}var gc=120,As=1e3,yo=new Map;async function bc(e,t){e.innerHTML=`<header class="head"><h2 class="page-title">${g("diff")} Changes</h2>${Bt()}</header>${Hs("history")}<div id="commit"><div class="skeleton" style="width:60%"></div></div>`,Rs(e);let n=yo.get(t);if(!n)try{n=await E("api/git/commit-info?h="+encodeURIComponent(t)),yo.set(t,n)}catch(u){e.querySelector("#commit").innerHTML=`<p class="note">${p(u.message)}</p>`;return}if(q().q!==t)return;let s=n.commit,a=re&&[...re.commits,...re.incoming].find(u=>u.full===s.full),[o,r,i]=a?js[a.state]:js.unknown,l=q().show?q().show==="all":n.files.length<=gc,c=n.files.reduce((u,$)=>u+($.add||0),0),d=n.files.reduce((u,$)=>u+($.del||0),0);e.querySelector("#commit").innerHTML=`<div class="commit-card">
173
+ <div class="commit-top"><a class="btn small" href="${p(Is(""))}">${g("chevron-left",14)} History</a><code class="hash" title="${p(s.full)}">${p(s.hash)}</code>${r?`<span class="push ${a.state}" title="${i}">${g(o,12)} ${r}</span>`:""}</div>
174
+ <h3 class="commit-subj">${p(s.subject)}</h3>
175
+ ${s.body?`<pre class="commit-body">${p(s.body)}</pre>`:""}
176
+ <p class="meta">${p(s.author)} \xB7 ${new Date(s.time).toLocaleString()} (${D(s.time)})${s.parents.length>1?` \xB7 merge of ${s.parents.map(u=>`<code>${p(u.slice(0,7))}</code>`).join(" + ")}, shown against the first`:""}</p>
177
+ </div>
178
+ ${n.files.length?`<div class="head"><span class="meta"><span class="plus">+${c}</span> <span class="minus">\u2212${d}</span> in ${n.files.length} files</span><span class="grow"></span><button class="btn${l?"":" on"}" data-cv="files">Files</button><button class="btn${l?" on":""}" data-cv="all">All diffs</button></div>
179
+ ${l?"":`<div class="rows">${n.files.slice(0,As).map(u=>Lo(u,p(Is(t)),!1)).join("")}</div>${n.files.length>As?`<p class="note">Showing the first ${As.toLocaleString()} of ${n.files.length.toLocaleString()} files.</p>`:""}`}
180
+ ${l?'<div id="all-diffs"></div>':""}`:'<p class="empty">This commit changed nothing in this folder.</p>'}`,e.querySelectorAll("[data-cv]").forEach(u=>u.onclick=()=>_({show:u.dataset.cv})),e.querySelectorAll(".rows .row").forEach((u,$)=>{u.onclick=h=>{h.preventDefault(),fc(s.full,$);let m=n.files[$].path;_({show:"all"}),requestAnimationFrame(()=>e.querySelector(`#all-diffs .diff-file[data-path="${CSS.escape(m)}"]`)?.scrollIntoView({block:"start"}))}}),!(!l||!n.files.length)&&To(e.querySelector("#all-diffs"),n.files,{url:u=>`api/git/commit-diff?h=${encodeURIComponent(s.full)}&p=${encodeURIComponent(u.path)}${u.from?"&from="+encodeURIComponent(u.from):""}`,link:u=>Q(u.path,{tab:"history"}),comments:!1,key:s.full,picture:u=>Es(u.path)&&{before:u.state==="added"||!s.parents[0]?"":ae(`api/git/raw?p=${encodeURIComponent(u.from||u.path)}&rev=${s.parents[0]}`),after:u.state==="deleted"?"":ae(`api/git/raw?p=${encodeURIComponent(u.path)}&rev=${s.full}`)}})}var Ft=matchMedia("(max-width: 759px)"),jo=e=>Ft.matches?document.scrollingElement:e,Io=new Map,Ln="",pe=!1,mt=matchMedia("(min-width: 1000px)"),Os=matchMedia("(min-width: 1280px)");function $c(){let{open:e}=q(),t=k("app");t.classList.remove("page"),t.classList.toggle("rail",mt.matches),t.classList.toggle("split",!!e&&Os.matches),k("main").hidden=!!e&&!Os.matches,k("file").hidden=!e}var Dt="";async function Tn(e=!1){let t=q(),n=JSON.stringify([v.project,t.folder,t.m,t.q,t.show,t.scope,t.opts,t.inc,t.view,t.open]);if(!e&&n===Dt)return;let s=n===Dt?jo(k("main")).scrollTop:0;Dt=n;let a=k("main");Wt(a)||(t.m==="search"&&t.q?await ho(a):t.m==="changes"?await So(a):t.m==="history"?await Eo(a):t.m==="review"?ut(a,t.q,o=>_({q:o})):await yn(a),Ft.matches&&t.open||(jo(a).scrollTop=s))}var Wt=e=>{let t=document.activeElement;return t&&t.tagName==="TEXTAREA"&&e.contains(t)&&t.value.trim()};function Kt(){k("branch").innerHTML=pe?Bt():"";let e=v.git?v.git.changes.length:0;k("changes-count").textContent=String(e),k("changes-count").hidden=!e,k("changes-btn").hidden=!v.info.git,us()}async function Ut(){let e=!pe;pe=!0,document.body.dataset.view="files",e&&(Dt="");let t=q();Ft.matches&&t.open&&!Ln&&Io.set(t.folder,document.scrollingElement.scrollTop);let n=Ft.matches&&!t.open&&Ln;Ln=t.open,$c(),await Tn(n||e),t.open?wn(k("file")):vs(),n&&(document.scrollingElement.scrollTop=Io.get(t.folder)||0),mt.matches&&ft(e),Kt(),document.title=`${t.open||(t.m==="search"?"\u201C"+t.q+"\u201D":t.folder.split("/").pop()||v.info.name)} \u2014 hitl`}function Ns(){if(!pe)return;pe=!1,Ln="",Dt="",vs(),k("file").hidden=!0,k("main").hidden=!1,k("branch").innerHTML="";let e=k("app");e.classList.remove("rail","split"),e.classList.add("page")}async function Ho(){await Promise.all([Qn(),Mt()]),Kt()}async function Ro(e){for(let s of e.folders)v.cache.delete(s);if(e.files.length&&mo(),e.git&&await Qn(),Kt(),!pe)return;let t=q(),n=t.open?(t.folder?t.folder+"/":"")+t.open:"";(t.m==="changes"||t.m==="history"?e.git:!t.m&&(e.folders.includes(t.folder)||e.git))&&await Tn(!0),n&&e.files.includes(n)&&wn(k("file"),!0),mt.matches&&ft()}async function Oo(){await Mt(),$e("comments")}Fe("comments",()=>{if(us(),!pe)return;uo(k("file"));let e=q();e.m==="review"||!e.m?Tn(!0):e.m==="changes"&&Co(k("main")),mt.matches&&ft()});Fe("settings",()=>{pe&&(Tn(!0),q().open&&wn(k("file"),!0),mt.matches&&ft())});addEventListener("keydown",e=>{if(!pe)return;let t=/^(INPUT|TEXTAREA|SELECT)$/.test(document.activeElement?.tagName||"");(e.ctrlKey||e.metaKey)&&(e.key==="p"||e.key==="k")?(e.preventDefault(),Ss()):e.key==="/"&&!t?(e.preventDefault(),vn()):!t&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&q().open&&(e.key==="["||e.key==="]"||k("picwrap")&&(e.key==="ArrowLeft"||e.key==="ArrowRight"))?(e.preventDefault(),Nt(e.key==="["||e.key==="ArrowLeft"?-1:1)):e.key==="Escape"&&!t&&!k("qo")&&q().open?_({open:"",tab:"",line:""}):e.key==="Escape"&&document.activeElement===k("q")&&k("q").blur()});function wc(){let e=Number(R("tree"))||280;k("app").style.setProperty("--tree",e+"px"),k("splitter").onpointerdown=t=>{t.preventDefault();let n=a=>{let o=Math.min(560,Math.max(180,a.clientX));k("app").style.setProperty("--tree",o+"px"),R("tree",String(o))},s=()=>{removeEventListener("pointermove",n),removeEventListener("pointerup",s)};addEventListener("pointermove",n),addEventListener("pointerup",s)}}function No(){k("search-icon").innerHTML=g("search",16),k("qo-btn").insertAdjacentHTML("afterbegin",g("file")),k("qo-btn").onclick=()=>Ss(),Ft.addEventListener("change",()=>pe&&Ut()),mt.addEventListener("change",()=>pe&&Ut()),Os.addEventListener("change",()=>pe&&Ut()),ko(),go(k("main")),fo(),wc()}var Po=()=>{xn(),se({folder:""})};var _s=new Set(["png","jpg","jpeg","gif","webp","avif","svg","bmp","ico"]),kc=new Set(["mp4","m4v","webm","ogv","mov"]),vc=new Set(["mp3","wav","ogg","oga","flac","m4a","aac","opus"]),_o=new IntersectionObserver(e=>{for(let t of e){if(!t.isIntersecting)continue;_o.unobserve(t.target);let n=t.target.__draw;delete t.target.__draw,n?.()}},{rootMargin:"600px 0px"});function Ps(e,t){e.__draw=t,_o.observe(e)}function me(e,t="",n=""){let s=document.createElement("div");return s.className="md"+(n?" "+n:""),le(s,e||"",t),s}function Qt(e,t){for(let n of t||[])e.append(zs(n))}function zs(e){let t=xc(e);if(e.collapsed){let n=document.createElement("details");return n.className="blk",n.innerHTML=`<summary>${g("chevron-right",16)}<span>${p(e.title||yc(e))}</span></summary>`,n.append(t),n}if(e.title&&(e.kind==="md"||e.kind==="mermaid"||e.kind==="html"||e.kind==="image")){let n=document.createElement("div");return n.className="blk titled",n.innerHTML=`<div class="blk-title">${p(e.title)}</div>`,n.append(t),n}return t}function yc(e){switch(e.kind){case"file":return e.file+(e.lines?`:${e.lines}`:"");case"code":return e.lang?`Code (${e.lang})`:"Code";case"diff":return"Proposed changes";case"mermaid":return"Diagram";case"image":return e.alt||"Picture";case"html":return"Mockup";case"link":return e.label;default:return"More"}}function xc(e){switch(e.kind){case"md":return me(e.md);case"code":{let n=document.createElement("div");return n.className="blk-code",n.innerHTML=dt(e.code,e.lang,e.title||e.lang||"code"),un(n),n}case"diff":return Lc(e.diff,e.title||"Proposed changes");case"mermaid":{let n=document.createElement("div");return n.className="md-diagram",n.innerHTML='<div class="skeleton" style="width:60%;height:120px"></div>',Ps(n,()=>ke(n,e.mermaid)),n}case"image":{let n=document.createElement("figure");n.className="blk-image";let s=/^(https?:|data:image\/)/i.test(e.image)?e.image:B(e.image.replace(/^\.?\//,""));return n.innerHTML=`<img loading="lazy" alt="${p(e.alt)}" src="${p(s)}" />${e.alt?`<figcaption>${p(e.alt)}</figcaption>`:""}`,n.querySelector("img").onclick=()=>Uo(s,e.alt),n}case"html":{let n=document.createElement("iframe");return n.className="blk-html",n.setAttribute("sandbox",""),n.setAttribute("referrerpolicy","no-referrer"),n.style.height=e.height+"px",n.title=e.title||"Mockup",Ps(n,()=>n.srcdoc="<style>html,body{margin:0;min-height:100%}</style>"+e.html),n}case"link":{let n=document.createElement("a");return n.className="blk-link",n.href=e.link,n.target="_blank",n.rel="noopener noreferrer",n.innerHTML=`${g("external",16)}<span>${p(e.label)}</span><small>${p(Sc(e.link))}</small>`,n}case"file":return Tc(e.file,e.lines,e.title)}let t=document.createElement("p");return t.textContent="(unknown block)",t}var Sc=e=>{try{return new URL(e).host}catch{return""}};function Lc(e,t){let n=document.createElement("figure");n.className="ui-code blk-diff";let s=e.replace(/\r/g,"").replace(/\n$/,"").split(`
181
+ `),a=s.map(i=>{let l="";return i.startsWith("+++")||i.startsWith("---")||i.startsWith("diff ")||i.startsWith("index ")?l="d-file":i.startsWith("@@")?l="d-hunk":i.startsWith("+")?l="d-add":i.startsWith("-")&&(l="d-del"),`<span class="d-line ${l}">${p(i)||" "}</span>`}).join(""),o=s.filter(i=>i.startsWith("+")&&!i.startsWith("+++")).length,r=s.filter(i=>i.startsWith("-")&&!i.startsWith("---")).length;return n.innerHTML=`<figcaption class="cbar"><span class="caption">${p(t)}</span><span class="d-stat"><b class="add">+${o}</b> <b class="del">\u2212${r}</b></span></figcaption><pre class="code diff" tabindex="0"><code>${a}</code></pre>`,n}function Tc(e,t,n){let s=Z(e),a=document.createElement("div");a.className="blk-file";let o=document.createElement("button");o.className="file-head",o.type="button",o.innerHTML=`${g(_s.has(s)?"image":"file",16)}<span class="fp">${p(n||e)}${t?`<span class="fl">:${p(t)}</span>`:""}</span>${g("external",14)}`,o.title="Open full size",o.onclick=()=>Do(e,t);let r=document.createElement("div");return r.className="file-body",r.innerHTML='<div class="skeleton" style="height:64px"></div>',a.append(o,r),Ps(r,()=>zo(r,e,t)),a}async function zo(e,t,n){let s=Z(t),a=B(t);try{if(_s.has(s)){e.innerHTML=`<img class="file-img" loading="lazy" alt="${p(tt(t))}" src="${p(a)}" />`,e.querySelector("img").onclick=()=>Uo(a,t);return}if(kc.has(s))return void(e.innerHTML=`<video controls preload="metadata" src="${p(a)}"></video>`);if(vc.has(s))return void(e.innerHTML=`<audio controls preload="metadata" src="${p(a)}"></audio>`);if(s==="pdf")return void(e.innerHTML=`<a class="blk-link" href="${p(a)}" target="_blank" rel="noopener">${g("file",16)}<span>Open the PDF</span></a>`);if((s==="html"||s==="htm")&&!n){e.innerHTML=`<iframe class="blk-html" sandbox="" src="${p(a)}?as=page" style="height:360px" title="${p(t)}"></iframe>`;return}let o=await E(`api/text?path=${encodeURIComponent(t)}${n?"&lines="+encodeURIComponent(n):""}`);if(e.innerHTML="",(s==="md"||s==="markdown"||s==="mdx")&&!n)e.append(me(o.text,Me(t),"file-md"));else if((s==="mmd"||s==="mermaid")&&!n){let r=document.createElement("div");r.className="md-diagram",e.append(r),ke(r,o.text)}else if((s==="csv"||s==="tsv")&&!n)e.append(Mc(o.text,s==="tsv"?" ":","));else{let r=document.createElement("div"),i=s==="json"||s==="jsonc"?"json":s,l=n?`${t} \xB7 lines ${o.first}\u2013${o.first+o.text.split(`
182
+ `).length-1} of ${o.total}`:t;r.innerHTML=dt(o.text,i,l),un(r),e.append(r)}o.truncated&&e.insertAdjacentHTML("beforeend",'<p class="muted small">Only the start of this file is shown (it is large).</p>')}catch(o){e.innerHTML=`<p class="problem">${p(t)}: ${p(o.message)}</p>`}}function Mc(e,t){let n=Cc(e,t).slice(0,201),s=document.createElement("div");s.className="md md-table-wrap";let[a=[],...o]=n;return s.innerHTML=`<div class="md-table"><table><thead><tr>${a.map(r=>`<th>${p(r)}</th>`).join("")}</tr></thead><tbody>${o.map(r=>`<tr>${r.map(i=>`<td>${p(i)}</td>`).join("")}</tr>`).join("")}</tbody></table></div>${n.length>200?'<p class="muted small">The first 200 rows.</p>':""}`,s}function Cc(e,t){let n=[],s=[],a="",o=!1;for(let r=0;r<e.length;r++){let i=e[r];o?i==='"'&&e[r+1]==='"'?(a+='"',r++):i==='"'?o=!1:a+=i:i==='"'?o=!0:i===t?(s.push(a),a=""):i===`
183
+ `?(s.push(a.replace(/\r$/,"")),n.push(s),s=[],a=""):a+=i}return(a||s.length)&&n.push([...s,a]),n}function Bo(e,t,n=""){let s=document.createElement("div");s.className="modal-back";let a=document.createElement("div");a.className="modal viewer "+n,a.setAttribute("role","dialog"),a.innerHTML=`<header class="viewer-head"><span class="viewer-title">${e}</span><button class="icon-btn" data-close aria-label="Close">${g("x")}</button></header>`;let o=document.createElement("div");o.className="viewer-body",o.append(t),a.append(o),s.append(a);let r=()=>{s.remove(),removeEventListener("keydown",i)},i=l=>l.key==="Escape"&&r();return s.onclick=l=>{(l.target===s||l.target.closest("[data-close]"))&&r()},addEventListener("keydown",i),document.body.append(s),r}function Do(e,t){let n=Z(e),s=document.createElement("div");s.className="file-body full",Bo(`${g("file",16)} ${p(e)}${t?`<span class="fl">:${p(t)}</span>`:""} <a class="mini" href="${p(B(e))}" download="${p(tt(e))}" title="Download">${g("download",16)}</a>`,s,_s.has(n)?"wide":""),zo(s,e,t)}function Uo(e,t){let n=document.createElement("img");n.src=e,n.alt=t||"",n.className="full-img",Bo(p(t||"Picture"),n,"wide")}document.addEventListener("click",e=>{let t=e.target.closest("a[data-file]");t&&(e.preventDefault(),Do(t.dataset.file,t.dataset.lines||""))});function J(e){return e.sections.flatMap(t=>t.questions)}function Le(e,t){for(let n of e.sections)for(let s of n.questions)if(s.id===t)return s}function Fo(e,t){return t?t.status==="answered"?t.picked??[]:t.status==="delegated"&&Array.isArray(e.recommended)?e.recommended:[]:[]}var Se=e=>!!e&&e.status!=="later",He=(e,t)=>!!t&&t.status!=="skipped"&&t.rev!==e.rev;function gt(e,t){let n=new Map(J(e).map(h=>[h.id,h])),s=new Map(e.sections.map(h=>[h.id,h])),a=new Map,o=new Map;for(let h of n.values())for(let m of h.options){for(let b of m.shows)(a.get(b)??a.set(b,[]).get(b))?.push({q:h.id,o:m.id});for(let b of m.hides)(o.get(b)??o.set(b,[]).get(b))?.push({q:h.id,o:m.id})}let r=new Map,i=new Set,l=(h,m)=>{let b=n.get(h);return!!b&&$(h)&&Fo(b,t[h]).includes(m)},c=h=>{let m=n.get(h.question);if(!m||!$(h.question))return!1;let b=t[h.question],w=!!b&&b.status!=="later"&&b.status!=="skipped";if(h.answered!==void 0&&h.answered!==w)return!1;let x=Fo(m,b);if(h.any&&!h.any.some(y=>x.includes(y))||h.all&&!h.all.every(y=>x.includes(y))||h.none&&(!w||h.none.some(y=>x.includes(y))))return!1;if(h.gte!==void 0||h.lte!==void 0){let y=b?.status==="answered"?b.number??NaN:b?.status==="delegated"&&typeof m.recommended=="number"?m.recommended:NaN;if(!Number.isFinite(y)||h.gte!==void 0&&y<h.gte||h.lte!==void 0&&y>h.lte)return!1}return!0},d=(h,m)=>{if(r.has(h))return r.get(h)??!1;if(i.has(h))return!1;i.add(h);let b=h.slice(2),w;return(o.get(b)??[]).some(x=>l(x.q,x.o))?w=!1:(a.get(b)??[]).some(x=>l(x.q,x.o))?w=!0:w=m(),i.delete(h),r.set(h,w),w};function u(h){let m=s.get(h);return m?d("s:"+h,()=>m.showIf?m.showIf.every(c):!m.hidden):!1}function $(h){let m=n.get(h);return!m||!u(m.section)?!1:d("q:"+h,()=>m.showIf?m.showIf.every(c):!m.hidden)}return{question:$,section:u}}function Wo(e,t,n=0){let s=gt(e,t.answers),a=0,o=0,r=0,i=0,l=0,c=0,d=0,u=J(e);for(let m of u){let b=t.answers[m.id];b&&b.seq>t.readSeq&&c++,s.question(m.id)&&(a++,Se(b)?o++:m.priority==="blocking"&&r++,b?.status==="later"&&i++,He(m,b)&&l++,Se(b)&&b?.status!=="skipped"&&!b?.ack&&d++)}let $=0;for(let m of Object.values(t.threads))for(let b of m)b.from==="owner"&&b.seq>t.readSeq&&$++;let h=e.updated;for(let m of Object.values(t.answers))m.at>h&&(h=m.at);return{id:e.id,kind:"questions",title:e.title,from:e.from,status:e.status,total:u.length,visible:a,done:o,toAnswer:a-o,blocking:r,later:i,changed:l,unread:c,unreadMessages:$,unacked:d,updated:h,errors:n}}function Ko(e){return e.recommended===void 0?"":Array.isArray(e.recommended)?e.recommended.map(t=>e.options.find(n=>n.id===t)?.label??t).join("; "):String(e.recommended)+(e.unit?" "+e.unit:"")}function Qo(e){let t=e.recommended;if(t!==void 0){if(e.type==="number"||e.type==="scale")return typeof t=="number"?{status:"answered",number:t}:void 0;if(e.type==="text")return typeof t=="string"&&t?{status:"answered",text:t}:void 0;if(e.type==="rank")return Array.isArray(t)&&t.length===e.options.length?{status:"answered",order:t}:void 0;if(Array.isArray(t)&&t.length)return{status:"answered",picked:e.type==="multi"?t:t.slice(0,1)}}}var Ac={answered:"Answered",delegated:"You decide",skipped:"Skipped",later:"Later"};function Mn(e,t,n={}){let s=document.createElement("article");return s.className="q-card",s.id="q-"+e.id,s.dataset.q=e.id,Bs(s,e,t,n),s}function Vo(e,t,n){return`q-card${n?" q-hidden":""}${t&&t.status!=="later"?" done":""}${e.priority==="blocking"?" blocking":""}${He(e,t)?" stale":""}`}function Zo(e,t,n){let s=[e.priority==="blocking"?`<span class="badge danger">${g("warning",13)}Blocking</span>`:e.priority==="high"?'<span class="badge warn">High</span>':e.priority==="low"?'<span class="badge">Low</span>':"",t?`<span class="badge ${t.status==="later"?"warn":"ok"}">${t.status==="answered"?g("check",13):""}${Ac[t.status]}</span>`:"",He(e,t)?'<span class="badge warn">Changed</span>':"",n?`<span class="badge">${g("eye",13)}Hidden</span>`:""].join("");return`<span class="q-num" title="Question ${e.index+1}">${e.index+1}</span>${e.header?`<span class="q-header">${p(e.header)}</span>`:""}${s}<a class="q-id" href="#" data-link="${p(e.id)}" title="Copy a link to this question">${g("link",12)}${p(e.id)}</a>`}function Yo(e,t,n,s={}){let a=n.answer(t.id);e.className=Vo(t,a,!!s.hidden);let o=e.querySelector(".q-top");o&&(o.innerHTML=Zo(t,a,!!s.hidden))}function Bs(e,t,n,s={}){let a=n.answer(t.id),o=n.thread(t.id),r=He(t,a),i=!!s.hidden;if(e.className=Vo(t,a,i),e.innerHTML=`<div class="q-top">${Zo(t,a,i)}</div>`,e.append(me(t.question,"","q-text")),i&&n.why&&e.insertAdjacentHTML("beforeend",`<p class="q-why-hidden">${g("info",14)}<span>${p(n.why(t.id))}</span></p>`),t.why){let S=document.createElement("div");S.className="q-why",S.innerHTML=`<span class="q-why-icon" aria-hidden="true">${g("info",15)}</span>`,S.append(me(t.why,"")),e.append(S)}if(t.content.length){let S=document.createElement("div");S.className="q-content",Qt(S,t.content),e.append(S)}r&&e.insertAdjacentHTML("beforeend",`<div class="q-stale">${g("warning",16)}<span>This question changed after you answered it. Check your answer${n.readOnly?"":", then keep it or change it"}.</span>${n.readOnly?"":'<button class="btn small" data-act="keep">Keep my answer</button>'}</div>`);let l=document.createElement("div");l.className="q-input",e.append(l);let c=i||n.readOnly;Ec(t,a,l,n,c),a?.ack&&e.insertAdjacentHTML("beforeend",`<div class="q-ack">${g("check",15)}<span><b>Applied</b>${a.ack.note?": "+p(a.ack.note):""}</span></div>`);let d=document.createElement("div");d.className="q-note";let u=!!a?.note;if(d.hidden=!u,t.allowNote){d.innerHTML=`<textarea rows="2" placeholder="A note (anything the agent should know)" ${c?"disabled":""}>${p(a?.note||"")}</textarea>`;let S=d.querySelector("textarea");Je(S);let M=ne(()=>ge(t,n,e,{note:S.value},!0),700);S.addEventListener("input",()=>{Je(S),Te(e,"Saving\u2026"),M()}),e.append(d)}let $=n.unseen?.(t.id)||0,h=document.createElement("footer");h.className="q-acts";let m=c?"disabled":"",b=(S,M,C,A)=>`<button class="seg-btn${a?.status===S?" on":""}" data-act="${S}" title="${p(A)}" aria-pressed="${a?.status===S}" ${m}>${g(M,14)}<span>${C}</span></button>`,w=(S,M,C,A,H="")=>`<button class="act-btn" data-act="${S}" title="${p(A)}" ${S==="thread"?"":m}>${g(M,16)}<span>${C}</span>${H}</button>`,x=Ko(t);h.innerHTML=[`<div class="quick" role="group" aria-label="Instead of answering">${b("delegated","sparkles","You decide",x?`Go with the recommendation: ${x}`:"Let the agent choose")}${b("later","clock","Later","Come back to it")}${b("skipped","x","Skip","Doesn't matter, or you don't know")}</div>`,'<span class="saved" aria-live="polite"></span>',`<span class="acts-more">${t.allowNote&&!u?w("note","pen","Note","Add a note for the agent"):""}${w("thread","chat","Discuss","Ask why, or explain",`${o.length?`<span class="n">${o.length}</span>`:""}${$?'<span class="dot" title="New reply"></span>':""}`)}${a&&!c?w("clear","undo","Clear","Clear the answer"):""}</span>`].join(""),e.append(h);let y=document.createElement("div");y.className="q-thread",y.hidden=!s.threadOpen,qc(y,t,n),e.append(y),e.onclick=S=>{let M=S.target.closest("[data-act]");if(!M||M.disabled)return;let C=M.dataset.act;if(C==="note")d.hidden=!1,M.remove(),d.querySelector("textarea")?.focus();else if(C==="thread")y.hidden=!y.hidden,y.hidden||(n.seen?.(t.id),M.querySelector(".dot")?.remove(),y.querySelector("textarea")?.focus());else if(C==="clear")n.clear(t.id);else if(C==="keep"){let A=n.answer(t.id);A&&n.save(t.id,Xo(A))}else if(C==="delegated"||C==="later"||C==="skipped"){let A=n.answer(t.id);A?.status===C?n.clear(t.id):n.save(t.id,{status:C,note:A?.note||""}).then(()=>C!=="later"&&n.picked?.(t.id))}}}function Xo(e){let{status:t,picked:n,other:s,text:a,number:o,order:r,note:i}=e;return{status:t,picked:n,other:s,text:a,number:o,order:r,note:i}}function ge(e,t,n,s,a=!1){let o=t.answer(e.id),r=o?Xo(o):{status:"answered"};if(!o&&"note"in s&&!s.note.trim())return Promise.resolve();if(!o&&"note"in s&&(e.type==="number"||e.type==="scale"||e.type==="rank"||e.type==="yesno"))return Te(n,"Answer first; the note saves with it"),Promise.resolve();let i={...r,...s};return("picked"in s||"other"in s||"text"in s||"number"in s||"order"in s)&&(i.status="answered"),t.save(e.id,i,{quiet:a}).then(()=>Te(n,"Saved"),l=>Te(n,l.message,!0))}function Te(e,t,n=!1){let s=e.querySelector(".saved");s&&(t==="Saved"?s.innerHTML=g("check",13)+"Saved":s.textContent=t,s.classList.toggle("bad",n),clearTimeout(s.__t),!n&&t==="Saved"&&(s.__t=setTimeout(()=>s.textContent="",1600)))}function Je(e){e.isConnected&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight+2,480)+"px")}function Ec(e,t,n,s,a){let o=()=>n.closest(".q-card"),r=t?.status==="answered"?t:void 0,i=t?.status==="delegated";switch(e.type){case"single":case"multi":case"yesno":{let l=e.type==="multi",c=new Set(r?.picked||[]),d=new Set(Array.isArray(e.recommended)?e.recommended:[]),u=document.createElement("div");u.className=`opts${e.type==="yesno"?" yesno":""}`,u.setAttribute("role",l?"group":"radiogroup");for(let h of e.options){let m=document.createElement("div");m.className="opt-wrap";let b=c.has(h.id),w=i&&d.has(h.id),x=document.createElement("button");x.type="button",x.className=`opt${b?" on":""}${w?" chosen":""}${h.recommended?" rec":""}${l?" multi":""}`,x.dataset.o=h.id,x.disabled=a,x.setAttribute("role",l?"checkbox":"radio"),x.setAttribute("aria-checked",String(b));let y=h.shows.length?`<span class="opt-shows">${g("plus",12)}Opens ${h.shows.length===1?"a follow-up":h.shows.length+" follow-ups"}</span>`:"";if(x.innerHTML=`<span class="tick">${b||w?g("check",14):""}</span><span class="opt-main"><span class="opt-label">${p(h.label)}${h.recommended?`<span class="rec-tag">${g("star",11)}${w?"Chosen for you":"Recommended"}</span>`:""}</span>${y}</span>`,h.description&&x.querySelector(".opt-main").append(me(h.description,"","opt-desc")),m.append(x),h.content.length){let S=document.createElement("div");S.className="opt-content";for(let M of h.content)S.append(zs(M));m.append(S)}u.append(m)}n.append(u);let $;if(e.allowOther){$=document.createElement("label"),$.className=`opt other${r?.other?" on":""}`,$.innerHTML=`<span class="tick">${r?.other?g("check",14):""}</span><textarea class="other-in" rows="1" data-grow placeholder="Other\u2026" ${a?"disabled":""} enterkeyhint="done">${p(r?.other||"")}</textarea>`,n.append($);let h=$.querySelector("textarea");requestAnimationFrame(()=>Je(h)),h.addEventListener("keydown",b=>b.key==="Enter"&&!b.shiftKey&&(b.preventDefault(),h.blur()));let m=ne(()=>{let b=h.value,w=l?{picked:[...s.answer(e.id)?.status==="answered"?s.answer(e.id).picked||[]:[]],other:b}:{picked:[],other:b};!b.trim()&&!(w.picked||[]).length?s.clear(e.id):ge(e,s,o(),w,!0)},700);h.addEventListener("input",()=>{if(Je(h),$.classList.toggle("on",!!h.value.trim()),!l)for(let b of u.querySelectorAll(".opt.on"))b.classList.remove("on");Te(o(),"Saving\u2026"),m()})}u.addEventListener("click",h=>{let m=h.target.closest(".opt[data-o]");if(!m||m.disabled)return;let b=m.dataset.o,w=s.answer(e.id),x=new Set(w?.status==="answered"?w.picked||[]:[]);if(l){x.has(b)?x.delete(b):x.add(b);let y=w?.status==="answered"&&w.other||"";if(!x.size&&!y.trim()&&!w?.note)return s.clear(e.id);ge(e,s,o(),{picked:[...x],other:y})}else{if(x.has(b)&&x.size===1){w?.note?ge(e,s,o(),{picked:[],other:""}):s.clear(e.id);return}ge(e,s,o(),{picked:[b],other:""}).then(()=>s.picked?.(e.id))}});return}case"text":{let l=document.createElement("textarea");l.className="text-in"+(e.multiline?"":" one-line"),l.dataset.grow="",l.placeholder=e.placeholder||(typeof e.recommended=="string"&&e.recommended?`Suggested: ${e.recommended}`:"Your answer"),l.value=r?.text||"",l.disabled=a,l.rows=e.multiline?3:1,e.multiline||(l.enterKeyHint="done",l.addEventListener("keydown",d=>d.key==="Enter"&&!d.shiftKey&&(d.preventDefault(),l.blur()))),requestAnimationFrame(()=>Je(l)),n.append(l);let c=ne(()=>l.value.trim()||s.answer(e.id)?.note?ge(e,s,o(),{text:l.value},!0):s.clear(e.id),800);if(l.addEventListener("input",()=>{Je(l),Te(o(),"Saving\u2026"),c()}),typeof e.recommended=="string"&&e.recommended&&!r){let d=document.createElement("button");d.className="btn small",d.type="button",d.disabled=a,d.textContent="Use the suggestion",d.onclick=()=>ge(e,s,o(),{text:e.recommended}),n.append(d)}return}case"number":{let l=document.createElement("div");l.className="num-row";let c=r?.number,d=e.min!==void 0&&e.max!==void 0;l.innerHTML=`${d?`<input type="range" min="${e.min}" max="${e.max}" step="${e.step??"any"}" value="${c??e.recommended??e.min}" ${a?"disabled":""} />`:""}<input type="number" inputmode="decimal" ${e.min!==void 0?`min="${e.min}"`:""} ${e.max!==void 0?`max="${e.max}"`:""} step="${e.step??"any"}" value="${c??""}" placeholder="${e.recommended!==void 0?"Suggested: "+p(e.recommended):""}" ${a?"disabled":""} />${e.unit?`<span class="unit">${p(e.unit)}</span>`:""}`,n.append(l);let[u,$]=[l.querySelector("input[type=range]"),l.querySelector("input[type=number]")],h=ne(()=>{let m=Number($.value);$.value===""||!Number.isFinite(m)||ge(e,s,o(),{number:m},!0)},600);u?.addEventListener("input",()=>{$.value=u.value,Te(o(),"Saving\u2026"),h()}),$.addEventListener("input",()=>{u&&$.value!==""&&(u.value=$.value),Te(o(),"Saving\u2026"),h()}),(e.minLabel||e.maxLabel)&&n.insertAdjacentHTML("beforeend",`<div class="scale-labels"><span>${p(e.minLabel)}</span><span>${p(e.maxLabel)}</span></div>`);return}case"scale":{let l=e.min??1,c=e.max??5,d=e.step||1,u=document.createElement("div");u.className="scale";let $=r?.number??(i?e.recommended:void 0);for(let h=l;h<=c+1e-9;h+=d){let m=Math.round(h*1e3)/1e3;u.insertAdjacentHTML("beforeend",`<button type="button" class="scale-btn${$===m?" on":""}${e.recommended===m?" rec":""}" data-v="${m}" ${a?"disabled":""}>${m}</button>`)}n.append(u),n.insertAdjacentHTML("beforeend",`<div class="scale-labels"><span>${p(e.minLabel)}</span>${e.recommended!==void 0?`<span class="rec-note">Recommended: ${p(e.recommended)}</span>`:""}<span>${p(e.maxLabel)}</span></div>`),u.addEventListener("click",h=>{let m=h.target.closest("[data-v]");if(!m||m.disabled)return;let b=Number(m.dataset.v);if(r?.number===b&&s.answer(e.id)?.number===b)return s.clear(e.id);ge(e,s,o(),{number:b}).then(()=>s.picked?.(e.id))});return}case"rank":{let l=r?.order?.length===e.options.length?r.order:Array.isArray(e.recommended)&&e.recommended.length===e.options.length?e.recommended:e.options.map(m=>m.id),c=document.createElement("ol");c.className=`rank${r?" on":""}`;let d=new Map(e.options.map(m=>[m.id,m])),u=m=>{c.innerHTML=m.map((b,w)=>{let x=d.get(b);return`<li data-o="${p(b)}"><span class="rank-n">${w+1}</span><span class="rank-label">${p(x?.label??b)}${x?.description?`<small>${p(x.description)}</small>`:""}</span><span class="rank-btns"><button class="icon-btn" data-move="-1" aria-label="Move up" ${w===0||a?"disabled":""}>${g("arrow-up",16)}</button><button class="icon-btn" data-move="1" aria-label="Move down" ${w===m.length-1||a?"disabled":""}>${g("arrow-down",16)}</button></span></li>`}).join("")},$=[...l];u($),n.append(c);let h=ne(()=>ge(e,s,o(),{order:$},!0),500);if(c.addEventListener("click",m=>{let b=m.target.closest("[data-move]");if(!b||b.disabled)return;let w=b.closest("li").dataset.o,x=$.indexOf(w),y=x+Number(b.dataset.move);y<0||y>=$.length||([$[x],$[y]]=[$[y],$[x]],u($),c.classList.add("on"),Te(o(),"Saving\u2026"),h())}),!r&&!a){let m=document.createElement("button");m.className="btn small",m.type="button",m.textContent="This order is right",m.onclick=()=>ge(e,s,o(),{order:$}),n.append(m)}return}}}function qc(e,t,n){let s=n.thread(t.id);e.innerHTML=`<div class="msgs">${s.length?s.map(r=>`<div class="msg ${r.from}"><div class="msg-who">${r.from==="owner"?"You":"Agent"} \xB7 ${p(D(Date.parse(r.at)))}</div></div>`).join(""):'<p class="muted small">Ask why, push back, or explain. The agent reads it and can answer here.</p>'}</div>${n.readOnly?"":'<form class="msg-form"><textarea rows="2" placeholder="Write to the agent\u2026"></textarea><button class="btn primary small" type="submit">Send</button></form>'}`,e.querySelectorAll(".msg").forEach((r,i)=>r.append(me(s[i].body,"","msg-body")));let a=e.querySelector("form");if(!a)return;let o=a.querySelector("textarea");o.addEventListener("input",()=>Je(o)),o.addEventListener("keydown",r=>{r.key==="Enter"&&(r.ctrlKey||r.metaKey)&&a.requestSubmit()}),a.onsubmit=r=>{r.preventDefault();let i=o.value.trim();i&&(o.disabled=!0,n.message(t.id,i).then(()=>{o.value="",o.disabled=!1},l=>{o.disabled=!1,Te(e.closest(".q-card"),l.message,!0)}))}}var wt=null,f=null,Cn={get projects(){return v.hub.projects},get readOnly(){return!!v.info.readOnly}},kt=(e,t,n)=>`#/p/${encodeURIComponent(e)}/q/${encodeURIComponent(t)}${n?`/${encodeURIComponent(n)}`:""}`;function An(e,t,n=52){let s=t?e/t:0,a=n/2-4,o=2*Math.PI*a;return`<span class="ring${s>=1?" full":""}" style="--size:${n}px" title="${e} of ${t}"><svg viewBox="0 0 ${n} ${n}" width="${n}" height="${n}" aria-hidden="true"><circle class="ring-bg" cx="${n/2}" cy="${n/2}" r="${a}"/><circle class="ring-fg" cx="${n/2}" cy="${n/2}" r="${a}" stroke-dasharray="${o}" stroke-dashoffset="${o*(1-s)}"/></svg><span class="ring-text">${s>=1?g("check",Math.round(n/3)):Math.round(s*100)+"<small>%</small>"}</span></span>`}var tr=e=>{let t=0;for(let n of String(e))t=(t*31+n.charCodeAt(0))%360;return t};var Go=[268,205,160,30,330,85,295,185,0,125],nr=e=>Go[Math.max(0,f.data.set.sections.findIndex(t=>t.id===e))%Go.length],jc=[["todo","To answer"],["blocking","Blocking"],["changed","Changed"],["later","Later"],["done","Answered"],["all","All"],["hidden","Hidden"]];async function sr(e,t,n,s){if(f&&f.key===t&&f.setId===n&&wt===e&&e.querySelector(".set-page")){s&&Us(s);return}wt=e;let a=await E(`api/q/${encodeURIComponent(n)}`);f={key:t,setId:n,data:a,shape:ar(a.set),vis:gt(a.set,a.answers.answers),filter:R(`filter:${t}/${n}`)||"todo",search:"",mode:R("mode")||"list",shown:new Set,cards:new Map,index:0,order:[]},document.title=`${a.set.title} \xB7 hitl`,Hc(),s?Us(s):f.mode==="cards"&&vt(0)}var ar=e=>JSON.stringify(e.sections.map(t=>[t.id,t.title,t.intro,t.content,t.hidden,t.showIf,t.questions.map(n=>[n.id,n.rev,n.why,n.header,n.content,n.priority,n.hidden,n.showIf,n.options])]).concat([e.title,e.intro,e.content]));function En(){let e=f.data.set,t=f.data.answers,n={todo:0,blocking:0,changed:0,later:0,done:0,all:0,hidden:0};for(let s of J(e))for(let a of Object.keys(n))Ws(s,a)&&n[a]++;return{c:n,summary:Wo(e,t)}}function Ws(e,t){let n=f.data.answers.answers[e.id],s=f.vis.question(e.id);if(t==="hidden")return!s;if(!s)return!1;switch(t){case"todo":return!Se(n)||He(e,n);case"blocking":return e.priority==="blocking"&&(!Se(n)||He(e,n));case"changed":return He(e,n);case"later":return n?.status==="later";case"done":return Se(n);default:return!0}}function or(e,t){if(!t)return!0;let n=[e.id,e.header,e.question,e.why,...e.options.map(s=>s.label+" "+s.description)].join(" ").toLowerCase();return t.toLowerCase().split(/\s+/).every(s=>n.includes(s))}function bt(){f.shown=new Set(J(f.data.set).filter(e=>Ws(e,f.filter)&&or(e,f.search)).map(e=>e.id))}var Zt={answer:e=>f?.data.answers.answers[e],thread:e=>f?.data.answers.threads[e]||[],get readOnly(){return!!Cn?.readOnly},async save(e,t,n={}){let s=await E(`api/q/${encodeURIComponent(f.setId)}/answer`,{method:"POST",json:{id:e,...t}});return f.data.answers.answers[e]=s.answer,f.data.answers.seq=Math.max(f.data.answers.seq,s.answer.seq),Vt(e,{redraw:!n.quiet}),s.answer},async clear(e){await E(`api/q/${encodeURIComponent(f.setId)}/answer`,{method:"POST",json:{id:e,clear:!0}}),delete f.data.answers.answers[e],Vt(e,{redraw:!0})},async message(e,t){let n=await E(`api/q/${encodeURIComponent(f.setId)}/message`,{method:"POST",json:{id:e,body:t}});(f.data.answers.threads[e]??=[]).push(n.message),qn(e,{threadOpen:!0})},picked(e){f?.mode!=="cards"||R("advance")==="0"||f.order.indexOf(e)!==f.index||setTimeout(()=>{f?.order[f.index]===e&&jn(!0)},380)},why:e=>Ic(e),unseen(e){let t=Jo()[e]||0;return(f?.data.answers.threads[e]||[]).filter(n=>n.from==="agent"&&n.seq>t).length},seen(e){let t=Jo();t[e]=Math.max(0,...(f.data.answers.threads[e]||[]).map(n=>n.seq)),R(`seen:${f.key}/${f.setId}`,JSON.stringify(t))}};function Jo(){try{return JSON.parse(R(`seen:${f.key}/${f.setId}`)||"{}")}catch{return{}}}function Ic(e){let t=f.data.set,n=Le(t,e);if(!n)return"";let s=i=>{let l=Le(t,i);return l?`\u201C${l.header||l.question.replace(/\s+/g," ").slice(0,50)}\u201D`:i},a=(i,l)=>`\u201C${i.options.find(c=>c.id===l)?.label??l}\u201D`,o=[],r=t.sections.find(i=>i.id===n.section);r&&!f.vis.section(r.id)&&o.push(`its section \u201C${r.title||r.id}\u201D is hidden`);for(let i of J(t))for(let l of i.options)(l.shows.includes(e)||l.shows.includes(n.section))&&o.push(`shown when you pick ${a(i,l.id)} for ${s(i.id)}`),(l.hides.includes(e)||l.hides.includes(n.section))&&o.push(`hidden while ${a(i,l.id)} is picked for ${s(i.id)}`);for(let i of n.showIf||[]){let l=Le(t,i.question),c=d=>(i[d]||[]).map(u=>l?a(l,u):u).join(" or ");i.any?o.push(`shown when ${s(i.question)} is ${c("any")}`):i.all?o.push(`shown when ${s(i.question)} includes ${(i.all||[]).map(d=>l?a(l,d):d).join(" and ")}`):i.none?o.push(`shown when ${s(i.question)} isn't ${c("none")}`):i.answered!==void 0&&o.push(`shown when ${s(i.question)} is ${i.answered?"":"not "}answered`),(i.gte!==void 0||i.lte!==void 0)&&o.push(`shown when ${s(i.question)} is ${i.gte!==void 0?"\u2265 "+i.gte:""}${i.gte!==void 0&&i.lte!==void 0?" and ":""}${i.lte!==void 0?"\u2264 "+i.lte:""}`)}return o.length?o.join("; ").replace(/^./,i=>i.toUpperCase())+".":"Hidden by default."}function Hc(){let{data:e}=f,t=e.set;bt(),f.cards.clear();let n=document.createElement("div");n.className="set-page";let s=document.createElement("header"),a=Cn.projects.find(i=>i.key===f.key);if(s.className="set-hero",s.innerHTML=`<div class="hero-top"><div class="hero-text"><span class="eyebrow">${p(a?.name||f.key)} \xB7 Questions${t.from?` \xB7 from ${p(t.from)}`:""}</span><h1>${p(t.title)}</h1></div><div class="hero-ring" id="hero-ring"></div></div>`,t.intro&&s.append(me(t.intro,"","set-intro")),s.insertAdjacentHTML("beforeend",'<div class="hero-stats" id="hero-stats"></div>'),t.content.length){let i=document.createElement("div");i.className="q-content",Qt(i,t.content),s.append(i)}e.errors.length&&s.insertAdjacentHTML("beforeend",`<details class="problems"><summary>${g("warning",16)} ${e.errors.length} problem${e.errors.length===1?"":"s"} in this set's file (the agent can fix them: <code>hitl validate ${p(f.setId)}</code>)</summary><ul>${e.errors.map(i=>`<li>${p(i)}</li>`).join("")}</ul></details>`),n.append(s);let o=document.createElement("div");o.className="set-tools",o.id="set-tools",n.append(o);let r=document.createElement("div");r.id="set-body",n.append(r),wt.replaceChildren(n),$t(),De()}function $t(){let e=k("set-tools");if(!e)return;let{c:t}=En(),n=Ks(J(f.data.set)).length,s=f.searchOpen||!!f.search;e.innerHTML=`
184
+ <div class="tools-row">
185
+ <div class="filters" role="tablist">${jc.filter(([o])=>o==="todo"||o==="all"||t[o]||f.filter===o).map(([o,r])=>`<button class="chip${f.filter===o?" on":""}${o==="blocking"?" danger":""}" data-filter="${o}" role="tab" aria-selected="${f.filter===o}">${r}<span class="n">${t[o]}</span></button>`).join("")}</div>
186
+ <div class="tools-btns">
187
+ <button class="icon-btn${s?" on":""}" id="search-btn" title="Search" aria-label="Search">${g("search",18)}</button>
188
+ ${f.mode==="cards"?`<button class="icon-btn" data-mode="list" title="Show every question" aria-label="Show every question">${g("list",18)}</button>`:`<button class="icon-btn" data-mode="cards" title="One question at a time" aria-label="One question at a time">${g("cards",18)}</button>`}
189
+ <button class="icon-btn" id="set-menu" title="More" aria-label="More">${g("more",18)}</button>
190
+ </div>
191
+ </div>
192
+ <div class="search-row" ${s?"":"hidden"}><label class="search-in">${g("search",16)}<input id="q-search" type="search" placeholder="Search questions and options" value="${p(f.search)}" autocomplete="off" enterkeyhint="search" /></label></div>
193
+ <div class="tools-progress" aria-hidden="true"><span></span></div>`,e.querySelectorAll("[data-filter]").forEach(o=>o.onclick=()=>{f.filter=o.dataset.filter,R(`filter:${f.key}/${f.setId}`,f.filter),bt(),$t(),De();let r=k("set-body").getBoundingClientRect().top+scrollY-e.offsetHeight-60;scrollY>r&&scrollTo({top:r,behavior:"instant"})}),e.querySelector(".filters .on")?.scrollIntoView({inline:"center",block:"nearest"}),e.querySelectorAll("[data-mode]").forEach(o=>o.onclick=()=>{if(f.mode===o.dataset.mode)return;let r=f.mode==="cards"?f.order[f.index]:lr();f.mode=o.dataset.mode,R("mode",f.mode),$t(),De(),r&&Us(r)});let a=k("q-search");a.oninput=ne(()=>{f.search=a.value.trim(),bt(),De(),Rc()},200),k("search-btn").onclick=()=>{f.searchOpen=!s,!f.searchOpen&&f.search&&(f.search="",bt(),De()),$t(),f.searchOpen&&k("q-search").focus()},k("set-menu").onclick=o=>Oc(o.currentTarget,n),ir()}function Rc(){let{c:e}=En();for(let t of document.querySelectorAll("[data-filter]")){let n=t.querySelector(".n");n&&(n.textContent=e[t.dataset.filter])}}function Oc(e,t){document.querySelector(".pop.menu")?.remove();let n=document.createElement("div");n.className="pop menu";let s=e.getBoundingClientRect();n.style.top=s.bottom+scrollY+6+"px",n.style.right=Math.max(8,innerWidth-s.right)+"px";let a=`Read the new answers in the hitl question set "${f.setId}" (get_answers, filter "new"; or \`npx hitloop answers ${f.setId} --new\`), apply them, and ack each one with a short note.`;n.innerHTML=`
194
+ <button class="menu-item" data-m="accept" ${t&&!Cn.readOnly?"":"disabled"}>${g("sparkles",16)}Take every recommendation${t?` (${t} unanswered)`:""}</button>
195
+ <button class="menu-item" data-m="prompt">${g("copy",16)}Copy a prompt for the agent</button>
196
+ <button class="menu-item" data-m="link">${g("link",16)}Copy a link to this set</button>
197
+ <label class="menu-item check"><input type="checkbox" data-m="advance" ${R("advance")==="0"?"":"checked"} />Cards: move on after a pick</label>`,document.body.append(n);let o=r=>{r&&n.contains(r.target)||(n.remove(),removeEventListener("pointerdown",o,!0))};setTimeout(()=>addEventListener("pointerdown",o,!0)),n.onclick=async r=>{let i=r.target.closest("[data-m]")?.dataset.m;if(i){if(i==="advance")return R("advance",r.target.checked?null:"0");o(),i==="prompt"?K(a,"Prompt copied"):i==="link"?K(location.origin+location.pathname+kt(f.key,f.setId),"Link copied"):i==="accept"&&rr(J(f.data.set))}}}function Ks(e){return e.filter(t=>f.vis.question(t.id)&&!Se(f.data.answers.answers[t.id])&&Qo(t))}async function rr(e){let t=Ks(e).map(s=>s.id);if(!t.length)return O("Nothing to take");if(!confirm(`Take the recommended answer for ${t.length} question${t.length===1?"":"s"}? You can change any of them after.`))return;let n=await E(`api/q/${encodeURIComponent(f.setId)}/accept`,{method:"POST",json:{ids:t}});f.data.answers=n.answers;for(let s of n.taken)Vt(s,{redraw:!0,quietVis:!0});Vt(null,{}),O(`Took ${n.taken.length} recommendation${n.taken.length===1?"":"s"}`)}function De(){let e=k("set-body");if(!e)return;if(f.mode==="cards")return Pc();f.cards.clear(),e.className="set-list",e.innerHTML="";let t=f.data.set,n=!1;for(let s of t.sections){let a=s.questions.filter(i=>f.shown.has(i.id));if(!a.length)continue;n=!0;let o=document.createElement("section");if(o.className="sec",o.dataset.s=s.id,o.style.setProperty("--hue",nr(s.id)),s.title||s.intro||s.content.length){let i=document.createElement("header");i.className="sec-head";let l=t.sections.filter(c=>c.title).indexOf(s)+1;if(i.innerHTML=s.title?`<h2><span class="sec-num">${l}</span><span>${p(s.title)}</span></h2>`:"",s.intro&&i.append(me(s.intro,"","sec-intro")),s.content.length){let c=document.createElement("div");c.className="q-content",Qt(c,s.content),i.append(c)}o.append(i)}let r=document.createElement("div");r.className="sec-tools",o.append(r);for(let i of a){let l=Mn(i,Zt,{hidden:!f.vis.question(i.id)});l.__hidden=!f.vis.question(i.id),f.cards.set(i.id,l),o.append(l)}e.append(o),Ds(s.id)}n||(e.innerHTML=Qs())}function Ds(e){let n=document.querySelector(`.sec[data-s="${CSS.escape(e)}"]`)?.querySelector(".sec-tools");if(!n)return;let s=f.data.set.sections.find(c=>c.id===e),a=s.questions.filter(c=>f.vis.question(c.id)),o=a.filter(c=>Se(f.data.answers.answers[c.id])).length,r=Ks(s.questions).length,i=a.length?o/a.length*100:0;n.innerHTML=`<span class="sec-count"><span class="mini-bar"><span style="width:${i}%"></span></span>${o} of ${a.length}</span>${r&&!Cn.readOnly?`<button class="ghost-btn" data-accept>${g("sparkles",15)}Take ${r===1?"the recommendation":`all ${r} recommendations`}</button>`:""}`;let l=n.querySelector("[data-accept]");l&&(l.onclick=()=>rr(s.questions))}function Qs(){let{summary:e}=En();return f.search?`<div class="empty"><p>No questions match \u201C${p(f.search)}\u201D.</p></div>`:f.filter==="todo"?`<div class="empty done-all"><div class="big-check">${g("check",44)}<i></i><i></i><i></i><i></i><i></i><i></i></div><h2>All answered</h2><p>${e.done} of ${e.visible} questions answered. The agent picks them up from here.</p></div>`:'<div class="empty"><p>Nothing here.</p></div>'}function qn(e,t={}){let n=f?.cards.get(e),s=Le(f.data.set,e);if(!n||!s)return;let a=t.threadOpen??!n.querySelector(".q-thread")?.hidden;Bs(n,s,Zt,{hidden:!f.vis.question(e),threadOpen:a}),n.__hidden=!f.vis.question(e)}function Vt(e,{redraw:t=!1,quietVis:n=!1}={}){if(!f)return;let s=f.vis;if(f.vis=gt(f.data.set,f.data.answers.answers),e)if(t)qn(e);else{let r=f.cards.get(e),i=Le(f.data.set,e);r&&i&&Yo(r,i,Zt,{hidden:!f.vis.question(e)})}if(n)return;let a=[];for(let r of J(f.data.set)){let i=s.question(r.id),l=f.vis.question(r.id);i!==l&&(l&&Ws(r,f.filter)&&or(r,f.search)&&(f.shown.add(r.id),a.push(r.id)),!l&&f.filter!=="hidden"&&f.shown.delete(r.id),f.filter==="hidden"&&l&&f.shown.delete(r.id))}if(J(f.data.set).some(r=>s.question(r.id)!==f.vis.question(r.id))){if(f.mode==="cards"){let r=f.order[f.index];f.order=cr();let i=f.order.indexOf(r);f.index=i>=0?i:Math.min(f.index,f.order.length-1),Fs()}else{let i=(e?f.cards.get(e):null)?.getBoundingClientRect().top,l=J(f.data.set).filter(d=>s.question(d.id)!==f.vis.question(d.id)).map(d=>d.id);if(!Nc(l)){let d=scrollY;De(),scrollTo(0,d)}let c=e?f.cards.get(e):null;c&&i!==void 0&&scrollTo(0,scrollY+c.getBoundingClientRect().top-i);for(let d of a)f.cards.get(d)?.classList.add("revealed");for(let d of f.data.set.sections)Ds(d.id)}a.length&&O(`${a.length} follow-up question${a.length===1?"":"s"} opened`)}else if(f.mode==="list"){let r=e&&Le(f.data.set,e);r&&Ds(r.section)}ir()}function Nc(e){let t=f.data.set;for(let n of e){let s=Le(t,n);if(!s)continue;let a=f.shown.has(n),o=f.cards.get(n);if(!a){o?.remove(),f.cards.delete(n);continue}if(o){qn(n);continue}let r=document.querySelector(`.sec[data-s="${CSS.escape(s.section)}"]`);if(!r)return!1;let i=Mn(s,Zt,{hidden:!f.vis.question(n)});i.__hidden=!f.vis.question(n);let l=t.sections.find(d=>d.id===s.section)?.questions??[],c=r.querySelector(".sec-tools");for(let d of l){if(d.id===n)break;let u=f.cards.get(d.id);u?.isConnected&&(c=u)}c.after(i),f.cards.set(n,i)}for(let n of document.querySelectorAll(".sec"))n.querySelector(".q-card")||n.remove();return document.querySelector(".sec")||(k("set-body").innerHTML=Qs()),!0}function ir(){let{c:e,summary:t}=En(),n=t.visible?t.done/t.visible*100:0,s=document.querySelector(".tools-progress span");s&&(s.style.width=n+"%");let a=k("hero-ring");a&&(a.innerHTML=An(t.done,t.visible,64));let o=k("hero-stats");o&&(o.innerHTML=[`<span class="stat"><b>${t.done}</b> of ${t.visible} answered</span>`,t.blocking?`<span class="badge danger">${g("warning",12)}${t.blocking} blocking</span>`:"",t.changed?`<span class="badge warn">${t.changed} changed</span>`:"",t.later?`<span class="badge">${t.later} for later</span>`:"",!t.toAnswer&&t.visible?`<span class="badge ok">${g("check",12)}All answered</span>`:""].join("")),document.title=`${t.toAnswer?`(${t.toAnswer}) `:""}${f.data.set.title} \xB7 hitl`;for(let r of document.querySelectorAll("[data-filter]")){let i=r.querySelector(".n");i&&(i.textContent=e[r.dataset.filter])}}function lr(){for(let[e,t]of f.cards)if(t.getBoundingClientRect().bottom>120)return e;return""}function Us(e){if(!f)return;if(f.shown.has(e)||(f.filter=f.vis.question(e)?"all":"hidden",bt(),$t(),De()),f.mode==="cards"){let n=f.order.indexOf(e);n>=0&&vt(n);return}let t=f.cards.get(e);t&&(t.scrollIntoView({block:"start",behavior:"smooth"}),t.classList.remove("flash"),t.offsetWidth,t.classList.add("flash"))}function cr(){return J(f.data.set).filter(e=>f.shown.has(e.id)&&(f.vis.question(e.id)||f.filter==="hidden")).map(e=>e.id)}function Pc(){let e=k("set-body");e.className="set-cards",f.order=cr(),f.index=Math.min(f.index,Math.max(0,f.order.length-1)),e.innerHTML='<div class="card-stage" id="card-stage"></div><nav class="card-nav" id="card-nav"></nav>',vt(f.index);let t=k("card-stage"),n=0,s=0,a=0;t.addEventListener("touchstart",o=>{let r=o.touches[0];n=r.clientX,s=r.clientY,a=Date.now()},{passive:!0}),t.addEventListener("touchend",o=>{let r=o.changedTouches[0],i=r.clientX-n,l=r.clientY-s;Date.now()-a<600&&Math.abs(i)>70&&Math.abs(l)<50&&!o.target.closest("input,textarea,.ui-code,.md-table,iframe")&&(i<0?jn():Vs())},{passive:!0})}function vt(e){if(!f||f.mode!=="cards")return;let t=k("card-stage");if(!t)return;f.cards.clear(),f.index=Math.max(0,Math.min(e,f.order.length-1));let n=f.order[f.index];if(!n){t.innerHTML=Qs(),Fs();return}let s=Le(f.data.set,n),a=f.data.set.sections.find(l=>l.id===s.section),o=a.questions.filter(l=>f.vis.question(l.id)).findIndex(l=>l.id===n)+1,r=a.questions.filter(l=>f.vis.question(l.id)).length;t.style.setProperty("--hue",nr(a.id)),t.innerHTML=a.title?`<div class="card-section"><span class="sec-num">${_c(a)}</span><b>${p(a.title)}</b><span class="muted">${o} of ${r}</span></div>`:"",a.intro&&o===1&&t.append(me(a.intro,"","sec-intro"));let i=Mn(s,Zt,{hidden:!f.vis.question(n)});i.__hidden=!f.vis.question(n),f.cards.set(n,i),t.append(i),Fs(),history.replaceState(null,"",kt(f.key,f.setId,n)),scrollTo({top:Math.max(0,t.getBoundingClientRect().top+scrollY-120),behavior:"instant"})}var _c=e=>f.data.set.sections.filter(t=>t.title).indexOf(e)+1;function Fs(){let e=k("card-nav");if(!e)return;let t=f.order.length,n=f.order.filter(a=>!Se(f.data.answers.answers[a])).length,s=t?(f.index+1)/t*100:0;e.innerHTML=`<button class="nav-btn" data-nav="-1" aria-label="Back" ${f.index<=0?"disabled":""}>${g("chevron-left",22)}</button><span class="card-pos"><span><b>${t?f.index+1:0}</b> / ${t}</span><span class="mini-bar"><span style="width:${s}%"></span></span><small>${n} to answer</small></span><button class="nav-btn primary" data-nav="1" ${f.index>=t-1?"disabled":""}><span>Next</span>${g("chevron-right",20)}</button>`,e.querySelectorAll("[data-nav]").forEach(a=>a.onclick=()=>a.dataset.nav==="1"?jn():Vs())}function jn(e=!1){let t=f.index+1;if(e)for(;t<f.order.length&&Se(f.data.answers.answers[f.order[t]]);)t++;t>=f.order.length&&(t=f.index+1),t<f.order.length?vt(t):O("That was the last one")}var Vs=()=>f.index>0&&vt(f.index-1);addEventListener("keydown",e=>{!f||!wt?.isConnected||f.mode!=="cards"||e.target.closest?.("input,textarea,select")||e.altKey||e.ctrlKey||e.metaKey||(e.key==="ArrowRight"||e.key==="j"?jn():(e.key==="ArrowLeft"||e.key==="k")&&Vs())});document.addEventListener("click",e=>{let t=e.target.closest("[data-link]");if(!t||!f)return;e.preventDefault();let n=location.origin+location.pathname+kt(f.key,f.setId,t.dataset.link);K(n,"Link to the question copied")});var er=null;async function zc(){if((!wt?.isConnected||!wt.querySelector(".set-page"))&&(f=null),!f)return;let e=f.key,t=f.setId,n;try{n=await E(`api/q/${encodeURIComponent(t)}`)}catch{return}if(!f||f.key!==e||f.setId!==t)return;let s=f.data,a=ar(n.set);if(f.data=n,a!==f.shape){f.shape=a,f.vis=gt(n.set,n.answers.answers);let r=f.mode==="cards"?f.order[f.index]:lr(),i=new Set(J(s.set).map(u=>u.id)),l=J(n.set).filter(u=>!i.has(u.id)).length,c=f.shown;bt();for(let u of c)Le(n.set,u)&&f.shown.add(u);let d=scrollY;if($t(),De(),f.mode==="cards"&&r){let u=f.order.indexOf(r);u>=0&&vt(u)}else scrollTo(0,d);l&&O(`${l} new question${l===1?"":"s"}`);return}let o=f.vis;f.vis=gt(n.set,n.answers.answers);for(let r of J(n.set)){let i=s.answers.answers[r.id],l=n.answers.answers[r.id],c=s.answers.threads[r.id]?.length||0,d=n.answers.threads[r.id]?.length||0;if(!((i?.seq??-1)!==(l?.seq??-1)||JSON.stringify(i?.ack)!==JSON.stringify(l?.ack)||c!==d))continue;let $=f.cards.get(r.id);$&&!$.contains(document.activeElement)&&qn(r.id)}f.vis=o,Vt(null,{})}function dr(){f=null}function pr(e){f&&e.project===f.key&&e.id===f.setId&&(clearTimeout(er),er=setTimeout(zc,150))}var In=250;function yt(e,{text:t,name:n="",first:s=1,caption:a,onComment:o,readOnly:r=!1,marks:i}){let l=t.length>8e6?t.slice(0,8e6):t,c=je(l,n);c.length>1&&c[c.length-1]===""&&l.endsWith(`
198
+ `)&&c.pop();let d=c.length,u=[];for(let S=0;S<d;S+=In){let M=[];for(let C=S;C<Math.min(d,S+In);C++){let A=s+C,H=i?.get(A);M.push(`<div class="ln" data-n="${A}"><button class="gut" type="button" data-n="${A}" tabindex="-1">${A}</button>${i?`<span class="mk${H?" "+H:""}"></span>`:""}<span class="src">${c[C]||" "}</span></div>`)}u.push(d>In?`<div class="lblock" style="contain-intrinsic-size:auto ${Math.min(In,d-S)*21}px">${M.join("")}</div>`:M.join(""))}e.innerHTML=`<figure class="ui-code lines-view">${$n(a??`${n||"text"} \xB7 ${d.toLocaleString()} line${d===1?"":"s"}`)}<div class="code${v.settings.wrap?" wrap":""}" tabindex="0">${u.join("")}</div></figure>`;let $=e.querySelector(".code");$.text=t,$.lines=d;let h=null,m=S=>$.querySelector(`.ln[data-n="${S}"]`),b=S=>{let M=m(S);for(;M?.nextElementSibling&&M.nextElementSibling.classList.contains("under");)M=M.nextElementSibling;return M},w=()=>{h=null,$.querySelectorAll(".ln.sel").forEach(S=>S.classList.remove("sel")),$.querySelector(".selbar")?.remove()},x=(S,M)=>{w(),h=[S,M];for(let H=S;H<=M;H++)m(H)?.classList.add("sel");let C=document.createElement("div");C.className="selbar under";let A=S===M?`Line ${S}`:`Lines ${S}\u2013${M}`;C.innerHTML=`<span class="faint">${A}${S===M?'<span class="hint"> \xB7 tap another line for a range</span>':""}</span>${r||!o?"":`<button class="btn small primary" type="button" data-sb="comment">${g("chat",14)} Comment</button>`}<button class="btn small" type="button" data-sb="copy">${g("copy",14)} Copy</button><button class="mini" type="button" data-sb="clear" aria-label="Clear">${g("x",14)}</button>`,b(M)?.after(C)},y=(S,M)=>{let C=[];for(let A=S;A<=Math.min(M,S+11);A++)C.push(m(A)?.querySelector(".src")?.textContent??"");return C.join(`
199
+ `)+(M>S+11?`
200
+ \u2026`:"")};return $.addEventListener("click",S=>{let M=S.target.closest(".gut"),C=S.target.closest("[data-sb]");if(M){let A=Number(M.dataset.n);if(h&&(S.shiftKey||h[0]===h[1]&&h[0]!==A&&Math.abs(A-h[0])<400&&S.detail===1&&M.dataset.armed)){x(Math.min(h[0],A),Math.max(h[1],A));return}if(h&&h[0]===A&&h[1]===A)return w();x(A,A),$.querySelectorAll(".gut[data-armed]").forEach(H=>delete H.dataset.armed),$.querySelectorAll(".gut").forEach(H=>H.dataset.armed="1"),clearTimeout($.disarm),$.disarm=setTimeout(()=>$.querySelectorAll(".gut[data-armed]").forEach(H=>delete H.dataset.armed),4e3);return}if(C&&h){let[A,H]=h;C.dataset.sb==="comment"?(w(),o?.(A,H,y(A,H))):C.dataset.sb==="copy"?K(y(A,Math.min(H,A+5e3)).replace(/\n…$/,""),"Copied"):w()}}),Ze(n).then(S=>{if(!S||!$.isConnected)return;let M=je(l,n),C=$.querySelectorAll(".ln > .src"),A=0,H=L=>{if(!$.isConnected)return;let I=A+400;for(;A<C.length&&A<I&&(!L||L.timeRemaining()>1||A%400===0);A++)M[A]!==void 0&&(C[A].innerHTML=M[A]||" ");A<C.length&&(window.requestIdleCallback||(z=>setTimeout(z,16)))(H)};H()}),{code:$,place(S,M){M.classList.add("under"),b(Math.min(Math.max(S,s),s+d-1))?.after(M)},clearPlaced(){$.querySelectorAll(".under:not(.selbar)").forEach(S=>S.remove())},select:x,clear:w,row:m}}var br=new Set(["png","jpg","jpeg","gif","webp","avif","svg","bmp","ico"]),Bc=new Set(["mp4","m4v","webm","ogv","mov"]),Dc=new Set(["mp3","wav","ogg","oga","flac","m4a","aac","opus"]),Yt={ok:{label:"Looks good",short:"Good",icon:"check"},changes:{label:"Needs changes",short:"Changes",icon:"edit"},no:{label:"No",short:"No",icon:"x"}},Zs={ok:"Approve",no:"Refuse",changes:"Not yet"},Uc={file:"file",code:"code",text:"file",md:"file",json:"code",diff:"diff",image:"image",mermaid:"diff",html:"monitor",link:"external"},T=null,P=null,Nn=(e,t,n)=>`#/p/${encodeURIComponent(e)}/r/${encodeURIComponent(t)}${n?`/${encodeURIComponent(n)}`:""}`;async function $r(e,t,n,s){if(T&&T.key===t&&T.id===n&&P===e&&e.querySelector(".rv-page")){s&&gr(s);return}P=e;let a=await E(`api/r/${encodeURIComponent(n)}`);T={key:t,id:n,data:a,shape:na(a),mode:R("rv-mode")==="swipe"?"swipe":"list",filter:"all",index:0,inks:new Map},(a.review.mode!=="review"||a.review.items.length<2)&&(T.mode="list"),document.title=`${a.review.title} \xB7 hitl`,yr(),s?gr(s):T.mode==="swipe"&&et(vr())}function wr(){T=null}var ur;function kr(e){!T||e.project!==T.key||e.id!==T.id||(clearTimeout(ur),ur=setTimeout(Fc,150))}var na=e=>JSON.stringify([e.review.title,e.review.intro,e.review.mode,e.review.status,e.review.items.map(t=>[t.id,t.rev,t.title,t.note,t.ask]),e.files]),G=()=>T.data.review.items,Ne=()=>T.data.feedback,U=()=>!!v.info.readOnly,St=()=>T.data.review.mode==="review",Re=()=>T.data.review.mode==="approve",ee=e=>Ne().items[e],be=e=>Ne().comments.filter(t=>t.item===e),vr=()=>Math.max(0,G().findIndex(e=>!ee(e.id)));async function Fc(){if(!T||!P?.isConnected)return;let e;try{e=await E(`api/r/${encodeURIComponent(T.id)}`)}catch{return}if(!T)return;let t=na(e),n=T.data;if(T.data=e,t!==T.shape){let a=e.review.items.length-n.review.items.length;T.shape=t;let o=scrollY;yr(),scrollTo(0,o),a>0&&O(`${a} new item${a===1?"":"s"} from the agent`);return}for(let a of G()){let o=P.querySelector(`[data-item="${CSS.escape(a.id)}"]`);if(!o||o.contains(document.activeElement))continue;let r=JSON.stringify([n.feedback.items[a.id],n.feedback.comments.filter(l=>l.item===a.id)]),i=JSON.stringify([ee(a.id),be(a.id)]);r!==i&&Pn(o,a)}let s=P.querySelector('[data-item=""]');s&&!s.contains(document.activeElement)&&sa(s),Jt(),en()}function yr(){let e=T.data.review,t=v.hub.projects.find(a=>a.key===T.key),n=document.createElement("div");n.className=`page-wrap rv-page mode-${e.mode}`;let s=Re()?"Approval":e.mode==="show"?"To look at":"Review";n.innerHTML=`<header class="rv-hero${Re()?" gate":""}">
201
+ <span class="eyebrow">${p(t?.name||T.key)} \xB7 ${s}${e.from?` \xB7 from ${p(e.from)}`:""}${e.updated?` \xB7 ${p(D(Date.parse(e.updated)))}`:""}</span>
202
+ <h1>${Re()?`${g("warning",22)} `:""}${p(e.title)}</h1>
203
+ <div class="rv-intro"></div>
204
+ <div class="rv-progress" id="rv-progress"></div>
205
+ ${T.data.errors.length?`<details class="problems"><summary>${g("warning",16)} ${T.data.errors.length} problem${T.data.errors.length===1?"":"s"} in this review's file (the agent can fix them: <code>hitl validate ${p(T.id)}</code>)</summary><ul>${T.data.errors.map(a=>`<li>${p(a)}</li>`).join("")}</ul></details>`:""}
206
+ ${e.status==="closed"?`<p class="rv-closed">${g("check",14)} The agent closed this ${e.mode==="approve"?"question":"review"}.</p>`:""}
207
+ </header>
208
+ ${G().length&&!Re()?'<div class="rv-tools" id="rv-tools"></div>':""}
209
+ <div class="rv-items" id="rv-items"></div>
210
+ <section class="rv-finish" id="rv-finish"></section>
211
+ <section class="rv-whole" data-item=""></section>`,e.intro&&le(n.querySelector(".rv-intro"),e.intro,""),P.replaceChildren(n),On(),Ys(),Jt(),en(),sa(n.querySelector(".rv-whole"))}function On(){let e=P.querySelector("#rv-tools");if(!e)return;let t=G().length,n=G().filter(s=>!ee(s.id)).length;e.innerHTML=`${St()?`<div class="seg" role="tablist">${[["all",`All ${t}`],["todo",`To review ${n}`],["changes","Needs changes"],["comments","Comments"]].map(([s,a])=>`<button class="seg-btn${T.filter===s?" on":""}" data-filter="${s}">${a}</button>`).join("")}</div>`:""}<span class="grow"></span>${St()&&t>1?`<div class="seg"><button class="seg-btn${T.mode==="list"?" on":""}" data-mode="list">${g("menu",15)} List</button><button class="seg-btn${T.mode==="swipe"?" on":""}" data-mode="swipe">${g("cards",15)} One at a time</button></div>`:""}`,e.onclick=s=>{let a=s.target.closest("[data-filter]"),o=s.target.closest("[data-mode]");a?(T.filter=a.dataset.filter,On(),Ys()):o&&(T.mode=o.dataset.mode,R("rv-mode",T.mode),On(),Ys(),T.mode==="swipe"&&et(vr()))}}function Wc(){return G().filter(e=>T.filter==="todo"?!ee(e.id):T.filter==="changes"?ee(e.id)&&ee(e.id).verdict!=="ok":T.filter==="comments"?be(e.id).length>0:!0)}function Ys(){let e=P.querySelector("#rv-items");for(let n of T.inks.values())n.stop();if(T.inks.clear(),T.mode==="swipe"){e.innerHTML='<div class="rv-stage" id="rv-stage"></div><nav class="rv-swipebar" id="rv-swipebar"></nav>';return}e.replaceChildren();let t=Wc();if(!t.length){e.innerHTML=`<p class="empty">${T.filter==="todo"?`${g("check",18)} Everything has a verdict.`:"Nothing here."}</p>`;return}for(let n of t)e.append(xr(n))}function xr(e){let t=G().indexOf(e)+1,n=document.createElement("article");n.className="rv-item",n.dataset.item=e.id,n.id="item-"+e.id;let s=T.data.files?.[e.id],a=e.kind==="file"&&e.file&&s?.exists!==!1?`<a class="icon-btn" href="${Q(e.file,e.lines?{line:e.lines}:{})}" title="Open in Files" aria-label="Open in Files">${g("folder-open",16)}</a>`:"";n.innerHTML=`<header class="rv-ihead"><span class="rv-n">${t}</span><span class="rv-kind">${g(Uc[e.kind]||"file",16)}</span><h3 class="rv-title">${p(e.title)}</h3><span class="rv-chip"></span>${a}<button class="icon-btn" data-act="fold" title="Fold" aria-label="Fold">${g("chevron-down",16)}</button></header>
212
+ ${s&&!s.exists?`<p class="rv-banner warn">${g("warning",14)} This file isn't there any more.${e.snap?" Showing the copy kept when it was shown.":""}</p>`:""}
213
+ ${s?.changed?`<p class="rv-banner">${g("diff",14)} Changed since it was shown. <button class="link-btn" data-act="since">See what changed</button></p><div class="rv-since" hidden></div>`:""}
214
+ ${e.note?`<div class="rv-note md">${Ye(e.note,"")}</div>`:""}
215
+ <div class="rv-body"></div>
216
+ ${e.ask?`<p class="rv-ask">${g("chat",15)} ${p(e.ask)}</p>`:""}
217
+ <div class="rv-verdict"></div>
218
+ <div class="rv-comments"></div>
219
+ ${U()?"":`<div class="rv-cbar"><button class="btn small" data-act="comment">${g("chat",14)} <span>Comment</span></button>${Kc(e)?`<button class="btn small" data-act="mark">${g("pen",14)} Mark an area</button>`:""}</div>`}`,e.collapsed&&n.classList.add("folded");let o=n.querySelector(".rv-body");return Qc(o,e,n),Pn(n,e),Xc(n,e),n}var Kc=e=>e.kind==="image"||e.kind==="file"&&br.has(Z(e.file||""))&&!e.against,xt=e=>T.data.files?.[e.id]?.exists===!1&&e.snap?B(e.snap.path):B(e.file),Xs=e=>/^(https?:|data:image\/)/i.test(e)?e:B(String(e).replace(/^\.?\//,""));function Qc(e,t,n){let s=(o,r,i)=>Ue(n,t,{line:o,endLine:r,quote:i}),a=(o,r,i=1,l)=>{let c=yt(e,{text:o,name:r,first:i,caption:l,onComment:U()?null:s,readOnly:U()});n.lines=c,Gt(n,t)};switch(t.kind){case"file":{let o=Z(t.file);if(t.against)return void Gs(e,t,n,`${t.file} \xB7 since ${t.against}`);if(br.has(o))return void Js(e,t,n,xt(t),"");if(Bc.has(o))return void(e.innerHTML=`<video controls preload="metadata" src="${p(xt(t))}"></video>`);if(Dc.has(o))return void(e.innerHTML=`<audio controls preload="metadata" src="${p(xt(t))}"></audio>`);if(o==="pdf")return void(e.innerHTML=`<a class="blk-link" href="${p(xt(t))}" target="_blank" rel="noopener">${g("file",16)}<span>Open the PDF</span></a>`);if((o==="html"||o==="htm")&&!t.lines){e.innerHTML='<div class="rv-tabs"><button class="seg-btn on" data-tab="page">Page</button><button class="seg-btn" data-tab="source">Source</button></div><div class="rv-tab"></div>';let r=e.querySelector(".rv-tab"),i=()=>r.innerHTML=`<iframe class="blk-html" sandbox="" src="${p(xt(t))}?as=page" style="height:420px" title="${p(t.file)}"></iframe>`;i(),e.querySelector(".rv-tabs").onclick=async l=>{let c=l.target.closest("[data-tab]");if(!c)return;if(e.querySelectorAll("[data-tab]").forEach(u=>u.classList.toggle("on",u===c)),c.dataset.tab==="page")return i();let d=await fr(t);d&&hr(r,d,t,n)};return}e.innerHTML='<div class="skeleton" style="height:96px"></div>',fr(t).then(r=>{if(!r)return void(e.innerHTML=`<p class="problem">${p(t.file)}: can't be shown as text. <a href="${p(xt(t))}" download>Download it</a>.</p>`);if((o==="md"||o==="markdown"||o==="mdx")&&!t.lines)return Xt(e,t,n,r.text,i=>le(i,r.text,t.file.includes("/")?t.file.slice(0,t.file.lastIndexOf("/")):""));if((o==="csv"||o==="tsv")&&!t.lines)return Xt(e,t,n,r.text,i=>ys(i,r.text,o==="tsv"?" ":","));if((o==="mmd"||o==="mermaid")&&!t.lines)return Xt(e,t,n,r.text,i=>ke(i,r.text));if((o==="json"||o==="jsonc")&&!t.lines&&r.text.length<2e6)try{let i=JSON.parse(r.text);return Xt(e,t,n,r.text,l=>l.innerHTML=`<div class="jtree">${Pt(i,0)}</div>`)}catch{}hr(e,r,t,n),r.truncated&&e.insertAdjacentHTML("beforeend",'<p class="muted small">Only the start of this file is shown (it is large).</p>')});return}case"code":return t.before!==void 0?void mr(e,t,n,t.code,t.name||`x.${t.lang||"txt"}`):a(t.code,t.name||`x.${t.lang||"txt"}`,1,`${t.name||t.lang||"code"} \xB7 ${t.code.split(`
220
+ `).length} lines`);case"text":return t.before!==void 0?void mr(e,t,n,t.text,t.name||"text.txt"):a(t.text,t.name||"text.txt",1,t.name||"text");case"md":return Xt(e,t,n,t.md,o=>le(o,t.md,""));case"json":e.innerHTML=`<div class="jtree">${Pt(t.json,0)}</div>`;return;case"diff":return Gs(e,t,n,t.title,t.diff);case"image":return t.before?void Zc(e,t,n):Js(e,t,n,Xs(t.image),t.alt||"");case"mermaid":{let o=document.createElement("div");o.className="md-diagram",e.append(o),ke(o,t.mermaid);return}case"html":{let o=document.createElement("iframe");o.className="blk-html",o.setAttribute("sandbox",""),o.setAttribute("referrerpolicy","no-referrer"),o.style.height=(t.height||360)+"px",o.title=t.title,o.srcdoc="<style>html,body{margin:0;min-height:100%}</style>"+t.html,e.append(o);return}case"link":{let o="";try{o=new URL(t.link).host}catch{o=""}e.innerHTML=`<a class="blk-link" href="${p(t.link)}" target="_blank" rel="noopener noreferrer">${g("external",16)}<span>${p(t.label||t.link)}</span><small>${p(o)}</small></a>`;return}}}async function fr(e){let t=T.data.files?.[e.id]?.exists===!1&&e.snap?e.snap.path:e.file;try{return await E(`api/text?path=${encodeURIComponent(t)}${e.lines?"&lines="+encodeURIComponent(e.lines):""}`)}catch{return null}}function hr(e,t,n,s){let a=n.lines?`${n.file} \xB7 lines ${t.first}\u2013${t.first+t.text.split(`
221
+ `).length-1} of ${t.total}`:`${n.file} \xB7 ${t.total.toLocaleString()} lines`;s.lines=yt(e,{text:t.text,name:n.file,first:t.first,caption:a,onComment:U()?null:(o,r,i)=>Ue(s,n,{line:o,endLine:r,quote:i}),readOnly:U()}),Gt(s,n)}function Xt(e,t,n,s,a){e.innerHTML='<div class="rv-tabs"><button class="seg-btn on" data-tab="view">Rendered</button><button class="seg-btn" data-tab="source">Source</button></div><div class="rv-tab"></div>';let o=e.querySelector(".rv-tab"),r=()=>{o.innerHTML='<div class="md rv-rendered"></div>',a(o.firstElementChild),n.lines=null,_n(n,t)};r(),e.querySelector(".rv-tabs").onclick=i=>{let l=i.target.closest("[data-tab]");if(l){if(e.querySelectorAll("[data-tab]").forEach(c=>c.classList.toggle("on",c===l)),l.dataset.tab==="view")return r();n.lines=yt(o,{text:s,name:t.file||t.name||"notes.md",onComment:U()?null:(c,d,u)=>Ue(n,t,{line:c,endLine:d,quote:u}),readOnly:U()}),Gt(n,t)}},be(t.id).some(i=>i.line)&&e.querySelector('[data-tab="source"]').insertAdjacentHTML("beforeend",` <span class="count">${be(t.id).filter(i=>i.line).length}</span>`)}function mr(e,t,n,s,a){e.innerHTML=`<div class="rv-tabs"><button class="seg-btn on" data-tab="after">After</button><button class="seg-btn" data-tab="before">Before</button><button class="seg-btn" data-tab="changes">${g("diff",14)} Changes</button></div><div class="rv-tab"></div>`;let o=e.querySelector(".rv-tab"),r=async i=>{if(e.querySelectorAll("[data-tab]").forEach(l=>l.classList.toggle("on",l.dataset.tab===i)),n.lines=null,i==="after")n.lines=yt(o,{text:s,name:a,onComment:U()?null:(l,c,d)=>Ue(n,t,{line:l,endLine:c,quote:d}),readOnly:U()}),Gt(n,t);else if(i==="before")yt(o,{text:t.before,name:a,caption:"Before",readOnly:!0});else{o.innerHTML='<div class="skeleton" style="height:96px"></div>';let l=await E(`api/r/${encodeURIComponent(T.id)}/diff?item=${encodeURIComponent(t.id)}`).catch(c=>`error: ${c.message}`);Gs(o,t,n,"Before \u2192 after",l)}};e.querySelector(".rv-tabs").onclick=i=>{let l=i.target.closest("[data-tab]");l&&r(l.dataset.tab)},r(R("rv-ba")==="changes"?"changes":"after")}async function Gs(e,t,n,s,a){if(a===void 0&&(e.innerHTML='<div class="skeleton" style="height:96px"></div>',a=await E(`api/r/${encodeURIComponent(T.id)}/diff?item=${encodeURIComponent(t.id)}`).catch(r=>`error: ${r.message}`)),typeof a!="string"||!a.trim())return void(e.innerHTML='<p class="note">No changes.</p>');_e(e,a,t.file||Vc(a),{comments:!1,caption:s});let o=e.querySelector(".diff");o&&(n.diff=o,Sr(n,t),!U()&&o.addEventListener("click",r=>{if(r.target.closest(".under, .rv-composer"))return;let i=r.target.closest(".dl");if(!i||String(getSelection()).trim())return;let l=Number(i.dataset.n||0),c=Number(i.querySelector(".on")?.textContent||0);!l&&!c||Ue(n,t,l?{line:l,quote:i.querySelector(".dt")?.textContent||""}:{line:c,side:"old",quote:i.querySelector(".dt")?.textContent||""},i)}))}var Vc=e=>/^\+\+\+ (?:b\/)?(.+)$/m.exec(e)?.[1]?.trim()||"changes.diff";function Js(e,t,n,s,a){e.innerHTML=`<div class="rv-pic"><div class="picwrap"><img alt="${p(a)}" src="${p(s)}" draggable="false"><svg class="marks" viewBox="0 0 1 1" preserveAspectRatio="none"></svg><div class="pins"></div></div></div>`,n.pic=e.querySelector("img"),n.picwrap=e.querySelector(".picwrap"),n.pic.onclick=()=>{T.inks.has(t.id)||e.querySelector(".rv-pic").classList.toggle("actual")},Lr(n,t)}function Zc(e,t,n){let s=Xs(t.before),a=Xs(t.image);e.innerHTML='<div class="rv-tabs"><button class="seg-btn on" data-tab="slide">Slide</button><button class="seg-btn" data-tab="side">Side by side</button><button class="seg-btn" data-tab="after">After</button><button class="seg-btn" data-tab="before">Before</button></div><div class="rv-tab"></div>';let o=e.querySelector(".rv-tab"),r=l=>{if(e.querySelectorAll("[data-tab]").forEach(d=>d.classList.toggle("on",d.dataset.tab===l)),n.pic=null,l==="slide"){o.innerHTML=`<div class="compare-slide" style="--at:50%"><img class="after" src="${p(a)}" alt="After" draggable="false"><div class="before-clip"><img class="before" src="${p(s)}" alt="Before" draggable="false"></div><div class="handle" role="slider" aria-label="Before and after" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50" tabindex="0"><span>${g("arrow-left",14)}${g("arrow-right",14)}</span></div><span class="lbl l">Before</span><span class="lbl r">After</span></div>`;let d=o.querySelector(".compare-slide"),u=d.querySelector(".handle"),$=h=>{let m=d.getBoundingClientRect(),b=Math.max(0,Math.min(100,(h-m.left)/m.width*100));d.style.setProperty("--at",b+"%"),u.setAttribute("aria-valuenow",String(Math.round(b)))};d.onpointerdown=h=>{d.setPointerCapture(h.pointerId),$(h.clientX),d.onpointermove=m=>$(m.clientX),d.onpointerup=()=>d.onpointermove=null},u.onkeydown=h=>{let m=parseFloat(d.style.getPropertyValue("--at"))||50;(h.key==="ArrowLeft"||h.key==="ArrowRight")&&(h.preventDefault(),d.style.setProperty("--at",Math.max(0,Math.min(100,m+(h.key==="ArrowLeft"?-5:5)))+"%"))}}else l==="side"?o.innerHTML=`<div class="compare"><figure><figcaption>Before</figcaption><div class="stage"><img src="${p(s)}" alt="Before"></div></figure><figure><figcaption>After</figcaption><div class="stage"><img src="${p(a)}" alt="After"></div></figure></div>`:(Js(o,t,n,l==="after"?a:s,l==="after"?"After":"Before"),l==="before"&&(n.pic=null));let c=n.querySelector('[data-act="mark"]');c&&(c.disabled=l!=="after")};e.querySelector(".rv-tabs").onclick=l=>{let c=l.target.closest("[data-tab]");c&&r(c.dataset.tab)},r("slide");let i=n.querySelector('[data-act="mark"]');i&&(i.disabled=!0)}function Pn(e,t){let n=ee(t.id),s=e.querySelector(".rv-chip"),a=n&&n.rev!==t.rev;s.innerHTML=n?`<span class="pill ${n.verdict==="ok"?"ok":n.verdict==="no"?"danger":"warn"}">${g(Yt[n.verdict].icon,12)} ${Yt[n.verdict].short}</span>${a?'<span class="pill">updated since</span>':""}`:"",e.classList.toggle("done",!!n&&!a);let o=e.querySelector(".rv-verdict");if(!St())o.innerHTML="";else{o.innerHTML=`<div class="verdicts${U()?" ro":""}">${["ok","changes","no"].map(l=>`<button class="vbtn v-${l}${n?.verdict===l?" on":""}" data-verdict="${l}" ${U()?"disabled":""}>${g(Yt[l].icon,16)}<span class="long">${Yt[l].label}</span><span class="short">${Yt[l].short}</span></button>`).join("")}</div>${n&&(n.verdict!=="ok"||n.note)?`<textarea class="vnote" rows="1" data-grow placeholder="${n.verdict==="ok"?"Anything to add?":"What should change?"}" ${U()?"disabled":""}>${p(n.note||"")}</textarea>`:""}${n?.ack?`<p class="ack">${g("sparkles",14)} <b>Agent:</b> ${p(n.ack.note||"done")}</p>`:""}${a?'<p class="faint small">You gave this verdict to an earlier version; the agent has changed it since.</p>':""}`;let i=o.querySelector(".vnote");i&&aa(i)}_n(e,t),e.lines&&Gt(e,t),e.diff&&Sr(e,t),e.picwrap&&Lr(e,t);let r=e.querySelector('[data-act="comment"] span');r&&(r.textContent=(be(t.id).length,"Comment")),T.mode==="swipe"&&Mr()}function _n(e,t){let n=e.querySelector(".rv-comments");if(!n||n.contains(document.activeElement))return;let s=be(t.id).filter(a=>!a.line||!e.lines&&!e.diff);n.innerHTML=s.map(a=>zn(a,t)).join("")}function Gt(e,t){let n=e.lines;if(_n(e,t),!!n){n.clearPlaced();for(let s of be(t.id).filter(a=>a.line&&a.side!=="old")){let a=document.createElement("div");a.className="threads",a.innerHTML=zn(s,t),n.place(s.endLine||s.line,a)}}}function Sr(e,t){let n=e.diff;if(_n(e,t),!!n){n.querySelectorAll(".under").forEach(s=>s.remove());for(let s of be(t.id).filter(a=>a.line)){let a=[...n.querySelectorAll(".dl")],o=s.side==="old"?a.find(l=>l.classList.contains("del")&&Number(l.querySelector(".on")?.textContent)===s.line):a.find(l=>Number(l.dataset.n)===(s.endLine||s.line));if(!o)continue;let r=document.createElement("div");r.className="threads under",r.innerHTML=zn(s,t);let i=o;for(;i.nextElementSibling?.classList.contains("under");)i=i.nextElementSibling;i.after(r)}}}function ea(e,t){return be(e.id).filter(n=>n.strokes?.length).indexOf(t)+1}function Lr(e,t){let n=e.picwrap;if(!n?.isConnected)return;let s=be(t.id).filter(a=>a.strokes?.length);n.querySelector(".marks").innerHTML=s.map(a=>so(a.strokes,a.status)).join(""),n.querySelector(".pins").innerHTML=s.map(a=>`<button class="pin ${a.status}" data-pin="${p(a.id)}" style="left:${a.strokes[0][0]*100}%;top:${a.strokes[0][1]*100}%" title="Marked area ${ea(t,a)}">${ea(t,a)}</button>`).join(""),n.querySelector(".pins").onclick=a=>{let o=a.target.closest("[data-pin]"),r=o&&e.querySelector(`[data-cid="${CSS.escape(o.dataset.pin)}"]`);r&&(r.scrollIntoView({block:"center",behavior:"smooth"}),r.classList.remove("flash"),r.offsetWidth,r.classList.add("flash"))}}function Yc(e,t){return e.strokes?.length?`<span class="pin static ${e.status}">${ea(t,e)}</span> Marked area`:e.line?`${e.side==="old"?"Removed ":""}${e.endLine&&e.endLine!==e.line?`lines ${e.line}\u2013${e.endLine}`:`line ${e.line}`}`:e.quote?"On the selection":""}function zn(e,t){let n=e.from==="agent",s=e.status==="resolved",a=t?Yc(e,t):"",o=e.replies.map(i=>`<div class="reply${i.from==="agent"?" agent":""}"><div class="cmt-head"><b>${i.from==="agent"?`${g("sparkles",13)} agent`:"You"}</b><span class="faint">${D(Date.parse(i.at))}</span></div><div class="cmt-body md">${Ye(i.body,"")}</div></div>`).join(""),r=t&&e.rev&&e.rev!==t.rev&&!s;return`<div class="cmt rv-cmt${s?" resolved":""}${n?" agent":""}" data-cid="${p(e.id)}">
222
+ <div class="cmt-head"><b>${n?`${g("sparkles",13)} agent`:"You"}</b>${a?`<span class="where">${a}</span>`:""}<span class="faint">${D(Date.parse(e.at))}</span>${s?'<span class="pill ok">Resolved</span>':""}${r?'<span class="pill">item changed since</span>':""}
223
+ ${U()?"":`<span class="cmt-acts"><button class="mini" data-cact="${s?"reopen":"resolve"}">${s?g("undo",14)+" Reopen":g("check",14)+" Resolve"}</button>${n?"":`<button class="mini" data-cact="edit" aria-label="Edit">${g("edit",14)}</button><button class="mini" data-cact="delete" aria-label="Delete">${g("trash",14)}</button>`}</span>`}</div>
224
+ ${e.quote&&!e.line?`<blockquote class="quote-sel">${p(e.quote)}</blockquote>`:""}
225
+ ${e.body?`<div class="cmt-body md">${Ye(e.body,"")}</div>`:""}
226
+ ${e.marked?`<a href="${p(B(e.marked))}" target="_blank" rel="noopener"><img class="rimg" src="${p(B(e.marked))}" alt="The marked area" loading="lazy"></a>`:""}
227
+ ${mn((e.photos||[]).map(i=>B(i)))}
228
+ ${o}
229
+ ${U()?"":`<form class="rv-reply" data-cid="${p(e.id)}"><textarea rows="1" data-grow placeholder="Reply\u2026"></textarea><button class="btn small" type="submit">Reply</button></form>`}
230
+ </div>`}function sa(e){if(!e)return;let t=be("");e.innerHTML=`${t.length?`<h2 class="rv-h2">On the whole ${Re()?"question":"review"}</h2>${t.map(n=>zn(n,null)).join("")}`:""}${U()?"":`<button class="link-btn rv-whole-btn" data-comment-whole>${g("chat",14)} Comment on the whole ${Re()?"question":"review"}</button>`}`}function Jt(){let e=P.querySelector("#rv-progress");if(!e)return;let t=G().length,n=T.data.summary;if(Re())return void(e.innerHTML="");if(!St())return void(e.innerHTML=t?`<span class="faint">${t} thing${t===1?"":"s"} to look at${n.comments?` \xB7 ${n.comments} comment${n.comments===1?"":"s"}`:""}</span>`:"");let s=t?Math.round(n.reviewed/t*100):0;e.innerHTML=`<div class="mini-bar big"><span style="width:${s}%"></span></div><div class="rv-stats"><b>${n.reviewed} of ${t}</b> reviewed${n.ok?` \xB7 <span class="ok-t">${n.ok} good</span>`:""}${n.changes?` \xB7 <span class="warn-t">${n.changes} need changes</span>`:""}${n.no?` \xB7 <span class="danger-t">${n.no} no</span>`:""}${n.open?` \xB7 ${n.open} open comment${n.open===1?"":"s"}`:""}</div>`;let a=P.querySelector("#rv-tools");a&&!a.contains(document.activeElement)&&On()}function en(e=!1){let t=P.querySelector("#rv-finish");if(!t||!e&&t.contains(document.activeElement))return;let n=Ne().overall,s=T.data.summary;if(Re()){t.className="rv-finish gate"+(n?" answered v-"+n.verdict:""),t.innerHTML=n?`<div class="gate-answer"><span class="gate-mark">${g(n.verdict==="ok"?"check":n.verdict==="no"?"x":"edit",22)}</span><div><b>${n.verdict==="ok"?"You approved this":n.verdict==="no"?"You refused this":"You asked for changes first"}</b>${n.note?`<p>${p(n.note)}</p>`:""}<span class="faint">${D(Date.parse(n.at))}</span></div>${U()?"":'<button class="btn small" data-overall="">Change my answer</button>'}</div>`:U()?'<p class="faint">Waiting for an answer.</p>':`<textarea class="onote" rows="1" data-grow placeholder="A note for the agent (optional)"></textarea><div class="gate-btns"><button class="btn big v-no" data-overall="no">${g("x",18)} ${Zs.no}</button><button class="btn big v-changes" data-overall="changes">${g("edit",18)} ${Zs.changes}</button><button class="btn big primary v-ok" data-overall="ok">${g("check",18)} ${Zs.ok}</button></div>`;return}if(!G().length)return void(t.innerHTML="");if(!St()){t.className="rv-finish",t.innerHTML=n?`<p class="done-note">${g("check",16)} You've looked at this${n.note?`: \u201C${p(n.note)}\u201D`:""}. <button class="link-btn" data-overall="">Undo</button></p>`:U()?"":`<textarea class="onote" rows="1" data-grow placeholder="Anything to tell the agent? (optional)"></textarea><div class="finish-btns"><button class="btn primary" data-overall="ok">${g("check",16)} Seen it</button></div>`;return}let a=G().filter(o=>!ee(o.id)).length;t.className="rv-finish"+(n?" answered v-"+n.verdict:""),t.innerHTML=n?`<div class="gate-answer"><span class="gate-mark">${g(n.verdict==="ok"?"check":n.verdict==="no"?"x":"edit",20)}</span><div><b>${n.verdict==="ok"?"You approved the review":n.verdict==="no"?"You rejected it":"You asked for changes"}</b>${n.note?`<p>${p(n.note)}</p>`:""}<span class="faint">The agent sees this in <code>hitl news</code>.</span></div>${U()?"":'<button class="btn small" data-overall="">Reopen</button>'}</div>`:U()?"":`<h2 class="rv-h2">Finish the review</h2><p class="faint">${a?`${a} item${a===1?"":"s"} without a verdict${a&&s.reviewed===0,""}.`:"Every item has a verdict."} The agent is told when you finish.</p>
231
+ <textarea class="onote" rows="1" data-grow placeholder="A note on the whole thing (optional)"></textarea>
232
+ <div class="finish-btns">${a?`<button class="btn" data-accept-rest>${g("check",16)} The other ${a} look good</button>`:""}<button class="btn v-changes" data-overall="changes">${g("edit",16)} Request changes</button><button class="btn primary v-ok" data-overall="ok">${g("check",16)} Approve</button></div>`,t.querySelectorAll("textarea").forEach(aa)}async function Oe(e,t){return await E(`api/r/${encodeURIComponent(T.id)}/${e}`,{method:"POST",json:t})}async function Hn(){T.data=await E(`api/r/${encodeURIComponent(T.id)}`),T.shape=na(T.data)}async function ta(e,t,n){let s=ee(e.id),a=s?.verdict===t&&n===void 0?null:t,o=await Oe("verdict",{item:e.id,verdict:a,note:n??(a&&s?.note||"")});o.verdict?Ne().items[e.id]=o.verdict:delete Ne().items[e.id],T.data.summary=o.summary;let r=P.querySelector(`[data-item="${CSS.escape(e.id)}"]`);return r&&Pn(r,e),Jt(),en(),a}function Xc(e,t){e.addEventListener("click",async s=>{let a=s.target.closest("[data-verdict]"),o=s.target.closest("[data-act]");try{if(a){let r=await ta(t,a.dataset.verdict);r&&r!=="ok"&&requestAnimationFrame(()=>e.querySelector(".vnote")?.focus()),r&&T.mode==="swipe"&&setTimeout(()=>r==="ok"&&Bn(),260)}else if(o?.dataset.act==="comment"){let r=Jc(e);Ue(e,t,r?{quote:r}:{})}else if(o?.dataset.act==="mark")td(e,t);else if(o?.dataset.act==="fold")e.classList.toggle("folded");else if(o?.dataset.act==="since"){let r=e.querySelector(".rv-since");if(r.hidden=!r.hidden,!r.hidden&&!r.childElementCount){let i=await E(`api/r/${encodeURIComponent(T.id)}/diff?item=${encodeURIComponent(t.id)}`).catch(l=>`error: ${l.message}`);i.trim()?_e(r,i,t.file,{comments:!1,caption:"As shown \u2192 now"}):r.innerHTML='<p class="note">No changes in the text.</p>'}}}catch(r){O(r.message)}});let n=ne(async s=>{let a=ee(t.id);if(a)try{let o=await Oe("verdict",{item:t.id,verdict:a.verdict,note:s.value});Ne().items[t.id]=o.verdict,T.data.summary=o.summary,Gc(s,"Saved")}catch(o){O(o.message)}},700);e.addEventListener("input",s=>{s.target.matches(".vnote")&&n(s.target)})}function Gc(e,t){let n=e.parentElement.querySelector(".saved");n||(n=document.createElement("span"),n.className="saved faint small",e.after(n)),n.textContent=t,clearTimeout(n.timer),n.timer=setTimeout(()=>n.remove(),1400)}function Jc(e){let t=getSelection();if(!t||t.isCollapsed)return"";let n=t.anchorNode?.nodeType===1?t.anchorNode:t.anchorNode?.parentElement;return!n||!e.querySelector(".rv-body")?.contains(n)?"":String(t).trim().slice(0,2e3)}function ed(e){return`<form class="rv-composer">
233
+ <div class="composer-head">${p(e)}</div>
234
+ <textarea rows="2" data-grow placeholder="What should change? Markdown works. Ctrl+Enter to send."></textarea>
235
+ <div class="photo-list"></div>
236
+ <div class="composer-acts"><button class="btn primary" type="submit">Comment</button>${fn()}<button class="btn" type="button" data-cancel>Cancel</button></div>
237
+ </form>`}function Ue(e,t,n={},s){P.querySelectorAll(".rv-composer").forEach(l=>l.querySelector("textarea").value.trim()?null:l.remove());let a=n.line?`Comment on ${n.side==="old"?"removed ":""}${n.endLine&&n.endLine!==n.line?`lines ${n.line}\u2013${n.endLine}`:`line ${n.line}`}`:n.quote?"Comment on the selection":n.strokes?"Comment on the marked area":`Comment on ${t?`\u201C${t.title}\u201D`:"the whole review"}`,o=document.createElement("div");o.innerHTML=ed(a);let r=o.firstElementChild;if(r.at=n,r.it=t,n.quote&&!n.line&&r.querySelector(".composer-head").insertAdjacentHTML("afterend",`<blockquote class="quote-sel">${p(n.quote.slice(0,400))}</blockquote>`),n.line&&e.lines&&!s)r.classList.add("under"),e.lines.place(n.endLine||n.line,r);else if(s){r.classList.add("under");let l=s;for(;l.nextElementSibling?.classList.contains("under");)l=l.nextElementSibling;l.after(r)}else(t?e.querySelector(".rv-cbar"):e).before(r);return r.querySelector("textarea").focus({preventScroll:!0}),r.scrollIntoView({block:"nearest",behavior:"smooth"}),r}function td(e,t){if(T.inks.has(t.id)||!e.picwrap||!e.pic)return;e.querySelector(".rv-pic")?.classList.remove("actual");let n=no(e.picwrap,e.pic);T.inks.set(t.id,n);let s=document.createElement("div");s.className="ink-tools",s.innerHTML=`<span class="ink-hint">${g("pen",14)} Draw around what you mean, then say what should change.</span><span class="grow"></span><button class="btn small" type="button" data-ink="undo">${g("undo",14)} Undo</button><button class="btn small" type="button" data-ink="clear">Clear</button>`,e.picwrap.parentElement.after(s);let a=Ue(e,t,{strokes:!0});a.ink=n,a.inkBar=s,s.onclick=o=>{let r=o.target.closest("[data-ink]");r?.dataset.ink==="undo"?n.undo():r?.dataset.ink==="clear"&&n.clear()}}function Tr(e){if(e.ink){e.ink.stop(),e.inkBar?.remove();for(let[t,n]of T.inks)n===e.ink&&T.inks.delete(t)}}document.addEventListener("submit",async e=>{let t=e.target;if(!T||!P?.contains(t)||!t.matches(".rv-composer, .rv-reply, .rv-edit"))return;e.preventDefault();let n=t.querySelector("textarea").value.trim(),s=t.querySelector("[type=submit]");try{if(t.matches(".rv-composer")){let a=hn(t),o={item:t.it?.id||"",body:n,photos:a},r=t.at||{};if(r.line?Object.assign(o,{line:r.line,...r.endLine?{endLine:r.endLine}:{},...r.side?{side:r.side}:{},...r.quote?{quote:r.quote}:{}}):r.quote&&(o.quote=r.quote),t.ink){if(!t.ink.count())return O("Draw on the picture first");Object.assign(o,await t.ink.marks())}if(!n&&!a.length)return O("Say what you mean first");s.disabled=!0,await Oe("comment",o),Tr(t),t.remove()}else if(t.matches(".rv-reply")){if(!n)return;s.disabled=!0,await Oe("reply",{cid:t.dataset.cid,body:n})}else s.disabled=!0,await Oe("edit",{cid:t.dataset.cid,body:n});await Hn(),Rn()}catch(a){s.disabled=!1,O(a.message)}});function Rn(){for(let e of G()){let t=P.querySelector(`[data-item="${CSS.escape(e.id)}"]`);t&&Pn(t,e)}sa(P.querySelector(".rv-whole")),Jt(),en()}document.addEventListener("click",async e=>{if(!T||!P?.contains(e.target))return;let t=e.target.closest(".rv-composer [data-cancel]");if(t){let r=t.closest(".rv-composer");Tr(r),r.remove();return}let n=e.target.closest(".rv-cmt [data-cact]");if(n){let r=n.closest("[data-cid]").dataset.cid;try{if(n.dataset.cact==="resolve"||n.dataset.cact==="reopen")await Oe("status",{cid:[r],status:n.dataset.cact==="resolve"?"resolved":"open"});else if(n.dataset.cact==="delete"){if(!confirm("Delete this comment?"))return;await Oe("delete",{cid:r})}else if(n.dataset.cact==="edit"){let i=Ne().comments.find(d=>d.id===r),l=n.closest(".rv-cmt").querySelector(":scope > .cmt-body"),c=document.createElement("form");c.className="rv-edit",c.dataset.cid=r,c.innerHTML=`<textarea rows="2" data-grow>${p(i?.body||"")}</textarea><div class="composer-acts"><button class="btn primary small" type="submit">Save</button><button class="btn small" type="button" data-cancel-edit>Cancel</button></div>`,(l||n.closest(".rv-cmt").querySelector(".cmt-head")).after(c),l?.remove(),aa(c.querySelector("textarea")),c.querySelector("textarea").focus();return}await Hn(),Rn()}catch(i){O(i.message)}return}if(e.target.closest("[data-cancel-edit]"))return Rn();let s=e.target.closest("[data-overall]"),a=e.target.closest("[data-accept-rest]");if(s||a){let r=P.querySelector("#rv-finish"),i=r?.querySelector(".onote")?.value||"";try{if(a){for(let c of G())ee(c.id)||await Oe("verdict",{item:c.id,verdict:"ok",note:""});await Hn(),Rn();return}let l=s.dataset.overall;if(l==="changes"&&St()&&!i.trim()&&!Ne().comments.length&&!Object.values(Ne().items).some(c=>c.verdict!=="ok"))return r.querySelector(".onote")?.focus(),O("Say what should change (in the note, or on the items)");await Oe("overall",{verdict:l||null,note:i}),await Hn(),en(!0),Jt(),l&&O(Re()?l==="ok"?"Approved: the agent is told":"Sent: the agent is told":"Sent to the agent")}catch(l){O(l.message)}}e.target.closest("[data-comment-whole]")&&Ue(P.querySelector(".rv-whole"),null,{})});document.addEventListener("keydown",e=>{if(!(!T||!P?.isConnected)){if(e.key==="Enter"&&(e.ctrlKey||e.metaKey)&&e.target.matches(".rv-composer textarea, .rv-reply textarea, .rv-edit textarea")){e.preventDefault(),e.target.form.requestSubmit();return}T.mode!=="swipe"||e.target.closest?.("input,textarea,select")||e.altKey||e.ctrlKey||e.metaKey||(e.key==="ArrowRight"?Bn():e.key==="ArrowLeft"&&Cr())}});function et(e){let t=P.querySelector("#rv-stage");if(!t)return;let n=G();T.index=Math.max(0,Math.min(n.length-1,e));let s=n[T.index];if(!s)return;for(let o of T.inks.values())o.stop();T.inks.clear();let a=xr(s);a.classList.add("swipe-card"),t.replaceChildren(a),nd(t,a,s),Mr(),history.replaceState(null,"",Nn(T.key,T.id,s.id))}function Mr(){let e=P?.querySelector("#rv-swipebar");if(!e)return;let t=G();e.innerHTML=`<button class="icon-btn" data-sw="prev" aria-label="Previous" ${T.index===0?"disabled":""}>${g("arrow-left")}</button><span class="dots">${t.map((n,s)=>{let a=ee(n.id);return`<button class="dot${s===T.index?" cur":""}${a?" v-"+a.verdict:""}" data-sw="${s}" aria-label="Item ${s+1}"></button>`}).join("")}</span><span class="faint">${T.index+1} / ${t.length}</span><button class="icon-btn" data-sw="next" aria-label="Next" ${T.index>=t.length-1?"disabled":""}>${g("arrow-right")}</button>`,e.onclick=n=>{let s=n.target.closest("[data-sw]");s&&(s.dataset.sw==="prev"?Cr():s.dataset.sw==="next"?Bn():et(Number(s.dataset.sw)))}}function Bn(){let e=G(),t=e.findIndex((n,s)=>s>T.index&&!ee(n.id));if(t>=0)return et(t);if(T.index<e.length-1)return et(T.index+1);P.querySelector("#rv-finish")?.scrollIntoView({behavior:"smooth"})}var Cr=()=>T.index>0&&et(T.index-1);function nd(e,t,n){let s=null,a=t.querySelector(".rv-ihead");a.addEventListener("pointerdown",r=>{r.target.closest("button,a")||(s={x:r.clientX,y:r.clientY,id:r.pointerId},a.setPointerCapture(r.pointerId),t.style.transition="none")}),a.addEventListener("pointermove",r=>{if(!s||r.pointerId!==s.id)return;let i=r.clientX-s.x;t.style.transform=`translateX(${i}px) rotate(${i/40}deg)`,t.dataset.lean=i>40?"ok":i<-40?"changes":""});let o=async r=>{if(!s||r.pointerId!==s.id)return;let i=r.clientX-s.x;if(s=null,t.style.transition="",t.style.transform="",t.dataset.lean="",!(U()||Math.abs(i)<90))try{i>0?(await ta(n,"ok",ee(n.id)?.note||""),setTimeout(Bn,180)):(await ta(n,"changes",ee(n.id)?.note||""),requestAnimationFrame(()=>e.querySelector(".vnote")?.focus()))}catch(l){O(l.message)}};a.addEventListener("pointerup",o),a.addEventListener("pointercancel",o)}function gr(e){if(T.mode==="swipe"){let n=G().findIndex(s=>s.id===e);n>=0&&et(n);return}let t=P.querySelector(`[data-item="${CSS.escape(e)}"]`);t&&(t.classList.remove("folded"),t.scrollIntoView({block:"start",behavior:"smooth"}),t.classList.remove("flash"),t.offsetWidth,t.classList.add("flash"))}function aa(e){requestAnimationFrame(()=>{e.isConnected&&(e.style.height="auto",e.style.height=Math.min(e.scrollHeight+2,Math.max(160,innerHeight*.5))+"px")})}var Dn=e=>Date.parse(e||"")||0;function Ar(e){let t=[];for(let n of e){for(let s of n.reviews){let a=s.status==="open"&&!s.done,o=a?s.mode==="approve"?100:s.mode==="review"?60+(s.unread,0):30:0;t.push({kind:"review",p:n,s,waiting:a,urgency:o,at:Dn(s.updated||s.created)})}for(let s of n.questions){let a=s.status==="open"&&s.toAnswer>0;t.push({kind:"questions",p:n,s,waiting:a,urgency:a?s.blocking?90:50:0,at:Dn(s.updated)})}}return t.sort((n,s)=>s.urgency-n.urgency||s.at-n.at)}function sd(e,t,n){let s=t.mode==="approve",a=s?"Approval":t.mode==="show"?"To look at":"Review",o=s?"warning":t.mode==="show"?"eye":"diff",r;s?r=t.done?`<span class="badge ${t.overall==="ok"?"ok":"danger"}">${t.overall==="ok"?"Approved":t.overall==="no"?"Refused":"Changes asked"}</span>`:'<span class="badge danger">Waiting for your OK</span>':t.done?r=`<span class="badge ${t.overall==="ok"?"ok":"warn"}">${g("check",12)}${t.mode==="show"?"Seen":t.overall==="ok"?"Approved":"Changes asked"}</span>`:t.mode==="review"?r=`<span class="badge accent">${t.items-t.reviewed} to review</span>`:r=`<span class="badge accent">${t.items} to look at</span>`;let i=[r,t.open?`<span class="badge">${t.open} open comment${t.open===1?"":"s"}</span>`:"",t.stale?`<span class="badge warn">${t.stale} updated since</span>`:"",t.errors?`<span class="badge danger">${t.errors} errors</span>`:""].join(""),l=[n?p(e.name):"",a,t.from?`from ${p(t.from)}`:"",t.updated?p(D(Dn(t.updated))):""].filter(Boolean).join(" \xB7 "),c=s?`<span class="row-icon gate">${g(o,22)}</span>`:t.mode==="review"&&t.items?An(t.reviewed,t.items,48):`<span class="row-icon">${g(o,22)}</span>`;return`<a class="set-row${t.status==="closed"?" closed":""}${s&&!t.done?" urgent":""}" href="${Nn(e.key,t.id)}">${c}<div class="set-info"><b class="set-name">${p(t.title)}</b><span class="set-sub">${l}</span><span class="set-chips">${i}</span></div><span class="set-go">${g("chevron-right",20)}</span></a>`}function ad(e,t,n){let s=[t.toAnswer?`<span class="badge accent">${t.toAnswer} to answer</span>`:`<span class="badge ok">${g("check",13)}All answered</span>`,t.blocking?`<span class="badge danger">${g("warning",12)}${t.blocking} blocking</span>`:"",t.changed?`<span class="badge warn">${t.changed} changed</span>`:"",t.later?`<span class="badge">${t.later} later</span>`:"",t.errors?`<span class="badge danger">${t.errors} errors in the file</span>`:""].join(""),a=[n?p(e.name):"","Questions",t.from?`from ${p(t.from)}`:"",`${t.done} of ${t.visible} answered`,t.updated?p(D(Dn(t.updated))):""].filter(Boolean).join(" \xB7 ");return`<a class="set-row${t.status==="closed"?" closed":""}${t.blocking?" urgent":""}" href="${kt(e.key,t.id)}">${An(t.done,t.visible,48)}<div class="set-info"><b class="set-name">${p(t.title)}</b><span class="set-sub">${a}</span><span class="set-chips">${s}</span></div><span class="set-go">${g("chevron-right",20)}</span></a>`}var Er=(e,t)=>e.kind==="review"?sd(e.p,e.s,t):ad(e.p,e.s,t);function oa(e,t=""){let n=v.hub.projects.filter(d=>!t||d.key===t),s=Ar(n),a=s.filter(d=>d.waiting),o=s.filter(d=>!d.waiting),r=a.filter(d=>d.kind==="review"&&d.s.mode==="approve").length,i=!t&&n.length>1,l=t?n[0]:null;document.title=`${a.length?`(${a.length}) `:""}${l?l.name+" \xB7 ":""}hitl`;let c='<div class="page-wrap inbox">';c+=`<header class="page-hero"><div>${l?`<span class="eyebrow">${p(l.name)}</span>`:'<span class="eyebrow">Human In The Loop</span>'}<h1>${a.length?`${a.length} waiting on you`:"All caught up"}</h1>${r?`<p><span class="badge danger">${g("warning",13)} ${r} approval${r===1?"":"s"}: an agent is waiting</span></p>`:""}</div></header>`,l&&(c+=od(l)),s.length?(a.length&&(c+=`<section class="inbox-sec"><div class="sets">${a.map(d=>Er(d,i)).join("")}</div></section>`),o.length&&(c+=`<details class="inbox-done"${a.length?"":" open"}><summary>${g("check",15)} Done (${o.length})</summary><div class="sets">${o.slice(0,60).map(d=>Er(d,i)).join("")}</div></details>`)):c+=`<div class="empty"><div class="empty-art">${g("chat",34)}</div><h2>Nothing from an agent yet</h2><p>When an agent asks you something, shows you something or waits for your OK, it shows up here (and on your phone, with <code>npx hitloop notify ntfy</code>). In a project folder, run <code>npx hitloop init</code> once to set it up for Claude Code.</p>${l?`<p><a class="btn" href="#/p/${encodeURIComponent(l.key)}/files/">${g("folder",16)} Browse the files</a></p>`:""}</div>`,!t&&n.length&&(c+=`<section class="inbox-sec"><h2 class="sec-h">Projects</h2><div class="proj-grid">${n.map(d=>{let u=Ar([d]).filter($=>$.waiting).length;return`<a class="proj-card" href="#/p/${encodeURIComponent(d.key)}"><span class="proj-mark" style="--hue:${tr(d.name)}">${p(d.name.slice(0,1).toUpperCase())}</span><span class="proj-text"><b>${p(d.name)}</b><span class="faint">${p(d.root)}</span></span>${u?`<span class="count">${u}</span>`:""}${d.notes.open?`<span class="pill">${d.notes.open} note${d.notes.open===1?"":"s"}</span>`:""}</a>`}).join("")}</div></section>`),c+="</div>",e.innerHTML=c}function od(e){let t=encodeURIComponent(e.key);return`<nav class="proj-links"><a class="tile" href="#/p/${t}/files/">${g("folder",20)}<b>Files</b><span class="faint">Browse &amp; search</span></a><a class="tile" href="#/p/${t}/files/?m=changes">${g("diff",20)}<b>Changes</b><span class="faint">Since last commit</span></a><a class="tile" href="#/p/${t}/notes">${g("chat",20)}<b>Notes</b><span class="faint">${e.notes.open?`${e.notes.open} open`:"For the agent"}</span></a><a class="tile" href="#/p/${t}/decisions">${g("check",20)}<b>Decisions</b><span class="faint">What you decided</span></a></nav>`}async function qr(e,t=""){e.innerHTML=`<div class="page-wrap decisions"><header class="page-hero"><div><span class="eyebrow">${p(v.info.name)}</span><h1>Decisions</h1></div></header>
238
+ <p class="lede">Everything you answered, approved or gave a verdict on, newest first. Agents check this (<code>hitl decisions</code>) before asking again.</p>
239
+ <form class="search wide" id="dec-form" role="search">${g("search",16)}<input id="dec-q" type="search" placeholder="Find a decision" value="${p(t)}" autocomplete="off" enterkeyhint="search"></form>
240
+ <div id="dec-list"><div class="skeleton" style="height:120px"></div></div></div>`;let n=e.querySelector("#dec-list"),s=async()=>{let o=e.querySelector("#dec-q").value.trim(),r=await E(`api/decisions?q=${encodeURIComponent(o)}&limit=300`).catch(l=>({error:l.message}));if(r.error)return void(n.innerHTML=`<p class="problem">${p(r.error)}</p>`);if(!r.decisions.length)return void(n.innerHTML=`<p class="empty">${o?`Nothing matches \u201C${p(o)}\u201D.`:"No decisions yet."}</p>`);let i="";n.innerHTML=r.decisions.map(l=>{let c=new Date(l.at).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric",year:"numeric"}),d=c!==i?`<h3 class="dec-day">${p(i=c)}</h3>`:"",u=l.kind==="answer"?kt(v.project,l.request,l.id):Nn(v.project,l.request,l.id||""),$=/good|approved/.test(l.decision)?"ok":/no|refused|reject/.test(l.decision)?"danger":/changes|not yet/.test(l.decision)?"warn":"accent";return`${d}<a class="dec-row" href="${u}"><span class="dec-kind">${g(l.kind==="answer"?"chat":l.kind==="approval"?"warning":"check",16)}</span><span class="dec-text"><span class="dec-subject">${p(l.subject)}</span><span class="dec-decision"><span class="badge ${$}">${p(l.decision)}</span>${l.note?` <span class="dec-note">\u201C${p(l.note)}\u201D</span>`:""}</span><span class="faint small">${p(l.requestTitle)}${l.from?` \xB7 from ${p(l.from)}`:""} \xB7 ${new Date(l.at).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}</span></span></a>`}).join("")},a;e.querySelector("#dec-q").oninput=()=>{clearTimeout(a),a=setTimeout(s,200)},e.querySelector("#dec-form").onsubmit=o=>{o.preventDefault(),s()},await s()}var rd=()=>Math.max(160,innerHeight*.55);function jr(e){!e.isConnected||e.closest("[data-nogrow]")||(e.style.height="auto",e.style.height=Math.min(e.scrollHeight+2,rd())+"px")}document.addEventListener("input",e=>{e.target instanceof HTMLTextAreaElement&&jr(e.target)});new MutationObserver(e=>{for(let t of e)for(let n of t.addedNodes){if(!(n instanceof HTMLElement))continue;let s=n.matches("textarea[data-grow]")?[n]:n.querySelectorAll?.("textarea[data-grow]")||[];for(let a of s)a.value&&requestAnimationFrame(()=>jr(a))}}).observe(document.documentElement,{childList:!0,subtree:!0});function Rr(){let e=v.settings.theme;e==="light"||e==="dark"?document.documentElement.dataset.theme=e:delete document.documentElement.dataset.theme}function id(){let e=location.hash.slice(1)||"/",[t,n=""]=e.split("?"),s=t.split("/").filter(Boolean).map(i=>decodeURIComponent(i));if(s[0]!=="p"||!s[1])return{page:"inbox",key:""};let a=s[1],o=s[2]||"",r=new URLSearchParams(n);return o==="files"?{page:q().m==="changes"||q().m==="history"?"changes":"files",key:a}:o==="q"&&s[3]?{page:"questions",key:a,id:s[3],focus:s[4]||""}:o==="r"&&s[3]?{page:"review",key:a,id:s[3],focus:s[4]||""}:o==="notes"?{page:"notes",key:a,filter:r.get("f")||""}:o==="decisions"?{page:"decisions",key:a,q:r.get("q")||""}:{page:"project",key:a}}var te={page:""},tn=null,ra=!1;async function Ir(){if(tn)return ra=!0,tn;tn=(async()=>{do ra=!1,await ld();while(ra)})();try{await tn}finally{tn=null}}async function ld(){let e=id();try{if(e.key&&!st(e.key)&&await la(),e.key&&!st(e.key))throw new Error(`No project "${e.key}" here (it may have moved, or this hub doesn't serve it).`);e.key!==v.project&&(ha(e.key),e.key&&(v.info=await E("api/info"),await Ho()));let t=k("main");e.page!=="files"&&e.page!=="changes"&&Ns(),e.page!=="questions"&&dr(),e.page!=="review"&&wr(),te=e,document.body.dataset.view=e.page,cd();let n=e.page!=="files"&&e.page!=="changes";switch(e.page){case"inbox":case"project":oa(t,e.key);break;case"files":case"changes":await Ut();break;case"notes":ut(t,e.filter,s=>location.hash=`#/p/${encodeURIComponent(e.key)}/notes${s?"?f="+s:""}`),document.title=`Notes \xB7 ${v.info.name} \xB7 hitl`;break;case"decisions":await qr(t,e.q),document.title=`Decisions \xB7 ${v.info.name} \xB7 hitl`;break;case"questions":await sr(t,e.key,e.id,e.focus);break;case"review":await $r(t,e.key,e.id,e.focus);break}n&&Hr!==JSON.stringify([e.page,e.key,e.id])&&scrollTo(0,0),Hr=JSON.stringify([e.page,e.key,e.id])}catch(t){Ns(),k("main").innerHTML=`<div class="page-wrap"><div class="empty"><h2>Couldn't open that</h2><p>${p(t.message)}</p><p><a class="btn" href="#/">Back to the inbox</a></p></div></div>`}}var Hr="";function cd(){let e=v.project,t=st(e),n=encodeURIComponent(e);k("proj").hidden=!t,t&&(k("proj-name").textContent=t.name,k("proj-mark").textContent=t.name.slice(0,1).toUpperCase(),k("proj-mark").style.setProperty("--hue",Or(t.name))),k("tabs").hidden=!t;let a={inbox:"inbox",project:"inbox",files:"files",changes:"changes",notes:"notes",decisions:"decisions",questions:"inbox",review:"inbox"}[te.page]||"",o={inbox:`#/p/${n}`,files:`#/p/${n}/files/`,changes:`#/p/${n}/files/?m=changes`,notes:`#/p/${n}/notes`,decisions:`#/p/${n}/decisions`};for(let i of k("tabs").querySelectorAll("[data-tab]"))i.href=o[i.dataset.tab],i.classList.toggle("on",i.dataset.tab===a),i.dataset.tab===a?i.setAttribute("aria-current","page"):i.removeAttribute("aria-current");let r=te.page==="files"||te.page==="changes";k("search-form").hidden=!r,k("qo-btn").hidden=!r,Nr(),t&&Kt()}var Or=e=>{let t=0;for(let n of String(e))t=(t*31+n.charCodeAt(0))%360;return t};function ia(e){let t=0;for(let n of e.reviews)n.status==="open"&&!n.done&&t++;for(let n of e.questions)n.status==="open"&&n.toAnswer>0&&t++;return t}function Nr(){let e=v.hub.projects.reduce((a,o)=>a+ia(o),0);k("inbox-count").textContent=String(e),k("inbox-count").hidden=!e;let t=st(),n=t?ia(t):0;k("proj-count").textContent=String(n),k("proj-count").hidden=!n;let s=v.hub.projects.some(a=>a.reviews.some(o=>o.mode==="approve"&&o.status==="open"&&!o.done));k("inbox-count").classList.toggle("danger",s)}function dd(){let e=k("proj-menu");if(e)return k("proj").setAttribute("aria-expanded","false"),e.remove();let t=document.createElement("div");t.id="proj-menu",t.className="pop menu",t.setAttribute("role","menu"),t.innerHTML=v.hub.projects.map(a=>{let o=ia(a);return`<a class="menu-item${a.key===v.project?" on":""}" href="#/p/${encodeURIComponent(a.key)}"><span class="proj-mark" style="--hue:${Or(a.name)}">${p(a.name.slice(0,1).toUpperCase())}</span><span class="grow">${p(a.name)}</span>${o?`<span class="count">${o}</span>`:""}</a>`}).join("")+`<div class="menu-sep" role="separator"></div><a class="menu-item" href="#/"><span class="menu-ic">${g("home",16)}</span><span class="grow">Every project</span></a>`;let n=k("proj").getBoundingClientRect();t.style.left=Math.max(8,Math.min(n.left,innerWidth-300))+"px",t.style.top=n.bottom+6+"px",document.body.append(t),k("proj").setAttribute("aria-expanded","true");let s=a=>{if(!t.contains(a.target)||a.target.closest("a")){if(a.target.closest?.("#proj"))return;k("proj").setAttribute("aria-expanded","false"),t.remove(),removeEventListener("pointerdown",s,!0)}};setTimeout(()=>addEventListener("pointerdown",s,!0)),t.onclick=a=>{a.target.closest("a")&&(k("proj").setAttribute("aria-expanded","false"),t.remove())}}async function pd(){let e=k("settings-pop");if(e)return e.remove();let t=v.settings,n=document.createElement("div");n.id="settings-pop",n.className="pop";let s=st();n.innerHTML=`<h3>Settings</h3>
241
+ <label>Theme <select data-s="theme"><option value="auto">Match the system</option><option value="dark">Dark</option><option value="light">Light</option></select></label>
242
+ <label>Ignored files <select data-s="ignored"><option value="dim">Show dimmed</option><option value="hide">Hide</option></select></label>
243
+ <label class="check"><input type="checkbox" data-s="wrap"> Wrap long lines</label>
244
+ <label class="check"><input type="checkbox" data-s="review"> Tap a line to write a note on it</label>
245
+ <label class="check"><input type="checkbox" data-s="resolved"> Show resolved notes in files</label>
246
+ <label>Your name on notes <input data-s="author" placeholder="${p(v.info.author||"")}" value="${p(t.author)}"></label>
247
+ ${s?`<h3>Claude Code in ${p(s.name)}</h3><div id="hooks-box" class="faint small">\u2026</div>`:""}
248
+ <h3>On your phone</h3>
249
+ <p class="faint small">Open this page on your phone (the same Wi-Fi or Tailscale) and add it to your home screen. For notifications when an agent asks something: <code>npx hitloop notify ntfy</code>.</p>
250
+ <h3>Shortcuts</h3>
251
+ <dl class="keys"><dt><kbd>Ctrl</kbd> <kbd>P</kbd></dt><dd>Go to a file</dd><dt><kbd>/</kbd></dt><dd>Search in files</dd><dt><kbd>Esc</kbd></dt><dd>Close the file</dd><dt><kbd>[</kbd> <kbd>]</kbd></dt><dd>Previous / next file</dd><dt><kbd>Shift</kbd>-click</dt><dd>A range of lines</dd><dt><kbd>Ctrl</kbd> <kbd>Enter</kbd></dt><dd>Send a note or comment</dd><dt><kbd>\u2190</kbd> <kbd>\u2192</kbd></dt><dd>One at a time: previous / next</dd></dl>
252
+ <p class="faint">hitl ${p(v.hub.version||"")} \u2014 Human In The Loop${v.info.root?" \xB7 "+p(v.info.root):""}</p>`,document.body.append(n);for(let a of n.querySelectorAll("[data-s]")){let o=a.dataset.s;a.type==="checkbox"?a.checked=!!t[o]:a.value=t[o],a.onchange=()=>{at(o,a.type==="checkbox"?a.checked:a.value.trim()),o==="theme"&&Rr(),$e("settings")}}s&&ud(n.querySelector("#hooks-box")),setTimeout(()=>{let a=o=>{!n.contains(o.target)&&!o.target.closest("#settings-btn")&&(n.remove(),removeEventListener("pointerdown",a))};addEventListener("pointerdown",a)})}async function ud(e){if(!e)return;let t;try{t=await E("api/hooks")}catch(n){e.textContent=n.message;return}e.classList.remove("faint","small"),e.innerHTML=`<label class="check"><input type="checkbox" data-hook="prompt" ${t.prompt?"checked":""} ${v.info.readOnly?"disabled":""}> Tell Claude what you said, each time you send it a message</label>
253
+ <label class="check"><input type="checkbox" data-hook="stop" ${t.stop?"checked":""} ${v.info.readOnly?"disabled":""}> Don't let Claude finish while an approval or a blocking question is waiting</label>
254
+ <p class="faint small">Saved in <code>.claude/settings.json</code>; Claude Code picks them up in its next session. (<code>hitl hooks</code> does the same.)</p>`,e.onchange=async n=>{let s=n.target.closest("[data-hook]");if(s)try{await E("api/hooks",{method:"POST",json:{[s.dataset.hook]:s.checked}}),O(s.checked?"Hook on":"Hook off")}catch(a){s.checked=!s.checked,O(a.message)}}}Fe("comments",()=>{te.page==="notes"&&!Wt(k("main"))&&ut(k("main"),te.filter,e=>location.hash=`#/p/${encodeURIComponent(te.key)}/notes${e?"?f="+e:""}`)});var la=async()=>{v.hub=await E("api/info",{hub:!0})},nn=ne(async()=>{try{await la()}catch{return}Nr(),(te.page==="inbox"||te.page==="project")&&!Wt(k("main"))&&oa(k("main"),te.key)},250);function fd(){let e=new EventSource("api/events");e.addEventListener("hello",()=>k("live").classList.add("on")),e.onerror=()=>k("live").classList.remove("on"),e.addEventListener("change",t=>{let n=JSON.parse(t.data);n.project===v.project&&Ro(n)}),e.addEventListener("notes",async t=>{if(JSON.parse(t.data).project!==v.project)return nn();await Oo(),te.page==="notes"&&!Wt(k("main"))&&ut(k("main"),te.filter,s=>location.hash=`#/p/${encodeURIComponent(te.key)}/notes${s?"?f="+s:""}`),nn()}),e.addEventListener("request",t=>{let n=JSON.parse(t.data);n.kind==="review"?kr(n):pr(n),nn()}),e.addEventListener("projects",nn),document.addEventListener("visibilitychange",()=>document.visibilityState==="visible"&&nn())}async function hd(){Rr();try{await la()}catch(t){k("main").innerHTML=`<div class="page-wrap"><p class="empty">Can't reach the hitl server: ${p(t.message)}</p></div>`;return}v.hub.mode==="solo"&&v.hub.projects[0]&&(!location.hash||location.hash==="#/")&&history.replaceState(null,"",`#/p/${encodeURIComponent(v.hub.projects[0].key)}`),k("settings-btn").innerHTML=g("settings"),k("proj-caret").innerHTML=g("chevron-down",14);let e={inbox:"home",files:"folder",changes:"diff",notes:"chat",decisions:"check"};for(let t of k("tabs").querySelectorAll("[data-tab]"))t.querySelector(".tab-ic").innerHTML=g(e[t.dataset.tab],18);k("settings-btn").onclick=pd,k("proj").onclick=dd,k("tab-files").addEventListener("click",t=>{te.page==="files"&&q().folder===""&&!q().open||te.page==="files"&&(t.preventDefault(),Po())}),new ResizeObserver(()=>document.documentElement.style.setProperty("--bar-h",k("bar").offsetHeight+"px")).observe(k("bar")),No(),addEventListener("hashchange",Ir),await Ir(),fd()}hd();