@hawkeyexl/manni 4.10.0 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/README.md +1 -1
  2. package/dist/batch-EFSFG6GC.js +46 -0
  3. package/dist/build-NIO3UIWJ.js +36 -0
  4. package/dist/calibrate-6VO7URRV.js +41 -0
  5. package/dist/capture-NMBVJO3C.js +38 -0
  6. package/dist/check-SHOYX2B5.js +30 -0
  7. package/dist/check-XMJKH3KV.js +34 -0
  8. package/dist/{check-NLL4NRYA.js → check-Y62BJNC4.js} +35 -31
  9. package/dist/{check-NLL4NRYA.js.map → check-Y62BJNC4.js.map} +1 -1
  10. package/dist/{check-7B77ZD2N.js → check-ZMO3ZLMW.js} +19 -15
  11. package/dist/{chunk-PK7EKJ5T.js → chunk-24AJK2RG.js} +5 -10
  12. package/dist/chunk-24AJK2RG.js.map +1 -0
  13. package/dist/chunk-2OZF2VUB.js +164 -0
  14. package/dist/chunk-2OZF2VUB.js.map +1 -0
  15. package/dist/chunk-2UJZXVHR.js +1868 -0
  16. package/dist/chunk-2UJZXVHR.js.map +1 -0
  17. package/dist/{chunk-DNZUBCGZ.js → chunk-3BRJCQPY.js} +36 -7
  18. package/dist/chunk-3BRJCQPY.js.map +1 -0
  19. package/dist/{chunk-D2UW3ZCK.js → chunk-42VFJOAF.js} +13 -11
  20. package/dist/{chunk-D2UW3ZCK.js.map → chunk-42VFJOAF.js.map} +1 -1
  21. package/dist/{chunk-LQZQ5KGG.js → chunk-4Q24OYI3.js} +7 -7
  22. package/dist/{chunk-XU73V5XT.js → chunk-4WJTURRO.js} +15 -15
  23. package/dist/{chunk-WN47MNSK.js → chunk-5SID2SVL.js} +4 -4
  24. package/dist/{chunk-5REEVKGH.js → chunk-AANUY4BH.js} +2 -2
  25. package/dist/chunk-ANPIIYRH.js +2272 -0
  26. package/dist/chunk-ANPIIYRH.js.map +1 -0
  27. package/dist/{chunk-RZVCWX5R.js → chunk-AYVKN3PG.js} +4 -4
  28. package/dist/{chunk-2UCC26MO.js → chunk-CH6IOGXV.js} +9 -9
  29. package/dist/{chunk-RODZ7MB7.js → chunk-D5Z6B4M7.js} +6 -6
  30. package/dist/{chunk-IJ62BB2T.js → chunk-D6SELXQ2.js} +7 -7
  31. package/dist/{chunk-2JV7C4YV.js → chunk-DDILEF5F.js} +890 -1399
  32. package/dist/chunk-DDILEF5F.js.map +1 -0
  33. package/dist/{chunk-3E2X2RBU.js → chunk-DGRLHDM4.js} +9 -9
  34. package/dist/{chunk-2BV4FBC7.js → chunk-DHGB4JBG.js} +4 -3
  35. package/dist/chunk-DHGB4JBG.js.map +1 -0
  36. package/dist/{chunk-6LR73NMO.js → chunk-DLU5FCFT.js} +30 -28
  37. package/dist/chunk-DLU5FCFT.js.map +1 -0
  38. package/dist/chunk-DSWKBZWW.js +16 -0
  39. package/dist/chunk-DSWKBZWW.js.map +1 -0
  40. package/dist/{chunk-BD7IXBWE.js → chunk-F564FHMQ.js} +8 -8
  41. package/dist/{chunk-ABHG6I3G.js → chunk-FKAZUZQU.js} +469 -85
  42. package/dist/chunk-FKAZUZQU.js.map +1 -0
  43. package/dist/{chunk-DFCQ6BMI.js → chunk-G3MBUL5M.js} +4 -4
  44. package/dist/{chunk-SUTMSDQ2.js → chunk-GQ3KRY3B.js} +3 -3
  45. package/dist/chunk-HDPN46JP.js +393 -0
  46. package/dist/chunk-HDPN46JP.js.map +1 -0
  47. package/dist/{chunk-EAUIQADY.js → chunk-IQQAJROD.js} +6 -6
  48. package/dist/{chunk-ZHRPH52H.js → chunk-IZXN3WI6.js} +2 -2
  49. package/dist/{chunk-NCPWXHDO.js → chunk-JEUFYSFQ.js} +4 -4
  50. package/dist/{chunk-G6FNWRAI.js → chunk-JSSM7VVV.js} +4 -4
  51. package/dist/{chunk-CCWMACJL.js → chunk-KFGZPVFA.js} +229 -821
  52. package/dist/chunk-KFGZPVFA.js.map +1 -0
  53. package/dist/{chunk-H26VDFDS.js → chunk-KGFSPJLD.js} +2 -2
  54. package/dist/{chunk-AO5TSDKT.js → chunk-KMORGMCW.js} +7 -7
  55. package/dist/{chunk-WQWKYAAK.js → chunk-NUQF5F5J.js} +2 -2
  56. package/dist/{chunk-2YJ5H5E6.js → chunk-NZ6KSHFD.js} +23 -21
  57. package/dist/{chunk-2YJ5H5E6.js.map → chunk-NZ6KSHFD.js.map} +1 -1
  58. package/dist/{chunk-7Y3N4Y72.js → chunk-OHUDZRLK.js} +3 -3
  59. package/dist/{chunk-GCKHSBEN.js → chunk-OKMTUAWO.js} +4 -4
  60. package/dist/{chunk-6M5VJOC2.js → chunk-OTJOBZJ5.js} +167 -166
  61. package/dist/chunk-OTJOBZJ5.js.map +1 -0
  62. package/dist/{chunk-2W34HX2U.js → chunk-PS257NIU.js} +288 -373
  63. package/dist/chunk-PS257NIU.js.map +1 -0
  64. package/dist/chunk-QDC7JPFG.js +685 -0
  65. package/dist/chunk-QDC7JPFG.js.map +1 -0
  66. package/dist/chunk-QEAGL4V5.js +3185 -0
  67. package/dist/chunk-QEAGL4V5.js.map +1 -0
  68. package/dist/{chunk-GB2XPITA.js → chunk-QMY57PVW.js} +2 -2
  69. package/dist/{chunk-55GMOVKW.js → chunk-QNDDPXFR.js} +2 -2
  70. package/dist/{chunk-GXN7RRHR.js → chunk-QSIXNTRV.js} +4 -4
  71. package/dist/{chunk-G7XD4QH5.js → chunk-RGLFV4KO.js} +11372 -10218
  72. package/dist/chunk-RGLFV4KO.js.map +1 -0
  73. package/dist/{chunk-QBVP3SQP.js → chunk-SGR7ZAVE.js} +13 -7
  74. package/dist/chunk-SGR7ZAVE.js.map +1 -0
  75. package/dist/{chunk-KBG463UK.js → chunk-SMHAYK6I.js} +2409 -5243
  76. package/dist/chunk-SMHAYK6I.js.map +1 -0
  77. package/dist/{chunk-XG6PVB5S.js → chunk-SSQZB5SQ.js} +1 -11
  78. package/dist/chunk-SSQZB5SQ.js.map +1 -0
  79. package/dist/{chunk-GDLHTI5R.js → chunk-STPGIKPY.js} +8 -2
  80. package/dist/chunk-STPGIKPY.js.map +1 -0
  81. package/dist/{chunk-QJRQ4BRC.js → chunk-U22TOL5Y.js} +17 -17
  82. package/dist/{chunk-NGTVREIH.js → chunk-U6IHLEWT.js} +2 -2
  83. package/dist/{chunk-Z5YHMRLF.js → chunk-UUCCV3SI.js} +2 -2
  84. package/dist/{chunk-ZXXFP2LA.js → chunk-UXMCHBOJ.js} +2 -2
  85. package/dist/{chunk-VZVEP2OZ.js → chunk-VFAKGIDG.js} +2 -2
  86. package/dist/{chunk-QCHVR4ZM.js → chunk-VM7VAFJW.js} +33 -7
  87. package/dist/chunk-VM7VAFJW.js.map +1 -0
  88. package/dist/{chunk-VQK4VHLF.js → chunk-YQV75FIL.js} +2 -2
  89. package/dist/chunk-YUTVAMWW.js +2 -0
  90. package/dist/chunk-ZPLVANY2.js +15 -0
  91. package/dist/chunk-ZPLVANY2.js.map +1 -0
  92. package/dist/{cli-BIIUKPTE.js → cli-4CR7QIOK.js} +26 -22
  93. package/dist/{cli-BIIUKPTE.js.map → cli-4CR7QIOK.js.map} +1 -1
  94. package/dist/{cli-V2DI3K2R.js → cli-6R4W3HAH.js} +37 -33
  95. package/dist/{cli-V2DI3K2R.js.map → cli-6R4W3HAH.js.map} +1 -1
  96. package/dist/{cli-HO62TOM2.js → cli-BOMA2FMP.js} +14 -11
  97. package/dist/{cli-EH3I4IUX.js → cli-EDQPQOCE.js} +47 -41
  98. package/dist/cli-EDQPQOCE.js.map +1 -0
  99. package/dist/{cli-P2X7PNY6.js → cli-GBF76EXT.js} +25 -20
  100. package/dist/{cli-P2X7PNY6.js.map → cli-GBF76EXT.js.map} +1 -1
  101. package/dist/{cli-4YYC6LCY.js → cli-MQYCF3SR.js} +27 -23
  102. package/dist/{cli-4YYC6LCY.js.map → cli-MQYCF3SR.js.map} +1 -1
  103. package/dist/{cli-UETKXHJN.js → cli-OJKFXQOM.js} +9 -9
  104. package/dist/{cli-LWST5FQH.js → cli-PHZAO4LZ.js} +4 -4
  105. package/dist/{cli-TELPAMJO.js → cli-PTKFFNOW.js} +59 -35
  106. package/dist/cli-PTKFFNOW.js.map +1 -0
  107. package/dist/{cli-SGVFZOAW.js → cli-UW2K5Z5J.js} +34 -29
  108. package/dist/{cli-SGVFZOAW.js.map → cli-UW2K5Z5J.js.map} +1 -1
  109. package/dist/cli-XXTNPPKB.js +83 -0
  110. package/dist/cli-XXTNPPKB.js.map +1 -0
  111. package/dist/cli.js +24 -12
  112. package/dist/cli.js.map +1 -1
  113. package/dist/{config-TYXYQK3I.js → config-JJW75SBX.js} +5 -5
  114. package/dist/docmeta.js +13 -10
  115. package/dist/docmeta.js.map +1 -1
  116. package/dist/github-6VQKSB67.js +35 -0
  117. package/dist/github-RBSEM7ZK.js +30 -0
  118. package/dist/graph/runtime.d.ts +4 -1
  119. package/dist/graph/runtime.js +20 -9
  120. package/dist/graph/runtime.js.map +1 -1
  121. package/dist/{host-6GURH5HE.js → host-YSTYO5DX.js} +3 -3
  122. package/dist/index.d.ts +1214 -940
  123. package/dist/index.js +190 -160
  124. package/dist/index.js.map +1 -1
  125. package/dist/{json-QR4G35KA.js → json-PU2HLHDQ.js} +18 -14
  126. package/dist/labels-SJNSOPBI.js +73 -0
  127. package/dist/labels-SJNSOPBI.js.map +1 -0
  128. package/dist/lint-KIVTHLGU.js +34 -0
  129. package/dist/list-RDEJDDJF.js +32 -0
  130. package/dist/list-SUTDWL2J.js +35 -0
  131. package/dist/{page-FSXDXCDD.js → page-UMAA3NCM.js} +18 -13
  132. package/dist/{prepare-UPIBTFNS.js → prepare-3I3LOXXD.js} +24 -20
  133. package/dist/{prepare-UPIBTFNS.js.map → prepare-3I3LOXXD.js.map} +1 -1
  134. package/dist/{pretty-4IONWSEP.js → pretty-ANLRHU4O.js} +18 -14
  135. package/dist/{pretty-R4BQD2VH.js → pretty-Q3ZFKOR7.js} +18 -14
  136. package/dist/{provider-527CO4DM.js → provider-LBX4IXGX.js} +3 -3
  137. package/dist/{release-3D5PK6M7.js → release-VV3UTKE5.js} +3 -3
  138. package/dist/{reporters-M6LJ2IYU.js → reporters-26H3N2KW.js} +3 -3
  139. package/dist/{reporters-DHO2BXAD.js → reporters-ILT36CIH.js} +7 -7
  140. package/dist/{reporters-FPP6JNDP.js → reporters-PNDLWT6K.js} +16 -12
  141. package/dist/run-QXCK33Z4.js +37 -0
  142. package/dist/{term-ASM4LVYC.js → term-D2N7UN4P.js} +981 -138
  143. package/dist/term-D2N7UN4P.js.map +1 -0
  144. package/dist/validate-BRUCOT2O.js +19 -0
  145. package/dist/validate-BRUCOT2O.js.map +1 -0
  146. package/package.json +3 -2
  147. package/plugin/manni/.claude-plugin/plugin.json +1 -1
  148. package/shapes/graph/shapes-1.1.0.ttl +785 -0
  149. package/dist/batch-6NICDKRE.js +0 -41
  150. package/dist/build-3KP2K3XN.js +0 -32
  151. package/dist/calibrate-LUA3DWKD.js +0 -36
  152. package/dist/capture-NETOHCB4.js +0 -34
  153. package/dist/check-E4QCB7LS.js +0 -20
  154. package/dist/check-PTECPIIB.js +0 -26
  155. package/dist/chunk-2BV4FBC7.js.map +0 -1
  156. package/dist/chunk-2JV7C4YV.js.map +0 -1
  157. package/dist/chunk-2W34HX2U.js.map +0 -1
  158. package/dist/chunk-4DLF5SA4.js +0 -392
  159. package/dist/chunk-4DLF5SA4.js.map +0 -1
  160. package/dist/chunk-6AGESHHM.js +0 -387
  161. package/dist/chunk-6AGESHHM.js.map +0 -1
  162. package/dist/chunk-6LR73NMO.js.map +0 -1
  163. package/dist/chunk-6M5VJOC2.js.map +0 -1
  164. package/dist/chunk-ABHG6I3G.js.map +0 -1
  165. package/dist/chunk-CCWMACJL.js.map +0 -1
  166. package/dist/chunk-DNZUBCGZ.js.map +0 -1
  167. package/dist/chunk-G7XD4QH5.js.map +0 -1
  168. package/dist/chunk-GDLHTI5R.js.map +0 -1
  169. package/dist/chunk-KBG463UK.js.map +0 -1
  170. package/dist/chunk-PK7EKJ5T.js.map +0 -1
  171. package/dist/chunk-QBVP3SQP.js.map +0 -1
  172. package/dist/chunk-QCHVR4ZM.js.map +0 -1
  173. package/dist/chunk-VVVKBUBO.js +0 -818
  174. package/dist/chunk-VVVKBUBO.js.map +0 -1
  175. package/dist/chunk-XG6PVB5S.js.map +0 -1
  176. package/dist/cli-EH3I4IUX.js.map +0 -1
  177. package/dist/cli-TELPAMJO.js.map +0 -1
  178. package/dist/github-ESK45CEZ.js +0 -26
  179. package/dist/github-WER7JUTN.js +0 -31
  180. package/dist/lint-QTI7XK2A.js +0 -30
  181. package/dist/list-JO4G3TS3.js +0 -30
  182. package/dist/list-O2MJUP5V.js +0 -28
  183. package/dist/run-YH5Z7RJ7.js +0 -32
  184. package/dist/term-ASM4LVYC.js.map +0 -1
  185. package/dist/validate-7JI3H57P.js +0 -17
  186. /package/dist/{batch-6NICDKRE.js.map → batch-EFSFG6GC.js.map} +0 -0
  187. /package/dist/{build-3KP2K3XN.js.map → build-NIO3UIWJ.js.map} +0 -0
  188. /package/dist/{calibrate-LUA3DWKD.js.map → calibrate-6VO7URRV.js.map} +0 -0
  189. /package/dist/{capture-NETOHCB4.js.map → capture-NMBVJO3C.js.map} +0 -0
  190. /package/dist/{check-7B77ZD2N.js.map → check-SHOYX2B5.js.map} +0 -0
  191. /package/dist/{check-E4QCB7LS.js.map → check-XMJKH3KV.js.map} +0 -0
  192. /package/dist/{check-PTECPIIB.js.map → check-ZMO3ZLMW.js.map} +0 -0
  193. /package/dist/{chunk-LQZQ5KGG.js.map → chunk-4Q24OYI3.js.map} +0 -0
  194. /package/dist/{chunk-XU73V5XT.js.map → chunk-4WJTURRO.js.map} +0 -0
  195. /package/dist/{chunk-WN47MNSK.js.map → chunk-5SID2SVL.js.map} +0 -0
  196. /package/dist/{chunk-5REEVKGH.js.map → chunk-AANUY4BH.js.map} +0 -0
  197. /package/dist/{chunk-RZVCWX5R.js.map → chunk-AYVKN3PG.js.map} +0 -0
  198. /package/dist/{chunk-2UCC26MO.js.map → chunk-CH6IOGXV.js.map} +0 -0
  199. /package/dist/{chunk-RODZ7MB7.js.map → chunk-D5Z6B4M7.js.map} +0 -0
  200. /package/dist/{chunk-IJ62BB2T.js.map → chunk-D6SELXQ2.js.map} +0 -0
  201. /package/dist/{chunk-3E2X2RBU.js.map → chunk-DGRLHDM4.js.map} +0 -0
  202. /package/dist/{chunk-BD7IXBWE.js.map → chunk-F564FHMQ.js.map} +0 -0
  203. /package/dist/{chunk-DFCQ6BMI.js.map → chunk-G3MBUL5M.js.map} +0 -0
  204. /package/dist/{chunk-SUTMSDQ2.js.map → chunk-GQ3KRY3B.js.map} +0 -0
  205. /package/dist/{chunk-EAUIQADY.js.map → chunk-IQQAJROD.js.map} +0 -0
  206. /package/dist/{chunk-ZHRPH52H.js.map → chunk-IZXN3WI6.js.map} +0 -0
  207. /package/dist/{chunk-NCPWXHDO.js.map → chunk-JEUFYSFQ.js.map} +0 -0
  208. /package/dist/{chunk-G6FNWRAI.js.map → chunk-JSSM7VVV.js.map} +0 -0
  209. /package/dist/{chunk-H26VDFDS.js.map → chunk-KGFSPJLD.js.map} +0 -0
  210. /package/dist/{chunk-AO5TSDKT.js.map → chunk-KMORGMCW.js.map} +0 -0
  211. /package/dist/{chunk-WQWKYAAK.js.map → chunk-NUQF5F5J.js.map} +0 -0
  212. /package/dist/{chunk-7Y3N4Y72.js.map → chunk-OHUDZRLK.js.map} +0 -0
  213. /package/dist/{chunk-GCKHSBEN.js.map → chunk-OKMTUAWO.js.map} +0 -0
  214. /package/dist/{chunk-GB2XPITA.js.map → chunk-QMY57PVW.js.map} +0 -0
  215. /package/dist/{chunk-55GMOVKW.js.map → chunk-QNDDPXFR.js.map} +0 -0
  216. /package/dist/{chunk-GXN7RRHR.js.map → chunk-QSIXNTRV.js.map} +0 -0
  217. /package/dist/{chunk-QJRQ4BRC.js.map → chunk-U22TOL5Y.js.map} +0 -0
  218. /package/dist/{chunk-NGTVREIH.js.map → chunk-U6IHLEWT.js.map} +0 -0
  219. /package/dist/{chunk-Z5YHMRLF.js.map → chunk-UUCCV3SI.js.map} +0 -0
  220. /package/dist/{chunk-ZXXFP2LA.js.map → chunk-UXMCHBOJ.js.map} +0 -0
  221. /package/dist/{chunk-VZVEP2OZ.js.map → chunk-VFAKGIDG.js.map} +0 -0
  222. /package/dist/{chunk-VQK4VHLF.js.map → chunk-YQV75FIL.js.map} +0 -0
  223. /package/dist/{cli-HO62TOM2.js.map → chunk-YUTVAMWW.js.map} +0 -0
  224. /package/dist/{config-TYXYQK3I.js.map → cli-BOMA2FMP.js.map} +0 -0
  225. /package/dist/{cli-UETKXHJN.js.map → cli-OJKFXQOM.js.map} +0 -0
  226. /package/dist/{cli-LWST5FQH.js.map → cli-PHZAO4LZ.js.map} +0 -0
  227. /package/dist/{github-ESK45CEZ.js.map → config-JJW75SBX.js.map} +0 -0
  228. /package/dist/{github-WER7JUTN.js.map → github-6VQKSB67.js.map} +0 -0
  229. /package/dist/{host-6GURH5HE.js.map → github-RBSEM7ZK.js.map} +0 -0
  230. /package/dist/{json-QR4G35KA.js.map → host-YSTYO5DX.js.map} +0 -0
  231. /package/dist/{lint-QTI7XK2A.js.map → json-PU2HLHDQ.js.map} +0 -0
  232. /package/dist/{list-JO4G3TS3.js.map → lint-KIVTHLGU.js.map} +0 -0
  233. /package/dist/{list-O2MJUP5V.js.map → list-RDEJDDJF.js.map} +0 -0
  234. /package/dist/{page-FSXDXCDD.js.map → list-SUTDWL2J.js.map} +0 -0
  235. /package/dist/{pretty-4IONWSEP.js.map → page-UMAA3NCM.js.map} +0 -0
  236. /package/dist/{pretty-R4BQD2VH.js.map → pretty-ANLRHU4O.js.map} +0 -0
  237. /package/dist/{provider-527CO4DM.js.map → pretty-Q3ZFKOR7.js.map} +0 -0
  238. /package/dist/{reporters-DHO2BXAD.js.map → provider-LBX4IXGX.js.map} +0 -0
  239. /package/dist/{release-3D5PK6M7.js.map → release-VV3UTKE5.js.map} +0 -0
  240. /package/dist/{reporters-FPP6JNDP.js.map → reporters-26H3N2KW.js.map} +0 -0
  241. /package/dist/{reporters-M6LJ2IYU.js.map → reporters-ILT36CIH.js.map} +0 -0
  242. /package/dist/{run-YH5Z7RJ7.js.map → reporters-PNDLWT6K.js.map} +0 -0
  243. /package/dist/{validate-7JI3H57P.js.map → run-QXCK33Z4.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/term/commands/check.ts","../src/term/core/severity.ts","../src/term/core/check.ts","../src/term/commands/findings.ts"],"sourcesContent":["/**\n * `manni term check`: the referential integrity of the set (proposal 0052 § 7),\n * with the baseline ratchet meta and cite use.\n *\n * `--baseline` is one flag for both halves of the ratchet. When the baseline\n * file is not there yet, the run records one and exits 0: that is how a docset\n * whose terms were never checked ramps in. When it is there, the run fails only\n * on findings it does not hold. A configured `term.baseline` compares without\n * the flag, as `cite.baseline` does.\n */\nimport { existsSync } from \"node:fs\";\nimport { resolveBaselineRequest, settleBaseline } from \"../../meta/internal.js\";\nimport { checkTermSet } from \"../core/check.js\";\nimport { DEFAULT_TERM_BASELINE_PATH } from \"../core/config.js\";\nimport { TermError } from \"../errors.js\";\nimport { reportedFindings, summarize, toResults, type TermReport } from \"./findings.js\";\nimport { loadTerms, type TermCommandOptions } from \"./run.js\";\n\nexport interface CheckOptions extends TermCommandOptions {\n /** `--baseline`. */\n baseline?: boolean;\n}\n\nexport async function runCheck(opts: CheckOptions): Promise<TermReport> {\n const { cwd, run, set } = await loadTerms(opts);\n const config = run.config;\n const findings = checkTermSet(set, {\n ...(config?.severity === undefined ? {} : { severity: config.severity }),\n ...(config?.abstractMaxLength === undefined ? {} : { abstractMaxLength: config.abstractMaxLength }),\n ...(config?.fill?.crawl?.minPages === undefined ? {} : { minPages: config.fill.crawl.minPages }),\n });\n const { results, origin } = toResults(set, findings);\n\n // Fingerprints must not depend on where the command was run from.\n const frame = { cwd, base: run.configDir ?? cwd, runBase: run.base };\n let request = resolveBaselineRequest(\n opts.baseline === true ? { baseline: true } : {},\n config?.baseline,\n run.configDir,\n cwd,\n { current: DEFAULT_TERM_BASELINE_PATH },\n );\n if (request !== null && !existsSync(request.absPath)) {\n if (opts.baseline !== true) {\n throw new TermError(\n `Baseline \"${request.label}\" not found. Record one with \\`manni term check --baseline\\`.`,\n );\n }\n request = { ...request, write: true };\n }\n const { results: reported, baseline } = await settleBaseline(results, request, frame);\n\n return {\n findings: reportedFindings(reported, origin),\n results: reported,\n summary: summarize(reported, baseline),\n frame,\n terms: set.terms.length,\n references: set.references.length,\n ...(baseline === undefined ? {} : { baseline }),\n found: findings.length,\n cwd,\n };\n}\n","/**\n * Rule ids and levels for the term tool (proposal 0052). `check` findings are\n * `manni:term/<rule>`. A `lint` finding keeps Vale's own rule name,\n * `manni:term/prose/<Style.Rule>`, in the shape lint's proposal 0050 set for\n * its prose job, because that is the name Vale's documentation uses.\n */\nimport type { Severity } from \"../../shared/severity.js\";\nimport { TERM_RULES, type TermRule, type TermSeverity, type ValeSeverity } from \"../types.js\";\n\nexport const RULE_ID_PREFIX = \"manni:term\";\n\nexport const DEFAULT_SEVERITY: Readonly<Record<TermRule, TermSeverity>> = {\n \"undefined-term\": \"error\",\n \"duplicate-id\": \"error\",\n \"label-collision\": \"error\",\n \"alt-label-collision\": \"error\",\n \"label-overlap\": \"error\",\n \"dangling-reference\": \"error\",\n \"broader-cycle\": \"error\",\n \"see-not-empty\": \"error\",\n \"missing-definition\": \"error\",\n \"conflicting-matches\": \"error\",\n \"asymmetric-hierarchy\": \"warning\",\n \"asymmetric-related\": \"warning\",\n \"related-in-hierarchy\": \"warning\",\n \"alt-label-reference\": \"warning\",\n \"ambiguous-alt-label\": \"warning\",\n \"deprecated-label\": \"warning\",\n \"abstract-too-long\": \"notice\",\n \"unused-term\": \"notice\",\n \"hierarchy-outside-termbase\": \"notice\",\n \"related-siblings\": \"notice\",\n \"orphan-term\": \"notice\",\n \"keyword-candidate\": \"notice\",\n};\n\nexport function ruleId(rule: TermRule): string {\n return `${RULE_ID_PREFIX}/${rule}`;\n}\n\nexport function proseRuleId(check: string): string {\n return `${RULE_ID_PREFIX}/prose/${check}`;\n}\n\nexport function isTermRule(value: string): value is TermRule {\n return (TERM_RULES as readonly string[]).includes(value);\n}\n\n/** The defaults with config's overrides laid over them. */\nexport function resolveSeverity(\n overrides?: Partial<Record<TermRule, TermSeverity>>,\n): Record<TermRule, TermSeverity> {\n return { ...DEFAULT_SEVERITY, ...overrides };\n}\n\n/**\n * Vale's scale onto the family's. A finding keeps Vale's own value beside the\n * folded one, as an a11y violation keeps axe's `impact`.\n */\nexport function foldValeSeverity(severity: ValeSeverity): Severity {\n return severity === \"suggestion\" ? \"notice\" : severity;\n}\n","/**\n * `term check`'s rules (proposal 0052 § 7): the referential integrity of a term\n * set. Pure: it reads records and references and returns findings, so the\n * command core owns every file and the rules are tested on sets built inline.\n *\n * Every label comparison ignores case, because the Vale style `write -f vale`\n * renders is a `swap` map keyed on the lowercased term. Two labels that differ\n * only in case collide there silently, so they collide here out loud. Ids\n * compare ignoring case too, because references resolve them that way.\n *\n * A set may hold one term per language, joined on `id` (proposal 0084). A term\n * with no language counts as `en`, and languages compare ignoring case. Across\n * languages, two labels collide only when they differ in spelling but not in\n * case: `API` in en and de is one word, `Kubernetes`/`kubernetes` is a clash.\n *\n * The hierarchy is the concept scheme's (proposal 0086): every term's\n * `broader` and `narrower`, plus every page's `graph:` block. A name on a page\n * resolves as the graph resolves it, by label, then id, then alt-label. The\n * thesaurus rules (proposal 0086 § 4) read that union too, and\n * `keyword-candidate` reads the free `keywords:` of every page loaded.\n */\nimport { TERM_RELATION_FIELDS } from \"../../shared/reference-fields.js\";\nimport { DEFAULT_ABSTRACT_MAX_LENGTH, DEFAULT_CRAWL_MIN_PAGES } from \"./config.js\";\nimport { languageKey as language } from \"./writers/render-util.js\";\nimport { resolveSeverity, ruleId } from \"./severity.js\";\nimport {\n TERM_MATCH_FIELDS,\n type Term,\n type TermField,\n type TermFinding,\n type TermReference,\n type TermRule,\n type TermSet,\n type TermSeverity,\n} from \"../types.js\";\n\nexport interface CheckTermSetOptions {\n severity?: Partial<Record<TermRule, TermSeverity>>;\n /** Default `DEFAULT_ABSTRACT_MAX_LENGTH`. */\n abstractMaxLength?: number;\n /** The pages a keyword needs to be a `keyword-candidate`: `term.fill.crawl.minPages`. Default `DEFAULT_CRAWL_MIN_PAGES`. */\n minPages?: number;\n}\n\n/** The `administrative-status` values that retire a designation, as 0084 reads them from TBX. */\nconst RETIRED_STATUSES: ReadonlySet<string> = new Set([\"deprecated\", \"superseded\"]);\n\n/** The fields whose values name other entries. */\nconst REFERENCE_FIELDS = TERM_RELATION_FIELDS;\ntype ReferenceField = (typeof REFERENCE_FIELDS)[number];\n\ninterface Draft {\n rule: TermRule;\n message: string;\n file: string;\n line?: number;\n id?: string;\n field?: TermField;\n}\n\nexport function checkTermSet(set: TermSet, opts: CheckTermSetOptions = {}): TermFinding[] {\n const levels = resolveSeverity(opts.severity);\n const maxLength = opts.abstractMaxLength ?? DEFAULT_ABSTRACT_MAX_LENGTH;\n const { terms } = set;\n const drafts: Draft[] = [];\n\n const fold = (value: string): string => value.toLowerCase();\n const where = (t: Term): string => `${t.location.file}:${String(t.location.line)}`;\n const onEntry = (t: Term, rule: TermRule, message: string, field?: TermField): Draft => ({\n rule,\n message,\n file: t.location.file,\n line: (field === undefined ? undefined : t.location.fieldLines[field]) ?? t.location.line,\n id: t.id,\n ...(field === undefined ? {} : { field }),\n });\n\n // The first entry claiming each folded label, id and alt-label, overall\n // and per language.\n const byLabel = new Map<string, number>();\n const byId = new Map<string, number>();\n const inLanguage = new Map<string, number>();\n const byAlt = new Map<string, number>();\n // Every entry per folded label, and per folded alt-label, in set order, for\n // the collision rules.\n const labelled = new Map<string, number[]>();\n const altHeld = new Map<string, Set<number>>();\n const claim = (map: Map<string, number>, key: string, index: number): void => {\n if (!map.has(key)) map.set(key, index);\n };\n terms.forEach((t, index) => {\n claim(byLabel, fold(t.record.label), index);\n const group = labelled.get(fold(t.record.label));\n if (group === undefined) labelled.set(fold(t.record.label), [index]);\n else group.push(index);\n claim(byId, fold(t.id), index);\n claim(inLanguage, `${language(t)} label ${fold(t.record.label)}`, index);\n claim(inLanguage, `${language(t)} id ${fold(t.id)}`, index);\n for (const alt of t.record[\"alt-labels\"] ?? []) {\n claim(byAlt, fold(alt), index);\n claim(inLanguage, `${language(t)} alt ${fold(alt)}`, index);\n const holders = altHeld.get(fold(alt));\n if (holders === undefined) altHeld.set(fold(alt), new Set([index]));\n else holders.add(index);\n }\n });\n /** Whether `t`'s label `a` collides with `other`'s label `b`: within a language when they fold alike, across languages only when their spelling differs too. */\n const clash = (t: Term, a: string, other: Term, b: string): boolean =>\n fold(a) === fold(b) && (language(t) === language(other) || a !== b);\n /** The first entry other than `index` whose label collides with `value` on `t`, among those `before` allows. */\n const collider = (t: Term, index: number, value: string, before: boolean): Term | undefined => {\n for (const otherIndex of labelled.get(fold(value)) ?? []) {\n if (otherIndex === index || (before && otherIndex > index)) continue;\n const other = terms[otherIndex];\n if (other !== undefined && clash(t, value, other, other.record.label)) return other;\n }\n return undefined;\n };\n /** As `collider`, against other entries' alt-labels. */\n const altCollider = (t: Term, index: number, value: string, before: boolean): Term | undefined => {\n for (const otherIndex of altHeld.get(fold(value)) ?? []) {\n if (otherIndex === index || (before && otherIndex > index)) continue;\n const other = terms[otherIndex];\n const alt = other?.record[\"alt-labels\"]?.find((a) => fold(a) === fold(value));\n if (other !== undefined && alt !== undefined && clash(t, value, other, alt)) return other;\n }\n return undefined;\n };\n\n // A same-language label, then a same-language id, then any language.\n const resolveReference = (from: Term, value: string): number | undefined =>\n inLanguage.get(`${language(from)} label ${fold(value)}`) ??\n inLanguage.get(`${language(from)} id ${fold(value)}`) ??\n byLabel.get(fold(value)) ??\n byId.get(fold(value));\n\n // A name on a page, in the graph's order (`termIndex` in\n // src/graph/core/concepts.ts): the page's language, then its primary\n // language, then any, and within each a label, an id, then an alt-label. The\n // two must change together, or term check and the graph judge different\n // hierarchies. So here, unlike the other rules, a page or term with no\n // language takes part only in the last pass, as in the graph.\n const tagOf = (tag: string | undefined): string | undefined =>\n tag === undefined || tag === \"\" ? undefined : fold(tag);\n // `split` always yields one element; the `?? \"\"` only satisfies the index type.\n const primaryOf = (tag: string): string => tag.split(\"-\")[0] ?? \"\";\n const ids = new Map<string, number[]>();\n const alts = new Map<string, number[]>();\n const list = (map: Map<string, number[]>, key: string, index: number): void => {\n const held = map.get(key);\n if (held === undefined) map.set(key, [index]);\n else held.push(index);\n };\n terms.forEach((t, index) => {\n list(ids, fold(t.id), index);\n for (const alt of t.record[\"alt-labels\"] ?? []) list(alts, fold(alt), index);\n });\n const tiers: [Map<string, number[]>, boolean][] = [\n [labelled, false],\n [ids, false],\n [alts, true],\n ];\n const resolvePageName = (value: string, lang: string | undefined): { index: number; alt: boolean } | undefined => {\n const wanted = tagOf(lang);\n const passes: ((t: Term) => boolean)[] =\n wanted === undefined\n ? [() => true]\n : [\n (t) => tagOf(t.language) === wanted,\n (t) => {\n const own = tagOf(t.language);\n return own !== undefined && primaryOf(own) === primaryOf(wanted);\n },\n () => true,\n ];\n for (const pass of passes) {\n for (const [map, alt] of tiers) {\n const index = map.get(fold(value))?.find((i) => {\n const t = terms[i];\n return t !== undefined && pass(t);\n });\n if (index !== undefined) return { index, alt };\n }\n }\n return undefined;\n };\n const resolveName = (value: string, lang: string | undefined): number | undefined =>\n resolvePageName(value, lang)?.index;\n\n // undefined-term and alt-label-reference, and the ids some page names, for unused-term.\n const usedIds = new Set<string>();\n for (const reference of set.references) {\n const field = reference.field ?? \"concepts\";\n const at = { file: reference.file, ...(reference.line === undefined ? {} : { line: reference.line }) };\n const hit = resolvePageName(reference.label, reference.language);\n const target = terms[hit?.index ?? -1];\n if (target !== undefined) usedIds.add(fold(target.id));\n if (hit !== undefined && !hit.alt) continue;\n drafts.push(\n target === undefined\n ? { rule: \"undefined-term\", message: `${field}: \"${reference.label}\" names no entry.`, ...at }\n : {\n rule: \"alt-label-reference\",\n message: `${field}: \"${reference.label}\" is an alt-label of \"${target.record.label}\", so name the label.`,\n ...at,\n },\n );\n }\n\n // duplicate-id: ignoring case, as references resolve ids, on every entry\n // sharing the id in one language.\n const sharing = new Map<string, Term[]>();\n for (const t of terms) {\n const id = `${language(t)} ${fold(t.id)}`;\n const group = sharing.get(id);\n if (group === undefined) sharing.set(id, [t]);\n else group.push(t);\n }\n for (const group of sharing.values()) {\n if (group.length < 2) continue;\n for (const t of group) {\n const others = group.filter((other) => other !== t).map(where);\n drafts.push(onEntry(t, \"duplicate-id\", `id: \"${t.id}\" is also used by ${others.join(\", \")}`));\n }\n }\n\n terms.forEach((t, index) => {\n // label-collision: on each later entry, naming the first.\n const firstTerm = collider(t, index, t.record.label, true);\n if (firstTerm !== undefined) {\n drafts.push(\n onEntry(\n t,\n \"label-collision\",\n `\"${t.record.label}\" is claimed by ${where(firstTerm)} as \"${firstTerm.record.label}\"`,\n \"label\",\n ),\n );\n }\n\n // alt-label-collision: an alt-label that is another entry's label.\n for (const alt of t.record[\"alt-labels\"] ?? []) {\n const owner = collider(t, index, alt, false);\n if (owner !== undefined) {\n drafts.push(\n onEntry(t, \"alt-label-collision\", `alt-labels: \"${alt}\" is the label of ${where(owner)}`, \"alt-labels\"),\n );\n }\n // label-overlap: an alt-label that repeats the entry's own label.\n if (fold(alt) === fold(t.record.label)) {\n drafts.push(onEntry(t, \"label-overlap\", `alt-labels: \"${alt}\" repeats this entry's label.`, \"alt-labels\"));\n }\n // ambiguous-alt-label: on each later entry, naming the first.\n const sharer = altCollider(t, index, alt, true);\n if (sharer !== undefined) {\n drafts.push(\n onEntry(\n t,\n \"ambiguous-alt-label\",\n `alt-labels: \"${alt}\" is also an alt-label of ${where(sharer)}, so a reader can't tell which term it means.`,\n \"alt-labels\",\n ),\n );\n }\n }\n\n // label-overlap: a hidden-label is a name the entry or another one goes by.\n const ownAlts = new Set((t.record[\"alt-labels\"] ?? []).map(fold));\n for (const hidden of t.record[\"hidden-labels\"] ?? []) {\n const labelOf = collider(t, index, hidden, false);\n const altOf = labelOf === undefined ? altCollider(t, index, hidden, false) : undefined;\n const overlap =\n fold(hidden) === fold(t.record.label)\n ? \"repeats this entry's label.\"\n : ownAlts.has(fold(hidden))\n ? \"repeats this entry's alt-label.\"\n : labelOf !== undefined\n ? `is the label of ${where(labelOf)}.`\n : altOf !== undefined\n ? `is an alt-label of ${where(altOf)}.`\n : undefined;\n if (overlap !== undefined) {\n drafts.push(onEntry(t, \"label-overlap\", `hidden-labels: \"${hidden}\" ${overlap}`, \"hidden-labels\"));\n }\n }\n\n // deprecated-label: the designation of the label itself is retired.\n const status = t.record.designations?.find((d) => fold(d.term) === fold(t.record.label))?.[\"administrative-status\"];\n if (t.record.see === undefined && status !== undefined && RETIRED_STATUSES.has(fold(status))) {\n drafts.push(\n onEntry(\n t,\n \"deprecated-label\",\n `label: \"${t.record.label}\" is deprecated in designations, so promote another label or redirect with see:.`,\n \"label\",\n ),\n );\n }\n\n // dangling-reference: one finding per value that resolves to nothing.\n for (const field of REFERENCE_FIELDS) {\n for (const value of referenceValues(t, field)) {\n if (resolveReference(t, value) === undefined) {\n drafts.push(onEntry(t, \"dangling-reference\", `${field}: \"${value}\" names no entry`, field));\n }\n }\n }\n\n // see-not-empty: a redirect carries no definition.\n if (t.record.see !== undefined && t.record.definition !== undefined) {\n drafts.push(\n onEntry(t, \"see-not-empty\", `see: \"${t.record.see}\" redirects this entry, so remove its definition`, \"see\"),\n );\n }\n\n // missing-definition: an entry that neither defines its term nor redirects.\n if (t.record.see === undefined && t.record.definition === undefined) {\n drafts.push(\n onEntry(t, \"missing-definition\", \"definition: missing, so write one or run manni term fill.\", \"definition\"),\n );\n }\n\n // conflicting-matches: once per IRI, naming the first kind it is under and the next.\n const kindOf = new Map<string, TermField>();\n const conflicting = new Set<string>();\n for (const field of TERM_MATCH_FIELDS) {\n for (const iri of t.record[field] ?? []) {\n const first = kindOf.get(iri);\n if (first === undefined) kindOf.set(iri, field);\n else if (first !== field && !conflicting.has(iri)) {\n conflicting.add(iri);\n drafts.push(\n onEntry(t, \"conflicting-matches\", `${first}: \"${iri}\" is also in ${field}, and a mapping has one kind.`, first),\n );\n }\n }\n }\n\n // abstract-too-long.\n const abstract = t.record.abstract;\n if (abstract !== undefined && abstract.length > maxLength) {\n drafts.push(\n onEntry(\n t,\n \"abstract-too-long\",\n `abstract: ${String(abstract.length)} characters is over the limit of ${String(maxLength)}, so shorten it`,\n \"abstract\",\n ),\n );\n }\n\n // unused-term: no reference resolves to any term sharing the id.\n if (!usedIds.has(fold(t.id))) {\n drafts.push(onEntry(t, \"unused-term\", \"no page's concepts: names this term\"));\n }\n });\n\n // The resolved hierarchy, one edge per pair.\n const edges = (field: \"broader\" | \"narrower\" | \"related-terms\"): Set<number>[] =>\n terms.map((t) => {\n const targets = new Set<number>();\n for (const value of referenceValues(t, field)) {\n const target = resolveReference(t, value);\n if (target !== undefined) targets.add(target);\n }\n return targets;\n });\n const broader = edges(\"broader\");\n const narrower = edges(\"narrower\");\n const related = edges(\"related-terms\");\n\n // asymmetric-related: on the entry that omits the other half.\n terms.forEach((t, index) => {\n for (const other of related[index] ?? []) {\n const otherTerm = terms[other];\n if (otherTerm !== undefined && !(related[other]?.has(index) ?? false)) {\n drafts.push(\n onEntry(\n otherTerm,\n \"asymmetric-related\",\n `related-terms: omits \"${t.record.label}\", which lists this entry as related.`,\n \"related-terms\",\n ),\n );\n }\n }\n });\n\n // asymmetric-hierarchy: each missing half, on the entry that should carry it.\n terms.forEach((t, index) => {\n for (const parent of broader[index] ?? []) {\n const parentTerm = terms[parent];\n if (parentTerm !== undefined && !(narrower[parent]?.has(index) ?? false)) {\n drafts.push(\n onEntry(\n parentTerm,\n \"asymmetric-hierarchy\",\n `narrower: omits \"${t.record.label}\", which lists this entry as broader`,\n \"narrower\",\n ),\n );\n }\n }\n for (const child of narrower[index] ?? []) {\n const childTerm = terms[child];\n if (childTerm !== undefined && !(broader[child]?.has(index) ?? false)) {\n drafts.push(\n onEntry(\n childTerm,\n \"asymmetric-hierarchy\",\n `broader: omits \"${t.record.label}\", which lists this entry as narrower`,\n \"broader\",\n ),\n );\n }\n }\n });\n\n // The concept scheme's hierarchy, child to parent: every term's broader and\n // narrower, then every graph block's. A name no term claims is a freeform\n // node of its own, after the terms.\n const names = terms.map((t) => t.record.label);\n const freeform = new Map<string, number>();\n const node = (value: string, lang: string | undefined): number => {\n const index = resolveName(value, lang) ?? freeform.get(fold(value));\n if (index !== undefined) return index;\n freeform.set(fold(value), names.length);\n names.push(value);\n return names.length - 1;\n };\n const up: Set<number>[] = [];\n const termEdges = new Set<string>();\n const blockEdges = new Map<string, { file: string; line?: number }>();\n const link = (child: number, parent: number): string => {\n (up[child] ??= new Set()).add(parent);\n return `${String(child)}>${String(parent)}`;\n };\n broader.forEach((parents, child) => {\n for (const parent of parents) termEdges.add(link(child, parent));\n });\n narrower.forEach((children, parent) => {\n for (const child of children) termEdges.add(link(child, parent));\n });\n for (const block of set.blocks) {\n const subject = node(block.label, block.language);\n for (const edge of block.edges) {\n if (edge.field === \"related-concepts\") continue;\n const other = node(edge.value, block.language);\n const key = edge.field === \"broader\" ? link(subject, other) : link(other, subject);\n const line = edge.line ?? block.line;\n if (!blockEdges.has(key)) blockEdges.set(key, { file: block.file, ...(line === undefined ? {} : { line }) });\n }\n }\n\n // broader-cycle: every elementary cycle once, found from its earliest node.\n // A cycle the terms close alone sits on that entry; one a block edge closes\n // sits on the first such edge's page.\n for (const [start, path] of broaderCycles(up)) {\n const chain = [...path, start];\n const message = `broader: ${chain.map((index) => names[index] ?? \"\").join(\" > \")}`;\n const hops = path.map((from, i) => `${String(from)}>${String(chain[i + 1])}`);\n const viaBlock = hops.find((hop) => !termEdges.has(hop));\n const startTerm = terms[start];\n if (viaBlock === undefined && startTerm !== undefined) {\n drafts.push(onEntry(startTerm, \"broader-cycle\", message, \"broader\"));\n } else {\n const at = blockEdges.get(viaBlock ?? \"\");\n if (at !== undefined) drafts.push({ rule: \"broader-cycle\", message, ...at });\n }\n }\n\n // hierarchy-outside-termbase: a block whose label is a term gives it an edge\n // the term's own field does not list. Values compare as concepts, by id.\n const concept = (index: number | undefined, value: string): string => {\n const t = index === undefined ? undefined : terms[index];\n return t === undefined ? `name ${fold(value)}` : `id ${fold(t.id)}`;\n };\n for (const block of set.blocks) {\n const t = terms[resolveName(block.label, block.language) ?? -1];\n if (t === undefined) continue;\n for (const edge of block.edges) {\n const field = edge.field === \"related-concepts\" ? \"related-terms\" : edge.field;\n const listed = referenceValues(t, field).map((value) => concept(resolveReference(t, value), value));\n if (listed.includes(concept(resolveName(edge.value, block.language), edge.value))) continue;\n const kind = t.location.construct === \"page\" ? \"page\" : \"entry\";\n const line = edge.line ?? block.line;\n drafts.push({\n rule: \"hierarchy-outside-termbase\",\n message: `graph: ${edge.field} \"${edge.value}\" on \"${t.record.label}\" is not on its term ${kind} (${t.location.file}), so add it there.`,\n file: block.file,\n ...(line === undefined ? {} : { line }),\n });\n }\n }\n\n // Every concept above a node, at any depth, over the whole union.\n const ancestors = (start: number): Set<number> => {\n const seen = new Set<number>();\n const stack = [...(up[start] ?? [])];\n for (let next = stack.pop(); next !== undefined; next = stack.pop()) {\n if (seen.has(next)) continue;\n seen.add(next);\n stack.push(...(up[next] ?? []));\n }\n return seen;\n };\n\n // related-in-hierarchy on the entry that lists the link; related-siblings\n // once per pair, on the first entry that lists the other.\n const siblingPairs = new Set<string>();\n terms.forEach((t, index) => {\n const above = ancestors(index);\n const seen = new Set<number>();\n for (const value of referenceValues(t, \"related-terms\")) {\n const other = resolveReference(t, value);\n if (other === undefined || other === index || seen.has(other)) continue;\n seen.add(other);\n const direction = above.has(other) ? \"broader\" : ancestors(other).has(index) ? \"narrower\" : undefined;\n if (direction !== undefined) {\n drafts.push(\n onEntry(\n t,\n \"related-in-hierarchy\",\n `related-terms: \"${value}\" is also ${direction} than this entry, so keep one of the two.`,\n \"related-terms\",\n ),\n );\n continue;\n }\n // Z39.19 siblings share an immediate broader term, not just an ancestor.\n const parent = [...(up[index] ?? [])].find((p) => up[other]?.has(p) ?? false);\n const pair = `${String(Math.min(index, other))}~${String(Math.max(index, other))}`;\n if (parent === undefined || siblingPairs.has(pair)) continue;\n siblingPairs.add(pair);\n drafts.push(\n onEntry(\n t,\n \"related-siblings\",\n `related-terms: \"${value}\" shares the broader term \"${names[parent] ?? \"\"}\", which already relates them.`,\n \"related-terms\",\n ),\n );\n }\n });\n\n // orphan-term: only once a term sits in the hierarchy at all, so a flat\n // glossary never hears of it, nor one whose only edges join names no term\n // defines (those sit past the terms in `names`). A concept is placed in\n // every language.\n const isTerm = (index: number): boolean => index < terms.length;\n if (up.some((parents, child) => isTerm(child) || [...parents].some(isTerm))) {\n const placed = new Set<string>();\n const place = (index: number | undefined): void => {\n if (index === undefined) return;\n const t = terms[index];\n if (t !== undefined) placed.add(fold(t.id));\n };\n up.forEach((parents, child) => {\n place(child);\n for (const parent of parents) place(parent);\n });\n related.forEach((others, index) => {\n if (others.size > 0) place(index);\n for (const other of others) place(other);\n });\n for (const block of set.blocks) {\n for (const edge of block.edges) {\n if (edge.field !== \"related-concepts\") continue;\n place(resolveName(block.label, block.language));\n place(resolveName(edge.value, block.language));\n }\n }\n for (const t of terms) {\n if (t.record.see === undefined && !placed.has(fold(t.id))) {\n drafts.push(onEntry(t, \"orphan-term\", \"no broader, narrower or related term, so place it in the hierarchy.\"));\n }\n }\n }\n\n // keyword-candidate: once per keyword, at its first page in sort order.\n const minPages = opts.minPages ?? DEFAULT_CRAWL_MIN_PAGES;\n const byKeyword = new Map<string, TermReference[]>();\n for (const keyword of set.keywords ?? []) {\n const uses = byKeyword.get(fold(keyword.label));\n if (uses === undefined) byKeyword.set(fold(keyword.label), [keyword]);\n else uses.push(keyword);\n }\n for (const [key, uses] of byKeyword) {\n if (byLabel.has(key) || byId.has(key) || byAlt.has(key)) continue;\n const pages = new Set(uses.map((use) => use.file)).size;\n const first = [...uses].sort((a, b) => compareText(a.file, b.file) || (a.line ?? 0) - (b.line ?? 0))[0];\n if (pages < minPages || first === undefined) continue;\n drafts.push({\n rule: \"keyword-candidate\",\n message: `keywords: \"${first.label}\" is on ${String(pages)} pages and names no term, so add it to concepts: or run manni term fill --crawl.`,\n file: first.file,\n ...(first.line === undefined ? {} : { line: first.line }),\n });\n }\n\n const findings: TermFinding[] = [];\n for (const draft of drafts) {\n const level = levels[draft.rule];\n if (level === \"off\") continue;\n findings.push({\n rule: draft.rule,\n ruleId: ruleId(draft.rule),\n severity: level,\n message: draft.message,\n file: draft.file,\n ...(draft.line === undefined ? {} : { line: draft.line }),\n ...(draft.id === undefined ? {} : { id: draft.id }),\n ...(draft.field === undefined ? {} : { field: draft.field }),\n });\n }\n return findings.sort(compareFindings);\n}\n\nfunction referenceValues(t: Term, field: ReferenceField): string[] {\n const value = t.record[field];\n if (value === undefined) return [];\n return typeof value === \"string\" ? [value] : value;\n}\n\n/**\n * Each elementary cycle of the `broader` graph, as its start and the path from\n * it. A search from `start` only visits later entries, so a cycle is found\n * exactly once, from the entry of it that comes first in set order.\n */\nfunction broaderCycles(broader: readonly Set<number>[]): [number, number[]][] {\n const cycles: [number, number[]][] = [];\n for (let start = 0; start < broader.length; start++) {\n const path: number[] = [start];\n const onPath = new Set<number>([start]);\n const walk = (node: number): void => {\n for (const next of broader[node] ?? []) {\n if (next === start) {\n cycles.push([start, [...path]]);\n } else if (next > start && !onPath.has(next)) {\n path.push(next);\n onPath.add(next);\n walk(next);\n path.pop();\n onPath.delete(next);\n }\n }\n };\n walk(start);\n }\n return cycles;\n}\n\nfunction compareText(a: string, b: string): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareFindings(a: TermFinding, b: TermFinding): number {\n return (\n compareText(a.file, b.file) ||\n (a.line ?? 0) - (b.line ?? 0) ||\n compareText(a.ruleId, b.ruleId) ||\n compareText(a.message, b.message)\n );\n}\n","/**\n * The report `check` and `lint` share, and the bridge from term findings to\n * meta's `ValidationResult`, so the SARIF and JUnit renderers and the baseline\n * ratchet work unchanged, as cite's adapter does for citations.\n *\n * FieldError: schema `manni:term` (a builtin-shaped ref, so fingerprints and\n * rule ids never depend on where the command ran), keyword = the rule id after\n * `manni:term/`, instancePath `/<field>` when the finding concerns one field\n * and `\"\"` when it concerns none (`undefined-term`, `duplicate-id`,\n * `unused-term`). A check finding and a lint finding carry the field the same\n * way. The subject is the entry, the field, and what the finding says, with any\n * `file:line` taken out: a line moves when a page is edited above the entry,\n * and a moved finding is not a new one.\n */\nimport {\n isErrorSeverity,\n type BaselineSummary,\n type FieldError,\n type FingerprintContext,\n type RunSummary,\n type ValidationResult,\n} from \"../../meta/index.js\";\nimport { RULE_ID_PREFIX } from \"../core/severity.js\";\nimport type { TermFinding, TermSet } from \"../types.js\";\n\nexport const FINDING_FORMATS = [\"pretty\", \"json\", \"github\", \"sarif\", \"junit\"] as const;\nexport type FindingFormat = (typeof FINDING_FORMATS)[number];\n\n/** JUnit `classname` for the term tool's findings. */\nexport const JUNIT_CLASSNAME = \"manni.term\";\n\n/** What `check` and `lint` return. */\nexport interface TermReport {\n /** The findings reported: a baselined one is not among them. */\n findings: TermFinding[];\n /** The same findings as meta's results, for SARIF and JUnit. One per file. */\n results: ValidationResult[];\n summary: RunSummary;\n frame: FingerprintContext;\n /** Entries in the set. */\n terms: number;\n /** `concepts:` values the run read. */\n references: number;\n /** How a baseline shaped the run, when one did. */\n baseline?: BaselineSummary;\n /** Findings before the baseline, for the line a recording run prints. */\n found: number;\n /** Where the run stood, for the paths the reporters print. */\n cwd: string;\n}\n\nconst LINE_REFERENCE = /:\\d+\\b/g;\n\nfunction toFieldError(finding: TermFinding): FieldError {\n const keyword = finding.ruleId.startsWith(`${RULE_ID_PREFIX}/`)\n ? finding.ruleId.slice(RULE_ID_PREFIX.length + 1)\n : finding.ruleId;\n const { field } = finding;\n const subject = [finding.id ?? \"\", field ?? \"\", finding.message.replace(LINE_REFERENCE, \"\")].join(\"\\u0000\");\n const error: FieldError = {\n schema: RULE_ID_PREFIX,\n instancePath: field === undefined ? \"\" : `/${field}`,\n message: finding.message,\n keyword,\n subject,\n severity: finding.severity,\n };\n if (finding.line !== undefined) error.line = finding.line;\n return error;\n}\n\n/**\n * One result per file: every file a term was read from, clean or not, and\n * every file a finding sits in. `origin` maps each error back to its finding.\n */\nexport function toResults(\n set: TermSet,\n findings: readonly TermFinding[],\n): { results: ValidationResult[]; origin: Map<FieldError, TermFinding> } {\n const origin = new Map<FieldError, TermFinding>();\n const byFile = new Map<string, FieldError[]>();\n for (const term of set.terms) {\n if (!byFile.has(term.location.file)) byFile.set(term.location.file, []);\n }\n for (const finding of findings) {\n const error = toFieldError(finding);\n origin.set(error, finding);\n const list = byFile.get(finding.file) ?? [];\n list.push(error);\n byFile.set(finding.file, list);\n }\n const results = [...byFile.keys()].sort().map((file): ValidationResult => {\n const errors = byFile.get(file) ?? [];\n return { file, format: \"term\", ok: !errors.some(isErrorSeverity), schemas: [RULE_ID_PREFIX], errors };\n });\n return { results, origin };\n}\n\n/** The run summary meta's renderers read, from results a baseline may have thinned. */\nexport function summarize(results: readonly ValidationResult[], baseline?: BaselineSummary): RunSummary {\n const failed = results.filter((r) => !r.ok).length;\n const count = (keep: (e: FieldError) => boolean): number =>\n results.reduce((n, r) => n + r.errors.filter(keep).length, 0);\n const warnings = count((e) => e.severity === \"warning\");\n const notices = count((e) => e.severity === \"notice\");\n return {\n files: results.length,\n passed: results.length - failed,\n failed,\n errors: count(isErrorSeverity),\n ...(warnings > 0 ? { warnings } : {}),\n ...(notices > 0 ? { notices } : {}),\n ...(baseline ? { baseline } : {}),\n };\n}\n\n/** The findings still reported once a baseline has thinned the results. */\nexport function reportedFindings(\n results: readonly ValidationResult[],\n origin: ReadonlyMap<FieldError, TermFinding>,\n): TermFinding[] {\n const kept: TermFinding[] = [];\n for (const result of results) {\n for (const error of result.errors) {\n const finding = origin.get(error);\n if (finding !== undefined) kept.push(finding);\n }\n }\n return kept.sort(compareFindings);\n}\n\nfunction compareFindings(a: TermFinding, b: TermFinding): number {\n if (a.file !== b.file) return a.file < b.file ? -1 : 1;\n const lineA = a.line ?? 0;\n const lineB = b.line ?? 0;\n if (lineA !== lineB) return lineA - lineB;\n if (a.ruleId !== b.ruleId) return a.ruleId < b.ruleId ? -1 : 1;\n return a.message < b.message ? -1 : a.message > b.message ? 1 : 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAUA,SAAS,kBAAkB;;;ACDpB,IAAM,iBAAiB;AAEvB,IAAM,mBAA6D;AAAA,EACxE,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,uBAAuB;AAAA,EACvB,wBAAwB;AAAA,EACxB,sBAAsB;AAAA,EACtB,wBAAwB;AAAA,EACxB,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,qBAAqB;AACvB;AAEO,SAAS,OAAO,MAAwB;AAC7C,SAAO,GAAG,cAAc,IAAI,IAAI;AAClC;AAEO,SAAS,YAAY,OAAuB;AACjD,SAAO,GAAG,cAAc,UAAU,KAAK;AACzC;AAEO,SAAS,WAAW,OAAkC;AAC3D,SAAQ,WAAiC,SAAS,KAAK;AACzD;AAGO,SAAS,gBACd,WACgC;AAChC,SAAO,EAAE,GAAG,kBAAkB,GAAG,UAAU;AAC7C;AAMO,SAAS,iBAAiB,UAAkC;AACjE,SAAO,aAAa,eAAe,WAAW;AAChD;;;AChBA,IAAM,mBAAwC,oBAAI,IAAI,CAAC,cAAc,YAAY,CAAC;AAGlF,IAAM,mBAAmB;AAYlB,SAAS,aAAa,KAAc,OAA4B,CAAC,GAAkB;AACxF,QAAM,SAAS,gBAAgB,KAAK,QAAQ;AAC5C,QAAM,YAAY,KAAK,qBAAqB;AAC5C,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,SAAkB,CAAC;AAEzB,QAAM,OAAO,CAAC,UAA0B,MAAM,YAAY;AAC1D,QAAM,QAAQ,CAAC,MAAoB,GAAG,EAAE,SAAS,IAAI,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC;AAChF,QAAM,UAAU,CAAC,GAAS,MAAgB,SAAiB,WAA8B;AAAA,IACvF;AAAA,IACA;AAAA,IACA,MAAM,EAAE,SAAS;AAAA,IACjB,OAAO,UAAU,SAAY,SAAY,EAAE,SAAS,WAAW,KAAK,MAAM,EAAE,SAAS;AAAA,IACrF,IAAI,EAAE;AAAA,IACN,GAAI,UAAU,SAAY,CAAC,IAAI,EAAE,MAAM;AAAA,EACzC;AAIA,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,aAAa,oBAAI,IAAoB;AAC3C,QAAM,QAAQ,oBAAI,IAAoB;AAGtC,QAAM,WAAW,oBAAI,IAAsB;AAC3C,QAAM,UAAU,oBAAI,IAAyB;AAC7C,QAAM,QAAQ,CAAC,KAA0B,KAAa,UAAwB;AAC5E,QAAI,CAAC,IAAI,IAAI,GAAG,EAAG,KAAI,IAAI,KAAK,KAAK;AAAA,EACvC;AACA,QAAM,QAAQ,CAAC,GAAG,UAAU;AAC1B,UAAM,SAAS,KAAK,EAAE,OAAO,KAAK,GAAG,KAAK;AAC1C,UAAM,QAAQ,SAAS,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC;AAC/C,QAAI,UAAU,OAAW,UAAS,IAAI,KAAK,EAAE,OAAO,KAAK,GAAG,CAAC,KAAK,CAAC;AAAA,QAC9D,OAAM,KAAK,KAAK;AACrB,UAAM,MAAM,KAAK,EAAE,EAAE,GAAG,KAAK;AAC7B,UAAM,YAAY,GAAG,YAAS,CAAC,CAAC,UAAU,KAAK,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK;AACvE,UAAM,YAAY,GAAG,YAAS,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC,IAAI,KAAK;AAC1D,eAAW,OAAO,EAAE,OAAO,YAAY,KAAK,CAAC,GAAG;AAC9C,YAAM,OAAO,KAAK,GAAG,GAAG,KAAK;AAC7B,YAAM,YAAY,GAAG,YAAS,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,KAAK;AAC1D,YAAM,UAAU,QAAQ,IAAI,KAAK,GAAG,CAAC;AACrC,UAAI,YAAY,OAAW,SAAQ,IAAI,KAAK,GAAG,GAAG,oBAAI,IAAI,CAAC,KAAK,CAAC,CAAC;AAAA,UAC7D,SAAQ,IAAI,KAAK;AAAA,IACxB;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,CAAC,GAAS,GAAW,OAAa,MAC9C,KAAK,CAAC,MAAM,KAAK,CAAC,MAAM,YAAS,CAAC,MAAM,YAAS,KAAK,KAAK,MAAM;AAEnE,QAAM,WAAW,CAAC,GAAS,OAAe,OAAe,WAAsC;AAC7F,eAAW,cAAc,SAAS,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG;AACxD,UAAI,eAAe,SAAU,UAAU,aAAa,MAAQ;AAC5D,YAAM,QAAQ,MAAM,UAAU;AAC9B,UAAI,UAAU,UAAa,MAAM,GAAG,OAAO,OAAO,MAAM,OAAO,KAAK,EAAG,QAAO;AAAA,IAChF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,GAAS,OAAe,OAAe,WAAsC;AAChG,eAAW,cAAc,QAAQ,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG;AACvD,UAAI,eAAe,SAAU,UAAU,aAAa,MAAQ;AAC5D,YAAM,QAAQ,MAAM,UAAU;AAC9B,YAAM,MAAM,OAAO,OAAO,YAAY,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC;AAC5E,UAAI,UAAU,UAAa,QAAQ,UAAa,MAAM,GAAG,OAAO,OAAO,GAAG,EAAG,QAAO;AAAA,IACtF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,mBAAmB,CAAC,MAAY,UACpC,WAAW,IAAI,GAAG,YAAS,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,KACvD,WAAW,IAAI,GAAG,YAAS,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,KACpD,QAAQ,IAAI,KAAK,KAAK,CAAC,KACvB,KAAK,IAAI,KAAK,KAAK,CAAC;AAQtB,QAAM,QAAQ,CAAC,QACb,QAAQ,UAAa,QAAQ,KAAK,SAAY,KAAK,GAAG;AAExD,QAAM,YAAY,CAAC,QAAwB,IAAI,MAAM,GAAG,EAAE,CAAC,KAAK;AAChE,QAAM,MAAM,oBAAI,IAAsB;AACtC,QAAM,OAAO,oBAAI,IAAsB;AACvC,QAAM,OAAO,CAAC,KAA4B,KAAa,UAAwB;AAC7E,UAAM,OAAO,IAAI,IAAI,GAAG;AACxB,QAAI,SAAS,OAAW,KAAI,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,QACvC,MAAK,KAAK,KAAK;AAAA,EACtB;AACA,QAAM,QAAQ,CAAC,GAAG,UAAU;AAC1B,SAAK,KAAK,KAAK,EAAE,EAAE,GAAG,KAAK;AAC3B,eAAW,OAAO,EAAE,OAAO,YAAY,KAAK,CAAC,EAAG,MAAK,MAAM,KAAK,GAAG,GAAG,KAAK;AAAA,EAC7E,CAAC;AACD,QAAM,QAA4C;AAAA,IAChD,CAAC,UAAU,KAAK;AAAA,IAChB,CAAC,KAAK,KAAK;AAAA,IACX,CAAC,MAAM,IAAI;AAAA,EACb;AACA,QAAM,kBAAkB,CAAC,OAAe,SAA0E;AAChH,UAAM,SAAS,MAAM,IAAI;AACzB,UAAM,SACJ,WAAW,SACP,CAAC,MAAM,IAAI,IACX;AAAA,MACE,CAAC,MAAM,MAAM,EAAE,QAAQ,MAAM;AAAA,MAC7B,CAAC,MAAM;AACL,cAAM,MAAM,MAAM,EAAE,QAAQ;AAC5B,eAAO,QAAQ,UAAa,UAAU,GAAG,MAAM,UAAU,MAAM;AAAA,MACjE;AAAA,MACA,MAAM;AAAA,IACR;AACN,eAAW,QAAQ,QAAQ;AACzB,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO;AAC9B,cAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM;AAC9C,gBAAM,IAAI,MAAM,CAAC;AACjB,iBAAO,MAAM,UAAa,KAAK,CAAC;AAAA,QAClC,CAAC;AACD,YAAI,UAAU,OAAW,QAAO,EAAE,OAAO,IAAI;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,cAAc,CAAC,OAAe,SAClC,gBAAgB,OAAO,IAAI,GAAG;AAGhC,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,aAAa,IAAI,YAAY;AACtC,UAAM,QAAQ,UAAU,SAAS;AACjC,UAAM,KAAK,EAAE,MAAM,UAAU,MAAM,GAAI,UAAU,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,UAAU,KAAK,EAAG;AACrG,UAAM,MAAM,gBAAgB,UAAU,OAAO,UAAU,QAAQ;AAC/D,UAAM,SAAS,MAAM,KAAK,SAAS,EAAE;AACrC,QAAI,WAAW,OAAW,SAAQ,IAAI,KAAK,OAAO,EAAE,CAAC;AACrD,QAAI,QAAQ,UAAa,CAAC,IAAI,IAAK;AACnC,WAAO;AAAA,MACL,WAAW,SACP,EAAE,MAAM,kBAAkB,SAAS,GAAG,KAAK,MAAM,UAAU,KAAK,qBAAqB,GAAG,GAAG,IAC3F;AAAA,QACE,MAAM;AAAA,QACN,SAAS,GAAG,KAAK,MAAM,UAAU,KAAK,yBAAyB,OAAO,OAAO,KAAK;AAAA,QAClF,GAAG;AAAA,MACL;AAAA,IACN;AAAA,EACF;AAIA,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,KAAK,OAAO;AACrB,UAAM,KAAK,GAAG,YAAS,CAAC,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;AACvC,UAAM,QAAQ,QAAQ,IAAI,EAAE;AAC5B,QAAI,UAAU,OAAW,SAAQ,IAAI,IAAI,CAAC,CAAC,CAAC;AAAA,QACvC,OAAM,KAAK,CAAC;AAAA,EACnB;AACA,aAAW,SAAS,QAAQ,OAAO,GAAG;AACpC,QAAI,MAAM,SAAS,EAAG;AACtB,eAAW,KAAK,OAAO;AACrB,YAAM,SAAS,MAAM,OAAO,CAAC,UAAU,UAAU,CAAC,EAAE,IAAI,KAAK;AAC7D,aAAO,KAAK,QAAQ,GAAG,gBAAgB,QAAQ,EAAE,EAAE,qBAAqB,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,IAC9F;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,GAAG,UAAU;AAE1B,UAAM,YAAY,SAAS,GAAG,OAAO,EAAE,OAAO,OAAO,IAAI;AACzD,QAAI,cAAc,QAAW;AAC3B,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,IAAI,EAAE,OAAO,KAAK,mBAAmB,MAAM,SAAS,CAAC,QAAQ,UAAU,OAAO,KAAK;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,eAAW,OAAO,EAAE,OAAO,YAAY,KAAK,CAAC,GAAG;AAC9C,YAAM,QAAQ,SAAS,GAAG,OAAO,KAAK,KAAK;AAC3C,UAAI,UAAU,QAAW;AACvB,eAAO;AAAA,UACL,QAAQ,GAAG,uBAAuB,gBAAgB,GAAG,qBAAqB,MAAM,KAAK,CAAC,IAAI,YAAY;AAAA,QACxG;AAAA,MACF;AAEA,UAAI,KAAK,GAAG,MAAM,KAAK,EAAE,OAAO,KAAK,GAAG;AACtC,eAAO,KAAK,QAAQ,GAAG,iBAAiB,gBAAgB,GAAG,iCAAiC,YAAY,CAAC;AAAA,MAC3G;AAEA,YAAM,SAAS,YAAY,GAAG,OAAO,KAAK,IAAI;AAC9C,UAAI,WAAW,QAAW;AACxB,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA,gBAAgB,GAAG,6BAA6B,MAAM,MAAM,CAAC;AAAA,YAC7D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,UAAU,IAAI,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC;AAChE,eAAW,UAAU,EAAE,OAAO,eAAe,KAAK,CAAC,GAAG;AACpD,YAAM,UAAU,SAAS,GAAG,OAAO,QAAQ,KAAK;AAChD,YAAM,QAAQ,YAAY,SAAY,YAAY,GAAG,OAAO,QAAQ,KAAK,IAAI;AAC7E,YAAM,UACJ,KAAK,MAAM,MAAM,KAAK,EAAE,OAAO,KAAK,IAChC,gCACA,QAAQ,IAAI,KAAK,MAAM,CAAC,IACtB,oCACA,YAAY,SACV,mBAAmB,MAAM,OAAO,CAAC,MACjC,UAAU,SACR,sBAAsB,MAAM,KAAK,CAAC,MAClC;AACZ,UAAI,YAAY,QAAW;AACzB,eAAO,KAAK,QAAQ,GAAG,iBAAiB,mBAAmB,MAAM,KAAK,OAAO,IAAI,eAAe,CAAC;AAAA,MACnG;AAAA,IACF;AAGA,UAAM,SAAS,EAAE,OAAO,cAAc,KAAK,CAAC,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,OAAO,KAAK,CAAC,IAAI,uBAAuB;AAClH,QAAI,EAAE,OAAO,QAAQ,UAAa,WAAW,UAAa,iBAAiB,IAAI,KAAK,MAAM,CAAC,GAAG;AAC5F,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,WAAW,EAAE,OAAO,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,eAAW,SAAS,kBAAkB;AACpC,iBAAW,SAAS,gBAAgB,GAAG,KAAK,GAAG;AAC7C,YAAI,iBAAiB,GAAG,KAAK,MAAM,QAAW;AAC5C,iBAAO,KAAK,QAAQ,GAAG,sBAAsB,GAAG,KAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,QAC5F;AAAA,MACF;AAAA,IACF;AAGA,QAAI,EAAE,OAAO,QAAQ,UAAa,EAAE,OAAO,eAAe,QAAW;AACnE,aAAO;AAAA,QACL,QAAQ,GAAG,iBAAiB,SAAS,EAAE,OAAO,GAAG,oDAAoD,KAAK;AAAA,MAC5G;AAAA,IACF;AAGA,QAAI,EAAE,OAAO,QAAQ,UAAa,EAAE,OAAO,eAAe,QAAW;AACnE,aAAO;AAAA,QACL,QAAQ,GAAG,sBAAsB,6DAA6D,YAAY;AAAA,MAC5G;AAAA,IACF;AAGA,UAAM,SAAS,oBAAI,IAAuB;AAC1C,UAAM,cAAc,oBAAI,IAAY;AACpC,eAAW,SAAS,mBAAmB;AACrC,iBAAW,OAAO,EAAE,OAAO,KAAK,KAAK,CAAC,GAAG;AACvC,cAAM,QAAQ,OAAO,IAAI,GAAG;AAC5B,YAAI,UAAU,OAAW,QAAO,IAAI,KAAK,KAAK;AAAA,iBACrC,UAAU,SAAS,CAAC,YAAY,IAAI,GAAG,GAAG;AACjD,sBAAY,IAAI,GAAG;AACnB,iBAAO;AAAA,YACL,QAAQ,GAAG,uBAAuB,GAAG,KAAK,MAAM,GAAG,gBAAgB,KAAK,iCAAiC,KAAK;AAAA,UAChH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,EAAE,OAAO;AAC1B,QAAI,aAAa,UAAa,SAAS,SAAS,WAAW;AACzD,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,aAAa,OAAO,SAAS,MAAM,CAAC,oCAAoC,OAAO,SAAS,CAAC;AAAA,UACzF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,EAAE,CAAC,GAAG;AAC5B,aAAO,KAAK,QAAQ,GAAG,eAAe,qCAAqC,CAAC;AAAA,IAC9E;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,CAAC,UACb,MAAM,IAAI,CAAC,MAAM;AACf,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,SAAS,gBAAgB,GAAG,KAAK,GAAG;AAC7C,YAAM,SAAS,iBAAiB,GAAG,KAAK;AACxC,UAAI,WAAW,OAAW,SAAQ,IAAI,MAAM;AAAA,IAC9C;AACA,WAAO;AAAA,EACT,CAAC;AACH,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,WAAW,MAAM,UAAU;AACjC,QAAM,UAAU,MAAM,eAAe;AAGrC,QAAM,QAAQ,CAAC,GAAG,UAAU;AAC1B,eAAW,SAAS,QAAQ,KAAK,KAAK,CAAC,GAAG;AACxC,YAAM,YAAY,MAAM,KAAK;AAC7B,UAAI,cAAc,UAAa,EAAE,QAAQ,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ;AACrE,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA,yBAAyB,EAAE,OAAO,KAAK;AAAA,YACvC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,CAAC,GAAG,UAAU;AAC1B,eAAW,UAAU,QAAQ,KAAK,KAAK,CAAC,GAAG;AACzC,YAAM,aAAa,MAAM,MAAM;AAC/B,UAAI,eAAe,UAAa,EAAE,SAAS,MAAM,GAAG,IAAI,KAAK,KAAK,QAAQ;AACxE,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA,oBAAoB,EAAE,OAAO,KAAK;AAAA,YAClC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,eAAW,SAAS,SAAS,KAAK,KAAK,CAAC,GAAG;AACzC,YAAM,YAAY,MAAM,KAAK;AAC7B,UAAI,cAAc,UAAa,EAAE,QAAQ,KAAK,GAAG,IAAI,KAAK,KAAK,QAAQ;AACrE,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA,mBAAmB,EAAE,OAAO,KAAK;AAAA,YACjC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAKD,QAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK;AAC7C,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,OAAO,CAAC,OAAe,SAAqC;AAChE,UAAM,QAAQ,YAAY,OAAO,IAAI,KAAK,SAAS,IAAI,KAAK,KAAK,CAAC;AAClE,QAAI,UAAU,OAAW,QAAO;AAChC,aAAS,IAAI,KAAK,KAAK,GAAG,MAAM,MAAM;AACtC,UAAM,KAAK,KAAK;AAChB,WAAO,MAAM,SAAS;AAAA,EACxB;AACA,QAAM,KAAoB,CAAC;AAC3B,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,aAAa,oBAAI,IAA6C;AACpE,QAAM,OAAO,CAAC,OAAe,WAA2B;AACtD,KAAC,GAAG,KAAK,MAAM,oBAAI,IAAI,GAAG,IAAI,MAAM;AACpC,WAAO,GAAG,OAAO,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC;AAAA,EAC3C;AACA,UAAQ,QAAQ,CAAC,SAAS,UAAU;AAClC,eAAW,UAAU,QAAS,WAAU,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA,EACjE,CAAC;AACD,WAAS,QAAQ,CAAC,UAAU,WAAW;AACrC,eAAW,SAAS,SAAU,WAAU,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA,EACjE,CAAC;AACD,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,UAAU,KAAK,MAAM,OAAO,MAAM,QAAQ;AAChD,eAAW,QAAQ,MAAM,OAAO;AAC9B,UAAI,KAAK,UAAU,mBAAoB;AACvC,YAAM,QAAQ,KAAK,KAAK,OAAO,MAAM,QAAQ;AAC7C,YAAM,MAAM,KAAK,UAAU,YAAY,KAAK,SAAS,KAAK,IAAI,KAAK,OAAO,OAAO;AACjF,YAAM,OAAO,KAAK,QAAQ,MAAM;AAChC,UAAI,CAAC,WAAW,IAAI,GAAG,EAAG,YAAW,IAAI,KAAK,EAAE,MAAM,MAAM,MAAM,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK,EAAG,CAAC;AAAA,IAC7G;AAAA,EACF;AAKA,aAAW,CAAC,OAAO,IAAI,KAAK,cAAc,EAAE,GAAG;AAC7C,UAAM,QAAQ,CAAC,GAAG,MAAM,KAAK;AAC7B,UAAM,UAAU,YAAY,MAAM,IAAI,CAAC,UAAU,MAAM,KAAK,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC;AAChF,UAAM,OAAO,KAAK,IAAI,CAAC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,IAAI,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,EAAE;AAC5E,UAAM,WAAW,KAAK,KAAK,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,CAAC;AACvD,UAAM,YAAY,MAAM,KAAK;AAC7B,QAAI,aAAa,UAAa,cAAc,QAAW;AACrD,aAAO,KAAK,QAAQ,WAAW,iBAAiB,SAAS,SAAS,CAAC;AAAA,IACrE,OAAO;AACL,YAAM,KAAK,WAAW,IAAI,YAAY,EAAE;AACxC,UAAI,OAAO,OAAW,QAAO,KAAK,EAAE,MAAM,iBAAiB,SAAS,GAAG,GAAG,CAAC;AAAA,IAC7E;AAAA,EACF;AAIA,QAAM,UAAU,CAAC,OAA2B,UAA0B;AACpE,UAAM,IAAI,UAAU,SAAY,SAAY,MAAM,KAAK;AACvD,WAAO,MAAM,SAAY,QAAQ,KAAK,KAAK,CAAC,KAAK,MAAM,KAAK,EAAE,EAAE,CAAC;AAAA,EACnE;AACA,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,IAAI,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC9D,QAAI,MAAM,OAAW;AACrB,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,QAAQ,KAAK,UAAU,qBAAqB,kBAAkB,KAAK;AACzE,YAAM,SAAS,gBAAgB,GAAG,KAAK,EAAE,IAAI,CAAC,UAAU,QAAQ,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAC;AAClG,UAAI,OAAO,SAAS,QAAQ,YAAY,KAAK,OAAO,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,EAAG;AACnF,YAAM,OAAO,EAAE,SAAS,cAAc,SAAS,SAAS;AACxD,YAAM,OAAO,KAAK,QAAQ,MAAM;AAChC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,UAAU,KAAK,KAAK,KAAK,KAAK,KAAK,SAAS,EAAE,OAAO,KAAK,wBAAwB,IAAI,KAAK,EAAE,SAAS,IAAI;AAAA,QACnH,MAAM,MAAM;AAAA,QACZ,GAAI,SAAS,SAAY,CAAC,IAAI,EAAE,KAAK;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,YAAY,CAAC,UAA+B;AAChD,UAAM,OAAO,oBAAI,IAAY;AAC7B,UAAM,QAAQ,CAAC,GAAI,GAAG,KAAK,KAAK,CAAC,CAAE;AACnC,aAAS,OAAO,MAAM,IAAI,GAAG,SAAS,QAAW,OAAO,MAAM,IAAI,GAAG;AACnE,UAAI,KAAK,IAAI,IAAI,EAAG;AACpB,WAAK,IAAI,IAAI;AACb,YAAM,KAAK,GAAI,GAAG,IAAI,KAAK,CAAC,CAAE;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAIA,QAAM,eAAe,oBAAI,IAAY;AACrC,QAAM,QAAQ,CAAC,GAAG,UAAU;AAC1B,UAAM,QAAQ,UAAU,KAAK;AAC7B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,SAAS,gBAAgB,GAAG,eAAe,GAAG;AACvD,YAAM,QAAQ,iBAAiB,GAAG,KAAK;AACvC,UAAI,UAAU,UAAa,UAAU,SAAS,KAAK,IAAI,KAAK,EAAG;AAC/D,WAAK,IAAI,KAAK;AACd,YAAM,YAAY,MAAM,IAAI,KAAK,IAAI,YAAY,UAAU,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa;AAC5F,UAAI,cAAc,QAAW;AAC3B,eAAO;AAAA,UACL;AAAA,YACE;AAAA,YACA;AAAA,YACA,mBAAmB,KAAK,aAAa,SAAS;AAAA,YAC9C;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,SAAS,CAAC,GAAI,GAAG,KAAK,KAAK,CAAC,CAAE,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK;AAC5E,YAAM,OAAO,GAAG,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,IAAI,OAAO,KAAK,CAAC,CAAC;AAChF,UAAI,WAAW,UAAa,aAAa,IAAI,IAAI,EAAG;AACpD,mBAAa,IAAI,IAAI;AACrB,aAAO;AAAA,QACL;AAAA,UACE;AAAA,UACA;AAAA,UACA,mBAAmB,KAAK,8BAA8B,MAAM,MAAM,KAAK,EAAE;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAMD,QAAM,SAAS,CAAC,UAA2B,QAAQ,MAAM;AACzD,MAAI,GAAG,KAAK,CAAC,SAAS,UAAU,OAAO,KAAK,KAAK,CAAC,GAAG,OAAO,EAAE,KAAK,MAAM,CAAC,GAAG;AAC3E,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,QAAQ,CAAC,UAAoC;AACjD,UAAI,UAAU,OAAW;AACzB,YAAM,IAAI,MAAM,KAAK;AACrB,UAAI,MAAM,OAAW,QAAO,IAAI,KAAK,EAAE,EAAE,CAAC;AAAA,IAC5C;AACA,OAAG,QAAQ,CAAC,SAAS,UAAU;AAC7B,YAAM,KAAK;AACX,iBAAW,UAAU,QAAS,OAAM,MAAM;AAAA,IAC5C,CAAC;AACD,YAAQ,QAAQ,CAAC,QAAQ,UAAU;AACjC,UAAI,OAAO,OAAO,EAAG,OAAM,KAAK;AAChC,iBAAW,SAAS,OAAQ,OAAM,KAAK;AAAA,IACzC,CAAC;AACD,eAAW,SAAS,IAAI,QAAQ;AAC9B,iBAAW,QAAQ,MAAM,OAAO;AAC9B,YAAI,KAAK,UAAU,mBAAoB;AACvC,cAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,CAAC;AAC9C,cAAM,YAAY,KAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,MAC/C;AAAA,IACF;AACA,eAAW,KAAK,OAAO;AACrB,UAAI,EAAE,OAAO,QAAQ,UAAa,CAAC,OAAO,IAAI,KAAK,EAAE,EAAE,CAAC,GAAG;AACzD,eAAO,KAAK,QAAQ,GAAG,eAAe,qEAAqE,CAAC;AAAA,MAC9G;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,oBAAI,IAA6B;AACnD,aAAW,WAAW,IAAI,YAAY,CAAC,GAAG;AACxC,UAAM,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,CAAC;AAC9C,QAAI,SAAS,OAAW,WAAU,IAAI,KAAK,QAAQ,KAAK,GAAG,CAAC,OAAO,CAAC;AAAA,QAC/D,MAAK,KAAK,OAAO;AAAA,EACxB;AACA,aAAW,CAAC,KAAK,IAAI,KAAK,WAAW;AACnC,QAAI,QAAQ,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,EAAG;AACzD,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,EAAE;AACnD,UAAM,QAAQ,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,YAAY,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,QAAQ,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AACtG,QAAI,QAAQ,YAAY,UAAU,OAAW;AAC7C,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,cAAc,MAAM,KAAK,WAAW,OAAO,KAAK,CAAC;AAAA,MAC1D,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,IACzD,CAAC;AAAA,EACH;AAEA,QAAM,WAA0B,CAAC;AACjC,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAI,UAAU,MAAO;AACrB,aAAS,KAAK;AAAA,MACZ,MAAM,MAAM;AAAA,MACZ,QAAQ,OAAO,MAAM,IAAI;AAAA,MACzB,UAAU;AAAA,MACV,SAAS,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,SAAS,SAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;AAAA,MACvD,GAAI,MAAM,OAAO,SAAY,CAAC,IAAI,EAAE,IAAI,MAAM,GAAG;AAAA,MACjD,GAAI,MAAM,UAAU,SAAY,CAAC,IAAI,EAAE,OAAO,MAAM,MAAM;AAAA,IAC5D,CAAC;AAAA,EACH;AACA,SAAO,SAAS,KAAK,eAAe;AACtC;AAEA,SAAS,gBAAgB,GAAS,OAAiC;AACjE,QAAM,QAAQ,EAAE,OAAO,KAAK;AAC5B,MAAI,UAAU,OAAW,QAAO,CAAC;AACjC,SAAO,OAAO,UAAU,WAAW,CAAC,KAAK,IAAI;AAC/C;AAOA,SAAS,cAAc,SAAuD;AAC5E,QAAM,SAA+B,CAAC;AACtC,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS;AACnD,UAAM,OAAiB,CAAC,KAAK;AAC7B,UAAM,SAAS,oBAAI,IAAY,CAAC,KAAK,CAAC;AACtC,UAAM,OAAO,CAAC,SAAuB;AACnC,iBAAW,QAAQ,QAAQ,IAAI,KAAK,CAAC,GAAG;AACtC,YAAI,SAAS,OAAO;AAClB,iBAAO,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAAA,QAChC,WAAW,OAAO,SAAS,CAAC,OAAO,IAAI,IAAI,GAAG;AAC5C,eAAK,KAAK,IAAI;AACd,iBAAO,IAAI,IAAI;AACf,eAAK,IAAI;AACT,eAAK,IAAI;AACT,iBAAO,OAAO,IAAI;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,SAAK,KAAK;AAAA,EACZ;AACA,SAAO;AACT;AAEA,SAAS,YAAY,GAAW,GAAmB;AACjD,SAAO,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAClC;AAEA,SAAS,gBAAgB,GAAgB,GAAwB;AAC/D,SACE,YAAY,EAAE,MAAM,EAAE,IAAI,MACzB,EAAE,QAAQ,MAAM,EAAE,QAAQ,MAC3B,YAAY,EAAE,QAAQ,EAAE,MAAM,KAC9B,YAAY,EAAE,SAAS,EAAE,OAAO;AAEpC;;;AC9nBO,IAAM,kBAAkB,CAAC,UAAU,QAAQ,UAAU,SAAS,OAAO;AAIrE,IAAM,kBAAkB;AAsB/B,IAAM,iBAAiB;AAEvB,SAAS,aAAa,SAAkC;AACtD,QAAM,UAAU,QAAQ,OAAO,WAAW,GAAG,cAAc,GAAG,IAC1D,QAAQ,OAAO,MAAM,eAAe,SAAS,CAAC,IAC9C,QAAQ;AACZ,QAAM,EAAE,MAAM,IAAI;AAClB,QAAM,UAAU,CAAC,QAAQ,MAAM,IAAI,SAAS,IAAI,QAAQ,QAAQ,QAAQ,gBAAgB,EAAE,CAAC,EAAE,KAAK,IAAQ;AAC1G,QAAM,QAAoB;AAAA,IACxB,QAAQ;AAAA,IACR,cAAc,UAAU,SAAY,KAAK,IAAI,KAAK;AAAA,IAClD,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA,UAAU,QAAQ;AAAA,EACpB;AACA,MAAI,QAAQ,SAAS,OAAW,OAAM,OAAO,QAAQ;AACrD,SAAO;AACT;AAMO,SAAS,UACd,KACA,UACuE;AACvE,QAAM,SAAS,oBAAI,IAA6B;AAChD,QAAM,SAAS,oBAAI,IAA0B;AAC7C,aAAW,QAAQ,IAAI,OAAO;AAC5B,QAAI,CAAC,OAAO,IAAI,KAAK,SAAS,IAAI,EAAG,QAAO,IAAI,KAAK,SAAS,MAAM,CAAC,CAAC;AAAA,EACxE;AACA,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,aAAa,OAAO;AAClC,WAAO,IAAI,OAAO,OAAO;AACzB,UAAM,OAAO,OAAO,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC1C,SAAK,KAAK,KAAK;AACf,WAAO,IAAI,QAAQ,MAAM,IAAI;AAAA,EAC/B;AACA,QAAM,UAAU,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,SAA2B;AACxE,UAAM,SAAS,OAAO,IAAI,IAAI,KAAK,CAAC;AACpC,WAAO,EAAE,MAAM,QAAQ,QAAQ,IAAI,CAAC,OAAO,KAAK,eAAe,GAAG,SAAS,CAAC,cAAc,GAAG,OAAO;AAAA,EACtG,CAAC;AACD,SAAO,EAAE,SAAS,OAAO;AAC3B;AAGO,SAAS,UAAU,SAAsC,UAAwC;AACtG,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE;AAC5C,QAAM,QAAQ,CAAC,SACb,QAAQ,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,OAAO,IAAI,EAAE,QAAQ,CAAC;AAC9D,QAAM,WAAW,MAAM,CAAC,MAAM,EAAE,aAAa,SAAS;AACtD,QAAM,UAAU,MAAM,CAAC,MAAM,EAAE,aAAa,QAAQ;AACpD,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ,SAAS;AAAA,IACzB;AAAA,IACA,QAAQ,MAAM,eAAe;AAAA,IAC7B,GAAI,WAAW,IAAI,EAAE,SAAS,IAAI,CAAC;AAAA,IACnC,GAAI,UAAU,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACjC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACjC;AACF;AAGO,SAAS,iBACd,SACA,QACe;AACf,QAAM,OAAsB,CAAC;AAC7B,aAAW,UAAU,SAAS;AAC5B,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,UAAU,OAAO,IAAI,KAAK;AAChC,UAAI,YAAY,OAAW,MAAK,KAAK,OAAO;AAAA,IAC9C;AAAA,EACF;AACA,SAAO,KAAK,KAAKA,gBAAe;AAClC;AAEA,SAASA,iBAAgB,GAAgB,GAAwB;AAC/D,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,OAAO,EAAE,OAAO,KAAK;AACrD,QAAM,QAAQ,EAAE,QAAQ;AACxB,QAAM,QAAQ,EAAE,QAAQ;AACxB,MAAI,UAAU,MAAO,QAAO,QAAQ;AACpC,MAAI,EAAE,WAAW,EAAE,OAAQ,QAAO,EAAE,SAAS,EAAE,SAAS,KAAK;AAC7D,SAAO,EAAE,UAAU,EAAE,UAAU,KAAK,EAAE,UAAU,EAAE,UAAU,IAAI;AAClE;;;AHnHA,eAAsB,SAAS,MAAyC;AACtE,QAAM,EAAE,KAAK,KAAK,IAAI,IAAI,MAAM,UAAU,IAAI;AAC9C,QAAM,SAAS,IAAI;AACnB,QAAM,WAAW,aAAa,KAAK;AAAA,IACjC,GAAI,QAAQ,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS;AAAA,IACtE,GAAI,QAAQ,sBAAsB,SAAY,CAAC,IAAI,EAAE,mBAAmB,OAAO,kBAAkB;AAAA,IACjG,GAAI,QAAQ,MAAM,OAAO,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,OAAO,KAAK,MAAM,SAAS;AAAA,EAChG,CAAC;AACD,QAAM,EAAE,SAAS,OAAO,IAAI,UAAU,KAAK,QAAQ;AAGnD,QAAM,QAAQ,EAAE,KAAK,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,KAAK;AACnE,MAAI,UAAU;AAAA,IACZ,KAAK,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IAC/C,QAAQ;AAAA,IACR,IAAI;AAAA,IACJ;AAAA,IACA,EAAE,SAAS,2BAA2B;AAAA,EACxC;AACA,MAAI,YAAY,QAAQ,CAAC,WAAW,QAAQ,OAAO,GAAG;AACpD,QAAI,KAAK,aAAa,MAAM;AAC1B,YAAM,IAAI;AAAA,QACR,aAAa,QAAQ,KAAK;AAAA,MAC5B;AAAA,IACF;AACA,cAAU,EAAE,GAAG,SAAS,OAAO,KAAK;AAAA,EACtC;AACA,QAAM,EAAE,SAAS,UAAU,SAAS,IAAI,MAAM,eAAe,SAAS,SAAS,KAAK;AAEpF,SAAO;AAAA,IACL,UAAU,iBAAiB,UAAU,MAAM;AAAA,IAC3C,SAAS;AAAA,IACT,SAAS,UAAU,UAAU,QAAQ;AAAA,IACrC;AAAA,IACA,OAAO,IAAI,MAAM;AAAA,IACjB,YAAY,IAAI,WAAW;AAAA,IAC3B,GAAI,aAAa,SAAY,CAAC,IAAI,EAAE,SAAS;AAAA,IAC7C,OAAO,SAAS;AAAA,IAChB;AAAA,EACF;AACF;","names":["compareFindings"]}