@vibgrate/cli 2026.722.2 → 2026.727.2
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.
- package/DOCS.md +418 -213
- package/README.md +34 -8
- package/dist/baseline-TG4ATZGZ.js +8 -0
- package/dist/{baseline-BD3A7EXD.js.map → baseline-TG4ATZGZ.js.map} +1 -1
- package/dist/chunk-2MBL43EJ.js +82 -0
- package/dist/chunk-2MBL43EJ.js.map +1 -0
- package/dist/chunk-2XQDMLKB.js +465 -0
- package/dist/chunk-2XQDMLKB.js.map +1 -0
- package/dist/{chunk-PY3DNX5H.js → chunk-3Q7QBWFW.js} +13 -2
- package/dist/chunk-3Q7QBWFW.js.map +1 -0
- package/dist/chunk-3V24O47U.js +478 -0
- package/dist/chunk-3V24O47U.js.map +1 -0
- package/dist/chunk-5I4VSBWQ.js +764 -0
- package/dist/chunk-5I4VSBWQ.js.map +1 -0
- package/dist/{chunk-WNIIKCNF.js → chunk-6ABXHZRN.js} +59 -311
- package/dist/chunk-6ABXHZRN.js.map +1 -0
- package/dist/chunk-6AYDFFP5.js +136 -0
- package/dist/chunk-6AYDFFP5.js.map +1 -0
- package/dist/chunk-6UQMXIAG.js +122 -0
- package/dist/chunk-6UQMXIAG.js.map +1 -0
- package/dist/chunk-7N4Y3E47.js +108 -0
- package/dist/chunk-7N4Y3E47.js.map +1 -0
- package/dist/chunk-BPF3YX2U.js +64 -0
- package/dist/chunk-BPF3YX2U.js.map +1 -0
- package/dist/chunk-BWPBB45M.js +88 -0
- package/dist/chunk-BWPBB45M.js.map +1 -0
- package/dist/{chunk-6CXTPC74.js → chunk-CY4WKXB2.js} +27 -6
- package/dist/chunk-CY4WKXB2.js.map +1 -0
- package/dist/chunk-DGUM43GV.js +10 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/{chunk-NONYJLOJ.js → chunk-EX4PQT6W.js} +3 -3
- package/dist/{chunk-NONYJLOJ.js.map → chunk-EX4PQT6W.js.map} +1 -1
- package/dist/chunk-IS7VTH2Q.js +627 -0
- package/dist/chunk-IS7VTH2Q.js.map +1 -0
- package/dist/chunk-IZDH67DX.js +289 -0
- package/dist/chunk-IZDH67DX.js.map +1 -0
- package/dist/chunk-J4RFRKZH.js +2496 -0
- package/dist/chunk-J4RFRKZH.js.map +1 -0
- package/dist/chunk-J7LKEB2R.js +51 -0
- package/dist/chunk-J7LKEB2R.js.map +1 -0
- package/dist/chunk-JIBOJTGS.js +313 -0
- package/dist/chunk-JIBOJTGS.js.map +1 -0
- package/dist/chunk-K3MZIVZW.js +88 -0
- package/dist/chunk-K3MZIVZW.js.map +1 -0
- package/dist/chunk-K7REHDQS.js +776 -0
- package/dist/chunk-K7REHDQS.js.map +1 -0
- package/dist/{chunk-2O5YZVZV.js → chunk-KCKYKDMS.js} +23 -19
- package/dist/chunk-KCKYKDMS.js.map +1 -0
- package/dist/{chunk-3MXNNBLI.js → chunk-KNELIQJO.js} +1647 -2042
- package/dist/chunk-KNELIQJO.js.map +1 -0
- package/dist/chunk-KSBHGWRV.js +613 -0
- package/dist/chunk-KSBHGWRV.js.map +1 -0
- package/dist/chunk-LKVMI67M.js +1695 -0
- package/dist/chunk-LKVMI67M.js.map +1 -0
- package/dist/chunk-NDMDSPFX.js +69 -0
- package/dist/chunk-NDMDSPFX.js.map +1 -0
- package/dist/{chunk-CS37OBE3.js → chunk-OFUC6RYN.js} +791 -783
- package/dist/chunk-OFUC6RYN.js.map +1 -0
- package/dist/chunk-OOIG3RUM.js +276 -0
- package/dist/chunk-OOIG3RUM.js.map +1 -0
- package/dist/chunk-PMYWZRRS.js +62 -0
- package/dist/chunk-PMYWZRRS.js.map +1 -0
- package/dist/chunk-PXHNTC6D.js +382 -0
- package/dist/chunk-PXHNTC6D.js.map +1 -0
- package/dist/{chunk-I7GY7MVN.js → chunk-RNP3SMTV.js} +60 -12
- package/dist/chunk-RNP3SMTV.js.map +1 -0
- package/dist/chunk-TCDAZZNP.js +843 -0
- package/dist/chunk-TCDAZZNP.js.map +1 -0
- package/dist/{chunk-5BDHQ7DD.js → chunk-WGUL45AV.js} +24 -17
- package/dist/chunk-WGUL45AV.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +3373 -617
- package/dist/cli.js.map +1 -1
- package/dist/execution-env-ZU45JZ4G.js +4 -0
- package/dist/execution-env-ZU45JZ4G.js.map +1 -0
- package/dist/federation-SZWZIFZ7.js +7 -0
- package/dist/federation-SZWZIFZ7.js.map +1 -0
- package/dist/{fs-IPY4FJKH.js → fs-B5HZ2MIU.js} +3 -2
- package/dist/fs-B5HZ2MIU.js.map +1 -0
- package/dist/{fs-KCABDURV.js → fs-O5IQYXHO.js} +3 -2
- package/dist/fs-O5IQYXHO.js.map +1 -0
- package/dist/git-ref-XDXB6JP5.js +4 -0
- package/dist/git-ref-XDXB6JP5.js.map +1 -0
- package/dist/graph-backend-73URGTFY.js +11 -0
- package/dist/graph-backend-73URGTFY.js.map +1 -0
- package/dist/index.d.ts +472 -137
- package/dist/index.js +15 -7
- package/dist/index.js.map +1 -1
- package/dist/{interactive-A4DISSIW.js → interactive-372NLI5C.js} +186 -226
- package/dist/interactive-372NLI5C.js.map +1 -0
- package/dist/llm-host-7GWDO6IX.js +9 -0
- package/dist/llm-host-7GWDO6IX.js.map +1 -0
- package/dist/load-I333TGNI.js +8 -0
- package/dist/load-I333TGNI.js.map +1 -0
- package/dist/local-runtime-5O2NN3GA.js +5 -0
- package/dist/local-runtime-5O2NN3GA.js.map +1 -0
- package/dist/mcp-tools-I7JK3S2M.js +4 -0
- package/dist/{mcp-tools-I6PME3AV.js.map → mcp-tools-I7JK3S2M.js.map} +1 -1
- package/dist/model-execution-profile-TFBKCNJG.js +4 -0
- package/dist/model-execution-profile-TFBKCNJG.js.map +1 -0
- package/dist/model-orchestrator-TVONAUPS.js +9 -0
- package/dist/model-orchestrator-TVONAUPS.js.map +1 -0
- package/dist/parse-worker.d.ts +1 -1
- package/dist/parse-worker.js +2 -1
- package/dist/parse-worker.js.map +1 -1
- package/dist/paths-2RAH3GME.js +6 -0
- package/dist/paths-2RAH3GME.js.map +1 -0
- package/dist/resolve-gguf-VPL4YQ6J.js +8 -0
- package/dist/resolve-gguf-VPL4YQ6J.js.map +1 -0
- package/dist/runtime-session-JRKCQUHY.js +18 -0
- package/dist/runtime-session-JRKCQUHY.js.map +1 -0
- package/dist/session-ITPYQ5XI.js +11 -0
- package/dist/{session-POJUDFPH.js.map → session-ITPYQ5XI.js.map} +1 -1
- package/dist/session-store-WFBX7HXL.js +4 -0
- package/dist/{session-store-W5RZZHA3.js.map → session-store-WFBX7HXL.js.map} +1 -1
- package/dist/{stream-json-Q2JGWPHB.js → stream-json-SLMDKLXP.js} +17 -6
- package/dist/stream-json-SLMDKLXP.js.map +1 -0
- package/dist/{types-Jl6RJ175.d.ts → types-7AHBUbFm.d.ts} +8 -2
- package/dist/ui-Q6DJ3GCU.js +5 -0
- package/dist/ui-Q6DJ3GCU.js.map +1 -0
- package/dist/vgd-7JV5KCNJ.js +17 -0
- package/dist/vgd-7JV5KCNJ.js.map +1 -0
- package/package.json +9 -6
- package/dist/baseline-BD3A7EXD.js +0 -7
- package/dist/chunk-2O5YZVZV.js.map +0 -1
- package/dist/chunk-3MXNNBLI.js.map +0 -1
- package/dist/chunk-5BDHQ7DD.js.map +0 -1
- package/dist/chunk-6CXTPC74.js.map +0 -1
- package/dist/chunk-CS37OBE3.js.map +0 -1
- package/dist/chunk-GGJZA3Q6.js +0 -961
- package/dist/chunk-GGJZA3Q6.js.map +0 -1
- package/dist/chunk-I7GY7MVN.js.map +0 -1
- package/dist/chunk-JBXNQCGE.js +0 -484
- package/dist/chunk-JBXNQCGE.js.map +0 -1
- package/dist/chunk-PY3DNX5H.js.map +0 -1
- package/dist/chunk-WNIIKCNF.js.map +0 -1
- package/dist/fs-IPY4FJKH.js.map +0 -1
- package/dist/fs-KCABDURV.js.map +0 -1
- package/dist/interactive-A4DISSIW.js.map +0 -1
- package/dist/mcp-tools-I6PME3AV.js +0 -3
- package/dist/session-POJUDFPH.js +0 -6
- package/dist/session-store-W5RZZHA3.js +0 -3
- package/dist/stream-json-Q2JGWPHB.js.map +0 -1
- package/dist/ui-HOVOPWMX.js +0 -4
- package/dist/ui-HOVOPWMX.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/languages.ts","../src/engine/grammars.ts","../src/engine/queries.ts","../src/engine/sfc.ts","../src/engine/parse.ts"],"names":["require","ranges"],"mappings":";;;;;;;;;AAsBO,IAAM,SAAA,GAA2B;AAAA,EACtC;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAM,CAAA;AAAA,IAClC,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAA,EAAO,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAAA,IAC1C,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,IAC1B,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,CAAC,OAAO,CAAA;AAAA,IACpB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,MAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAA,EAAI,IAAA;AAAA,IACJ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,WAAA,EAAa;AAAA,GACf;AAAA,EACA,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,iBAAA,EAAkB;AAAA,EAChF,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,WAAA,EAAa,oBAAA,EAAqB;AAAA,EAChG,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,YAAY,CAAC,QAAQ,CAAA,EAAG,WAAA,EAAa,mBAAA,EAAoB;AAAA,EACxF,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAC,QAAA,EAAU,KAAK,CAAA,EAAG,WAAA,EAAa,mBAAA,EAAoB;AAAA,EAC/F,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,YAAY,CAAC,OAAO,CAAA,EAAG,WAAA,EAAa,kBAAA,EAAmB;AAAA,EACpF,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,iBAAA,EAAkB;AAAA,EAChF,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,WAAA,EAAa,oBAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK5F,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAC,KAAA,EAAO,OAAO,CAAA,EAAG,WAAA,EAAa,kBAAA,EAAmB;AAAA,EAC1F,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,iBAAA,EAAkB;AAAA,EAChF,EAAE,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,GAAA,EAAK,YAAY,CAAC,IAAI,CAAA,EAAG,WAAA,EAAa,eAAA,EAAgB;AAAA;AAAA;AAAA,EAGxE;AAAA,IACE,EAAA,EAAI,KAAA;AAAA,IACJ,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,CAAC,MAAA,EAAQ,KAAA,EAAO,QAAQ,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,IAC/D,WAAA,EAAa;AAAA,GACf;AAAA;AAAA;AAAA,EAGA,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,UAAA,EAAY,CAAC,IAAA,EAAM,KAAK,CAAA,EAAG,WAAA,EAAa,kBAAA,EAAmB;AAAA;AAAA,EAE/F,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,WAAA,EAAa,mBAAA,EAAoB;AAAA,EAC7F,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,sBAAA,EAAuB;AAAA,EAC/F,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,sBAAA,EAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/F,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,wBAAA,EAAyB;AAAA,EACvF,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,YAAY,CAAC,SAAS,CAAA,EAAG,WAAA,EAAa,wBAAA,EAAyB;AAAA,EAChG,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,YAAY,CAAC,QAAQ,CAAA,EAAG,WAAA,EAAa,wBAAA,EAAyB;AAAA,EAC7F,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,CAAC,OAAA,EAAS,MAAM,CAAA,EAAG,WAAA,EAAa,wBAAA,EAAyB;AAAA,EAClG,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,kBAAA,EAAmB;AAAA,EACjF,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,YAAY,CAAC,MAAM,CAAA,EAAG,WAAA,EAAa,wBAAA;AAChE;AAEA,IAAM,WAAA,uBAAkB,GAAA,EAAyB;AACjD,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,EAAA,KAAA,MAAW,OAAO,IAAA,CAAK,UAAA,EAAY,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AAC9D;AAEA,IAAM,UAAA,GAAa,IAAI,GAAA,CAAyB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAC,CAAC,CAAA;AAExE,SAAS,iBAAiB,GAAA,EAAsC;AACrE,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAA;AAC1C;AAEO,SAAS,SAAS,EAAA,EAAqC;AAC5D,EAAA,OAAO,UAAA,CAAW,IAAI,EAAE,CAAA;AAC1B;AAEO,SAAS,cAAA,GAA2B;AACzC,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAClC;ACvHA,IAAMA,QAAAA,GAAU,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAE7C,IAAI,UAAA,GAAmC,IAAA;AACvC,IAAM,aAAA,uBAAoB,GAAA,EAAsB;AAIhD,IAAI,gBAAA;AACG,SAAS,oBAAoB,GAAA,EAAoB;AACtD,EAAA,gBAAA,GAAmB,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA;AAC/C;AAEA,SAAS,OAAA,GAAkB;AACzB,EAAA,OAAY,IAAA,CAAA,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AACpD;AAEA,IAAI,wBAAA,GAA0C,IAAA;AAC9C,SAAS,qBAAA,GAAgC;AACvC,EAAA,IAAI,0BAA0B,OAAO,wBAAA;AACrC,EAAA,MAAM,OAAA,GAAUA,QAAAA,CAAQ,OAAA,CAAQ,gCAAgC,CAAA;AAChE,EAAA,wBAAA,GAAgC,IAAA,CAAA,IAAA,CAAU,IAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,EAAG,KAAK,CAAA;AACjE,EAAA,OAAO,wBAAA;AACT;AAQO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAUA,QAAAA,CAAQ,OAAA,CAAQ,gCAAgC,CAAA;AAChE,IAAA,MAAM,EAAE,SAAQ,GAAI,IAAA,CAAK,MAAS,EAAA,CAAA,YAAA,CAAa,OAAA,EAAS,MAAM,CAAC,CAAA;AAC/D,IAAA,OAAO,qBAAqB,OAAO,CAAA,qBAAA,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,gDAAA;AAAA,EACT;AACF;AASA,SAAS,WAAA,GAAwB;AAC/B,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,IAAI,gBAAA,EAAkB,IAAA,CAAK,IAAA,CAAK,gBAAgB,CAAA;AAEhD,EAAA,IAAA,CAAK,KAAU,IAAA,CAAA,IAAA,CAAK,OAAA,EAAQ,EAAG,IAAA,EAAM,UAAU,CAAC,CAAA;AAChD,EAAA,IAAA,CAAK,IAAA,CAAU,IAAA,CAAA,IAAA,CAAK,OAAA,EAAQ,EAAG,UAAU,CAAC,CAAA;AAE1C,EAAA,IAAA,CAAK,KAAU,IAAA,CAAA,IAAA,CAAK,OAAA,EAAQ,EAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC9C,EAAA,IAAA,CAAK,KAAU,IAAA,CAAA,IAAA,CAAK,OAAA,IAAW,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAC,CAAA;AAEpD,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,IAAA,CAAK,uBAAuB,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,eAAA,GAAkB,CAAC,GAAA,KAA8B,IAAA,CAAA,QAAA,CAAS,GAAG,CAAA,KAAM,QAAA;AAOlE,SAAS,iBAAA,GAAmC;AACjD,EAAA,KAAA,MAAW,GAAA,IAAO,aAAY,EAAG;AAC/B,IAAA,IAAI,eAAA,CAAgB,GAAG,CAAA,EAAG;AAC1B,IAAA,IAAO,EAAA,CAAA,UAAA,CAAW,GAAG,CAAA,IAAQ,EAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,GAAG,OAAO,GAAA;AAAA,EACzF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAmB,WAAA,EAA6B;AACvD,EAAA,MAAM,QAAA,GAAW,GAAG,WAAW,CAAA,KAAA,CAAA;AAC/B,EAAA,KAAA,MAAW,GAAA,IAAO,aAAY,EAAG;AAC/B,IAAA,MAAM,SAAA,GAAiB,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AACzC,IAAA,IAAO,EAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,SAAA;AAAA,EACvC;AACA,EAAA,MAAM,IAAI,KAAA;AAAA,IACR,YAAY,QAAQ,CAAA,wBAAA,EAA2B,aAAY,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,uEAAA;AAAA,GAEzE;AACF;AAQO,SAAS,oBAAA,GAAgE;AAC9E,EAAA,OAAO,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC3B,QAAA,EAAU,CAAA,EAAG,CAAA,CAAE,WAAW,CAAA,KAAA,CAAA;AAAA,IAC1B,OAAA,EAAS,kBAAA,CAAmB,CAAA,CAAE,WAAW;AAAA,GAC3C,CAAE,CAAA;AACJ;AAEA,eAAe,gBAAA,GAAkC;AAC/C,EAAA,IAAI,CAAC,UAAA,EAAY,UAAA,GAAa,MAAA,CAAO,IAAA,EAAK;AAC1C,EAAA,MAAM,UAAA;AACR;AAGA,eAAsB,aAAa,MAAA,EAAmC;AACpE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AACvC,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,MAAM,GAAA,GAAM,SAAS,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,MAAM,CAAA,CAAA,CAAG,CAAA;AAC3D,EAAA,MAAM,gBAAA,EAAiB;AACvB,EAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,GAAA,CAAI,WAAW,CAAA;AACnD,EAAA,MAAM,WAAW,MAAM,QAAA,CAAS,IAAA,CAAQ,EAAA,CAAA,YAAA,CAAa,QAAQ,CAAC,CAAA;AAC9D,EAAA,aAAA,CAAc,GAAA,CAAI,QAAQ,QAAQ,CAAA;AAClC,EAAA,OAAO,QAAA;AACT;AAGA,eAAsB,UAAU,GAAA,EAAmC;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,EAAO;AAC1B,EAAA,MAAA,CAAO,YAAY,QAAQ,CAAA;AAC3B,EAAA,OAAO,MAAA;AACT;;;ACnGA,IAAM,YAAA,GAAe;AAAA,EACnB;AACF,CAAA;AAEA,IAAM,WAAA,GAAc;AAAA,EAClB,kDAAA;AAAA,EACA,yFAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,aAAA,GAAgB;AAAA,EACpB,6CAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,UAAA,GAA0B;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClF;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,4DAAA,EAA6D;AAAA,IACtF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,wDAAA,EAAyD;AAAA,IACjF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,iEAAA,EAAkE;AAAA,IAC1F,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,4DAAA;AAA6D,GAC3F;AAAA,EACA,KAAA,EAAO,WAAA;AAAA,EACP,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU;AAAA,IACR,gEAAA;AAAA,IACA,uGAAA;AAAA,IACA,oEAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,UAAA,GAA0B;AAAA,EAC9B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClF;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA,IACA;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,4DAAA,EAA6D;AAAA,IACtF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mDAAA;AAAoD,GAC9E;AAAA,EACA,KAAA,EAAO,WAAA;AAAA,EACP,OAAA,EAAS,aAAA;AAAA,EACT,QAAA,EAAU;AAAA,IACR,wCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,MAAA,GAAsB;AAAA,EAC1B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACjF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA;AAAmD,GAC7E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,uCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,gDAAA;AAAA,IACA,4DAAA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,GACF;AAAA,EACA,QAAA,EAAU,CAAC,wEAAwE,CAAA;AAAA,EACnF,MAAA,EAAQ,CAAC,2BAA2B;AACtC,CAAA;AAEA,IAAM,EAAA,GAAkB;AAAA,EACtB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,0DAAA,EAA2D;AAAA,IACpF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mEAAA;AAAoE,GAC9F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,0DAA0D,CAAA;AAAA,EACpE,UAAU;AACZ,CAAA;AAEA,IAAM,IAAA,GAAoB;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,oDAAA,EAAqD;AAAA,IAC9E,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,yDAAA,EAA0D;AAAA,IACnF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mDAAA,EAAoD;AAAA,IAC5E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,uDAAA;AAAwD,GACtF;AAAA,EACA,KAAA,EAAO,CAAC,gDAAA,EAAkD,8DAA8D,CAAA;AAAA,EACxH,OAAA,EAAS,CAAC,kDAAkD,CAAA;AAAA,EAC5D,QAAA,EAAU;AAAA,IACR,yCAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,EAAU;AAAA,IACR,+GAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA,EAAY,CAAC,sDAAA,EAAwD,+CAA+C;AACtH,CAAA;AAEA,IAAM,IAAA,GAAoB;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,+CAAA,EAAgD;AAAA,IAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,gDAAA,EAAiD;AAAA,IACzE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,iDAAA;AAAkD,GAChF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA,kFAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,+CAA+C,CAAA;AAAA,EACzD,UAAU;AACZ,CAAA;AAEA,IAAM,OAAA,GAAuB;AAAA,EAC3B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,oDAAA,EAAqD;AAAA,IAC9E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mDAAA,EAAoD;AAAA,IAC5E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,uDAAA,EAAwD;AAAA,IACpF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,oDAAA,EAAqD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM7E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,oDAAA;AAAqD,GAC/E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,yFAAA;AAAA,IACA,wDAAA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,4CAAA,EAA8C,wCAAwC,CAAA;AAAA,EAChG,QAAA,EAAU,CAAC,mCAAmC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM9C,QAAA,EAAU;AAAA,IACR,oFAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,UAAA,EAAY;AAAA,IACV,0EAAA;AAAA,IACA;AAAA;AAEJ,CAAA;AAEA,IAAM,IAAA,GAAoB;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,wCAAA,EAAyC;AAAA,IAClE,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,qCAAA,EAAsC;AAAA,IAC9D,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,sCAAA;AAAuC,GAClE;AAAA,EACA,KAAA,EAAO,CAAC,qCAAA,EAAuC,wCAAwC,CAAA;AAAA,EACvF,OAAA,EAAS;AAAA,IACP;AAAA,GACF;AAAA,EACA,QAAA,EAAU,CAAC,0CAA0C;AACvD,CAAA;AAGA,IAAM,GAAA,GAAmB;AAAA,EACvB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,+CAAA,EAAgD;AAAA,IAC3E;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,8CAAA,EAA+C;AAAA,IACxE,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,6CAAA,EAA8C;AAAA,IACtE,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,6CAAA,EAA8C;AAAA,IACtE,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,iDAAA;AAAkD,GAChF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,qDAAA;AAAA,IACA,+CAAA;AAAA,IACA,wDAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,iDAAA;AAAA,IACA,uCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU,CAAC,+BAAA,EAAiC,6CAA6C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzF,UAAA,EAAY,CAAC,0DAA0D,CAAA;AAAA,EACvE,QAAA,EAAU;AAAA,IACR,uDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,CAAC,4EAA4E;AACvF,CAAA;AAKA,IAAM,MAAA,GAAsB;AAAA,EAC1B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,uDAAA,EAAwD;AAAA,IACnF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,0DAAA,EAA2D;AAAA,IACnF,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,8DAAA,EAA+D;AAAA,IAC3F,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mDAAA;AAAoD,GAC9E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,+CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,sCAAsC,CAAA;AAAA;AAAA;AAAA,EAGhD,UAAA,EAAY,CAAC,0CAA0C,CAAA;AAAA,EACvD,QAAA,EAAU;AAAA,IACR,0DAAA;AAAA,IACA,sFAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,wFAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,CAAC,2FAA2F;AACtG,CAAA;AAIA,IAAM,KAAA,GAAqB;AAAA,EACzB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,6DAAA,EAA8D;AAAA,IACzF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,sEAAA,EAAuE;AAAA,IAChG,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,wDAAA,EAAyD;AAAA,IACjF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,oEAAA,EAAqE;AAAA,IAC7F,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,2DAAA;AAA4D,GAC1F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,+CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,2CAA2C,CAAA;AAAA,EACrD,QAAA,EAAU,CAAC,+EAA+E,CAAA;AAAA;AAAA;AAAA;AAAA,EAI1F,QAAA,EAAU;AAAA,IACR,oDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN;AAAA;AAEJ,CAAA;AAEA,IAAM,KAAA,GAAqB;AAAA,EACzB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACjF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAChF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC3E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC/E,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,mDAAA;AAAoD,GAC/E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,wDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,mDAAA;AAAA,IACA,wEAAA;AAAA,IACA,yEAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA,EAGA,UAAA,EAAY,CAAC,wDAAwD,CAAA;AAAA,EACrE,QAAA,EAAU;AAAA,IACR,oDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,CAAC,+FAA+F;AAC1G,CAAA;AAIA,IAAM,IAAA,GAAoB;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,oDAAA,EAAqD;AAAA,IAChF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,uDAAA,EAAwD;AAAA,IACjF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC3E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,6CAAA;AAA8C,GACxE;AAAA,EACA,KAAA,EAAO;AAAA,IACL,uDAAA;AAAA,IACA,sGAAA;AAAA,IACA,oGAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,0EAA0E,CAAA;AAAA;AAAA;AAAA;AAAA,EAIpF,QAAA,EAAU;AAAA,IACR,+CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,yCAAA;AAAA,IACA,4CAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,CAAC,2BAA2B;AACtC,CAAA;AAEA,IAAM,GAAA,GAAmB;AAAA,EACvB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,+DAAA,EAAgE;AAAA,IAC3F,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,iFAAA,EAAkF;AAAA,IAC7G,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,kFAAA,EAAmF;AAAA,IAC5G,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,qEAAA,EAAsE;AAAA,IACjG;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA;AACJ,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,wDAAA;AAAA,IACA,yDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP;AAAA,GACF;AAAA,EACA,UAAU,EAAC;AAAA,EACX,MAAA,EAAQ,CAAC,+EAA+E;AAC1F,CAAA;AAMA,IAAM,MAAA,GAAsB;AAAA,EAC1B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,yFAAA,EAA0F;AAAA,IACnH;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA;AACJ,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,4GAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,UAAU;AACZ,CAAA;AAKA,IAAM,IAAA,GAAoB;AAAA,EACxB,MAAM,CAAC,EAAE,MAAM,UAAA,EAAY,KAAA,EAAO,iDAAiD,CAAA;AAAA,EACnF,KAAA,EAAO,CAAC,+CAA+C,CAAA;AAAA,EACvD,OAAA,EAAS;AAAA,IACP;AAAA,GACF;AAAA,EACA,UAAU;AACZ,CAAA;AAEA,IAAM,GAAA,GAAmB;AAAA,EACvB,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAClF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,qEAAA,EAAsE;AAAA,IAC9F,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,mEAAA,EAAoE;AAAA,IAC5F,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,oEAAA;AAAqE,GAC/F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,+FAA+F,CAAA;AAAA,EACzG,UAAU,EAAC;AAAA,EACX,MAAA,EAAQ,CAAC,oGAAoG;AAC/G,CAAA;AAGA,IAAM,MAAA,GAAsB;AAAA,EAC1B,IAAA,EAAM;AAAA,IACJ;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,sFAAA,EAAuF;AAAA,IAC/G,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,6EAAA,EAA8E;AAAA,IACtG,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,4DAAA;AAA6D,GACvF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,kDAAA,EAAoD,qDAAqD,CAAA;AAAA,EACnH,UAAU,EAAC;AAAA,EACX,MAAA,EAAQ,CAAC,8FAA8F;AACzG,CAAA;AAEA,IAAM,GAAA,GAAmB;AAAA,EACvB,IAAA,EAAM;AAAA,IACJ;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,mGAAA,EAAoG;AAAA,IAC7H;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA;AAAA,MACE,IAAA,EAAM,QAAA;AAAA,MACN,KAAA,EACE;AAAA,KACJ;AAAA,IACA,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,qFAAA,EAAsF;AAAA,IAC9G,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,sFAAA,EAAuF;AAAA,IAC/G,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,gEAAA;AAAiE,GAC5F;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA,kFAAA;AAAA,IACA,+EAAA;AAAA,IACA,4GAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,kDAAA,EAAoD,qDAAqD,CAAA;AAAA,EACnH,QAAA,EAAU;AAAA,IACR,gDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ,CAAC,8FAA8F;AACzG,CAAA;AAEA,IAAM,IAAA,GAAoB;AAAA,EACxB,IAAA,EAAM;AAAA,IACJ;AAAA,MACE,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACT;AAAA;AAAA;AAAA,IAGA,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,6CAAA,EAA8C;AAAA,IACvE,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,kDAAA,EAAmD;AAAA,IAC3E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,6CAAA,EAA8C;AAAA;AAAA;AAAA,IAG1E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,gDAAA;AAAiD,GAC/E;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,kDAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA,EAAU;AAAA,IACR,qDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,MAAA,EAAQ;AACV,CAAA;AAEA,IAAM,KAAA,GAAqB;AAAA,EACzB,IAAA,EAAM;AAAA;AAAA;AAAA,IAGJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,4DAAA,EAA6D;AAAA,IACxF,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,iDAAA;AAAkD,GAC7E;AAAA,EACA,KAAA,EAAO,CAAC,sEAAsE,CAAA;AAAA,EAC9E,OAAA,EAAS,CAAC,mDAAmD,CAAA;AAAA,EAC7D,UAAU;AACZ,CAAA;AAEA,IAAM,QAAA,GAAwB;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,uEAAA,EAAwE;AAAA,IACnG,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,uDAAA;AAAwD,GACnF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,wDAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,8CAA8C,CAAA;AAAA,EACxD,UAAU;AACZ,CAAA;AAEA,IAAM,QAAA,GAAwB;AAAA,EAC5B,IAAA,EAAM;AAAA,IACJ,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACjF,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,qDAAA,EAAsD;AAAA,IACjF,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,sDAAA,EAAuD;AAAA,IAC/E,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,qDAAA,EAAsD;AAAA,IAC9E,EAAE,IAAA,EAAM,WAAA,EAAa,KAAA,EAAO,uDAAA;AAAwD,GACtF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,kDAAA;AAAA,IACA,gFAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,OAAA,EAAS,CAAC,6CAA6C,CAAA;AAAA,EACvD,QAAA,EAAU,CAAC,6EAA6E,CAAA;AAAA,EACxF,MAAA,EAAQ;AAAA,IACN;AAAA;AAEJ,CAAA;AAEA,IAAM,OAAA,GAAuC;AAAA,EAC3C,EAAA,EAAI,UAAA;AAAA,EACJ,GAAA,EAAK,UAAA;AAAA,EACL,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,GAAA;AAAA,EACL,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK,GAAA;AAAA,EACL,EAAA,EAAI,MAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,GAAA;AAAA,EACL,CAAA,EAAG,MAAA;AAAA,EACH,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,QAAA,EAAU,QAAA;AAAA,EACV,QAAA,EAAU;AAAA;AAAA;AAGZ,CAAA;AAEO,SAAS,WAAW,MAAA,EAAyC;AAClE,EAAA,OAAO,QAAQ,MAAM,CAAA;AACvB;;;AC/mBA,IAAM,UAAA,GAA4D;AAAA,EAChE,GAAA,EAAK,EAAE,IAAA,EAAM,aAAA,EAAe,aAAa,IAAA,EAAK;AAAA,EAC9C,MAAA,EAAQ,EAAE,IAAA,EAAM,aAAA,EAAe,aAAa,IAAA,EAAK;AAAA,EACjD,OAAO,EAAE,IAAA,EAAM,eAAe,WAAA,EAAa,IAAA,EAAM,aAAa,IAAA,EAAK;AAAA;AAAA,EACnE,IAAA,EAAM,EAAE,IAAA,EAAM,aAAA,EAAe,aAAa,IAAA,EAAK;AAAA,EAC/C,GAAA,EAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA,EAAK;AAAA,EACrC,GAAA,EAAK,EAAE,IAAA,EAAM,WAAA,EAAa,MAAM,IAAA;AAClC,CAAA;AAcA,IAAM,SAAA,GAAY,4CAAA;AAGlB,IAAM,cAAA,GAAiB,0CAAA;AAKvB,IAAM,YAAA,GAAe,qCAAA;AAErB,IAAM,YAAA,GAAe,gCAAA;AAGrB,IAAM,eAAuC,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,KAAK,CAAA,EAAE;AAEpE,SAAS,cAAA,CAAe,OAAe,QAAA,EAA0B;AAC/D,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACjC,EAAA,IAAI,CAAC,GAAG,OAAO,QAAA;AACf,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,CAAE,WAAA,EAAY;AAC9B,EAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,YAAA,EAAc,OAAO,IAAA;AACnD,EAAA,IAAI,IAAA,KAAS,OAAO,OAAO,KAAA;AAC3B,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,qBAAA,CAAsB,QAAgB,MAAA,EAAuC;AAC3F,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,IAAA,MAAMC,UAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACrB,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,MAAM,QAAQ,CAAA,CAAE,KAAA,GAAQ,EAAE,CAAC,CAAA,CAAE,QAAQ,IAAI,CAAA;AACzC,MAAAA,OAAAA,CAAO,KAAK,EAAE,KAAA,EAAO,KAAK,KAAA,GAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,IACjD;AAKA,IAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQA,OAAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA,EAAE;AAAA,EAChF;AAEA,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,IAAI,UAAU,IAAA,CAAK,WAAA;AAEnB,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,GAAI,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA;AAAA,IACrD;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACtB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,QAAQ,CAAA,CAAE,KAAA,GAAQ,SAAA,CAAU,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA;AAC1D,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,KAAK,KAAA,GAAQ,IAAA,CAAK,QAAQ,CAAA;AAC/C,IAAA,MAAM,CAAA,GAAI,cAAA,CAAe,KAAA,EAAO,IAAA,CAAK,WAAW,CAAA;AAChD,IAAA,IAAI,aAAa,CAAC,CAAA,GAAI,YAAA,CAAa,OAAO,GAAG,OAAA,GAAU,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAQ,IAAA,CAAK,MAAA,EAAQ,MAAM,CAAA,EAAE;AACzD;AAQA,SAAS,IAAA,CAAK,MAAA,EAAgB,MAAA,EAAiB,IAAA,GAAgC,EAAC,EAAW;AACzF,EAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAc,MAAA,CAAO,MAAM,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,EAAA,GAAK,OAAO,CAAC,CAAA;AACnB,IAAA,GAAA,CAAI,CAAC,CAAA,GAAI,EAAA,KAAO,IAAA,IAAQ,EAAA,KAAO,OAAO,EAAA,GAAK,GAAA;AAAA,EAC7C;AACA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,CAAE,KAAA,EAAO,CAAA,GAAI,EAAE,GAAA,IAAO,CAAA,GAAI,MAAA,CAAO,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AAC5E,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,CAAA,CAAE,GAAA,GAAM,OAAO,MAAA,IAAU,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,KAAM,GAAA,EAAK,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,GAAI,GAAA;AAAA,EAClF;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,EAAE,CAAA;AACpB;;;AC1IA,IAAM,aAAA,uBAAoB,GAAA,EAA0B;AAEpD,SAAS,OAAA,CAAQ,IAAA,EAAgB,MAAA,EAAgB,MAAA,EAA8B;AAC7E,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA;AAChC,EAAA,IAAI,aAAA,CAAc,IAAI,GAAG,CAAA,SAAU,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA,IAAK,IAAA;AAC7D,EAAA,IAAI,CAAA,GAAkB,IAAA;AACtB,EAAA,IAAI;AACF,IAAA,CAAA,GAAI,IAAI,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,CAAA,GAAI,IAAA;AAAA,EACN;AACA,EAAA,aAAA,CAAc,GAAA,CAAI,KAAK,CAAC,CAAA;AACxB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,YAAA,CACP,UACA,IAAA,EACkB;AAClB,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,EAAG,IAAA;AAChD;AAOA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,mBAAA;AAAA;AAAA,EACA,WAAA;AAAA;AAAA,EACA,qBAAA;AAAA;AAAA,EACA,kBAAA;AAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EACA,0BAAA;AAAA;AAAA,EACA,sBAAA;AAAA;AAAA,EACA,KAAA;AAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EACA,wBAAA;AAAA;AAAA,EACA,iCAAA;AAAA;AAAA,EACA,wBAAA;AAAA;AAAA,EACA,mCAAA;AAAA;AAAA,EACA,iCAAA;AAAA;AAAA,EACA,kBAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAC,CAAA;AAQD,SAAS,kBAAkB,IAAA,EAAqB;AAC9C,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AACpB,EAAA,IAAI,mBAAA,CAAoB,GAAA,CAAI,MAAA,CAAO,IAAI,GAAG,OAAO,IAAA;AAGjD,EAAA,IAAI,OAAO,IAAA,KAAS,mBAAA,SAA4B,MAAA,CAAO,iBAAA,CAAkB,QAAQ,CAAA,IAAK,IAAA;AAItF,EAAA,IAAI,OAAO,IAAA,KAAS,MAAA,SAAe,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA,IAAK,IAAA;AAG3E,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,SAAmB,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA,IAAK,IAAA;AAG5E,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,YAAA,EAAc,OAAO,OAAO,eAAA,GAAkB,CAAA;AAGlE,EAAA,IAAI,MAAA,CAAO,SAAS,oBAAA,EAAsB;AACxC,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA;AAChD,IAAA,OAAO,QAAQ,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,KAAK,IAAA,KAAS,OAAA;AAAA,EAC/D;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,WAAA,CAAY,MAAA,EAAgB,GAAA,EAAW,MAAA,EAAwB;AAQtE,EAAA,MAAM,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,UAAA,EAAY,IAAI,QAAQ,CAAA;AACtD,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,MAAA,KAAW,IAAA,EAAM,IAAA,GAAO,YAAA,CAAa,IAAI,CAAA;AAAA,OAAA,IAGpC,MAAA,KAAW,QAAQ,MAAA,KAAW,IAAA,SAAa,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,OACjE;AACH,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACjC,IAAA,IAAA,GAAO,QAAA,IAAY,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EACrE;AACA,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CAAE,IAAA,EAAK,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,IAAA,EAAK;AACrE,EAAA,OAAO,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA,GAAQ,IAAA;AAC1D;AASA,SAAS,WAAA,CAAY,MAAA,EAAgB,GAAA,EAAW,MAAA,EAAoC;AAClF,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,GAAA,EAAK,MAAM,CAAA;AACrC,EAAA,OAAO,GAAA,KAAQ,MAAA,GAAY,MAAA,GAAY,aAAA,CAAc,GAAG,CAAA;AAC1D;AAEA,SAAS,KAAA,CAAM,MAAA,EAAgB,GAAA,EAAW,MAAA,EAAoC;AAC5E,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,IAAI,WAAW,IAAA,EAAM,OAAO,gBAAgB,KAAA,EAAO,GAAA,CAAI,cAAc,GAAG,CAAA;AACxE,EAAA,OAAO,cAAA,CAAe,KAAA,EAAO,GAAA,CAAI,aAAA,CAAc,GAAG,CAAA;AACpD;AAGA,SAAS,cAAA,CAAe,OAAiB,GAAA,EAAiC;AACxE,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,KAAA,IAAS,CAAA,GAAI,GAAA,GAAM,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAC3B,IAAA,IAAI,SAAS,EAAA,EAAI;AACjB,IAAA,IAAI,+BAA+B,IAAA,CAAK,IAAI,CAAA,EAAG,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,SAChE;AAAA,EACP;AACA,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,EAAQ,OAAO,MAAA;AAC9B,EAAA,MAAM,OAAO,SAAA,CACV,IAAA,CAAK,IAAI,CAAA,CACT,OAAA,CAAQ,iBAAiB,GAAG,CAAA,CAC5B,QAAQ,cAAA,EAAgB,GAAG,EAC3B,OAAA,CAAQ,2BAAA,EAA6B,GAAG,CAAA,CACxC,OAAA,CAAQ,SAAS,GAAG,CAAA;AACvB,EAAA,OAAO,KAAK,IAAI,CAAA;AAClB;AAGA,SAAS,eAAA,CAAgB,OAAiB,GAAA,EAAiC;AAEzE,EAAA,IAAI,CAAA,GAAI,GAAA;AACR,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,CAAC,cAAc,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AAC1D,EAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,OAAW,EAAA,EAAI,CAAA,EAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,EAAG,MAAK,IAAK,EAAA;AAClC,EAAA,MAAM,CAAA,GAAI,2BAAA,CAA4B,IAAA,CAAK,KAAK,CAAA;AAChD,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AACb,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,CAAM,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAC,CAAA;AAC3C,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAChE,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAI,CAAA;AACnB,EAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACzC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC9B,IAAA,IAAI,OAAO,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,KAAK,KAAA,CAAM,CAAC,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAC7B;AAEA,SAAS,KAAK,CAAA,EAA+B;AAC3C,EAAA,MAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACtC,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,OAAO,CAAA,CAAE,SAAS,GAAA,GAAM,CAAA,EAAG,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA,GAAQ,CAAA;AACpD;AAGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,IAAA,IAAI,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAChC,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACrC,CAAA,KAAM,OAAO,KAAA,KAAU,CAAA,SAAU,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA;AAC3B;AAEA,eAAsB,WAAA,CACpB,GAAA,EACA,MAAA,EACA,MAAA,EACoB;AAKpB,EAAA,MAAM,QAAA,GAAW,qBAAA,CAAsB,MAAA,EAAQ,MAAM,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,UAAU,MAAA,IAAU,MAAA;AACtC,EAAA,MAAM,IAAA,GAAO,UAAU,MAAA,IAAU,MAAA;AACjC,EAAA,MAAM,GAAA,GAAM,SAAS,SAAS,CAAA;AAC9B,EAAA,MAAM,WAAA,GAAc,WAAW,SAAS,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAoB;AAAA,IACxB,GAAA;AAAA,IACA,IAAA,EAAM,MAAA;AAAA,IACN,IAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,UAAA,CAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,IACvC,MAAM,EAAC;AAAA,IACP,OAAO,EAAC;AAAA,IACR,SAAS,EAAC;AAAA,IACV,UAAU,EAAC;AAAA,IACX,UAAU,EAAC;AAAA,IACX,QAAQ;AAAC,GACX;AACA,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,WAAA,EAAa,OAAO,MAAA;AAEjC,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,SAAS,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,GAAG,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAGlB,EAAA,MAAM,UAAyD,EAAC;AAChE,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AACnC,IAAA,WAAA,CAAY,QAAA,EAAU,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,MAAM,OAAO,CAAA;AAAA,EAC5D;AAGA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM;AACpC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AAC1B,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,UAAU,CAAC,GAAG,OAAO,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,GAAO,EAAE,IAAI,CAAA;AAClF,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,SAAS,SAAA,CAAU,OAAA,EAAS,CAAA,CAAE,MAAA,EAAQ,EAAE,IAAI,CAAA;AAClD,IAAA,CAAA,CAAE,aAAA,GAAgB,SAAS,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,GAAK,CAAA,CAAE,IAAA;AAAA,EACrE;AACA,EAAA,MAAA,CAAO,IAAA,GAAO,OAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,GAAG,MAAK,GAAI,CAAA;AAGlC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA;AAAA,IACC,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,CAAE,SAAA,GAAY,EAAE,SAAA,IAChB,CAAA,CAAE,aAAA,CAAc,aAAA,CAAc,EAAE,aAAa,CAAA,IAC7C,EAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI;AAAA,GAC/B;AAMF,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,IAAA,EAAM;AACnC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,KAAK,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAA,CAAE,QAAA,EAAU,MAAM,CAAA;AAChD,MAAA,IAAI,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA;AAAA,IACpD;AAAA,EACF;AACA,EAAA,MAAM,QAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,KAAA,EAAO;AACpC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAC3B,MAAA,IAAI,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AAC3C,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,MAAA,EAAQ,IAAI,IAAA,CAAK,IAAA;AAAA,QACjB,IAAA,EAAM,IAAI,IAAA,CAAK,UAAA;AAAA,QACf,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,aAAA,CAAc,GAAA,GAAM,CAAA;AAAA,QACnC,SAAA,EAAW,iBAAA,CAAkB,GAAA,CAAI,IAAI;AAAA,OACtC,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAM,CAAC,CAAA;AAGvF,EAAA,MAAM,UAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,OAAA,EAAS;AACtC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAC3B,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,MAAA,EAAQ,WAAA,CAAY,IAAI,IAAA,CAAK,IAAI,GAAG,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,MAAA,CAAO,OAAA,GAAU,cAAc,OAAO,CAAA;AAGtC,EAAA,MAAM,WAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,IAAA,IAAQ,YAAY,QAAA,EAAU;AACvC,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,SAAS,YAAA,EAAc;AACzD,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,SAAA,EAAW,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAAA,IACvF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,WAAW,QAAA,CAAS,IAAA;AAAA,IACzB,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,CAAE,IAAA,GAAO,EAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI,CAAA,IAAK,EAAE,SAAA,CAAU,aAAA,CAAc,EAAE,SAAS;AAAA,GAC5F;AAGA,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,QAAA,IAAY,EAAC,EAAG;AAC7C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,MAAM,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,IAClE;AAAA,EACF;AACA,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAGzF,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,UAAA,IAAc,EAAC,EAAG;AAC/C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC9B,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,IAAA,EAAK;AAChC,MAAA,IAAI,IAAA,EAAM,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,UAAA,GAAa,CAAC,GAAG,UAAU,EAAE,IAAA,EAAK;AAG9D,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,MAAA,IAAU,EAAC,EAAG;AAC3C,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,SAAA,EAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,KAAA,MAAW,GAAA,IAAO,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACrD,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,SAAS,GAAA,GAAM,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA,GAAQ,MAAM,IAAA,EAAM,GAAA,CAAI,KAAK,aAAA,CAAc,GAAA,GAAM,GAAG,CAAA;AAAA,IACnH;AAAA,EACF;AACA,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAErF,EAAA,IAAA,CAAK,MAAA,EAAO;AACZ,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,WAAW,OAAA,EAA4B;AAC9C,EAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,YAAY,GAAG,OAAO,IAAA;AACjD,EAAA,IAAI,OAAA,CAAQ,gBAAA,EAAkB,IAAA,KAAS,eAAA,SAAwB,OAAA,CAAQ,gBAAA;AACvE,EAAA,MAAM,UAAU,OAAA,CAAQ,MAAA;AACxB,EAAA,IAAI,SAAS,IAAA,KAAS,kBAAA,IAAsB,OAAA,CAAQ,gBAAA,EAAkB,SAAS,eAAA,EAAiB;AAC9F,IAAA,OAAO,OAAA,CAAQ,gBAAA;AAAA,EACjB;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YACP,QAAA,EACA,MAAA,EACA,MAAA,EACA,IAAA,EACA,MACA,GAAA,EACM;AACN,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,KAAK,KAAK,CAAA;AAC9C,EAAA,IAAI,CAAC,CAAA,EAAG;AACR,EAAA,KAAA,MAAW,KAAA,IAAS,CAAA,CAAE,OAAA,CAAQ,IAAI,CAAA,EAAG;AACnC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,QAAA,EAAU,KAAK,CAAA;AAClD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,KAAA,CAAM,QAAA,EAAU,MAAM,CAAA;AACpD,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,QAAA,EAAU;AAI3B,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAO,CAAA,IAAK,OAAA;AACvC,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,eAAe,QAAA,CAAS,IAAA;AAAA;AAAA,MACxB,SAAA,EAAW,OAAA,CAAQ,aAAA,CAAc,GAAA,GAAM,CAAA;AAAA,MACvC,OAAA,EAAS,OAAA,CAAQ,WAAA,CAAY,GAAA,GAAM,CAAA;AAAA,MACnC,WAAW,OAAA,CAAQ,UAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,QAAA;AAAA,MACjB,SAAA,EACE,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,IAAA,KAAS,QAAA,GACtC,aAAA,CAAc,WAAA,CAAY,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAC,CAAA,GAClD,MAAA;AAAA;AAAA;AAAA,MAGN,GAAA,EAAK,WAAA,CAAY,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAAA,MACxC,UAAA,EAAY,MAAA;AAAA,MACZ,QAAQ,OAAA,CAAQ,UAAA;AAAA,MAChB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH;AACF;AAGA,SAAS,SAAA,CACP,IAAA,EACA,KAAA,EACA,GAAA,EACuC;AACvC,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,KAAA,IAAS,CAAA,CAAE,SAAS,GAAA,EAAK;AAC1C,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,KAAA,IAAS,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,SAAS,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,GAAO,CAAA;AAAA,IACnE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAC1C;AAEA,SAAS,cAAc,OAAA,EAAmC;AACxD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,CAAA,CAAE,MAAM,CAAC,CAAA,EAAG;AACxE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAM,CAAA,EAAG;AACxB,IAAA,IAAA,CAAK,GAAA,CAAI,EAAE,MAAM,CAAA;AACjB,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-PY3DNX5H.js","sourcesContent":["/**\n * Language registry: 20 grammar-backed languages (first wave + the Phase-3\n * expansion) plus the embedded-script container formats (Vue/Svelte/Astro\n * single-file components, parsed via sfc.ts with the JS/TS grammars).\n *\n * Each language maps to a tree-sitter grammar shipped (pre-compiled to .wasm) by\n * `tree-sitter-wasms`. `grammarFile` is the base name under that package's `out/`\n * directory (and our bundled `grammars/` copy). The grammar *version* is recorded\n * in provenance so the determinism contract is explicit about its inputs.\n */\n\nexport interface LanguageDef {\n /** Canonical short id used in the schema (`lang` field) and `--only`. */\n id: string;\n /** Human label. */\n label: string;\n /** File extensions (lowercase, with leading dot). */\n extensions: string[];\n /** tree-sitter-wasms grammar base name, e.g. `tree-sitter-typescript`. */\n grammarFile: string;\n}\n\nexport const LANGUAGES: LanguageDef[] = [\n {\n id: 'ts',\n label: 'TypeScript',\n extensions: ['.ts', '.mts', '.cts'],\n grammarFile: 'tree-sitter-typescript',\n },\n {\n id: 'tsx',\n label: 'TSX',\n extensions: ['.tsx'],\n grammarFile: 'tree-sitter-tsx',\n },\n {\n id: 'js',\n label: 'JavaScript',\n extensions: ['.js', '.mjs', '.cjs', '.jsx'],\n grammarFile: 'tree-sitter-javascript',\n },\n {\n id: 'py',\n label: 'Python',\n extensions: ['.py', '.pyi'],\n grammarFile: 'tree-sitter-python',\n },\n {\n id: 'go',\n label: 'Go',\n extensions: ['.go'],\n grammarFile: 'tree-sitter-go',\n },\n {\n id: 'java',\n label: 'Java',\n extensions: ['.java'],\n grammarFile: 'tree-sitter-java',\n },\n {\n id: 'rust',\n label: 'Rust',\n extensions: ['.rs'],\n grammarFile: 'tree-sitter-rust',\n },\n {\n id: 'cs',\n label: 'C#',\n extensions: ['.cs'],\n grammarFile: 'tree-sitter-c_sharp',\n },\n {\n id: 'rb',\n label: 'Ruby',\n extensions: ['.rb'],\n grammarFile: 'tree-sitter-ruby',\n },\n { id: 'php', label: 'PHP', extensions: ['.php'], grammarFile: 'tree-sitter-php' },\n { id: 'kotlin', label: 'Kotlin', extensions: ['.kt', '.kts'], grammarFile: 'tree-sitter-kotlin' },\n { id: 'swift', label: 'Swift', extensions: ['.swift'], grammarFile: 'tree-sitter-swift' },\n { id: 'scala', label: 'Scala', extensions: ['.scala', '.sc'], grammarFile: 'tree-sitter-scala' },\n { id: 'dart', label: 'Dart', extensions: ['.dart'], grammarFile: 'tree-sitter-dart' },\n { id: 'lua', label: 'Lua', extensions: ['.lua'], grammarFile: 'tree-sitter-lua' },\n { id: 'ex', label: 'Elixir', extensions: ['.ex', '.exs'], grammarFile: 'tree-sitter-elixir' },\n // Known limitation: the bundled bash grammar's external scanner throws under\n // web-tree-sitter 0.25.10 on `case`/heredoc constructs. Such files degrade\n // gracefully (per-file empty parse + a surfaced warning, never a build crash);\n // functions in case/heredoc-free scripts extract normally.\n { id: 'sh', label: 'Shell', extensions: ['.sh', '.bash'], grammarFile: 'tree-sitter-bash' },\n { id: 'zig', label: 'Zig', extensions: ['.zig'], grammarFile: 'tree-sitter-zig' },\n { id: 'c', label: 'C', extensions: ['.c'], grammarFile: 'tree-sitter-c' },\n // C++ owns `.h`: the cpp grammar is a superset of C, so C headers parse clean\n // under it, while C++ headers (classes/templates) break the C grammar.\n {\n id: 'cpp',\n label: 'C++',\n extensions: ['.cpp', '.cc', '.cxx', '.hpp', '.hh', '.hxx', '.h'],\n grammarFile: 'tree-sitter-cpp',\n },\n // Objective-C owns `.m` (the far more common meaning in repos than MATLAB);\n // `.mm` (ObjC++) degrades gracefully on C++-only constructs.\n { id: 'objc', label: 'Objective-C', extensions: ['.m', '.mm'], grammarFile: 'tree-sitter-objc' },\n // `.mli` interface files parse best-effort under the implementation grammar.\n { id: 'ocaml', label: 'OCaml', extensions: ['.ml', '.mli'], grammarFile: 'tree-sitter-ocaml' },\n { id: 'rescript', label: 'ReScript', extensions: ['.res'], grammarFile: 'tree-sitter-rescript' },\n { id: 'solidity', label: 'Solidity', extensions: ['.sol'], grammarFile: 'tree-sitter-solidity' },\n // Embedded-script container formats (single-file components and templates).\n // Their script regions are extracted with a position-preserving mask and\n // parsed with the JS/TS (or Ruby, for ERB) grammars — see sfc.ts. The\n // grammarFile below is the effective-grammar fallback so bundling always\n // ships something loadable for the id; the actual grammar is chosen per file\n // (script `lang` attribute / the container's fixed embedded language).\n { id: 'vue', label: 'Vue', extensions: ['.vue'], grammarFile: 'tree-sitter-typescript' },\n { id: 'svelte', label: 'Svelte', extensions: ['.svelte'], grammarFile: 'tree-sitter-typescript' },\n { id: 'astro', label: 'Astro', extensions: ['.astro'], grammarFile: 'tree-sitter-typescript' },\n { id: 'html', label: 'HTML', extensions: ['.html', '.htm'], grammarFile: 'tree-sitter-javascript' },\n { id: 'erb', label: 'ERB', extensions: ['.erb'], grammarFile: 'tree-sitter-ruby' },\n { id: 'ejs', label: 'EJS', extensions: ['.ejs'], grammarFile: 'tree-sitter-javascript' },\n];\n\nconst EXT_TO_LANG = new Map<string, LanguageDef>();\nfor (const lang of LANGUAGES) {\n for (const ext of lang.extensions) EXT_TO_LANG.set(ext, lang);\n}\n\nconst ID_TO_LANG = new Map<string, LanguageDef>(LANGUAGES.map((l) => [l.id, l]));\n\nexport function langForExtension(ext: string): LanguageDef | undefined {\n return EXT_TO_LANG.get(ext.toLowerCase());\n}\n\nexport function langById(id: string): LanguageDef | undefined {\n return ID_TO_LANG.get(id);\n}\n\nexport function allLanguageIds(): string[] {\n return LANGUAGES.map((l) => l.id);\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createRequire } from 'node:module';\nimport { Parser, Language } from 'web-tree-sitter';\nimport { langById, LANGUAGES, type LanguageDef } from './languages.js';\n\n/**\n * Grammar loader. Resolves the pre-compiled tree-sitter `.wasm` for a language\n * from, in order:\n * 1. the `--grammars <dir>` override (offline / air-gapped)\n * 2. ../grammars next to dist (bundled in the published package)\n * 3. the installed `tree-sitter-wasms` package (dev / fallback)\n *\n * Languages are cached. The grammar set version is recorded in provenance so the\n * determinism contract is explicit about which grammars produced the graph.\n */\n\nconst require = createRequire(import.meta.url);\n\nlet parserInit: Promise<void> | null = null;\nconst languageCache = new Map<string, Language>();\n\n// The `--grammars <dir>` override, set per process (and per parse worker, via the\n// parse payload) before parsing. Configured by a command option, not an env var.\nlet grammarsOverride: string | undefined;\nexport function setGrammarsOverride(dir?: string): void {\n grammarsOverride = dir ? path.resolve(dir) : undefined;\n}\n\nfunction thisDir(): string {\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\nlet cachedTreeSitterWasmsDir: string | null = null;\nfunction treeSitterWasmsOutDir(): string {\n if (cachedTreeSitterWasmsDir) return cachedTreeSitterWasmsDir;\n const pkgJson = require.resolve('tree-sitter-wasms/package.json');\n cachedTreeSitterWasmsDir = path.join(path.dirname(pkgJson), 'out');\n return cachedTreeSitterWasmsDir;\n}\n\n/**\n * The grammar-set version string recorded in provenance (determinism input).\n * The `+swift-vendored` suffix marks the vendored tree-sitter-swift build (see\n * vendor/README.md) that replaces the tree-sitter-wasms prebuilt; bump the\n * suffix if a vendored grammar is regenerated, so caches invalidate.\n */\nexport function grammarSetVersion(): string {\n try {\n const pkgJson = require.resolve('tree-sitter-wasms/package.json');\n const { version } = JSON.parse(fs.readFileSync(pkgJson, 'utf8')) as { version: string };\n return `tree-sitter-wasms@${version}+swift-vendored@0.7.1`;\n } catch {\n return 'tree-sitter-wasms@unknown+swift-vendored@0.7.1';\n }\n}\n\n/**\n * Candidate directories holding grammar .wasm files, highest priority first.\n * The vendor/ dirs are OVERLAYS holding only rebuilt replacements for\n * defective prebuilts (vendor/README.md) — they outrank the tree-sitter-wasms\n * fallback so dev/test runs without a prior `pnpm build` never load a\n * known-bad prebuilt, but they are never a complete grammar set.\n */\nfunction grammarDirs(): string[] {\n const dirs: string[] = [];\n // the `--grammars <dir>` override (offline / air-gapped), if set\n if (grammarsOverride) dirs.push(grammarsOverride);\n // ../grammars relative to dist/ (bundled in the published artifact)\n dirs.push(path.join(thisDir(), '..', 'grammars'));\n dirs.push(path.join(thisDir(), 'grammars'));\n // vendored overlays\n dirs.push(path.join(thisDir(), '..', 'vendor')); // from dist/\n dirs.push(path.join(thisDir(), '..', '..', 'vendor')); // from src/engine/\n // node_modules fallback\n try {\n dirs.push(treeSitterWasmsOutDir());\n } catch {\n /* tree-sitter-wasms not resolvable — rely on the dirs above */\n }\n return dirs;\n}\n\nconst isVendorOverlay = (dir: string): boolean => path.basename(dir) === 'vendor';\n\n/**\n * The first existing directory that holds a grammar .wasm set. Skips the\n * vendor overlays — they hold single replacement files, never a full set.\n * For a complete per-language resolution use resolvedGrammarFiles().\n */\nexport function grammarsSourceDir(): string | null {\n for (const dir of grammarDirs()) {\n if (isVendorOverlay(dir)) continue;\n if (fs.existsSync(dir) && fs.readdirSync(dir).some((f) => f.endsWith('.wasm'))) return dir;\n }\n return null;\n}\n\nfunction resolveGrammarFile(grammarFile: string): string {\n const fileName = `${grammarFile}.wasm`;\n for (const dir of grammarDirs()) {\n const candidate = path.join(dir, fileName);\n if (fs.existsSync(candidate)) return candidate;\n }\n throw new Error(\n `grammar \"${fileName}\" not found. Looked in: ${grammarDirs().join(', ')}. ` +\n `Pass --grammars <dir> pointing at a directory of grammar .wasm files.`,\n );\n}\n\n/**\n * Every registered language's grammar .wasm resolved through the same\n * priority order the parser uses (override > bundled > vendor overlay >\n * tree-sitter-wasms). Used by `vg bundle` so an air-gapped bundle always\n * carries the exact grammar files a scan would load.\n */\nexport function resolvedGrammarFiles(): { fileName: string; absPath: string }[] {\n return LANGUAGES.map((l) => ({\n fileName: `${l.grammarFile}.wasm`,\n absPath: resolveGrammarFile(l.grammarFile),\n }));\n}\n\nasync function ensureParserInit(): Promise<void> {\n if (!parserInit) parserInit = Parser.init();\n await parserInit;\n}\n\n/** Load (and cache) the tree-sitter Language for a vg language id. */\nexport async function loadLanguage(langId: string): Promise<Language> {\n const cached = languageCache.get(langId);\n if (cached) return cached;\n const def = langById(langId);\n if (!def) throw new Error(`unknown language id \"${langId}\"`);\n await ensureParserInit();\n const wasmPath = resolveGrammarFile(def.grammarFile);\n const language = await Language.load(fs.readFileSync(wasmPath));\n languageCache.set(langId, language);\n return language;\n}\n\n/** Construct a fresh parser bound to a language. */\nexport async function parserFor(def: LanguageDef): Promise<Parser> {\n const language = await loadLanguage(def.id);\n const parser = new Parser();\n parser.setLanguage(language);\n return parser;\n}\n","import type { NodeKind } from '../schema.js';\n\n/**\n * Per-language tree-sitter queries driving extraction. Each query uses a small,\n * fixed capture vocabulary so the generic extractor (parse.ts) stays\n * language-agnostic:\n *\n * @def — a definition node (its kind comes from the rule)\n * @name — the name node of that definition\n * @callee — a called name node (a call edge, resolved later)\n * @source — an import/require source string node (incl. quotes)\n * @extends / @implements — a base type name node (a heritage edge)\n *\n * Queries are best-effort per language: if a pattern fails to compile against a\n * grammar it is skipped (logged once), so one bad rule never disables a whole\n * language. Coverage is deepest for the TS/JS-first audience and a solid\n * baseline elsewhere — honestly recorded as `heuristic` resolution.\n */\n\nexport interface DefRule {\n kind: NodeKind;\n query: string;\n}\n\nexport interface LangQueries {\n defs: DefRule[];\n calls: string[];\n imports: string[];\n heritage: string[];\n /** Assert/guard expressions captured as @guard → invariant facts (--deep). */\n guards?: string[];\n /**\n * Constructor-parameter / field declared types captured as @typeref — a\n * structural dependency (e.g. Spring constructor/field injection) that never\n * appears as a `call_expression`/`object_creation_expression`, so it needs its\n * own capture. Resolved to a `references` edge (not `call`) in resolve.ts.\n */\n typeRefs?: string[];\n /**\n * Namespace declarations captured as @namespace — the namespaces a file\n * declares its types in. For languages where a namespace is decoupled from\n * the directory (C#), this lets the resolver connect a cross-directory\n * reference when the caller `using`-imports that namespace. Absent for\n * languages that have no namespace concept or where package == directory.\n */\n namespaces?: string[];\n}\n\n// assert-like call detection, shared by the C-family languages.\nconst ASSERT_CALLS = [\n '(call_expression function: (identifier) @_g (#match? @_g \"^(assert|invariant|require|precondition|invariantViolation)$\")) @guard',\n];\n\nconst TS_JS_CALLS = [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (member_expression property: (property_identifier) @callee))',\n '(new_expression constructor: (identifier) @callee)',\n];\n\nconst TS_JS_IMPORTS = [\n '(import_statement source: (string) @source)',\n '(call_expression function: (identifier) @_req (#eq? @_req \"require\") arguments: (arguments (string) @source))',\n];\n\nconst TYPESCRIPT: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration name: (identifier) @name) @def' },\n {\n kind: 'function',\n query: '(generator_function_declaration name: (identifier) @name) @def',\n },\n {\n kind: 'function',\n query:\n '(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @def',\n },\n { kind: 'method', query: '(method_definition name: (property_identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (type_identifier) @name) @def' },\n { kind: 'class', query: '(abstract_class_declaration name: (type_identifier) @name) @def' },\n { kind: 'interface', query: '(interface_declaration name: (type_identifier) @name) @def' },\n ],\n calls: TS_JS_CALLS,\n imports: TS_JS_IMPORTS,\n heritage: [\n '(class_heritage (extends_clause value: (identifier) @extends))',\n '(class_heritage (extends_clause value: (member_expression property: (property_identifier) @extends)))',\n '(class_heritage (implements_clause (type_identifier) @implements))',\n '(extends_type_clause type: (type_identifier) @extends)',\n ],\n guards: ASSERT_CALLS,\n};\n\nconst JAVASCRIPT: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration name: (identifier) @name) @def' },\n {\n kind: 'function',\n query: '(generator_function_declaration name: (identifier) @name) @def',\n },\n {\n kind: 'function',\n query:\n '(variable_declarator name: (identifier) @name value: [(arrow_function) (function_expression)]) @def',\n },\n { kind: 'method', query: '(method_definition name: (property_identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (identifier) @name) @def' },\n ],\n calls: TS_JS_CALLS,\n imports: TS_JS_IMPORTS,\n heritage: [\n '(class_heritage (identifier) @extends)',\n '(class_heritage (member_expression property: (property_identifier) @extends))',\n ],\n guards: ASSERT_CALLS,\n};\n\nconst PYTHON: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_definition name: (identifier) @name) @def' },\n { kind: 'class', query: '(class_definition name: (identifier) @name) @def' },\n ],\n calls: [\n '(call function: (identifier) @callee)',\n '(call function: (attribute attribute: (identifier) @callee))',\n ],\n imports: [\n '(import_statement name: (dotted_name) @source)',\n '(import_from_statement module_name: (dotted_name) @source)',\n // Relative imports (`from .models import X`, `from ..core.utils import Y`) —\n // the module is a `relative_import` node, not a `dotted_name`. These are the\n // bulk of intra-package edges and were previously dropped entirely.\n '(import_from_statement module_name: (relative_import) @source)',\n ],\n heritage: ['(class_definition superclasses: (argument_list (identifier) @extends))'],\n guards: ['(assert_statement) @guard'],\n};\n\nconst GO: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration name: (identifier) @name) @def' },\n { kind: 'method', query: '(method_declaration name: (field_identifier) @name) @def' },\n { kind: 'class', query: '(type_declaration (type_spec name: (type_identifier) @name)) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (selector_expression field: (field_identifier) @callee))',\n ],\n imports: ['(import_spec path: (interpreted_string_literal) @source)'],\n heritage: [],\n};\n\nconst JAVA: LangQueries = {\n defs: [\n { kind: 'method', query: '(method_declaration name: (identifier) @name) @def' },\n { kind: 'method', query: '(constructor_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (identifier) @name) @def' },\n { kind: 'interface', query: '(interface_declaration name: (identifier) @name) @def' },\n ],\n calls: ['(method_invocation name: (identifier) @callee)', '(object_creation_expression type: (type_identifier) @callee)'],\n imports: ['(import_declaration (scoped_identifier) @source)'],\n heritage: [\n '(superclass (type_identifier) @extends)',\n '(super_interfaces (type_list (type_identifier) @implements))',\n ],\n // Spring-style dependency injection wires a collaborator via a constructor\n // parameter or a field, never a `new`/method call — so without these, an\n // injected repository/service shows zero callers even when it is the sole\n // reason five other classes exist.\n typeRefs: [\n '(constructor_declaration parameters: (formal_parameters (formal_parameter type: (type_identifier) @typeref)))',\n '(field_declaration type: (type_identifier) @typeref)',\n ],\n // A Java package is a directory, so cross-directory (cross-package) DI\n // resolves through `import a.b.Foo`. Capturing the package lets the resolver\n // reach the implementation in another package when the caller imports it.\n namespaces: ['(package_declaration (scoped_identifier) @namespace)', '(package_declaration (identifier) @namespace)'],\n};\n\nconst RUST: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_item name: (identifier) @name) @def' },\n { kind: 'class', query: '(struct_item name: (type_identifier) @name) @def' },\n { kind: 'class', query: '(enum_item name: (type_identifier) @name) @def' },\n { kind: 'interface', query: '(trait_item name: (type_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (field_expression field: (field_identifier) @callee))',\n '(call_expression function: (scoped_identifier name: (identifier) @callee))',\n ],\n imports: ['(use_declaration (scoped_identifier) @source)'],\n heritage: [],\n};\n\nconst C_SHARP: LangQueries = {\n defs: [\n { kind: 'method', query: '(method_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (identifier) @name) @def' },\n { kind: 'interface', query: '(interface_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(struct_declaration name: (identifier) @name) @def' },\n // Enums and records are load-bearing lookup targets in real C# codebases\n // (permission enums, DTO records); without these captures a `Privilege`-\n // style lookup only ever resolves via the literal text fallthrough.\n // 'class' is this engine's established kind for enum-like types (see the\n // Rust enum_item and C enum_specifier mappings).\n { kind: 'class', query: '(enum_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(record_declaration name: (identifier) @name) @def' },\n ],\n calls: [\n '(invocation_expression function: (member_access_expression name: (identifier) @callee))',\n '(invocation_expression function: (identifier) @callee)',\n // `new Foo(...)` is an instantiation dependency (the caller depends on Foo),\n // and it is how a test most directly links to the class under test — without\n // it a test that only constructs the service showed up as no coverage.\n '(object_creation_expression type: (identifier) @callee)',\n ],\n imports: ['(using_directive (qualified_name) @source)', '(using_directive (identifier) @source)'],\n heritage: ['(base_list (identifier) @extends)'],\n // Dependency-injection wiring: the interface a class depends on appears as a\n // constructor-parameter type or a readonly field type, never as a call — so\n // without these captures a controller/service injected through an interface\n // looks like it references nothing. Simple (identifier) types only; generics/\n // qualified names are left to a precise rung. Mirrors the Java DI captures.\n typeRefs: [\n '(constructor_declaration (parameter_list (parameter type: (identifier) @typeref)))',\n '(field_declaration (variable_declaration type: (identifier) @typeref))',\n ],\n // A namespace is decoupled from the directory in C#, so cross-namespace\n // resolution needs to know which namespace a file declares. Both block-scoped\n // (`namespace N { }`) and file-scoped (`namespace N;`) forms.\n namespaces: [\n '(namespace_declaration name: [(identifier) (qualified_name)] @namespace)',\n '(file_scoped_namespace_declaration name: [(identifier) (qualified_name)] @namespace)',\n ],\n};\n\nconst RUBY: LangQueries = {\n defs: [\n { kind: 'method', query: '(method name: (identifier) @name) @def' },\n { kind: 'class', query: '(class name: (constant) @name) @def' },\n { kind: 'module', query: '(module name: (constant) @name) @def' },\n ],\n calls: ['(call method: (identifier) @callee)', '(command method: (identifier) @callee)'],\n imports: [\n '(call method: (identifier) @_m (#match? @_m \"require\") arguments: (argument_list (string (string_content) @source)))',\n ],\n heritage: ['(class (superclass (constant) @extends))'],\n};\n\n\nconst PHP: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_definition name: (name) @name) @def' },\n {\n kind: 'function',\n query:\n '(assignment_expression left: (variable_name (name) @name) right: [(anonymous_function_creation_expression) (arrow_function)]) @def',\n },\n { kind: 'method', query: '(method_declaration name: (name) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (name) @name) @def' },\n { kind: 'class', query: '(trait_declaration name: (name) @name) @def' },\n { kind: 'interface', query: '(interface_declaration name: (name) @name) @def' },\n ],\n calls: [\n '(function_call_expression function: (name) @callee)',\n '(member_call_expression name: (name) @callee)',\n '(nullsafe_member_call_expression name: (name) @callee)',\n '(scoped_call_expression name: (name) @callee)',\n '(object_creation_expression (name) @callee)',\n ],\n imports: [\n '(namespace_use_clause (qualified_name) @source)',\n '(namespace_use_clause (name) @source)',\n '[(require_expression (string) @source) (require_once_expression (string) @source) (include_expression (string) @source) (include_once_expression (string) @source)]',\n ],\n heritage: ['(base_clause (name) @extends)', '(class_interface_clause (name) @implements)'],\n // PHP namespaces are decoupled from directories (PSR-4 maps them, but the\n // resolver has no composer.json), so cross-namespace DI resolves through\n // `use`. Constructor-parameter and typed-property types are the injection\n // points.\n namespaces: ['(namespace_definition name: (namespace_name) @namespace)'],\n typeRefs: [\n '(simple_parameter type: (named_type (name) @typeref))',\n '(property_declaration type: (named_type (name) @typeref))',\n ],\n guards: ['(function_call_expression function: (name) @_g (#eq? @_g \"assert\")) @guard'],\n};\n\n// fwcd grammar: no field names — captures are positional; each def pattern binds\n// exactly one @name (params live under function_value_parameters). `class` vs\n// `interface` are both class_declaration, split by the anonymous keyword token.\nconst KOTLIN: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration (simple_identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration \"class\" (type_identifier) @name) @def' },\n { kind: 'interface', query: '(class_declaration \"interface\" (type_identifier) @name) @def' },\n { kind: 'class', query: '(object_declaration (type_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression (simple_identifier) @callee)',\n '(call_expression (navigation_expression (navigation_suffix (simple_identifier) @callee)))',\n ],\n imports: ['(import_header (identifier) @source)'],\n // Kotlin: package for cross-package DI reachability; primary-constructor\n // `val` params and property types are the injection points.\n namespaces: ['(package_header (identifier) @namespace)'],\n typeRefs: [\n '(class_parameter (user_type (type_identifier) @typeref))',\n '(property_declaration (variable_declaration (user_type (type_identifier) @typeref)))',\n '(property_declaration (variable_declaration (nullable_type (user_type (type_identifier) @typeref))))',\n ],\n heritage: [\n '(delegation_specifier (constructor_invocation (user_type (type_identifier) @extends)))',\n '(delegation_specifier (user_type (type_identifier) @implements))',\n ],\n guards: ['(call_expression (simple_identifier) @_g (#match? @_g \"^(require|check|assert)$\")) @guard'],\n};\n\n// class/struct/enum/extension are ALL class_declaration; extensions carry\n// name: (user_type …) and so get their own (duplicate-named) class def node.\nconst SWIFT: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration name: (simple_identifier) @name) @def' },\n { kind: 'method', query: '(protocol_function_declaration name: (simple_identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (type_identifier) @name) @def' },\n { kind: 'class', query: '(class_declaration name: (user_type (type_identifier) @name)) @def' },\n { kind: 'interface', query: '(protocol_declaration name: (type_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression (simple_identifier) @callee)',\n '(call_expression (navigation_expression suffix: (navigation_suffix suffix: (simple_identifier) @callee)))',\n ],\n imports: ['(import_declaration (identifier) @source)'],\n heritage: ['(inheritance_specifier inherits_from: (user_type (type_identifier) @extends))'],\n // Swift: init-parameter and stored-property types are the injection points\n // (protocol-typed). Whole-module visibility (handled in resolve.ts) makes the\n // conforming implementation reachable cross-file.\n typeRefs: [\n '(parameter (user_type (type_identifier) @typeref))',\n '(type_annotation (user_type (type_identifier) @typeref))',\n ],\n guards: [\n '(call_expression (simple_identifier) @_g (#match? @_g \"^(assert|precondition|assertionFailure|preconditionFailure)$\")) @guard',\n ],\n};\n\nconst SCALA: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_definition name: (identifier) @name) @def' },\n { kind: 'method', query: '(function_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(class_definition name: (identifier) @name) @def' },\n { kind: 'interface', query: '(trait_definition name: (identifier) @name) @def' },\n { kind: 'module', query: '(object_definition name: (identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (field_expression field: (identifier) @callee))',\n ],\n imports: [\n '(import_declaration path: (stable_identifier) @source)',\n '(import_declaration path: (identifier) @source)',\n ],\n heritage: [\n '(extends_clause type: (type_identifier) @extends)',\n '(extends_clause type: (generic_type type: (type_identifier) @extends))',\n '(extends_clause type: (compound_type base: (type_identifier) @extends))',\n '(extends_clause type: (compound_type extra: (type_identifier) @implements))',\n ],\n // Scala: package for cross-package DI reachability; class-parameter and val\n // types are the injection points.\n namespaces: ['(package_clause name: (package_identifier) @namespace)'],\n typeRefs: [\n '(class_parameter type: (type_identifier) @typeref)',\n '(val_definition type: (type_identifier) @typeref)',\n ],\n guards: ['(call_expression function: (identifier) @_g (#match? @_g \"^(require|assert|assume)$\")) @guard'],\n};\n\n// No call_expression node in this grammar: a call is an identifier followed by a\n// sibling selector(argument_part), hence the anchored sibling patterns.\nconst DART: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_signature name: (identifier) @name) @def' },\n { kind: 'method', query: '(constructor_signature name: (identifier) @name) @def' },\n { kind: 'class', query: '(class_definition name: (identifier) @name) @def' },\n { kind: 'class', query: '(mixin_declaration (identifier) @name) @def' },\n ],\n calls: [\n '(_ (identifier) @callee . (selector (argument_part)))',\n '(_ (selector (unconditional_assignable_selector (identifier) @callee)) . (selector (argument_part)))',\n '(_ (selector (conditional_assignable_selector (identifier) @callee)) . (selector (argument_part)))',\n '(cascade_section (cascade_selector (identifier) @callee) . (argument_part))',\n ],\n imports: ['(import_specification (configurable_uri (uri (string_literal) @source)))'],\n // Dart: constructor/method parameter types and typed field declarations are\n // the injection points (Dart resolves cross-file via `import`, so no\n // namespace query is needed — the import rung already reaches the impl).\n typeRefs: [\n '(formal_parameter (type_identifier) @typeref)',\n '(declaration (type_identifier) @typeref)',\n ],\n heritage: [\n '(superclass (type_identifier) @extends)',\n '(interfaces (type_identifier) @implements)',\n '(mixins (type_identifier) @implements)',\n ],\n guards: ['(assert_statement) @guard'],\n};\n\nconst LUA: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_definition_statement name: (identifier) @name) @def' },\n { kind: 'function', query: '(function_definition_statement name: (variable field: (identifier) @name)) @def' },\n { kind: 'method', query: '(function_definition_statement name: (variable method: (identifier) @name)) @def' },\n { kind: 'function', query: '(local_function_definition_statement name: (identifier) @name) @def' },\n {\n kind: 'function',\n query:\n '(variable_assignment (variable_list (variable field: (identifier) @name)) (expression_list value: (function_definition))) @def',\n },\n {\n kind: 'function',\n query:\n '(local_variable_declaration (variable_list (variable name: (identifier) @name)) (expression_list value: (function_definition))) @def',\n },\n ],\n calls: [\n '(call function: (variable name: (identifier) @callee))',\n '(call function: (variable field: (identifier) @callee))',\n '(call function: (variable method: (identifier) @callee))',\n ],\n imports: [\n '(call function: (variable name: (identifier) @_r (#eq? @_r \"require\")) arguments: (argument_list (expression_list (string) @source)))',\n ],\n heritage: [],\n guards: ['(call function: (variable name: (identifier) @_g (#eq? @_g \"assert\"))) @guard'],\n};\n\n// Expression-based grammar: defmodule/def/defp are ordinary `call` nodes keyed by\n// their target identifier, so every rule is predicate-gated. A parenthesized def\n// head is itself a call and yields one benign same-line self-capture; the\n// resolver's qualified-call/enclosing-def rules keep it from becoming an edge.\nconst ELIXIR: LangQueries = {\n defs: [\n { kind: 'module', query: '(call target: (identifier) @_kw (#eq? @_kw \"defmodule\") (arguments (alias) @name)) @def' },\n {\n kind: 'function',\n query:\n '(call target: (identifier) @_kw (#match? @_kw \"^(def|defp|defmacro|defmacrop|defguard|defguardp)$\") (arguments (call target: (identifier) @name))) @def',\n },\n {\n kind: 'function',\n query:\n '(call target: (identifier) @_kw (#match? @_kw \"^(def|defp|defmacro|defmacrop)$\") (arguments (identifier) @name)) @def',\n },\n {\n kind: 'function',\n query:\n '(call target: (identifier) @_kw (#match? @_kw \"^(def|defp|defmacro|defmacrop|defguard|defguardp)$\") (arguments (binary_operator left: (call target: (identifier) @name)))) @def',\n },\n ],\n calls: [\n '(call target: (dot right: (identifier) @callee))',\n '(call target: (identifier) @callee (#not-match? @callee \"^(def|defp|defmacro|defmacrop|defmodule|defstruct|defprotocol|defimpl|defguard|defguardp|defdelegate|defexception|defoverridable|alias|import|require|use|quote|unquote|moduledoc|doc|spec|type|typep|typedoc|opaque|behaviour|impl|derive|enforce_keys|callback|macrocallback|optional_callbacks|compile|deprecated|dialyzer|external_resource|on_definition|on_load|after_compile|before_compile)$\"))',\n ],\n imports: [\n '(call target: (identifier) @_kw (#match? @_kw \"^(alias|import|require|use)$\") (arguments (alias) @source))',\n '(call target: (identifier) @_kw (#match? @_kw \"^(alias|import|require|use)$\") (arguments (dot left: (alias) @source)))',\n ],\n heritage: [],\n};\n\n// Every shell command is a `command` node, so callees include external binaries\n// (rsync, git, …). Safe: the resolver has no global-name fallback, so only\n// callees matching a reachable function_definition become edges.\nconst BASH: LangQueries = {\n defs: [{ kind: 'function', query: '(function_definition name: (word) @name) @def' }],\n calls: ['(command name: (command_name (word) @callee))'],\n imports: [\n '(command name: (command_name (word) @_c (#match? @_c \"^(source|\\\\.)$\")) argument: [(word) (string) (raw_string) (concatenation)] @source)',\n ],\n heritage: [],\n};\n\nconst ZIG: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(variable_declaration (identifier) @name (struct_declaration)) @def' },\n { kind: 'class', query: '(variable_declaration (identifier) @name (enum_declaration)) @def' },\n { kind: 'class', query: '(variable_declaration (identifier) @name (union_declaration)) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (field_expression member: (identifier) @callee))',\n ],\n imports: ['(builtin_function (builtin_identifier) @_i (#eq? @_i \"@import\") (arguments (string) @source))'],\n heritage: [],\n guards: ['(call_expression function: (field_expression member: (identifier) @_g (#eq? @_g \"assert\"))) @guard'],\n};\n\n// Only body-bearing function_definitions match (prototypes are `declaration`s).\nconst C_LANG: LangQueries = {\n defs: [\n {\n kind: 'function',\n query:\n '(function_definition declarator: [(function_declarator declarator: (identifier) @name) (pointer_declarator declarator: (function_declarator declarator: (identifier) @name))]) @def',\n },\n { kind: 'class', query: '(struct_specifier name: (type_identifier) @name body: (field_declaration_list)) @def' },\n { kind: 'class', query: '(enum_specifier name: (type_identifier) @name body: (enumerator_list)) @def' },\n { kind: 'class', query: '(type_definition declarator: (type_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (field_expression field: (field_identifier) @callee))',\n ],\n imports: ['(preproc_include path: (string_literal) @source)', '(preproc_include path: (system_lib_string) @source)'],\n heritage: [],\n guards: ['(call_expression function: (identifier) @_g (#match? @_g \"^(assert|static_assert)$\")) @guard'],\n};\n\nconst CPP: LangQueries = {\n defs: [\n {\n kind: 'function',\n query:\n '(function_definition declarator: [(function_declarator declarator: (identifier) @name) (pointer_declarator declarator: (function_declarator declarator: (identifier) @name)) (reference_declarator (function_declarator declarator: (identifier) @name))]) @def',\n },\n { kind: 'method', query: '(function_definition declarator: (function_declarator declarator: (field_identifier) @name)) @def' },\n {\n kind: 'method',\n query:\n '(function_definition declarator: [(function_declarator declarator: (qualified_identifier name: (identifier) @name)) (pointer_declarator declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))) (reference_declarator (function_declarator declarator: (qualified_identifier name: (identifier) @name)))]) @def',\n },\n {\n kind: 'method',\n query:\n '(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (qualified_identifier name: (identifier) @name)))) @def',\n },\n { kind: 'class', query: '(class_specifier name: (type_identifier) @name body: (field_declaration_list)) @def' },\n { kind: 'class', query: '(struct_specifier name: (type_identifier) @name body: (field_declaration_list)) @def' },\n { kind: 'module', query: '(namespace_definition name: (namespace_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (field_expression field: (field_identifier) @callee))',\n '(call_expression function: (qualified_identifier name: (identifier) @callee))',\n '(call_expression function: (qualified_identifier name: (qualified_identifier name: (identifier) @callee)))',\n '(new_expression type: (type_identifier) @callee)',\n ],\n imports: ['(preproc_include path: (string_literal) @source)', '(preproc_include path: (system_lib_string) @source)'],\n heritage: [\n '(base_class_clause (type_identifier) @extends)',\n '(base_class_clause (qualified_identifier name: (type_identifier) @extends))',\n ],\n guards: ['(call_expression function: (identifier) @_g (#match? @_g \"^(assert|static_assert)$\")) @guard'],\n};\n\nconst OBJC: LangQueries = {\n defs: [\n {\n kind: 'function',\n query: '(function_definition declarator: (function_declarator declarator: (identifier) @name)) @def',\n },\n // The selector segments are the method_definition's direct bare identifiers\n // (param names sit inside method_parameter); the first segment names it.\n { kind: 'method', query: '(method_definition (identifier) @name) @def' },\n { kind: 'class', query: '(class_implementation . (identifier) @name) @def' },\n { kind: 'interface', query: '(class_interface . (identifier) @name) @def' },\n // A @protocol is Objective-C's interface — without this it is not a node, so\n // conformance and protocol-typed DI cannot resolve.\n { kind: 'interface', query: '(protocol_declaration (identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(message_expression method: (identifier) @callee)',\n ],\n imports: [\n '(preproc_include path: (string_literal) @source)',\n '(preproc_include path: (system_lib_string) @source)',\n ],\n // Superclass (`: NSObject`) is `extends`; adopted protocols (`<Servicing>`,\n // captured as parameterized_arguments after the interface name) are the\n // `implements` relationship a DI call disambiguates through.\n heritage: [\n '(class_interface superclass: (identifier) @extends)',\n '(class_interface (parameterized_arguments (type_name (type_identifier) @implements)))',\n ],\n guards: ASSERT_CALLS,\n};\n\nconst OCAML: LangQueries = {\n defs: [\n // Only parameterised bindings — plain `let x = …` values would drown the\n // graph in constants.\n { kind: 'function', query: '(let_binding pattern: (value_name) @name (parameter)) @def' },\n { kind: 'module', query: '(module_binding name: (module_name) @name) @def' },\n ],\n calls: ['(application_expression function: (value_path (value_name) @callee))'],\n imports: ['(open_module (module_path (module_name) @source))'],\n heritage: [],\n};\n\nconst RESCRIPT: LangQueries = {\n defs: [\n { kind: 'function', query: '(let_binding pattern: (value_identifier) @name body: (function)) @def' },\n { kind: 'module', query: '(module_binding name: (module_identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (value_identifier) @callee)',\n '(call_expression function: (value_identifier_path (value_identifier) @callee))',\n ],\n imports: ['(open_statement (module_identifier) @source)'],\n heritage: [],\n};\n\nconst SOLIDITY: LangQueries = {\n defs: [\n { kind: 'function', query: '(function_definition name: (identifier) @name) @def' },\n { kind: 'function', query: '(modifier_definition name: (identifier) @name) @def' },\n { kind: 'class', query: '(contract_declaration name: (identifier) @name) @def' },\n { kind: 'class', query: '(library_declaration name: (identifier) @name) @def' },\n { kind: 'interface', query: '(interface_declaration name: (identifier) @name) @def' },\n ],\n calls: [\n '(call_expression function: (identifier) @callee)',\n '(call_expression function: (member_expression property: (identifier) @callee))',\n '(emit_statement name: (identifier) @callee)',\n ],\n imports: ['(import_directive source: (string) @source)'],\n heritage: ['(inheritance_specifier ancestor: (user_defined_type (identifier) @extends))'],\n guards: [\n '(call_expression function: (identifier) @_g (#match? @_g \"^(require|assert)$\")) @guard',\n ],\n};\n\nconst BY_LANG: Record<string, LangQueries> = {\n ts: TYPESCRIPT,\n tsx: TYPESCRIPT,\n js: JAVASCRIPT,\n py: PYTHON,\n go: GO,\n java: JAVA,\n rust: RUST,\n cs: C_SHARP,\n rb: RUBY,\n php: PHP,\n kotlin: KOTLIN,\n swift: SWIFT,\n scala: SCALA,\n dart: DART,\n lua: LUA,\n ex: ELIXIR,\n sh: BASH,\n zig: ZIG,\n c: C_LANG,\n cpp: CPP,\n objc: OBJC,\n ocaml: OCAML,\n rescript: RESCRIPT,\n solidity: SOLIDITY,\n // Container formats (vue/svelte/astro/html/erb/ejs) have no entry here on\n // purpose: parse.ts routes them to their embedded language's queries.\n};\n\nexport function queriesFor(langId: string): LangQueries | undefined {\n return BY_LANG[langId];\n}\n","/**\n * Embedded-script container formats — files whose code lives in script regions\n * inside a non-code host document:\n *\n * - single-file components: Vue (`.vue`), Svelte (`.svelte`), Astro\n * (`.astro`, frontmatter fence + client `<script>`s);\n * - plain HTML with inline `<script>` blocks (`.html`/`.htm`);\n * - `<% … %>` templates: ERB (`.erb`, Ruby) and EJS (`.ejs`, JavaScript).\n *\n * The graph parses these by masking: every character outside the script\n * region(s) is replaced with a space (newlines kept), and the result is parsed\n * with the ordinary grammar of the embedded language. Masking preserves byte\n * offsets and line numbers exactly, so defs/calls/imports land on their true\n * positions in the original file and every downstream stage (resolution,\n * impact, display) works unchanged. Pure and deterministic: identical source →\n * identical mask.\n *\n * Template/markup content is intentionally out of scope — imports, exported\n * bindings, and calls all live in the script regions, which is what call/import\n * edges are built from.\n */\n\nexport interface EmbeddedScript {\n /** Effective grammar to parse the masked source with ('ts' | 'tsx' | 'js' | 'rb'). */\n langId: string;\n /** The original source with all non-script content blanked to spaces. */\n masked: string;\n}\n\ninterface ScriptTagSpec {\n kind: 'script-tags';\n /** Grammar when a block has no `lang` attribute. */\n defaultLang: string;\n /** Also extract a leading `---` frontmatter fence (Astro). */\n frontmatter?: boolean;\n}\n\ninterface DelimitedSpec {\n kind: 'delimited';\n /** The container's fixed embedded language. */\n lang: string;\n}\n\n/** Container language ids (must match the languages.ts registry entries). */\nconst CONTAINERS: Record<string, ScriptTagSpec | DelimitedSpec> = {\n vue: { kind: 'script-tags', defaultLang: 'js' },\n svelte: { kind: 'script-tags', defaultLang: 'js' },\n astro: { kind: 'script-tags', defaultLang: 'ts', frontmatter: true }, // frontmatter is TS\n html: { kind: 'script-tags', defaultLang: 'js' },\n erb: { kind: 'delimited', lang: 'rb' },\n ejs: { kind: 'delimited', lang: 'js' },\n};\n\nexport function isContainerLang(langId: string): boolean {\n return langId in CONTAINERS;\n}\n\ninterface Range {\n start: number;\n end: number;\n}\n\n// `<script …>body</script>` — non-greedy body, so multiple blocks (Vue's\n// `<script>` + `<script setup>`, Svelte's `context=\"module\"`) each match.\n// A void `<script src=… />` has an empty body and contributes nothing.\nconst SCRIPT_RE = /<script\\b([^>]*)>([\\s\\S]*?)<\\/script\\s*>/gi;\n\n// Astro frontmatter: a `---` fence on the first line, closed by a `---` line.\nconst ASTRO_FENCE_RE = /^---\\r?\\n([\\s\\S]*?)(\\r?\\n)---(?:\\r?\\n|$)/;\n\n// `<% code %>` regions (ERB/EJS): `=`/`-` output tags included, `#`/`%%`\n// comment/escape forms excluded, optional `-`/`_` trim markers kept out of the\n// body. Non-greedy to the first closer, the standard template behaviour.\nconst DELIMITED_RE = /<%(?![%#])[=\\-_]?([\\s\\S]*?)[-_]?%>/g;\n\nconst LANG_ATTR_RE = /\\blang\\s*=\\s*[\"']?([A-Za-z]+)/i;\n\n/** Rank grammars so mixed blocks pick the most permissive one (tsx ⊇ ts ⊇ js for our queries). */\nconst GRAMMAR_RANK: Record<string, number> = { js: 0, ts: 1, tsx: 2 };\n\nfunction grammarForAttr(attrs: string, fallback: string): string {\n const m = LANG_ATTR_RE.exec(attrs);\n if (!m) return fallback;\n const lang = m[1].toLowerCase();\n if (lang === 'ts' || lang === 'typescript') return 'ts';\n if (lang === 'tsx') return 'tsx';\n return 'js'; // js / jsx / anything exotic → the JS grammar\n}\n\n/**\n * Extract the script regions of a container-format file. Returns null for\n * non-container language ids (the caller parses the source as-is). A container\n * file with no script region returns a fully-blank mask — the file still gets\n * a graph node, it just defines nothing.\n */\nexport function extractEmbeddedScript(langId: string, source: string): EmbeddedScript | null {\n const spec = CONTAINERS[langId];\n if (!spec) return null;\n\n if (spec.kind === 'delimited') {\n const ranges: Range[] = [];\n for (const m of source.matchAll(DELIMITED_RE)) {\n const body = m[1] ?? '';\n if (!body.trim()) continue;\n const start = m.index + m[0].indexOf(body);\n ranges.push({ start, end: start + body.length });\n }\n // Fragments are expressions/statements cut from one template — terminate\n // each region (on the trim/closing char, still inside the match, so the\n // length is unchanged) so `<%= a %> … <%= b %>` on one line parses as two\n // statements rather than one garbled one.\n return { langId: spec.lang, masked: mask(source, ranges, { terminate: true }) };\n }\n\n const ranges: Range[] = [];\n let grammar = spec.defaultLang;\n\n if (spec.frontmatter) {\n const fence = ASTRO_FENCE_RE.exec(source);\n if (fence) {\n const start = fence[0].indexOf('\\n') + 1;\n ranges.push({ start, end: start + fence[1].length });\n }\n }\n\n for (const m of source.matchAll(SCRIPT_RE)) {\n const attrs = m[1] ?? '';\n const body = m[2] ?? '';\n if (!body) continue;\n const start = m.index + '<script'.length + attrs.length + 1; // past the tag's '>'\n ranges.push({ start, end: start + body.length });\n const g = grammarForAttr(attrs, spec.defaultLang);\n if (GRAMMAR_RANK[g] > GRAMMAR_RANK[grammar]) grammar = g;\n }\n\n return { langId: grammar, masked: mask(source, ranges) };\n}\n\n/**\n * Blank everything outside `ranges` to spaces, preserving newlines (and CR).\n * With `terminate`, the character right after each range (part of the closing\n * delimiter, never a newline) becomes `;` — a statement boundary for the\n * embedded language.\n */\nfunction mask(source: string, ranges: Range[], opts: { terminate?: boolean } = {}): string {\n const out = new Array<string>(source.length);\n for (let i = 0; i < source.length; i++) {\n const ch = source[i];\n out[i] = ch === '\\n' || ch === '\\r' ? ch : ' ';\n }\n for (const r of ranges) {\n for (let i = r.start; i < r.end && i < source.length; i++) out[i] = source[i];\n if (opts.terminate && r.end < source.length && out[r.end] === ' ') out[r.end] = ';';\n }\n return out.join('');\n}\n","import { Query, type Node, type Language } from 'web-tree-sitter';\nimport { parserFor, loadLanguage } from './grammars.js';\nimport { langById } from './languages.js';\nimport { queriesFor, type DefRule } from './queries.js';\nimport { extractEmbeddedScript } from './sfc.js';\nimport { hashString } from './hash.js';\nimport { redactSecrets } from '../core-open/utils/redact.js';\nimport type { FileParse, RawCall, RawDef, RawGuard, RawHeritage, RawImport, RawTypeRef } from './types.js';\n\n/**\n * Parse a single file's source into the raw symbol/edge tables. Pure and\n * deterministic: identical (lang, source) → identical FileParse. Cross-file\n * resolution is a later stage (resolve.ts); here we only see one file.\n */\n\n// Compiled queries are cached per (lang, querySource) — compilation is the\n// expensive part and queries are reused across every file of a language.\nconst compiledCache = new Map<string, Query | null>();\n\nfunction compile(lang: Language, langId: string, source: string): Query | null {\n const key = `${langId}::${source}`;\n if (compiledCache.has(key)) return compiledCache.get(key) ?? null;\n let q: Query | null = null;\n try {\n q = new Query(lang, source);\n } catch {\n q = null; // grammar doesn't support this pattern — skip it gracefully\n }\n compiledCache.set(key, q);\n return q;\n}\n\nfunction namedCapture(\n captures: { name: string; node: Node }[],\n name: string,\n): Node | undefined {\n return captures.find((c) => c.name === name)?.node;\n}\n\n/**\n * Wrapper node types that sit between a *qualified* callee identifier and the\n * call node (`obj.foo()` / `pkg::foo()` / `recv.foo()` across the grammars).\n * A bare call's identifier hangs directly off the call node instead.\n */\nconst MEMBER_PARENT_TYPES = new Set([\n 'member_expression', // ts/js: obj.foo()\n 'attribute', // python: obj.foo()\n 'selector_expression', // go: pkg.Foo()\n 'field_expression', // rust/scala/c/cpp/zig: recv.foo()\n 'scoped_identifier', // rust: Type::foo()\n 'member_access_expression', // c#: obj.Foo()\n 'qualified_identifier', // c++: ns::f(), Type::m()\n 'dot', // elixir: Mod.fun()\n 'navigation_suffix', // kotlin/swift: recv.foo()\n 'member_call_expression', // php: $x->m()\n 'nullsafe_member_call_expression', // php: $x?->m()\n 'scoped_call_expression', // php: X::m()\n 'unconditional_assignable_selector', // dart: x.foo()\n 'conditional_assignable_selector', // dart: x?.foo()\n 'cascade_selector', // dart: x..foo()\n 'value_identifier_path', // rescript: Mod.foo() (only exists for qualified calls)\n]);\n\n/**\n * Was this callee identifier part of a qualified call (`x.foo()`) rather than a\n * bare one (`foo()`)? The queries capture only the trailing name, so the\n * resolver needs this bit to know a same-file def with the same short name is\n * NOT evidence — the receiver points elsewhere (see resolve.ts).\n */\nfunction isQualifiedCallee(node: Node): boolean {\n const parent = node.parent;\n if (!parent) return false;\n if (MEMBER_PARENT_TYPES.has(parent.type)) return true;\n // Java `method_invocation` and Ruby `call` keep receiver and name on the call\n // node itself — qualified iff the receiver/object field is present.\n if (parent.type === 'method_invocation') return parent.childForFieldName('object') != null;\n // Ruby `call` carries a `receiver` field when qualified; Python's `call` has\n // no such field (its qualified form is the `attribute` wrapper above), and\n // Elixir's `call` has none either (its qualified form is the `dot` wrapper).\n if (parent.type === 'call') return parent.childForFieldName('receiver') != null;\n // Lua wraps every callee in `variable`; qualified iff a `table` receiver exists\n // (`repo.fetch()` / `repo:method()` carry table:, bare `foo()` has only name:).\n if (parent.type === 'variable') return parent.childForFieldName('table') != null;\n // OCaml wraps every callee in `value_path`; qualified iff a module path is\n // present (`Mod.f x` has two named children, bare `f x` has one).\n if (parent.type === 'value_path') return parent.namedChildCount > 1;\n // ObjC message sends: `[obj doThing]` points elsewhere, but `[self …]` /\n // `[super …]` stay within the class — same-file evidence still counts there.\n if (parent.type === 'message_expression') {\n const recv = parent.childForFieldName('receiver');\n return recv != null && recv.text !== 'self' && recv.text !== 'super';\n }\n return false;\n}\n\nfunction signatureOf(source: string, def: Node, langId: string): string {\n // The text up to the body opening, single-lined, bounded — a deterministic,\n // human-meaningful signature without dragging in the whole body.\n // - Brace languages: cut at the body `{`.\n // - Python: cut at the def-terminating `:` at bracket-depth 0 (so a `:` inside\n // typed params / generics / the `-> Dict[...]` return type doesn't cut it,\n // and the docstring/body is excluded).\n // - Ruby: the header is the first line.\n const full = source.slice(def.startIndex, def.endIndex);\n let head: string;\n if (langId === 'py') head = pythonHeader(full);\n // Ruby/Elixir: `do…end` bodies (and Elixir `%{}` default args would break a\n // brace cut) — the header is the first line.\n else if (langId === 'rb' || langId === 'ex') head = full.split('\\n')[0];\n else {\n const braceIdx = full.indexOf('{');\n head = braceIdx >= 0 ? full.slice(0, braceIdx) : full.split('\\n')[0];\n }\n head = head.replace(/\\s+/g, ' ').trim().replace(/[:{]\\s*$/, '').trim();\n return head.length > 200 ? `${head.slice(0, 197)}...` : head;\n}\n\n/**\n * A short doc summary for a definition — the leading doc-comment (JSDoc/TSDoc,\n * `//`, `///`, `#`) directly above it, or (Python) the body docstring. Gives a\n * tersely-named symbol real prose for semantic search. Deterministic, marker-\n * stripped, whitespace-collapsed, truncated; never the full body. Returns\n * undefined when there is no doc.\n */\nfunction scrubbedDoc(source: string, def: Node, langId: string): string | undefined {\n const doc = docOf(source, def, langId);\n return doc === undefined ? undefined : redactSecrets(doc);\n}\n\nfunction docOf(source: string, def: Node, langId: string): string | undefined {\n const lines = source.split('\\n');\n if (langId === 'py') return pythonDocstring(lines, def.startPosition.row);\n return leadingComment(lines, def.startPosition.row);\n}\n\n/** Contiguous comment lines directly above `row` (0-based), markers stripped. */\nfunction leadingComment(lines: string[], row: number): string | undefined {\n const collected: string[] = [];\n for (let r = row - 1; r >= 0; r--) {\n const line = lines[r].trim();\n if (line === '') break; // a blank line detaches the comment\n if (/^(\\/\\/|\\/\\*\\*?|\\*\\/?|#|;|--)/.test(line)) collected.unshift(line);\n else break;\n }\n if (!collected.length) return undefined;\n const text = collected\n .join('\\n')\n .replace(/\\/\\*\\*?|\\*\\//g, ' ') // /** and */\n .replace(/^\\s*[*]\\s?/gm, ' ') // leading * in block comments\n .replace(/^\\s*(\\/\\/+|#+|;+|--)\\s?/gm, ' ') // line-comment markers\n .replace(/@\\w+/g, ' '); // drop JSDoc tags (@param, @returns…)\n return clip(text);\n}\n\n/** The first string literal in a Python body (the docstring), if present. */\nfunction pythonDocstring(lines: string[], row: number): string | undefined {\n // Find the header's terminating line (ends with ':'), then the first non-blank line.\n let r = row;\n while (r < lines.length && !/:\\s*(#.*)?$/.test(lines[r])) r++;\n let j = r + 1;\n while (j < lines.length && lines[j].trim() === '') j++;\n const first = lines[j]?.trim() ?? '';\n const m = /^[rubfRUBF]{0,2}(\"\"\"|''')/.exec(first);\n if (!m) return undefined;\n const q = m[1];\n let rest = first.slice(first.indexOf(q) + 3);\n if (rest.includes(q)) return clip(rest.slice(0, rest.indexOf(q))); // single-line docstring\n const parts = [rest];\n for (let k = j + 1; k < lines.length; k++) {\n const idx = lines[k].indexOf(q);\n if (idx >= 0) {\n parts.push(lines[k].slice(0, idx));\n break;\n }\n parts.push(lines[k]);\n }\n return clip(parts.join(' '));\n}\n\nfunction clip(s: string): string | undefined {\n const t = s.replace(/\\s+/g, ' ').trim();\n if (!t) return undefined;\n return t.length > 200 ? `${t.slice(0, 197)}...` : t;\n}\n\n/** Python def/class header up to the terminating `:` at bracket-depth 0. */\nfunction pythonHeader(full: string): string {\n let depth = 0;\n for (let i = 0; i < full.length; i++) {\n const c = full[i];\n if (c === '(' || c === '[' || c === '{') depth++;\n else if (c === ')' || c === ']' || c === '}') depth--;\n else if (c === ':' && depth === 0) return full.slice(0, i);\n }\n return full.split('\\n')[0];\n}\n\nexport async function parseSource(\n rel: string,\n langId: string,\n source: string,\n): Promise<FileParse> {\n // Container formats (Vue/Svelte/Astro SFCs): parse the embedded script\n // region with the JS/TS grammar over a position-preserving mask, so every\n // offset/line below refers to the original file. The node keeps the\n // container's own lang id.\n const embedded = extractEmbeddedScript(langId, source);\n const effLangId = embedded?.langId ?? langId;\n const text = embedded?.masked ?? source;\n const def = langById(effLangId);\n const langQueries = queriesFor(effLangId);\n const hash = hashString(source);\n const result: FileParse = {\n rel,\n lang: langId,\n hash,\n bytes: Buffer.byteLength(source, 'utf8'),\n defs: [],\n calls: [],\n imports: [],\n heritage: [],\n typeRefs: [],\n guards: [],\n };\n if (!def || !langQueries) return result;\n\n const language = await loadLanguage(effLangId);\n const parser = await parserFor(def);\n const tree = parser.parse(text);\n if (!tree) return result;\n const root = tree.rootNode;\n\n // --- definitions ---\n const rawDefs: (RawDef & { _start: number; _end: number })[] = [];\n for (const rule of langQueries.defs) {\n collectDefs(language, effLangId, text, root, rule, rawDefs);\n }\n // Dedupe definitions that overlap on the same name+range (multiple rules can\n // match the same node, e.g. abstract vs plain class).\n const seen = new Set<string>();\n const deduped = rawDefs.filter((d) => {\n const key = `${d._start}:${d._end}:${d.name}:${d.kind}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n // Compute dotted qualified names by nesting (smallest enclosing def is parent).\n const byStart = [...deduped].sort((a, b) => a._start - b._start || b._end - a._end);\n for (const d of byStart) {\n const parent = enclosing(byStart, d._start, d._end);\n d.qualifiedName = parent ? `${parent.qualifiedName}.${d.name}` : d.name;\n }\n result.defs = byStart\n .map((d) => {\n const { _start, _end, ...rest } = d;\n void _start;\n void _end;\n return rest;\n })\n .sort(\n (a, b) =>\n a.startLine - b.startLine ||\n a.qualifiedName.localeCompare(b.qualifiedName) ||\n a.name.localeCompare(b.name),\n );\n\n // --- calls ---\n // A definition's own name node must never double as a call site: in\n // expression-based grammars (Elixir) a `def foo(…)` head is itself a `call`\n // node, which would fabricate a recursion edge for every definition.\n const defNameBytes = new Set<number>();\n for (const qsrc of langQueries.defs) {\n const q = compile(language, effLangId, qsrc.query);\n if (!q) continue;\n for (const m of q.matches(root)) {\n const nameNode = namedCapture(m.captures, 'name');\n if (nameNode) defNameBytes.add(nameNode.startIndex);\n }\n }\n const calls: RawCall[] = [];\n for (const qsrc of langQueries.calls) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'callee') continue;\n if (defNameBytes.has(cap.node.startIndex)) continue;\n calls.push({\n callee: cap.node.text,\n byte: cap.node.startIndex,\n line: cap.node.startPosition.row + 1,\n qualified: isQualifiedCallee(cap.node),\n });\n }\n }\n result.calls = calls.sort((a, b) => a.byte - b.byte || a.callee.localeCompare(b.callee));\n\n // --- imports ---\n const imports: RawImport[] = [];\n for (const qsrc of langQueries.imports) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'source') continue;\n imports.push({ source: stripQuotes(cap.node.text) });\n }\n }\n result.imports = dedupeImports(imports);\n\n // --- heritage (extends / implements) ---\n const heritage: RawHeritage[] = [];\n for (const qsrc of langQueries.heritage) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'extends' && cap.name !== 'implements') continue;\n heritage.push({ superName: cap.node.text, byte: cap.node.startIndex, kind: cap.name });\n }\n }\n result.heritage = heritage.sort(\n (a, b) =>\n a.byte - b.byte || a.kind.localeCompare(b.kind) || a.superName.localeCompare(b.superName),\n );\n\n // --- type references (constructor-param / field types → DI dependency edges) ---\n const typeRefs: RawTypeRef[] = [];\n for (const qsrc of langQueries.typeRefs ?? []) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'typeref') continue;\n typeRefs.push({ name: cap.node.text, byte: cap.node.startIndex });\n }\n }\n result.typeRefs = typeRefs.sort((a, b) => a.byte - b.byte || a.name.localeCompare(b.name));\n\n // --- namespaces declared by this file (C# cross-namespace resolution) ---\n const namespaces = new Set<string>();\n for (const qsrc of langQueries.namespaces ?? []) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'namespace') continue;\n const name = cap.node.text.trim();\n if (name) namespaces.add(name);\n }\n }\n if (namespaces.size) result.namespaces = [...namespaces].sort();\n\n // --- guards (assert-like expressions → invariant facts) ---\n const guards: RawGuard[] = [];\n for (const qsrc of langQueries.guards ?? []) {\n const q = compile(language, effLangId, qsrc);\n if (!q) continue;\n for (const cap of q.captures(root)) {\n if (cap.name !== 'guard') continue;\n const expr = cap.node.text.replace(/\\s+/g, ' ').trim();\n guards.push({ expr: expr.length > 160 ? `${expr.slice(0, 157)}...` : expr, line: cap.node.startPosition.row + 1 });\n }\n }\n result.guards = guards.sort((a, b) => a.line - b.line || a.expr.localeCompare(b.expr));\n\n tree.delete();\n return result;\n}\n\n/**\n * Dart splits a function into sibling signature + body nodes (and wraps class\n * methods in a method_signature). Return the trailing function_body so the def\n * span covers it — otherwise calls inside the body attribute to the file and\n * nested defs do not nest.\n */\nfunction dartBodyOf(defNode: Node): Node | null {\n if (!defNode.type.endsWith('_signature')) return null;\n if (defNode.nextNamedSibling?.type === 'function_body') return defNode.nextNamedSibling;\n const wrapper = defNode.parent;\n if (wrapper?.type === 'method_signature' && wrapper.nextNamedSibling?.type === 'function_body') {\n return wrapper.nextNamedSibling;\n }\n return null;\n}\n\nfunction collectDefs(\n language: Language,\n langId: string,\n source: string,\n root: Node,\n rule: DefRule,\n out: (RawDef & { _start: number; _end: number })[],\n): void {\n const q = compile(language, langId, rule.query);\n if (!q) return;\n for (const match of q.matches(root)) {\n const defNode = namedCapture(match.captures, 'def');\n const nameNode = namedCapture(match.captures, 'name');\n if (!defNode || !nameNode) continue;\n // Dart splits a function into sibling signature + body nodes; the def span\n // must cover the body or calls inside it would attribute to the file, and\n // nested defs would not nest.\n const spanEnd = dartBodyOf(defNode) ?? defNode;\n out.push({\n kind: rule.kind,\n name: nameNode.text,\n qualifiedName: nameNode.text, // refined after nesting is computed\n startLine: defNode.startPosition.row + 1,\n endLine: spanEnd.endPosition.row + 1,\n startByte: defNode.startIndex,\n endByte: spanEnd.endIndex,\n signature:\n rule.kind === 'function' || rule.kind === 'method'\n ? redactSecrets(signatureOf(source, defNode, langId))\n : undefined,\n // GUARDRAILS §1: signatures/docs are lifted verbatim from source and are\n // persisted (graph.json, `vg share` commits it) — scrub at ingest.\n doc: scrubbedDoc(source, defNode, langId),\n visibility: undefined,\n _start: defNode.startIndex,\n _end: spanEnd.endIndex,\n });\n }\n}\n\n/** The smallest def strictly containing [start,end) other than itself. */\nfunction enclosing(\n defs: { qualifiedName: string; _start: number; _end: number }[],\n start: number,\n end: number,\n): { qualifiedName: string } | undefined {\n let best: { qualifiedName: string; _start: number; _end: number } | undefined;\n for (const d of defs) {\n if (d._start === start && d._end === end) continue;\n if (d._start <= start && d._end >= end) {\n if (!best || d._end - d._start < best._end - best._start) best = d;\n }\n }\n return best;\n}\n\nfunction stripQuotes(text: string): string {\n return text.replace(/^['\"`]|['\"`]$/g, '');\n}\n\nfunction dedupeImports(imports: RawImport[]): RawImport[] {\n const seen = new Set<string>();\n const out: RawImport[] = [];\n for (const i of imports.sort((a, b) => a.source.localeCompare(b.source))) {\n if (seen.has(i.source)) continue;\n seen.add(i.source);\n out.push(i);\n }\n return out;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/serialize.ts","../src/engine/cache.ts","../src/engine/lock.ts","../src/engine/embeddings.ts","../src/engine/relations.ts","../src/engine/query.ts","../src/engine/impact.ts","../src/engine/savings.ts"],"names":["path","fs","fs2","path2","text","round","path4","fs4","round2"],"mappings":";;;;;;;;AAWO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,OAAO,CAAA,EAAG,eAAA,CAAgB,KAAA,EAAO,CAAC,CAAC;AAAA,CAAA;AACrC;AAEO,SAAS,eAAA,CAAgB,KAAA,EAAgB,MAAA,GAAS,CAAA,EAAW;AAClE,EAAA,OAAO,KAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG,MAAM,MAAM,CAAA;AACrD;AAEA,SAAS,SAAS,KAAA,EAAyB;AACzC,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,KAAA,CAAM,IAAI,QAAQ,CAAA;AACnD,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA;AACd,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,OAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,MAAK,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,MAAM,GAAG,CAAA;AACnB,MAAA,IAAI,MAAM,MAAA,EAAW;AACrB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA;AAAA,IACvB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,WAAW,IAAA,EAAuB;AAChD,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;ACjBA,IAAM,aAAA,GAAgB,kBAAA;AAiBf,SAAS,SAAS,IAAA,EAAsB;AAC7C,EAAA,OAAYA,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,WAAA,EAAa,OAAO,CAAA;AAC7C;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,OAAYA,KAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,kBAAkB,CAAA;AACrD;AAEO,SAAS,SAAA,CACd,MACA,IAAA,EACY;AACZ,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,EAAA,IAAI,IAAA,GAAkB;AAAA,IACpB,OAAA,EAAS,aAAA;AAAA,IACT,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,SAAS;AAAC,GACZ;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAeC,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAASA,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AAGvD,MAAA,IACE,MAAA,CAAO,OAAA,KAAY,aAAA,IACnB,MAAA,CAAO,WAAA,KAAgB,IAAA,CAAK,WAAA,IAC5B,MAAA,CAAO,QAAA,KAAa,IAAA,CAAK,QAAA,IACzB,MAAA,CAAO,OAAA,EACP;AACA,QAAA,IAAA,GAAO,MAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,GAAA,CAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,MAAA,OAAO,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,IAAA,GAAO,MAAM,KAAA,GAAQ,MAAA;AAAA,IACtD,CAAA;AAAA,IACA,GAAA,CAAI,KAAK,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,QAAQ,GAAG,CAAA,GAAI,EAAE,IAAA,EAAM,KAAA,CAAM,MAAM,KAAA,EAAM;AAAA,IAChD,CAAA;AAAA,IACA,MAAM,WAAA,EAAa;AACjB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG;AAC3C,QAAA,IAAI,CAAC,YAAY,GAAA,CAAI,GAAG,GAAG,OAAO,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAAA,IACA,IAAA,GAAO;AACL,MAAGA,cAAU,QAAA,CAAS,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAGA,GAAA,CAAA,aAAA,CAAc,IAAA,EAAM,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACjD;AAAA,GACF;AACF;ACjFO,IAAM,qBAAA,GAAwB,KAAK,EAAA,GAAK,GAAA;AAE/C,SAAS,eAAe,GAAA,EAAsB;AAC5C,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,OAAQ,EAA4B,IAAA,KAAS,OAAA;AAAA,EAC/C;AACF;AAEA,SAAS,WAAA,CAAY,MAAc,OAAA,EAA0B;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,KAAK,EAAA,EAAG,GAAI,KAAK,KAAA,CAASC,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AAC5D,IAAA,IAAI,OAAO,OAAO,QAAA,IAAY,IAAA,CAAK,KAAI,GAAI,EAAA,GAAK,SAAS,OAAO,IAAA;AAChE,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,CAAC,cAAA,CAAe,GAAG,GAAG,OAAO,IAAA;AAC5D,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGO,SAAS,WAAA,CAAY,IAAA,EAAc,OAAA,GAAU,qBAAA,EAAgC;AAClF,EAAA,MAAM,QAAQ,MAAe;AAC3B,IAAA,IAAI;AACF,MAAGA,cAAeC,KAAA,CAAA,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAM,EAAA,GAAQD,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AACjC,MAAGA,GAAA,CAAA,aAAA,CAAc,EAAA,EAAI,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,OAAA,CAAQ,GAAA,EAAK,EAAA,EAAI,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,CAAA;AACzE,MAAGA,cAAU,EAAE,CAAA;AACf,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,IAAA;AACpB,EAAA,IAAI,WAAA,CAAY,IAAA,EAAM,OAAO,CAAA,EAAG;AAC9B,IAAA,IAAI;AACF,MAAGA,GAAA,CAAA,MAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,KAAA,EAAM;AAAA,EACf;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,YAAY,IAAA,EAAoB;AAC9C,EAAA,IAAI;AACF,IAAGA,GAAA,CAAA,MAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACnBO,SAAS,kBAAkB,KAAA,EAAwB;AACxD,EAAA,OAAO,KAAA,IAAS,mBAAA;AAClB;AAUO,SAAS,aAAA,GAAwB;AACtC,EAAA,MAAM,OAAO,OAAA,CAAQ,GAAA,CAAI,kBAAuB,KAAA,CAAA,IAAA,CAAQ,EAAA,CAAA,OAAA,IAAW,QAAQ,CAAA;AAC3E,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,QAAQ,CAAA;AAC7C;AAGA,SAAS,iBAAiB,OAAA,EAAyB;AACjD,EAAA,OAAY,WAAK,aAAA,EAAc,EAAG,UAAU,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,CAAA;AAC7D;AAOO,SAAS,YAAA,CAAa,OAAA,GAAU,iBAAA,EAAkB,EAAY;AACnE,EAAA,OAAU,GAAA,CAAA,UAAA,CAAW,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAChD;AAOO,SAAS,mBAAmB,MAAA,EAAkC;AACnE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,kDAAA,EAAqD,eAAe,CAAA,gNAAA,CAAA;AAAA,IAC7E,KAAK,iBAAA;AACH,MAAA,OAAO,CAAA,0LAAA,CAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,CAAA,oFAAA,CAAA;AAAA,IACT,KAAK,aAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAA,kEAAA,CAAA;AAAA;AAEb;AASO,SAAS,cAAA,CAAe,OAAA,GAAU,iBAAA,EAAkB,EAAmB;AAC5E,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,OAAO,EAAE,GAAA,EAAK,OAAA,EAAS,YAAA,CAAa,OAAO,CAAA,IAAQ,GAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,EAAE;AAC1F;AAGO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,MAAM,aAAA,EAAc;AAC1B,EAAA,MAAM,KAAA,GAAQ,QAAQ,GAAG,CAAA;AACzB,EAAA,IAAI;AACF,IAAG,WAAO,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAqB;AACpC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAa,GAAA,CAAA,WAAA,CAAY,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,CAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,CAAA,GAAS,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,CAAA,CAAE,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAA,CAAE,WAAA,EAAY,EAAG,KAAA,IAAS,QAAQ,CAAC,CAAA;AAAA,SAClC;AACH,MAAA,IAAI;AACF,QAAA,KAAA,IAAY,GAAA,CAAA,QAAA,CAAS,CAAC,CAAA,CAAE,IAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAkB,CAAA,EAAqB;AAC9C,EAAA,MAAM,OAAQ,CAAA,EAAyC,IAAA;AACvD,EAAA,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,OAAA,IAAW,IAAA,KAAS,OAAA;AAC3D;AAOO,SAAS,gBAAA,CAAiB,MAAc,OAAA,EAA0B;AACvE,EAAA,OAAU,GAAA,CAAA,UAAA,CAAgB,KAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,KAAA,CAAO,CAAC,CAAA;AACpF;AAOA,eAAsB,YAAA,CAAa,OAAA,GAA+B,EAAC,EAA6B;AAG9F,EAAA,IAAI,OAAA,CAAQ,OAAO,OAAO,IAAA;AAC1B,EAAA,MAAM,OAAA,GAAU,iBAAA,CAAkB,OAAA,CAAQ,KAAK,CAAA;AAE/C,EAAA,IAAI,QAAQ,UAAA,IAAc,CAAC,YAAA,CAAa,OAAO,GAAG,OAAO,IAAA;AACzD,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,KAAmC;AAC/C,IAAA,OAAA,CAAQ,gBAAgB,MAAM,CAAA;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,GAAA,GAAW,MAAM,kBAAA,EAAmB;AAC1C,EAAA,IAAI,CAAC,GAAA,EAAK,aAAA,EAAe,OAAO,KAAK,eAAe,CAAA;AAEpD,EAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,EAAA,IAAI;AACF,IAAG,GAAA,CAAA,SAAA,CAAU,KAAA,EAAO,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACzC,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA,GAAI,kBAAkB,aAAa,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI;AAMF,IAAA,MAAM,QAAa,MAAM,WAAA;AAAA,MACvB,GAAA,CAAI,cAAc,IAAA,CAAK;AAAA,QACrB,KAAA,EAAO,QAAA,CAAS,GAAA,EAAK,OAAO,CAAA;AAAA,QAC5B,QAAA,EAAU,KAAA;AAAA,QACV,oBAAA,EAAsB,QAAQ,oBAAA,IAAwB;AAAA,OACvD,CAAA;AAAA,MACD,kBAAA,EAAmB;AAAA,MACnB;AAAA,KACF;AAEA,IAAA,IAAI;AACF,MAAG,GAAA,CAAA,aAAA,CAAc,iBAAiB,OAAO,CAAA,EAAA,qBAAO,IAAA,CAAK,CAAC,CAAA,EAAE,WAAA,EAAa,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,OAAA;AAAA,MACJ,MAAM,MAAM,KAAA,EAAO;AACjB,QAAA,MAAM,MAAkB,EAAC;AACzB,QAAA,WAAA,MAAiB,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,KAAA,EAAO,EAAE,CAAA,EAAG;AAChD,UAAA,KAAA,MAAW,KAAK,KAAA,EAAO,GAAA,CAAI,KAAK,KAAA,CAAM,IAAA,CAAK,CAAsB,CAAC,CAAA;AAAA,QACpE;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAA;AAAA,MACA,MAAM,WAAW,IAAA,EAAM;AACrB,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA;AACrC,QAAA,OAAO,KAAA,CAAM,KAAK,CAAsB,CAAA;AAAA,MAC1C;AAAA,KACF;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,CAAC,CAAA,GAAI,kBAAkB,iBAAiB,CAAA;AAAA,EACxE;AACF;AAWA,eAAe,kBAAA,GAAmC;AAChD,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,sBAAA;AAC5B,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,aAAA,CAAmB,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAC,CAAA;AAC5D,MAAA,MAAM,GAAA,GAAW,MAAM,OAAO,aAAA,CAAc,IAAI,OAAA,CAAQ,WAAW,CAAC,CAAA,CAAE,IAAA,CAAA;AAEtE,MAAA,MAAM,QAAA,GAAW,GAAA,EAAK,aAAA,GAAgB,GAAA,GAAM,GAAA,EAAK,OAAA;AACjD,MAAA,IAAI,QAAA,EAAU,eAAe,OAAO,QAAA;AAAA,IACtC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,MAAM,OAAO,WAAqB,CAAA,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC7D;AAGA,SAAS,kBAAA,GAA6B;AACpC,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAChD,EAAA,OAAO,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,IAAI,CAAA,GAAI,GAAA;AAC3C;AAGA,eAAsB,WAAA,CAAe,OAAA,EAAqB,EAAA,EAAY,OAAA,EAA6B;AACjG,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAQ,IAAA,CAAK;AAAA,MACxB,OAAA;AAAA,MACA,IAAI,OAAA,CAAe,CAAC,CAAA,EAAG,MAAA,KAAW;AAChC,QAAA,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,CAAA;AACvD,QAAA,KAAA,CAAM,KAAA,IAAQ;AAAA,MAChB,CAAC;AAAA,KACF,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;AAEA,SAAS,QAAA,CAAS,KAAU,EAAA,EAAqB;AAC/C,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,cAAA,IAAkB,EAAC;AACjC,EAAA,IAAI,YAAA,CAAa,KAAK,EAAE,CAAA,SAAU,CAAA,CAAE,aAAA,IAAiB,EAAE,UAAA,IAAc,EAAA;AACrE,EAAA,IAAI,YAAY,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,EAAE,YAAA,IAAgB,EAAA;AACnD,EAAA,IAAI,cAAc,IAAA,CAAK,EAAE,CAAA,EAAG,OAAO,EAAE,aAAA,IAAiB,EAAA;AACtD,EAAA,OAAO,EAAA;AACT;AAGA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,MAAA;AAAA,EACtE,UAAA;AAAA,EAAY,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,WAAA;AAAA,EAAa,MAAA;AAAA,EAAQ,cAAA;AAAA,EAAgB,UAAA;AAAA,EACzE,KAAA;AAAA,EAAO,SAAA;AAAA,EAAW,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AAClD,CAAC,CAAA;AAGD,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,EAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,MAAS,EAAA,EAAI,OAAA,CAAQ,YAAY,EAAE,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,CAAC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA;AACtE,EAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,EAAG,IAAI,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC3D;AAUO,SAAS,aAAA,CAAc,MAAiB,SAAA,EAA4B;AACzE,EAAA,OAAO,CAAC,KAAK,aAAA,EAAe,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,IAAa,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,EAAA,EAAI,YAAY,IAAA,CAAK,IAAI,GAAG,SAAA,IAAa,EAAE,EACjH,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA;AACb;AAEO,SAAS,MAAA,CAAO,GAAa,CAAA,EAAqB;AACvD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,IAAI,EAAA,GAAK,CAAA;AACT,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,GAAA,IAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AACjB,IAAA,EAAA,IAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAChB,IAAA,EAAA,IAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,EAAA,KAAO,CAAA,IAAK,EAAA,KAAO,CAAA,EAAG,OAAO,CAAA;AACjC,EAAA,OAAO,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,GAAI,IAAA,CAAK,KAAK,EAAE,CAAA,CAAA;AAC5C;AAWA,IAAM,WAAA,GAAc,GAAA;AAEpB,IAAM,uBAAA,GAA0B,IAAA;AAEhC,SAAS,eAAA,CAAgB,MAAc,OAAA,EAAyB;AAC9D,EAAA,OAAY,KAAA,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA,EAAG,cAAc,IAAA,CAAK,OAAO,CAAC,CAAA,KAAA,CAAO,CAAA;AACrE;AAOO,SAAS,YAAA,CAAa,KAAA,EAAgB,IAAA,EAAc,OAAA,EAAyB;AAClF,EAAA,MAAM,UAAU,gBAAA,CAAiB,eAAA,CAAgB,IAAA,EAAM,OAAO,GAAG,OAAO,CAAA;AACxE,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAU,CAAC,CAAA;AAC1E,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,SAAS,UAAA,EAAY;AAChD,IAAA,MAAM,CAAA,GAAI,WAAW,aAAA,CAAc,CAAA,EAAG,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA;AAC5D,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AAC3B,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,CAAA,EAAG,OAAA,EAAA;AAAA,EACpC;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,gBAAA,CAAiB,MAAc,OAAA,EAAwC;AAC9E,EAAA,IAAI,CAAI,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,SAAU,EAAC;AAClC,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AACvD,IAAA,IAAI,OAAO,KAAA,KAAU,OAAA,IAAW,MAAA,CAAO,OAAA,SAAgB,MAAA,CAAO,OAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAC;AACV;AAYA,eAAsB,iBAAA,CACpB,KAAA,EACA,QAAA,EACA,IAAA,EACA,UAAA,EACgC;AAChC,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,QAAA,CAAS,EAAE,CAAA;AAC9C,EAAA,IAAI,QAAoB,EAAE,KAAA,EAAO,SAAS,EAAA,EAAI,OAAA,EAAS,EAAC,EAAE;AAC1D,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAS,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AACvD,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,CAAS,EAAA,IAAM,MAAA,CAAO,SAAS,KAAA,GAAQ,MAAA;AAAA,IAC9D,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,KAAK,CAAU,CAAC,CAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACpF,EAAA,MAAM,UAAwD,EAAC;AAC/D,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,OAAO,aAAA,CAAc,CAAA,EAAG,UAAU,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACnD,IAAA,MAAM,CAAA,GAAI,WAAW,IAAI,CAAA;AACzB,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAA;AACjC,IAAA,IAAI,MAAA,IAAU,OAAO,IAAA,KAAS,CAAA,UAAW,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,MAAA,CAAO,GAAG,CAAA;AAAA,SACxD,OAAA,CAAQ,KAAK,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI;AACF,MAAG,cAAU,QAAA,CAAS,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,MAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,QAAQ,GAAG,CAAA,CAAA;AACtC,MAAG,GAAA,CAAA,aAAA,CAAc,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAC3C,MAAG,GAAA,CAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAIlB,IAAA,MAAM,IAAA,GAAO,GAAG,IAAI,CAAA,KAAA,CAAA;AACpB,IAAA,IAAI,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG,OAAO,OAAA;AAC/B,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,CAAA,EAAG,QAAQ,MAAM,CAAA;AAC9B,MAAA,IAAI,SAAA,GAAY,KAAK,GAAA,EAAI;AACzB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,EAAQ,KAAK,WAAA,EAAa;AACpD,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1D,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,CAAA,IAAK,EAAC;AACxB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,GAAG,CAAA;AACrB,UAAA,KAAA,CAAM,OAAA,CAAQ,EAAE,EAAE,CAAA,GAAI,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,GAAA,EAAI;AAAA,QAC5C,CAAC,CAAA;AACD,QAAA,UAAA,GAAa,IAAA,CAAK,IAAI,CAAA,GAAI,WAAA,EAAa,QAAQ,MAAM,CAAA,EAAG,QAAQ,MAAM,CAAA;AAEtE,QAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,uBAAA,EAAyB;AACrD,UAAA,OAAA,EAAQ;AACR,UAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,QACvB;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAC7C,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG,IAAI,CAAC,IAAA,CAAK,IAAI,EAAE,CAAA,EAAG,OAAO,KAAA,CAAM,QAAQ,EAAE,CAAA;AACvF,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA,SAAE;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,KAAK,EAAA,EAAoB;AAChC,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACzC;;;ACtcO,IAAM,aAAN,MAAiB;AAAA,EAKtB,YAAqB,KAAA,EAAgB;AAAhB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACnB,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO,IAAA,CAAK,SAAS,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AACtD,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,GAAA,EAAK,CAAC,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA,EANqB,KAAA;AAAA,EAJZ,QAAA,uBAAe,GAAA,EAAuB;AAAA,EACvC,OAAA,uBAAc,GAAA,EAAyB;AAAA,EACvC,MAAA,uBAAa,GAAA,EAAyB;AAAA,EAU9C,GAAA,CAAI,IAAY,IAAA,EAA8B;AAC5C,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,KAAK,EAAC;AACrC,IAAA,OAAO,IAAA,GAAO,IAAI,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,GAAI,GAAA;AAAA,EACrD;AAAA,EAEA,EAAA,CAAG,IAAY,IAAA,EAA8B;AAC3C,IAAA,MAAM,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAE,KAAK,EAAC;AACpC,IAAA,OAAO,IAAA,GAAO,IAAI,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,GAAI,GAAA;AAAA,EACrD;AAAA,EAEA,KAAK,EAAA,EAAmC;AACtC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ,EAAA,EAAoD;AAC1D,IAAA,OAAO,IAAA,CAAK,eAAe,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,EAAG,KAAK,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,QAAQ,EAAA,EAAoD;AAC1D,IAAA,OAAO,IAAA,CAAK,eAAe,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA,CAAE,MAAA,CAAO,WAAW,CAAA,EAAG,KAAK,CAAA;AAAA,EACnE;AAAA,EAEQ,cAAA,CAAe,OAAoB,GAAA,EAAoB;AAC7D,IAAA,MAAM,MAA8C,EAAC;AACrD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AACrC,MAAA,IAAI,MAAM,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAEA,IAAM,8BAAqC,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,YAAY,CAAC,CAAA;AACzE,SAAS,YAAY,CAAA,EAAuB;AAC1C,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AAC/B;AAEA,SAAS,IAAA,CAAK,GAAA,EAA+B,GAAA,EAAa,KAAA,EAAwB;AAChF,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACxB,EAAA,IAAI,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAAA,OACpB,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,CAAC,KAAK,CAAC,CAAA;AAC3B;AAoBA,IAAM,WAAA,uBAAkB,OAAA,EAA6B;AAE9C,SAAS,SAAS,KAAA,EAA4B;AACnD,EAAA,IAAI,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,IAAI,WAAW,KAAK,CAAA;AAC1B,IAAA,WAAA,CAAY,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,GAAA;AACT;;;AC7DA,IAAM,SAAA,uBAAgB,GAAA,CAAI;AAAA,EACxB,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,IAAA;AAAA,EAC1F,OAAA;AAAA,EAAS,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,GAAA;AAAA,EAAK,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,MAAA;AAAA,EACvF,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,IAAA;AAAA,EAAM,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQvF,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,aAAA;AAAA,EAAe,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,IAAA;AAAA,EACjD,gBAAA;AAAA,EAAkB,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,UAAA;AAAA,EAAY,UAAA;AAAA,EAAY;AAChE,CAAC,CAAA;AAEM,SAAS,UAAA,CAAW,KAAA,EAAgB,QAAA,EAAkB,OAAA,GAAwB,EAAC,EAAgB;AACpG,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,GAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAE5B,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,KAAQ,SAAA,CAAU,IAAA,EAAM,OAAO,QAAQ,CAAA;AACtD,IAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,IAAI,iBAAA,GAAoB,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,KAAK,CAAA;AAAA,EAC3G;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAK,aAAA,CAAc,aAAA,CAAc,CAAA,CAAE,IAAA,CAAK,aAAa,CAAC,CAAA;AAEnG,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACnC,EAAA,MAAM,EAAE,SAAS,cAAA,EAAe,GAAI,aAAa,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA;AAEtF,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,SAAS,cAAA,EAAe;AAC7D;AAeA,eAAsB,kBAAA,CACpB,KAAA,EACA,QAAA,EACA,OAAA,EACsB;AACtB,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,GAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,EAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,QAAQ,CAAA;AAG3D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AACxC,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,IAAA,MAAM,EAAE,KAAA,EAAO,GAAA,KAAQ,SAAA,CAAU,IAAA,EAAM,OAAO,QAAQ,CAAA;AACtD,IAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,GAAG,CAAA;AACxB,IAAA,IAAI,KAAA,GAAQ,QAAQ,MAAA,GAAS,KAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,IAAA,MAAM,OAAA,GAAU,SAAS,CAAA,GAAA,CAAK,MAAA,CAAO,IAAI,IAAA,CAAK,EAAE,CAAA,IAAK,CAAA,IAAK,MAAA,GAAS,CAAA;AACnE,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,KAAK,EAAE,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,QAAA,EAAU,GAAG,CAAC,CAAA,GAAI,CAAA;AACvD,IAAA,MAAM,MAAA,GAAS,GAAA,GAAM,OAAA,GAAU,GAAA,GAAM,GAAA;AACrC,IAAA,IAAI,UAAU,CAAA,EAAG;AACjB,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAClC,IAAA,MAAM,GAAA,GAAM,WAAW,GAAA,GAAM,GAAA,GAAM,mBAAmB,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GAAM,YAAA,CAAA;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,MAAA,IAAU,CAAA,GAAI,iBAAA,GAAoB,IAAA,CAAK,UAAA,CAAW,CAAA,EAAG,GAAA,EAAK,CAAA;AAAA,EAC7F;AACA,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAK,aAAA,CAAc,aAAA,CAAc,CAAA,CAAE,IAAA,CAAK,aAAa,CAAC,CAAA;AAEnG,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AACnC,EAAA,MAAM,EAAE,SAAS,cAAA,EAAe,GAAI,aAAa,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,MAAM,CAAA;AACtF,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,SAAS,cAAA,EAAe;AAC7D;AAaA,SAAS,SAAS,CAAA,EAAqB;AACrC,EAAA,OAAO;AAAA,IACL,GAAG,IAAI,GAAA;AAAA,MACL,EACG,WAAA,EAAY,CACZ,KAAA,CAAM,iBAAiB,EACvB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,IAAK,CAAC,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC;AAAA;AACrD,GACF;AACF;AAEA,SAAS,SAAA,CAAU,IAAA,EAAiB,KAAA,EAAiB,QAAA,GAAkC,MAAM,CAAA,EAAmC;AAC9H,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACnC,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,CAAc,WAAA,EAAY;AAC1C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AAGnC,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAC3C,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AAOrB,IAAA,MAAM,CAAA,GAAI,SAAS,CAAC,CAAA;AACpB,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,KAAA,IAAS,EAAA,GAAK,CAAA;AACd,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA,MAAA,IAAW,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,EAAG;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA,MAAA,IAAW,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,EAAG;AACzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb,CAAA,MAAA,IAAW,cAAA,CAAe,CAAA,EAAG,SAAS,CAAA,EAAG;AAIvC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA;AACb,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACnB,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG;AAC3B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA;AACb,MAAA,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,MAAA,GAAS,CAAA,SAAA,EAAY,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA,EAAG;AACxE;AAQA,IAAM,iBAAA,GAAoB,GAAA;AAU1B,SAAS,WAAA,CAAY,OAAgB,KAAA,EAAwC;AAC3E,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,MAAM,CAAA;AACrC,EAAA,MAAM,EAAA,uBAAS,GAAA,EAAoB;AACnC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,UAAA,EAAY;AACtD,IAAA,CAAA,EAAA;AACA,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY;AACnC,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AACvC,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,MAAM,GAAA,CAAI,CAAC,CAAA,IAAK,IAAA,CAAK,SAAS,CAAC,CAAA,EAAG,EAAA,CAAG,GAAA,CAAI,IAAI,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACtE;AAAA,EACF;AACA,EAAA,MAAM,CAAA,uBAAQ,GAAA,EAAoB;AAClC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,CAAA,KAAA,CAAO,EAAA,CAAG,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,CAAE,CAAA,GAAI,CAAA;AAGzD,IAAA,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,CAAC,CAAA,KAAc,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACpC;AAWO,SAAS,gBAAgB,IAAA,EAA2B;AACzD,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,IAAA,CACG,KAAA,CAAM,iEAAiE,CAAA,CACvE,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa;AAAA,GAC/B;AACF;AAGA,SAAS,cAAA,CAAe,MAAc,KAAA,EAA6B;AACjE,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AACzC,IAAA,IAAI,MAAA,IAAU,CAAA,IAAK,MAAA,IAAU,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,EAAG,OAAO,IAAA;AAAA,EAChF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAA,CAAgB,GAAW,CAAA,EAAmB;AACrD,EAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AACrC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAI,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAA;AAC/B,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,YAAA,CACP,KAAA,EACA,KAAA,EACA,QAAA,EACA,OACA,MAAA,EAC6C;AAC7C,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,QAAQ,CAAA,CAAE,CAAA;AACvC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,KAAK,wGAAwG,CAAA;AACnH,IAAA,MAAME,KAAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC5B,IAAA,OAAO,EAAE,OAAA,EAASA,KAAAA,EAAM,cAAA,EAAgB,cAAA,CAAeA,KAAI,CAAA,EAAE;AAAA,EAC/D;AAEA,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,GAAA,EAAI,IAAK,KAAA,EAAO;AACjC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,IAAA,CAAK,aAAa,MAAM,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AACtF,IAAA,IAAI,KAAK,SAAA,EAAW,KAAA,CAAM,KAAK,GAAA,GAAM,IAAA,CAAK,YAAY,GAAG,CAAA;AACzD,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA;AACtE,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,UAAU,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACjF,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,cAAc,MAAA,CAAO,OAAO,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACrF,IAAA,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,IAAA,CAAK,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,YAAA,EAAY,IAAA,CAAK,IAAI,GAAG,IAAA,CAAK,KAAA,GAAQ,cAAW,EAAE,CAAA,MAAA,EAAM,GAAG,CAAA,CAAE,CAAA;AAChH,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,IAAA,MAAM,YAAY,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA,CAAE,KAAK,IAAI,CAAA;AAC/C,IAAA,IAAI,eAAe,SAAS,CAAA,GAAI,MAAA,IAAU,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5D,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAC5B,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,cAAA,EAAgB,cAAA,CAAe,IAAI,CAAA,EAAE;AAC/D;AAEA,SAAS,OAAO,EAAA,EAAwB;AACtC,EAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,EAAE,CAAC,CAAA;AACxB;AAEA,SAAS,eAAe,IAAA,EAAsB;AAE5C,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAClC;AAEA,SAAS,MAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;;;ACxSA,IAAM,YAAA,uBAAmB,GAAA,CAAc,CAAC,QAAQ,QAAA,EAAU,SAAA,EAAW,YAAA,EAAc,YAAY,CAAC,CAAA;AAsBzF,SAAS,QAAA,CAAS,KAAA,EAAgB,MAAA,EAAgB,IAAA,GAA2B,EAAC,EAAiB;AACpG,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAE9B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAwB;AAC7C,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAGxB,EAAA,IAAI,WAA2C,CAAC,EAAE,IAAI,MAAA,EAAQ,IAAA,EAAM,GAAG,CAAA;AACvE,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,IAAS,QAAA,EAAU,KAAA,EAAA,EAAS;AAC9C,IAAA,MAAM,eAA+C,EAAC;AACtD,IAAA,KAAA,MAAW,EAAE,EAAA,EAAI,IAAA,EAAK,IAAK,QAAA,EAAU;AACnC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,EAAA,CAAG,EAAE,CAAA,EAAG;AAC5B,QAAA,IAAI,CAAC,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/B,QAAA,iBAAA,GAAoB,IAAA,CAAK,GAAA,CAAI,iBAAA,EAAmB,CAAA,CAAE,UAAU,CAAA;AAC5D,QAAA,MAAM,cAAc,CAAA,CAAE,GAAA;AACtB,QAAA,IAAI,WAAA,KAAgB,MAAA,IAAU,QAAA,CAAS,GAAA,CAAI,WAAW,CAAA,EAAG;AACzD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,MAAM,KAAA,GAAQC,MAAAA,CAAM,IAAA,GAAO,CAAA,CAAE,aAAa,GAAG,CAAA;AAC7C,QAAA,QAAA,CAAS,IAAI,WAAA,EAAa;AAAA,UACxB,IAAI,IAAA,CAAK,EAAA;AAAA,UACT,MAAM,IAAA,CAAK,aAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,IAAA,EAAM,KAAK,IAAA,CAAK,KAAA;AAAA,UAChB,KAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACb,CAAA;AACD,QAAA,YAAA,CAAa,KAAK,EAAE,EAAA,EAAI,WAAA,EAAa,IAAA,EAAM,OAAO,CAAA;AAAA,MACpD;AAAA,IACF;AACA,IAAA,QAAA,GAAW,YAAA;AACX,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAAA,EAC7B;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAG,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,IAAA;AAAA,IACnC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,UAAA,GAAa,EAAE,UAAA,IAAc,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI;AAAA,GAC3F;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,EAAE,EAAA,EAAI,QAAQ,IAAA,EAAM,IAAA,EAAM,iBAAiB,MAAA,EAAO;AAAA,IACxD,KAAA,EAAO,QAAA;AAAA,IACP,QAAA,EAAU,KAAA;AAAA,IACV,MAAA,EAAQ,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,CAAC,CAAA,CAAE,MAAA;AAAA,IAC3C,UAAA,EAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,CAAE,MAAA;AAAA,IAC7C,iBAAA,EAAmBA,OAAM,iBAAiB;AAAA,GAC5C;AACF;AAEA,SAASA,OAAM,CAAA,EAAmB;AAChC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;ACtEA,IAAM,MAAA,GAAS,eAAA;AAER,IAAM,eAAA,GAAkB;AAQxB,IAAM,gCAAgB,IAAI,GAAA,CAAI,CAAC,aAAA,EAAe,UAAA,EAAY,gBAAgB,CAAC;AAoB3E,IAAM,gBAAA,GAAqD;AAAA,EAChE,GAAA,EAAK,aAAA;AAAA,EACL,IAAA,EAAM,UAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM,WAAA;AAAA,EACN,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO,YAAA;AAAA,EACP,IAAA,EAAM;AACR;AASO,SAAS,eAAe,IAAA,EAAyC;AACtE,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,SAAA;AACrC,EAAA,MAAM,UAAU,IAAA,CACb,IAAA,EAAK,CACL,WAAA,GACA,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA,CAC7B,QAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,EAAA,OAAO,OAAA,IAAW,SAAA;AACpB;AAsCO,SAAS,gBAAgB,IAAA,EAAqD;AACnF,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,EAAU,OAAO,MAAA;AACrC,EAAA,MAAM,UAAU,IAAA,CACb,IAAA,EAAK,CACL,WAAA,GACA,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA,CAC/B,QAAQ,UAAA,EAAY,EAAE,CAAA,CACtB,KAAA,CAAM,GAAG,EAAE,CAAA;AACd,EAAA,OAAO,OAAA,IAAW,MAAA;AACpB;AAQO,SAAS,aAAA,CACd,IAAA,EACA,KAAA,EACA,GAAA,EACM;AACN,EAAA,YAAA;AAAA,IACE,IAAA;AAAA,IACA;AAAA,MACE,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AAAA,MACnC,UAAU,KAAA,CAAM,QAAA,GAAW,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA,GAAI,MAAA;AAAA,MAC5D,KAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,KAAK,CAAA;AAAA,MAClC,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,QAAA,EAAU,MAAM,QAAA,IAAY,CAAA;AAAA,MAC5B,cAAA,EAAA,CAAiB,KAAA,CAAM,aAAA,IAAiB,CAAA,IAAK;AAAA,KAC/C;AAAA,IACA;AAAA,GACF;AACF;AAOO,SAAS,kBAAkB,IAAA,EAAsB;AACtD,EAAA,OAAYC,KAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,MAAM,CAAA;AACzC;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,kBAAkB,IAAI,CAAA;AAC/B;AAGO,SAAS,gBAAgB,IAAA,EAAuB;AACrD,EAAA,OAAUC,GAAA,CAAA,UAAA,CAAW,UAAA,CAAW,IAAI,CAAC,CAAA;AACvC;AAUO,SAAS,aAAa,IAAA,EAAuB;AAClD,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAaA,eAAW,IAAI,CAAA;AAClC,EAAGA,GAAA,CAAA,MAAA,CAAO,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AAC/B,EAAGA,GAAA,CAAA,MAAA,CAAYD,KAAA,CAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,kBAAkB,CAAA,EAAG,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AACxE,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,YAAA,CAAa,IAAA,EAAc,KAAA,EAAgC,GAAA,EAAmB;AAC5F,EAAA,IAAI;AACF,IAAGC,cAAU,QAAA,CAAS,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU,EAAE,IAAI,GAAA,EAAK,GAAG,OAAO,CAAA;AACjD,IAAGA,GAAA,CAAA,cAAA,CAAe,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAI,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAiBA,IAAM,kBAAA,GAAqB,CAAA;AAC3B,IAAM,kBAAA,GAAqB,eAAA;AAEpB,SAAS,WAAA,CAAY,IAAA,EAAc,IAAA,EAAc,GAAA,EAAa,WAAW,kBAAA,EAAmC;AACjH,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAC3C,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAOA,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAWA,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5D,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,KAAK,MAAA,EAAQ;AAGnB,QAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAChC,QAAA,OAAA,EAAA;AACA,QAAA,QAAA,IAAY,CAAA,CAAE,QAAA;AACd,QAAA,cAAA,IAAkB,CAAA,CAAE,cAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAa,WAAW,GAAA,GAAO,QAAA;AACrC,EAAA,MAAM,eAAA,GAAmB,iBAAiB,GAAA,GAAO,QAAA;AACjD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAgB,IAAI,CAAA;AAAA,IAC7B,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,KAAA,EAAO,WAAW,CAAA,GAAI,IAAA,CAAK,MAAO,cAAA,GAAiB,QAAA,GAAY,GAAG,CAAA,GAAI,GAAA,GAAM,CAAA;AAAA,IAC5E,SAAA,EAAWC,QAAO,SAAS,CAAA;AAAA,IAC3B,eAAA,EAAiBA,QAAO,eAAe,CAAA;AAAA,IACvC,KAAA,EAAOA,OAAAA,CAAO,eAAA,GAAkB,SAAS,CAAA;AAAA,IACzC,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAASA,QAAO,CAAA,EAAmB;AACjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAC/B;AAoBO,SAAS,gBAAA,CAAiB,IAAA,EAAc,IAAA,EAAc,GAAA,EAAa,WAAW,kBAAA,EAAmC;AACtH,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAC3C,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA4F;AAChH,EAAA,IAAOD,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAWA,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5D,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,EAAA,GAAK,MAAA,IAAU,CAAC,CAAA,CAAE,KAAA,IAAS,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AAC7D,QAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,SAAA;AAC/B,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,EAAE,KAAK,CAAA,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,OAAO,OAAA,EAAS,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,MAAM,CAAA,EAAE;AACvF,QAAA,GAAA,CAAI,OAAA,EAAA;AACJ,QAAA,GAAA,CAAI,MAAM,CAAA,CAAE,QAAA;AACZ,QAAA,GAAA,CAAI,QAAQ,CAAA,CAAE,cAAA;AACd,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAA,CAAQ,OAAA,EAAS,CAAA,CACzB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,MAAO;AAAA,IAClB,GAAA;AAAA,IACA,UAAU,CAAA,CAAE,QAAA;AAAA,IACZ,OAAO,CAAA,CAAE,KAAA;AAAA,IACT,SAAS,CAAA,CAAE,OAAA;AAAA,IACX,UAAU,CAAA,CAAE,EAAA;AAAA,IACZ,gBAAgB,CAAA,CAAE,IAAA;AAAA,IAClB,OAAOC,OAAAA,CAAAA,CAAS,CAAA,CAAE,OAAO,CAAA,CAAE,EAAA,IAAM,MAAO,QAAQ;AAAA,GAClD,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AACnE;AA+CA,SAAS,iBAAiB,KAAA,EAAoD;AAC5E,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,OAAA,EAAS,CAAA,CACvB,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,KAAM;AACjB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,UAAU,CAAA,CAAE,IAAA;AACzC,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,UAAA,EAAY,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,IAAW,KAAA,GAAS,GAAG,CAAA,GAAI;AAAA,KAC7E;AAAA,EACF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,CAAI,aAAA,CAAc,CAAA,CAAE,GAAG,CAAC,CAAA;AACnE;AAQO,SAAS,SAAA,CAAU,IAAA,EAAc,IAAA,EAAc,GAAA,EAA0B;AAC9E,EAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,GAAO,EAAA,GAAK,KAAK,EAAA,GAAK,GAAA;AAC3C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA2B;AAC9C,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA2B;AAChD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAA2B;AAGhD,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAwC;AAC7D,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAA+B,GAAA,EAAa,OAAA,KAA2B;AACnF,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAC7D,IAAA,GAAA,CAAI,OAAO,CAAA,EAAA;AACX,IAAA,CAAA,CAAE,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,EAChB,CAAA;AACA,EAAA,IAAOD,GAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACvB,IAAA,KAAA,MAAW,QAAWA,GAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AAC5D,MAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAK,EAAG;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,KAAK,MAAA,EAAQ;AACnB,QAAA,MAAM,OAAA,GAAmB,EAAE,OAAA,IAAW,UAAA;AAGtC,QAAA,IAAA,CAAK,MAAA,EAAQ,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAC5B,QAAA,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,MAAA,IAAU,KAAA,EAAO,OAAO,CAAA;AACzC,QAAA,IAAA,CAAK,QAAA,EAAU,CAAA,CAAE,MAAA,IAAU,SAAA,EAAW,OAAO,CAAA;AAC7C,QAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,CAAA,CAAE,MAAM,CAAA,EAAG;AACzC,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAI,KAAK,EAAE,GAAA,EAAK,CAAA,EAAG,CAAA,EAAG,CAAA,EAAE;AACtD,UAAA,MAAA,CAAO,OAAO,CAAA,CAAE,EAAA;AAChB,UAAA,MAAA,CAAO,CAAA,EAAA;AACP,UAAA,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,MAAM,WAA0B,gBAAA,CAAiB,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAClE,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA;AACjC,IAAA,OAAO;AAAA,MACL,MAAM,CAAA,CAAE,GAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,YAAY,CAAA,CAAE,UAAA;AAAA,MACd,KAAA,EAAO,MAAA,IAAU,MAAA,CAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,CAAC,CAAA,GAAI;AAAA,KACtE;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AAAA,IACtB,CAAC,GAAG,CAAA,MAAO;AAAA,MACT,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA;AAAA,MACnB,QAAA,EAAU,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA;AAAA,MACzB,OAAA,EAAS,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA;AAAA,MACvB,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE;AAAA,KACnB,CAAA;AAAA,IACA,EAAE,OAAO,CAAA,EAAG,QAAA,EAAU,GAAG,OAAA,EAAS,CAAA,EAAG,MAAM,CAAA;AAAE,GAC/C;AACA,EAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA,GAC3B,IAAA,CAAK,KAAA,CAAM,SAAS,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA,GAAI,QAAA,CAAS,MAAM,CAAA,GAC3E,CAAA;AACJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,gBAAgB,IAAI,CAAA;AAAA,IAC7B,IAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA,EAAS,iBAAiB,QAAQ,CAAA;AAAA,IAClC,OAAA,EAAS,iBAAiB,QAAQ,CAAA;AAAA,IAClC,MAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-WNIIKCNF.js","sourcesContent":["import type { VgGraph } from '../schema.js';\n\n/**\n * Deterministic serialization of `graph.json`.\n *\n * Object keys are sorted recursively and arrays are emitted in the (already\n * stable) order the engine produced them, so two runs over identical content\n * yield byte-identical output — the determinism contract (VG-CLI-SPEC §1.3).\n * Pretty-printed (2-space) and newline-terminated so the committed artifact is\n * human-diffable and plays well with the union merge driver.\n */\nexport function serializeGraph(graph: VgGraph): string {\n return `${stableStringify(graph, 2)}\\n`;\n}\n\nexport function stableStringify(value: unknown, indent = 2): string {\n return JSON.stringify(sortKeys(value), null, indent);\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const input = value as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(input).sort()) {\n const v = input[key];\n if (v === undefined) continue; // omit undefined for stable output\n out[key] = sortKeys(v);\n }\n return out;\n }\n return value;\n}\n\nexport function parseGraph(json: string): VgGraph {\n return JSON.parse(json) as VgGraph;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { stableStringify } from './serialize.js';\nimport type { FileParse } from './types.js';\n\n/**\n * Incremental parse cache. Maps a file's content hash to its parsed\n * symbol/edge tables, so a rebuild re-parses only files whose content actually\n * changed (VG-DEVELOPMENT-PLAN Phase 0.4). Lives under `.vibgrate/cache/` and is\n * gitignored — never part of the committed artifact.\n *\n * The cache is a pure performance optimisation: a reused FileParse is identical\n * to a freshly-parsed one (parsing is pure over content), so the graph is\n * byte-identical whether or not the cache was warm. `--no-cache` / `vg verify`\n * prove this.\n */\n\n// Bumped to /3: FileParse now carries `namespaces` (C# cross-namespace\n// resolution); a cache written before this lacks it and must be re-parsed.\nconst CACHE_VERSION = 'vg-parse-cache/3';\n\ninterface CacheFile {\n version: string;\n toolVersion: string;\n grammars: string;\n entries: Record<string, { hash: string; parse: FileParse }>;\n}\n\nexport interface ParseCache {\n get(rel: string, hash: string): FileParse | undefined;\n set(rel: string, parse: FileParse): void;\n /** Drop entries for files no longer present. */\n prune(currentRels: Set<string>): void;\n save(): void;\n}\n\nexport function cacheDir(root: string): string {\n return path.join(root, '.vibgrate', 'cache');\n}\n\nfunction cachePath(root: string): string {\n return path.join(cacheDir(root), 'parse-cache.json');\n}\n\nexport function loadCache(\n root: string,\n opts: { toolVersion: string; grammars: string; disabled?: boolean },\n): ParseCache {\n const file = cachePath(root);\n let data: CacheFile = {\n version: CACHE_VERSION,\n toolVersion: opts.toolVersion,\n grammars: opts.grammars,\n entries: {},\n };\n\n if (!opts.disabled && fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as CacheFile;\n // Invalidate wholesale if the tool or grammars changed — those are\n // determinism inputs, so a stale parse could differ from a fresh one.\n if (\n loaded.version === CACHE_VERSION &&\n loaded.toolVersion === opts.toolVersion &&\n loaded.grammars === opts.grammars &&\n loaded.entries\n ) {\n data = loaded;\n }\n } catch {\n /* corrupt cache — start fresh */\n }\n }\n\n return {\n get(rel, hash) {\n const entry = data.entries[rel];\n return entry && entry.hash === hash ? entry.parse : undefined;\n },\n set(rel, parse) {\n data.entries[rel] = { hash: parse.hash, parse };\n },\n prune(currentRels) {\n for (const rel of Object.keys(data.entries)) {\n if (!currentRels.has(rel)) delete data.entries[rel];\n }\n },\n save() {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n fs.writeFileSync(file, stableStringify(data, 0));\n },\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Cross-process single-writer lock (O_EXCL create), shared by the embedding\n * cache writer and the auto-refresh rebuild so two vg processes never write\n * the same repo-local artifact at once. A lock whose owning process is dead,\n * or that is older than `staleMs`, is presumed abandoned and reclaimed.\n */\n\n/** A lock older than this is presumed dead (crashed process). */\nexport const DEFAULT_LOCK_STALE_MS = 15 * 60 * 1000;\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException).code === 'EPERM'; // exists, just not ours to signal\n }\n}\n\nfunction lockIsStale(file: string, staleMs: number): boolean {\n try {\n const { pid, at } = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: number; at?: number };\n if (typeof at === 'number' && Date.now() - at > staleMs) return true;\n if (typeof pid === 'number' && !isProcessAlive(pid)) return true;\n return false;\n } catch {\n return true; // unreadable/corrupt → reclaim it\n }\n}\n\n/** Take the lock (O_EXCL), reclaiming a stale/dead one. Returns success. */\nexport function acquireLock(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n const write = (): boolean => {\n try {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const fd = fs.openSync(file, 'wx');\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: Date.now() }));\n fs.closeSync(fd);\n return true;\n } catch {\n return false;\n }\n };\n if (write()) return true;\n if (lockIsStale(file, staleMs)) {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* another process may have reclaimed it */\n }\n return write();\n }\n return false;\n}\n\nexport function releaseLock(file: string): void {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* best-effort */\n }\n}\n","import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { hashString } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { acquireLock, releaseLock } from './lock.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Local-embedding semantic search for `vg ask --semantic`/`--deep` (no API key).\n *\n * The embedding backend is an OPTIONAL, lazily-loaded dependency (`fastembed`,\n * Apache-2.0, local ONNX) so the core install stays lean and `ask` never breaks:\n * if the backend or model isn't available it degrades to (prefix-fuzzy) lexical\n * search with a clear note. Embeddings are query-time + cached under\n * `.vibgrate/cache/` (keyed by node-text hash); they are NEVER written into the\n * committed `graph.json`, so the artifact stays byte-deterministic.\n *\n * `--local` disables the model download (semantic is skipped unless already\n * cached via an injected backend), keeping the air-gapped guarantee.\n */\n\nexport interface Embedder {\n /** Stable model id (recorded with cached vectors so a model change invalidates them). */\n id: string;\n /** Embed documents → unit-or-raw vectors (cosine handles normalization). */\n embed(texts: string[]): Promise<number[][]>;\n /** Embed a single query string. */\n embedQuery(text: string): Promise<number[]>;\n}\n\n/** Why semantic fell back to lexical — for calm, specific messaging. */\nexport type EmbedUnavailable = 'not-installed' | 'no-permission' | 'download-failed' | 'init-failed';\n\nexport interface LoadEmbedderOptions {\n local?: boolean; // --local: do not download a model\n model?: string; // override the embedding model id\n noDownload?: boolean; // only load if the model is already cached (never fetch)\n showDownloadProgress?: boolean; // let fastembed print its one-time download progress\n onUnavailable?: (reason: EmbedUnavailable) => void; // called (not thrown) when it can't load\n}\n\n/** The embedding model id in effect (explicit override → default). */\nexport function resolveEmbedModel(model?: string): string {\n return model ?? 'bge-small-en-v1.5';\n}\n\n/**\n * The **central, per-user** model cache — downloaded once per machine and shared\n * across every repo/folder (devs have many repos; the ~tens-of-MB model should\n * not re-download per project). Uses the XDG standard:\n * `$XDG_CACHE_HOME/vibgrate/models` (or `~/.cache/vibgrate/models`); relocate via\n * the standard `XDG_CACHE_HOME`. NB: fastembed's own default is the relative\n * `./local_cache`, i.e. per-CWD — which we override.\n */\nexport function modelCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'models');\n}\n\n/** A machine-global marker written once the model has loaded successfully. */\nfunction modelReadyMarker(modelId: string): string {\n return path.join(modelCacheDir(), `.ready-${safe(modelId)}`);\n}\n\n/**\n * Whether the embedding model is already present on this machine (loaded at least\n * once), so it can be used with **no network**. Lets the background warm-up\n * trigger only when it won't surprise-download.\n */\nexport function isModelReady(modelId = resolveEmbedModel()): boolean {\n return fs.existsSync(modelReadyMarker(modelId));\n}\n\n/**\n * A calm, specific, actionable one-liner for why semantic isn't available right\n * now — built to reassure (lexical still works) and inform, never to alarm. No\n * stack traces, no scary words; always names the off switch and the fix.\n */\nexport function unavailableMessage(reason: EmbedUnavailable): string {\n switch (reason) {\n case 'no-permission':\n return `semantic search couldn't write its model cache at ${modelCacheDir()} — using fast lexical search instead. Relocate it with the standard XDG_CACHE_HOME, or run with --local to stay lexical quietly. (No admin/sudo is ever needed — the cache lives in your home folder.)`;\n case 'download-failed':\n return `the semantic model isn't downloaded yet and couldn't be fetched (offline?) — using fast lexical search. It'll try again next time; run with --local to keep lexical without retrying.`;\n case 'not-installed':\n return `the optional semantic backend isn't available here — using fast lexical search.`;\n case 'init-failed':\n default:\n return `the semantic model couldn't load — using fast lexical search.`;\n }\n}\n\nexport interface ModelCacheInfo {\n dir: string;\n present: boolean;\n bytes: number;\n}\n\n/** Where the shared model lives, whether it's present, and how big it is. */\nexport function modelCacheInfo(modelId = resolveEmbedModel()): ModelCacheInfo {\n const dir = modelCacheDir();\n return { dir, present: isModelReady(modelId) || fs.existsSync(dir), bytes: dirSize(dir) };\n}\n\n/** Remove the shared, re-downloadable model from the central cache. Returns bytes freed. */\nexport function clearModelCache(): number {\n const dir = modelCacheDir();\n const bytes = dirSize(dir);\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n return bytes;\n}\n\nfunction dirSize(dir: string): number {\n let total = 0;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) total += dirSize(p);\n else {\n try {\n total += fs.statSync(p).size;\n } catch {\n /* skip unreadable */\n }\n }\n }\n return total;\n}\n\nfunction isPermissionError(e: unknown): boolean {\n const code = (e as NodeJS.ErrnoException | undefined)?.code;\n return code === 'EACCES' || code === 'EPERM' || code === 'EROFS';\n}\n\n/**\n * Whether this repo already has a cached vector set for `modelId` — i.e. semantic\n * search has run here before, so the next run is fast (no first-use download/embed).\n * Lets `ask` show the one-time setup note only when it's actually warranted.\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n return fs.existsSync(path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`));\n}\n\n/**\n * Try to load the optional local embedding backend. Returns null (→ caller falls\n * back to lexical) when running `--local`, when the dependency isn't installed,\n * or when the model can't initialize.\n */\nexport async function loadEmbedder(options: LoadEmbedderOptions = {}): Promise<Embedder | null> {\n // `--local` forces the deterministic lexical floor with no model load/download\n // (air-gapped guarantee; also how tests stay offline).\n if (options.local) return null;\n const modelId = resolveEmbedModel(options.model);\n // noDownload (used by the background warm-up): never fetch — bail if not cached.\n if (options.noDownload && !isModelReady(modelId)) return null;\n const fail = (reason: EmbedUnavailable): null => {\n options.onUnavailable?.(reason);\n return null;\n };\n\n // Lazy, optional dependency (native ONNX): loaded only for `vg ask`/`embed`,\n // never by build/verify, so the graph artifact stays deterministic.\n const mod: any = await importEmbedBackend();\n if (!mod?.FlagEmbedding) return fail('not-installed');\n\n const cache = modelCacheDir(); // central, shared across all repos\n try {\n fs.mkdirSync(cache, { recursive: true });\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'init-failed');\n }\n\n try {\n // First use fetches the model. A refused connection fails fast, but a\n // black-holing proxy (common on corporate networks) would hang the first\n // `vg ask` / MCP query_graph forever — bound the wait and fall back to\n // lexical instead. Cached loads are local disk and get the same generous\n // ceiling without ever hitting it.\n const model: any = await withTimeout(\n mod.FlagEmbedding.init({\n model: mapModel(mod, modelId),\n cacheDir: cache,\n showDownloadProgress: options.showDownloadProgress ?? false,\n }) as Promise<unknown>,\n embedInitTimeoutMs(),\n 'embedding model init timed out',\n );\n // Record machine-global readiness so future builds can warm up offline.\n try {\n fs.writeFileSync(modelReadyMarker(modelId), new Date(0).toISOString());\n } catch {\n /* marker is best-effort */\n }\n return {\n id: modelId,\n async embed(texts) {\n const out: number[][] = [];\n for await (const batch of model.embed(texts, 64)) {\n for (const v of batch) out.push(Array.from(v as ArrayLike<number>));\n }\n return out;\n },\n async embedQuery(text) {\n const v = await model.queryEmbed(text);\n return Array.from(v as ArrayLike<number>);\n },\n };\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'download-failed');\n }\n}\n\n/**\n * Import the optional native backend. A host can supply it out-of-tree via\n * `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules` contains\n * `fastembed`. Editor integrations use this when their bundled engine ships\n * without the native optional dependency (the VS Code extension installs it\n * into its own storage on consent); the host dir wins over this package's own\n * dependency tree so the copy the user consented to is the one that loads.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<any> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n const mod: any = await import(pathToFileURL(req.resolve('fastembed')).href);\n // A CJS entry imported over ESM may nest its exports under `default`.\n const resolved = mod?.FlagEmbedding ? mod : mod?.default;\n if (resolved?.FlagEmbedding) return resolved;\n } catch {\n /* fall through to normal resolution */\n }\n }\n return await import('fastembed' as string).catch(() => null);\n}\n\n/** Ceiling for the one-time model fetch/init; override via VG_EMBED_TIMEOUT_MS. */\nfunction embedInitTimeoutMs(): number {\n const n = Number(process.env.VG_EMBED_TIMEOUT_MS);\n return Number.isFinite(n) && n > 0 ? n : 60_000;\n}\n\n/** Reject `promise` if it hasn't settled within `ms` (the work itself is not cancelled). */\nexport async function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), ms);\n timer.unref?.();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction mapModel(mod: any, id: string): unknown {\n const m = mod.EmbeddingModel ?? {};\n if (/bge-small/i.test(id)) return m.BGESmallENV15 ?? m.BGESmallEN ?? id;\n if (/bge-base/i.test(id)) return m.BGEBaseENV15 ?? id;\n if (/all-minilm/i.test(id)) return m.AllMiniLML6V2 ?? id;\n return id;\n}\n\n/** Path segments that carry no semantic signal — dropped from embed context. */\nconst PATH_NOISE = new Set([\n 'src', 'app', 'apps', 'lib', 'libs', 'dist', 'build', 'out', 'index', 'main',\n 'packages', 'pkg', 'test', 'tests', '__tests__', 'spec', 'node_modules', 'internal',\n 'com', 'example', 'demo', 'java', 'net', 'org', 'www',\n]);\n\n/** Meaningful path context for a node: a couple of parent dirs + the filename stem. */\nfunction pathContext(file: string): string {\n const parts = file.split('/');\n const stem = (parts.pop() ?? '').replace(/\\.[^.]+$/, '');\n const dirs = parts.filter((p) => p && !PATH_NOISE.has(p.toLowerCase()));\n return [...dirs.slice(-2), stem].filter(Boolean).join(' ');\n}\n\n/**\n * The text we embed for a node. Alongside identity + signature we add the\n * strongest available signal — the node's **doc-comment / docstring** summary —\n * plus lightweight context already on the graph (file-path words, area label), so\n * a tersely-named symbol (`Table`, `NotificationJob`) a concept query can reach.\n * Only the short, truncated doc summary is used (captured at build time); no full\n * file bodies, so the graph artifact stays deterministic.\n */\nexport function nodeEmbedText(node: GraphNode, areaLabel?: string): string {\n return [node.qualifiedName, node.kind, node.signature ?? '', node.doc ?? '', pathContext(node.file), areaLabel ?? '']\n .filter(Boolean)\n .join(' ');\n}\n\nexport function cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\ninterface EmbedCache {\n model: string;\n entries: Record<string, { hash: string; vec: number[] }>;\n}\n\n/** Reports embedding progress: how many of `total` nodes are done so far. */\nexport type EmbedProgress = (done: number, total: number) => void;\n\n/** Nodes embedded per chunk — bounds memory and gives progress granularity. */\nconst EMBED_CHUNK = 256;\n/** Min gap between incremental cache writes (ms) — caps IO on big repos. */\nconst CACHE_WRITE_INTERVAL_MS = 1500;\n\nfunction vectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/**\n * How many searchable nodes still need embedding for `modelId` — cheap (hashes\n * the embed-text, reads only the cache; never loads the model). Lets the embed\n * command / background warm-up exit instantly when nothing changed.\n */\nexport function countPending(graph: VgGraph, root: string, modelId: string): number {\n const entries = readCacheEntries(vectorCachePath(root, modelId), modelId);\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n let pending = 0;\n for (const n of graph.nodes) {\n if (n.kind === 'file' || n.kind === 'external') continue;\n const h = hashString(nodeEmbedText(n, areaLabel.get(n.area)));\n const cached = entries[n.id];\n if (!cached || cached.hash !== h) pending++;\n }\n return pending;\n}\n\nfunction readCacheEntries(file: string, modelId: string): EmbedCache['entries'] {\n if (!fs.existsSync(file)) return {};\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) return loaded.entries;\n } catch {\n /* treat as empty */\n }\n return {};\n}\n\n// Single-writer lock (shared helper — see ./lock.ts) so a foreground `ask`\n// and a background `embed` never both embed the same repo at once (which\n// would race on the cache file).\n\n/**\n * Node embeddings for the searchable (non-file/external) nodes, cache-backed:\n * only nodes whose embed-text changed are re-embedded. The first run embeds in\n * chunks, **persists the cache incrementally** (so an interrupted/timed-out run\n * resumes instead of wasting the work), and reports progress via `onProgress`.\n */\nexport async function getNodeEmbeddings(\n graph: VgGraph,\n embedder: Embedder,\n root: string,\n onProgress?: EmbedProgress,\n): Promise<Map<string, number[]>> {\n const file = vectorCachePath(root, embedder.id);\n let cache: EmbedCache = { model: embedder.id, entries: {} };\n if (fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === embedder.id && loaded.entries) cache = loaded;\n } catch {\n /* rebuild */\n }\n }\n\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n const targets = graph.nodes.filter((n) => n.kind !== 'file' && n.kind !== 'external');\n const toEmbed: { id: string; text: string; hash: string }[] = [];\n const vectors = new Map<string, number[]>();\n for (const n of targets) {\n const text = nodeEmbedText(n, areaLabel.get(n.area));\n const h = hashString(text);\n const cached = cache.entries[n.id];\n if (cached && cached.hash === h) vectors.set(n.id, cached.vec);\n else toEmbed.push({ id: n.id, text, hash: h });\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(cache));\n fs.renameSync(tmp, file);\n } catch {\n /* cache write best-effort */\n }\n };\n\n if (toEmbed.length) {\n // Single-writer: if another process (e.g. a background warm-up) is already\n // embedding this repo, don't double-work or race the cache — return what's\n // cached so far (lexical floor still applies). It will be complete next run.\n const lock = `${file}.lock`;\n if (!acquireLock(lock)) return vectors;\n try {\n onProgress?.(0, toEmbed.length);\n let lastWrite = Date.now();\n for (let i = 0; i < toEmbed.length; i += EMBED_CHUNK) {\n const slice = toEmbed.slice(i, i + EMBED_CHUNK);\n const vecs = await embedder.embed(slice.map((t) => t.text));\n slice.forEach((t, j) => {\n const vec = vecs[j] ?? [];\n vectors.set(t.id, vec);\n cache.entries[t.id] = { hash: t.hash, vec };\n });\n onProgress?.(Math.min(i + EMBED_CHUNK, toEmbed.length), toEmbed.length);\n // Persist periodically so a crash/timeout resumes from here next run.\n if (Date.now() - lastWrite >= CACHE_WRITE_INTERVAL_MS) {\n persist();\n lastWrite = Date.now();\n }\n }\n // prune entries for nodes no longer present, then a final authoritative write\n const live = new Set(targets.map((n) => n.id));\n for (const id of Object.keys(cache.entries)) if (!live.has(id)) delete cache.entries[id];\n persist();\n } finally {\n releaseLock(lock);\n }\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n","import type { EdgeKind, GraphEdge, GraphNode, VgGraph } from '../schema.js';\n\n/** Indexes over a graph for O(1) neighbor lookups (built once per command). */\nexport class GraphIndex {\n readonly nodeById = new Map<string, GraphNode>();\n private outById = new Map<string, GraphEdge[]>();\n private inById = new Map<string, GraphEdge[]>();\n\n constructor(readonly graph: VgGraph) {\n for (const n of graph.nodes) this.nodeById.set(n.id, n);\n for (const e of graph.edges) {\n push(this.outById, e.src, e);\n push(this.inById, e.dst, e);\n }\n }\n\n out(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.outById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n in(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.inById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n node(id: string): GraphNode | undefined {\n return this.nodeById.get(id);\n }\n\n /**\n * Resolved nodes called by `id` — invocations (`call`) plus structural\n * dependency references (`references`, e.g. a constructor-injected field's\n * type), since both represent real usage a caller/impact question cares\n * about. `references` is otherwise only emitted by the precise SCIP/tsc\n * rungs and (for Java DI wiring) the heuristic rung — never a guess.\n */\n callees(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.out(id).filter(isUsageEdge), 'dst');\n }\n\n /** Resolved nodes that call or structurally reference `id`. */\n callers(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.in(id).filter(isUsageEdge), 'src');\n }\n\n private resolveTargets(edges: GraphEdge[], end: 'src' | 'dst') {\n const out: { edge: GraphEdge; node: GraphNode }[] = [];\n for (const e of edges) {\n const node = this.nodeById.get(e[end]);\n if (node) out.push({ edge: e, node });\n }\n return out;\n }\n}\n\nconst USAGE_KINDS: ReadonlySet<EdgeKind> = new Set(['call', 'references']);\nfunction isUsageEdge(e: GraphEdge): boolean {\n return USAGE_KINDS.has(e.kind);\n}\n\nfunction push(map: Map<string, GraphEdge[]>, key: string, value: GraphEdge): void {\n const list = map.get(key);\n if (list) list.push(value);\n else map.set(key, [value]);\n}\n\n/**\n * Memoized `GraphIndex`, keyed on the graph object's identity.\n *\n * The index (node-by-id + in/out adjacency) is a pure function of the graph's\n * content, and every read path rebuilds it from scratch — an O(nodes + edges)\n * pass that, on a large map, costs hundreds of milliseconds *per query*. Under\n * `vg serve` the same parsed graph object is reused across many tool calls\n * (`GraphSource` caches it by file mtime and only replaces the reference when\n * `graph.json` actually changes), so rebuilding the index on every call is pure\n * waste. Keying a `WeakMap` on that object identity builds the index once and\n * reuses it until the file is rebuilt — at which point `GraphSource` hands back a\n * *new* object, this map misses, and the stale index is collected with the old\n * graph. Correct and stale-safe by construction: a different graph is a\n * different object, so there is no cross-graph reuse and nothing to invalidate.\n *\n * `GraphIndex` is read-only (no method mutates its maps), so sharing one\n * instance across callers is safe.\n */\nconst INDEX_CACHE = new WeakMap<VgGraph, GraphIndex>();\n\nexport function indexFor(graph: VgGraph): GraphIndex {\n let idx = INDEX_CACHE.get(graph);\n if (!idx) {\n idx = new GraphIndex(graph);\n INDEX_CACHE.set(graph, idx);\n }\n return idx;\n}\n","import { indexFor, type GraphIndex } from './relations.js';\nimport { cosine, type Embedder } from './embeddings.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Deterministic retrieval for `vg ask` (VG-CLI-SPEC §3.2).\n *\n * Builds a structured, fact-annotated, budget-bounded context block for a\n * question — designed to drop straight into an assistant's context. The default\n * is deterministic lexical+structural retrieval (identifier/term matching with\n * morphological prefix-fuzzing, ranked by importance). `--semantic`/`--deep` adds\n * a hybrid local-embedding pass (`queryGraphSemantic`) that surfaces conceptually\n * related code even when no word is shared — still no API key.\n */\n\nexport interface QueryOptions {\n budget?: number; // approx token budget for the context block (default 2000)\n limit?: number; // max seed matches to expand (default 12)\n}\n\nexport interface QueryMatch {\n node: GraphNode;\n score: number;\n why: string;\n}\n\nexport interface QueryResult {\n question: string;\n matches: QueryMatch[];\n context: string;\n tokensEstimate: number;\n}\n\nconst STOPWORDS = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'to', 'of', 'in', 'on', 'for', 'and', 'or',\n 'where', 'what', 'which', 'how', 'do', 'does', 'did', 'i', 'we', 'it', 'this', 'that', 'with',\n 'when', 'who', 'why', 'can', 'should', 'my', 'our', 'you', 'your', 'from', 'by', 'at', 'as',\n // Discovery-question scaffolding: words a caller uses to FRAME the ask\n // (\"find the code responsible for X\", \"I need to modify X, where do I\n // start?\", \"explain how X works in this codebase\") rather than to name the\n // target. Left in, these compete on equal footing with the real identifier\n // terms and can outrank it outright — e.g. \"find the code responsible for\n // deleteAsync\" let \"find\" alone drag in every FindByIdAsync/FindAll method\n // in the repo, none of them the target (VG-LOCATE-FAILURE-ANALYSIS.md).\n 'find', 'code', 'responsible', 'need', 'modify', 'me',\n 'implementation', 'explain', 'works', 'codebase', 'contains', 'file',\n]);\n\nexport function queryGraph(graph: VgGraph, question: string, options: QueryOptions = {}): QueryResult {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const terms = tokenize(question);\n const weightOf = termWeights(graph, terms);\n const index = indexFor(graph);\n\n const scored: QueryMatch[] = [];\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, terms, weightOf);\n if (score > 0) scored.push({ node, score: round(score * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);\n\n return { question, matches: seeds, context, tokensEstimate };\n}\n\nexport interface SemanticQueryOptions extends QueryOptions {\n embedder: Embedder;\n /** Precomputed node vectors (from getNodeEmbeddings); falls back to lexical for nodes without one. */\n nodeVectors: Map<string, number[]>;\n}\n\n/**\n * Hybrid lexical + local-embedding retrieval. Blends the normalized lexical score\n * with cosine similarity to the query embedding (50/50), so a question like\n * \"where do we handle auth failures?\" can surface `verify_token` even with no\n * shared identifier. Deterministic given the same model + cached vectors;\n * embeddings live only in the cache, never in `graph.json`.\n */\nexport async function queryGraphSemantic(\n graph: VgGraph,\n question: string,\n options: SemanticQueryOptions,\n): Promise<QueryResult> {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const terms = tokenize(question);\n const weightOf = termWeights(graph, terms);\n const index = indexFor(graph);\n const queryVec = await options.embedder.embedQuery(question);\n\n // Raw lexical scores (pre-importance) for normalization.\n const lexRaw = new Map<string, number>();\n let lexMax = 0;\n const whyById = new Map<string, string>();\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, terms, weightOf);\n lexRaw.set(node.id, score);\n whyById.set(node.id, why);\n if (score > lexMax) lexMax = score;\n }\n\n const scored: QueryMatch[] = [];\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const lexNorm = lexMax > 0 ? (lexRaw.get(node.id) ?? 0) / lexMax : 0;\n const vec = options.nodeVectors.get(node.id);\n const sem = vec ? Math.max(0, cosine(queryVec, vec)) : 0;\n const hybrid = 0.5 * lexNorm + 0.5 * sem;\n if (hybrid <= 0) continue;\n const lexWhy = whyById.get(node.id);\n const why = lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : 'weak match');\n scored.push({ node, score: round(hybrid * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget);\n return { question, matches: seeds, context, tokensEstimate };\n}\n\n/**\n * Split on anything that isn't a Unicode letter/number (`\\p{L}\\p{N}`, not the\n * ASCII-only `[a-z0-9]`) so identifiers in non-Latin scripts (Japanese,\n * Cyrillic, ...) survive tokenization instead of vanishing entirely — the\n * ASCII-only split treated every character of e.g. `名前` as a separator,\n * producing zero terms and a guaranteed empty result for any question about\n * it (VG-LOCATE-FAILURE-ANALYSIS.md). Length floor is 1, not 2: a single\n * non-stopword letter/digit is still the whole identifier when that's genuinely\n * the symbol's name (adversarial fixtures deliberately use bare `f`/`x`/`h`\n * names to stress this) — STOPWORDS already screens out short function words.\n */\nfunction tokenize(q: string): string[] {\n return [\n ...new Set(\n q\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length >= 1 && !STOPWORDS.has(t)),\n ),\n ];\n}\n\nfunction scoreNode(node: GraphNode, terms: string[], weightOf: (t: string) => number = () => 1): { score: number; why: string } {\n let score = 0;\n const hits: string[] = [];\n const name = node.name.toLowerCase();\n const qn = node.qualifiedName.toLowerCase();\n const file = node.file.toLowerCase();\n // Split the ORIGINAL name on camelCase / snake_case, then lowercase the parts\n // (splitting must see the capitals, so it happens before lowercasing).\n const nameParts = identifierParts(node.name);\n for (const t of terms) {\n // Each term's contribution is weighted by its specificity (IDF over symbol\n // names): a match on a distinctive term (\"toComparable\", \"layoutFor\") counts\n // for more than a match on a term shared by hundreds of symbols (\"code\",\n // \"get\", \"run\"). Without this, an incidental exact-name hit on a common word\n // in a natural-language question outranked the conceptually-correct symbol,\n // and importance weighting amplified the wrong hit (VG-NAVIGATION trace).\n const w = weightOf(t);\n if (name === t) {\n score += 10 * w;\n hits.push(t);\n } else if (nameParts.has(t)) {\n score += 6 * w;\n hits.push(t);\n } else if (name.includes(t)) {\n score += 4 * w;\n hits.push(t);\n } else if (qn.includes(t)) {\n score += 3 * w;\n hits.push(t);\n } else if (fuzzyPartMatch(t, nameParts)) {\n // Morphological / subword match: \"authentication\" ↔ \"authenticate\"\n // (shared prefix), so lexical ask survives word-form differences without\n // a model. The semantic path handles non-shared-root synonyms.\n score += 2 * w;\n hits.push(`~${t}`);\n } else if (file.includes(t)) {\n score += 1 * w;\n hits.push(t);\n }\n }\n return { score, why: hits.length ? `matched: ${hits.join(', ')}` : '' };\n}\n\n/**\n * Importance is a mild tiebreaker, not a doubling. The old `1 + importance`\n * let a hub (importance→1) double its score and outrank a stronger textual\n * match on the actual target; at 0.4 a top hub adds at most 40%, enough to\n * break genuine ties without overriding term evidence.\n */\nconst IMPORTANCE_WEIGHT = 0.4;\n\n/**\n * Per-term specificity weights (IDF) for one question, computed over the graph's\n * symbol-name vocabulary: `ln((N+1)/(df+1)) + 1`, clamped to a sane band. A term\n * that appears in one symbol name is highly discriminating; one that appears in\n * hundreds (\"get\", \"code\", \"run\", \"handler\") is near-noise. Clamped so a term\n * matching nothing (huge idf, but it scores 0 anyway) or everything can't\n * distort the scale. Cost is one O(nodes) pass, dwarfed by the scoring loop.\n */\nfunction termWeights(graph: VgGraph, terms: string[]): (t: string) => number {\n if (terms.length === 0) return () => 1;\n const df = new Map<string, number>();\n let n = 0;\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n n++;\n const name = node.name.toLowerCase();\n const parts = identifierParts(node.name);\n for (const t of terms) {\n if (parts.has(t) || name.includes(t)) df.set(t, (df.get(t) ?? 0) + 1);\n }\n }\n const w = new Map<string, number>();\n for (const t of terms) {\n const idf = Math.log((n + 1) / ((df.get(t) ?? 0) + 1)) + 1;\n // Ceiling of 8 (vs a natural df≈40 idf ≈ 5.4) keeps genuinely rare terms\n // dominant while a term matching nothing/only a file path can't distort.\n w.set(t, Math.max(0.5, Math.min(8, idf)));\n }\n return (t: string) => w.get(t) ?? 1;\n}\n\n/**\n * camelCase / snake_case / kebab split of an identifier → lowercased parts.\n * The separator alternative is Unicode-letter-aware (`\\p{L}\\p{N}`, not\n * ASCII-only `a-zA-Z0-9`) so non-Latin identifiers split on punctuation\n * without losing every character to it; the camelCase boundary lookaround\n * stays ASCII-only since upper/lowercase casing is itself an ASCII-script\n * concept — scripts without case simply never trigger it and fall through to\n * the separator split.\n */\nexport function identifierParts(name: string): Set<string> {\n return new Set(\n name\n .split(/[^\\p{L}\\p{N}]+|(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/u)\n .filter(Boolean)\n .map((s) => s.toLowerCase()),\n );\n}\n\n/** A term fuzzily matches a part if they share a long-enough prefix (same root). */\nfunction fuzzyPartMatch(term: string, parts: Set<string>): boolean {\n for (const part of parts) {\n const shared = sharedPrefixLen(term, part);\n if (shared >= 5 && shared >= 0.6 * Math.min(term.length, part.length)) return true;\n }\n return false;\n}\n\nfunction sharedPrefixLen(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[i] === b[i]) i++;\n return i;\n}\n\nfunction buildContext(\n graph: VgGraph,\n index: GraphIndex,\n question: string,\n seeds: QueryMatch[],\n budget: number,\n): { context: string; tokensEstimate: number } {\n const lines: string[] = [];\n lines.push(`# Context for: ${question}`);\n lines.push('');\n if (seeds.length === 0) {\n lines.push('_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._');\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n }\n\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`## ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = index.callees(node.id).map((x) => x.node.qualifiedName);\n const callers = index.callers(node.id).map((x) => x.node.qualifiedName);\n if (callees.length) block.push(`calls: ${unique(callees).slice(0, 8).join(', ')}`);\n if (callers.length) block.push(`called by: ${unique(callers).slice(0, 8).join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)} · area #${node.area}${node.isHub ? ' · hub' : ''} · ${why}`);\n block.push('');\n\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 2) break;\n lines.push(...block);\n }\n\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n}\n\nfunction unique(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction estimateTokens(text: string): number {\n // ~4 chars per token, the standard rough estimate.\n return Math.ceil(text.length / 4);\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n","import { indexFor } from './relations.js';\nimport type { EdgeKind, VgGraph } from '../schema.js';\n\n/**\n * Deterministic reverse-reachability impact analysis (VG-CLI-SPEC §3.5).\n *\n * \"What breaks if `<node>` changes\" = everything that (transitively) depends on\n * it: its callers, importers, and subtypes. We BFS *backwards* along dependency\n * edges, bounded by depth, with a confidence that decays with distance (direct =\n * high; transitive lower; ambiguous/dynamic edges already carry lower edge\n * confidence which we fold in). Test-impact selection (`--tests`) lands in\n * Phase 2; this is the structural blast radius.\n */\n\nconst DEPEND_EDGES = new Set<EdgeKind>(['call', 'import', 'extends', 'implements', 'references']);\n\nexport interface ImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface ImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: ImpactItem[];\n direct: number;\n transitive: number;\n /** Lowest edge confidence encountered (e.g. a dynamic-dispatch edge). */\n minEdgeConfidence: number;\n}\n\nexport function impactOf(graph: VgGraph, rootId: string, opts: { depth?: number } = {}): ImpactResult {\n const maxDepth = Math.max(1, opts.depth ?? 4);\n const index = indexFor(graph);\n const root = index.node(rootId);\n\n const affected = new Map<string, ImpactItem>();\n let minEdgeConfidence = 1;\n\n // BFS over incoming dependency edges (dependents of the frontier).\n let frontier: { id: string; conf: number }[] = [{ id: rootId, conf: 1 }];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: { id: string; conf: number }[] = [];\n for (const { id, conf } of frontier) {\n for (const e of index.in(id)) {\n if (!DEPEND_EDGES.has(e.kind)) continue;\n minEdgeConfidence = Math.min(minEdgeConfidence, e.confidence);\n const dependentId = e.src;\n if (dependentId === rootId || affected.has(dependentId)) continue;\n const node = index.node(dependentId);\n if (!node) continue;\n const conf2 = round(conf * e.confidence * 0.9); // decay with distance\n affected.set(dependentId, {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n depth,\n confidence: conf2,\n });\n nextFrontier.push({ id: dependentId, conf: conf2 });\n }\n }\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n const items = [...affected.values()].sort(\n (a, b) => a.depth - b.depth || b.confidence - a.confidence || a.name.localeCompare(b.name),\n );\n\n return {\n root: { id: rootId, name: root?.qualifiedName ?? rootId },\n depth: maxDepth,\n affected: items,\n direct: items.filter((i) => i.depth === 1).length,\n transitive: items.filter((i) => i.depth > 1).length,\n minEdgeConfidence: round(minEdgeConfidence),\n };\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from './cache.js';\n\n/**\n * Usage-savings tracking (VG-DEVELOPMENT-PLAN §5) — local, privacy-safe, and\n * **opt-in**. We record *counts only* — never code, never the question text —\n * comparing the context tokens vg returned against a grep/read baseline estimate.\n * `vg savings` reports it with the assumptions shown; figures are labelled\n * estimates, never a hero number.\n *\n * Each entry also carries which path served the call (`source`: an MCP tool call\n * vs a `vg <subcommand>` CLI invocation) and, when known, a coarse `client` label\n * (the AI on the other end). That powers the command-vs-MCP split and the\n * per-client breakdown in `vg savings`, and is the basis for the opt-in\n * `vg serve --share-stats` upload (see ./stats-share.ts). Nothing here leaves the\n * machine unless the operator explicitly enables sharing.\n */\n\nconst LEDGER = 'savings.jsonl';\n// A conservative, documented estimate: tokens an agent reads per file it opens.\nexport const PER_FILE_TOKENS = 400;\n\n/** The tools whose grep/read token baseline the savings summary is computed from.\n * search_symbols belongs here: it is the direct grep replacement (the server\n * instructions steer agents to it INSTEAD of grep), yet it used to contribute\n * zero to the estimate — on search-heavy sessions most of the real saving went\n * uncounted. Its baseline is the same measure as query_graph's: the distinct\n * files its matches point at, at PER_FILE_TOKENS each. */\nexport const SAVINGS_TOOLS = new Set(['query_graph', 'get_node', 'search_symbols']);\n\n/**\n * How a navigation call reached the map:\n * - `mcp` — a tool call over the local `vg serve` MCP server;\n * - `cli` — a `vg <subcommand>` invocation that identified itself with `--client`.\n * Both are recorded into one ledger under a shared tool vocabulary (CLI\n * subcommands are normalised to their MCP tool names via CLI_TOOL_ALIASES), so\n * `(tool, source)` is the command-vs-MCP split and the token math stays unified.\n * Absent on ledger lines written before sources existed → read as `mcp` (the\n * only path that recorded then).\n */\nexport type Source = 'mcp' | 'cli';\n\n/**\n * Canonical tool name a CLI navigation subcommand maps to — the same vocabulary\n * the MCP tools use, so a `vg ask --client=claude` and an MCP `query_graph` call\n * land on one row distinguished only by `source`. A subcommand with no MCP twin\n * (e.g. `tree`) keeps its own name.\n */\nexport const CLI_TOOL_ALIASES: Readonly<Record<string, string>> = {\n ask: 'query_graph',\n show: 'get_node',\n impact: 'impact_of',\n path: 'find_path',\n hubs: 'list_hubs',\n areas: 'list_areas',\n tree: 'tree',\n};\n\n/**\n * Normalise a free-form client name (from `--client` or the MCP `initialize`\n * handshake) to a short, bounded, non-PII token: lowercase, `[a-z0-9._-]` only,\n * ≤ 40 chars. Never carries arbitrary user input into the ledger or an upload —\n * it is a coarse client label (e.g. `claude`, `cursor`, `cline`), not identity.\n * Returns `'unknown'` when nothing usable is provided.\n */\nexport function sanitizeClient(name: string | undefined | null): string {\n if (typeof name !== 'string') return 'unknown';\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || 'unknown';\n}\n\n/**\n * Outcome of a recorded navigation call:\n * - `complete` — returned results, with nothing capped or paginated;\n * - `partial` — returned results, but more were available/truncated;\n * - `miss` — returned no result (no match, not-found, not-connected).\n */\nexport type Outcome = 'complete' | 'partial' | 'miss';\n\nexport interface SavingEntry {\n ts: number; // epoch ms (runtime ledger state, not part of any artifact)\n tool: string;\n // Optional for back-compat with ledger lines written before outcomes existed;\n // an absent value is read as `complete` (those lines only recorded hits).\n outcome?: Outcome;\n vgTokens: number;\n baselineTokens: number;\n // Optional for back-compat: absent `source` reads as `mcp`. `client` is a\n // sanitized coarse label (see sanitizeClient) or absent when unidentified.\n source?: Source;\n client?: string;\n // The model that made the call, for per-model savings auditing. `provider` is\n // a coarse provider label (e.g. `anthropic`, `ollama`), `model` the sanitized\n // model slug. VG Code sets both so `vg savings` can break usage down per model.\n // Absent on lines from callers that don't identify a model.\n provider?: string;\n model?: string;\n // Wall time of the call, ms. Optional: absent on lines written before timing\n // existed (and on CLI-sourced lines) — absent means \"not measured\", never 0.\n ms?: number;\n}\n\n/**\n * Normalise a model slug to a bounded, non-PII token — like {@link sanitizeClient}\n * but keeping the `/` and `:` that model ids use (`anthropic/claude-3.5-sonnet`,\n * `qwen2.5-coder:7b`). Returns undefined when nothing usable is given.\n */\nexport function sanitizeModelId(name: string | undefined | null): string | undefined {\n if (typeof name !== 'string') return undefined;\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._:/-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60);\n return cleaned || undefined;\n}\n\n/**\n * Record a CLI navigation call (`vg <subcommand> --client=<ai>`) into the same\n * local ledger the MCP path uses. Only ever called when the caller passed\n * `--client` — i.e. an AI host explicitly identified itself — so a human's bare\n * `vg ask` still records nothing. Counts only; never the question or code.\n */\nexport function recordCliCall(\n root: string,\n entry: { tool: string; client?: string; provider?: string; model?: string; outcome: Outcome; vgTokens?: number; baselineFiles?: number },\n now: number,\n): void {\n recordSaving(\n root,\n {\n tool: entry.tool,\n source: 'cli',\n client: sanitizeClient(entry.client),\n provider: entry.provider ? sanitizeClient(entry.provider) : undefined,\n model: sanitizeModelId(entry.model),\n outcome: entry.outcome,\n vgTokens: entry.vgTokens ?? 0,\n baselineTokens: (entry.baselineFiles ?? 0) * PER_FILE_TOKENS,\n },\n now,\n );\n}\n\n/**\n * Absolute path of the local usage ledger for this repo. Exported so the serve\n * status display can tail it live (mcp/ledger-tail.ts) — the file itself stays\n * local-only (GUARDRAILS §3.4; upload is the separate opt-in stats-share path).\n */\nexport function savingsLedgerPath(root: string): string {\n return path.join(cacheDir(root), LEDGER);\n}\n\nfunction ledgerPath(root: string): string {\n return savingsLedgerPath(root);\n}\n\n/** Whether a savings ledger exists for this repo (i.e. `vg serve --savings` has recorded). */\nexport function savingsRecorded(root: string): boolean {\n return fs.existsSync(ledgerPath(root));\n}\n\n/**\n * Delete the recorded usage data for this repo: the ledger itself plus the\n * stats-share state that indexes into it (a byte offset into the ledger and the\n * random per-install id) — a stale offset against a fresh ledger would silently\n * skip new entries, and clearing \"my data\" should also reset the id. Everything\n * removed lives under `.vibgrate/cache/`; nothing else is touched. Returns\n * whether a ledger existed.\n */\nexport function clearSavings(root: string): boolean {\n const file = ledgerPath(root);\n const existed = fs.existsSync(file);\n fs.rmSync(file, { force: true });\n fs.rmSync(path.join(cacheDir(root), 'stats-share.json'), { force: true });\n return existed;\n}\n\nexport function recordSaving(root: string, entry: Omit<SavingEntry, 'ts'>, now: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const line = JSON.stringify({ ts: now, ...entry });\n fs.appendFileSync(ledgerPath(root), line + '\\n');\n } catch {\n /* never let telemetry break a tool call */\n }\n}\n\nexport interface SavingsReport {\n enabled: boolean;\n days: number;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n ratio: number;\n estCostVg: number;\n estCostBaseline: number;\n saved: number;\n rateLabel: string;\n}\n\n// Published-style input rate ($/1M tokens), shipped with the CLI. Labelled\n// estimate; the user can pass their own model rate.\nconst DEFAULT_RATE_PER_M = 3.0; // e.g. a mid-tier model input rate\nconst DEFAULT_RATE_LABEL = 'input @ $3/1M';\n\nexport function readSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): SavingsReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n let queries = 0;\n let vgTokens = 0;\n let baselineTokens = 0;\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n // The token-savings figures compare only the tools with a meaningful\n // grep/read baseline; the full per-command breakdown lives in readUsage.\n if (!SAVINGS_TOOLS.has(e.tool)) continue;\n queries++;\n vgTokens += e.vgTokens;\n baselineTokens += e.baselineTokens;\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const estCostVg = (vgTokens / 1e6) * ratePerM;\n const estCostBaseline = (baselineTokens / 1e6) * ratePerM;\n return {\n enabled: savingsRecorded(root),\n days,\n queries,\n vgTokens,\n baselineTokens,\n ratio: vgTokens > 0 ? Math.round((baselineTokens / vgTokens) * 100) / 100 : 0,\n estCostVg: round2(estCostVg),\n estCostBaseline: round2(estCostBaseline),\n saved: round2(estCostBaseline - estCostVg),\n rateLabel: DEFAULT_RATE_LABEL,\n };\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\n/** Token + cost savings attributed to one model (VG Code per-model auditing). */\nexport interface ModelSaving {\n /** `provider/model`, the ledger's per-model key. */\n key: string;\n provider: string;\n model: string;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n saved: number;\n}\n\n/**\n * Per-model breakdown of the token-savings figures — the basis of \"full savings\n * auditing per model\". Only entries that carry a `model` and are savings-baseline\n * tools contribute, so it lines up with the headline `readSavings` totals.\n * Sorted by dollars saved (desc), then key.\n */\nexport function readModelSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): ModelSaving[] {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byModel = new Map<string, { provider: string; model: string; queries: number; vg: number; base: number }>();\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff || !e.model || !SAVINGS_TOOLS.has(e.tool)) continue;\n const provider = e.provider ?? 'unknown';\n const key = `${provider}/${e.model}`;\n const row = byModel.get(key) ?? { provider, model: e.model, queries: 0, vg: 0, base: 0 };\n row.queries++;\n row.vg += e.vgTokens;\n row.base += e.baselineTokens;\n byModel.set(key, row);\n } catch {\n /* skip corrupt line */\n }\n }\n }\n return [...byModel.entries()]\n .map(([key, r]) => ({\n key,\n provider: r.provider,\n model: r.model,\n queries: r.queries,\n vgTokens: r.vg,\n baselineTokens: r.base,\n saved: round2(((r.base - r.vg) / 1e6) * ratePerM),\n }))\n .sort((a, b) => b.saved - a.saved || a.key.localeCompare(b.key));\n}\n\n/** Per-command usage stats over the ledger window (all recorded tools). */\nexport interface CommandStat {\n tool: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** (complete + partial) / calls, as a whole-number percentage. */\n successPct: number;\n /** Mean wall time over the calls that recorded one; null when none did. */\n avgMs: number | null;\n}\n\n/** Calls attributed to one dimension value (a source, or a client). */\nexport interface DimensionStat {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n successPct: number;\n}\n\nexport interface UsageReport {\n enabled: boolean;\n days: number;\n /** One row per tool used, ordered by call count (desc), then name. */\n commands: CommandStat[];\n /** The command-vs-MCP split: calls grouped by `source` (`cli` / `mcp`). */\n sources: DimensionStat[];\n /** Which AI is calling: calls grouped by coarse `client` label. */\n clients: DimensionStat[];\n /** Column sums across all commands. */\n totals: { calls: number; complete: number; partial: number; miss: number };\n /** The mean of the per-command success percentages (each command weighted equally). */\n avgSuccessPct: number;\n}\n\ninterface OutcomeCounts {\n complete: number;\n partial: number;\n miss: number;\n}\n\n/** Turn a name→outcome-count map into sorted DimensionStat rows. */\nfunction toDimensionStats(byKey: Map<string, OutcomeCounts>): DimensionStat[] {\n return [...byKey.entries()]\n .map(([key, r]) => {\n const calls = r.complete + r.partial + r.miss;\n return {\n key,\n calls,\n complete: r.complete,\n partial: r.partial,\n miss: r.miss,\n successPct: calls ? Math.round(((r.complete + r.partial) / calls) * 100) : 0,\n };\n })\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * Per-command breakdown of recorded navigation calls: how often each tool was\n * used and how those calls resolved (complete / partial / miss), plus column\n * totals and the average success rate. Complements the token-savings summary —\n * this counts *every* recorded tool, not just the grep-baseline ones.\n */\nexport function readUsage(root: string, days: number, now: number): UsageReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byTool = new Map<string, OutcomeCounts>();\n const bySource = new Map<string, OutcomeCounts>();\n const byClient = new Map<string, OutcomeCounts>();\n // Per-tool timing over the entries that recorded a duration (older ledger\n // lines and CLI-sourced calls carry none — \"not measured\", never zero).\n const msByTool = new Map<string, { sum: number; n: number }>();\n const bump = (m: Map<string, OutcomeCounts>, key: string, outcome: Outcome): void => {\n const row = m.get(key) ?? { complete: 0, partial: 0, miss: 0 };\n row[outcome]++;\n m.set(key, row);\n };\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n const outcome: Outcome = e.outcome ?? 'complete';\n // Back-compat: lines written before these dims existed are MCP calls\n // from an unidentified client.\n bump(byTool, e.tool, outcome);\n bump(bySource, e.source ?? 'mcp', outcome);\n bump(byClient, e.client ?? 'unknown', outcome);\n if (typeof e.ms === 'number' && e.ms >= 0) {\n const timing = msByTool.get(e.tool) ?? { sum: 0, n: 0 };\n timing.sum += e.ms;\n timing.n++;\n msByTool.set(e.tool, timing);\n }\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const commands: CommandStat[] = toDimensionStats(byTool).map((d) => {\n const timing = msByTool.get(d.key);\n return {\n tool: d.key,\n calls: d.calls,\n complete: d.complete,\n partial: d.partial,\n miss: d.miss,\n successPct: d.successPct,\n avgMs: timing && timing.n > 0 ? Math.round(timing.sum / timing.n) : null,\n };\n });\n const totals = commands.reduce(\n (t, c) => ({\n calls: t.calls + c.calls,\n complete: t.complete + c.complete,\n partial: t.partial + c.partial,\n miss: t.miss + c.miss,\n }),\n { calls: 0, complete: 0, partial: 0, miss: 0 },\n );\n const avgSuccessPct = commands.length\n ? Math.round(commands.reduce((s, c) => s + c.successPct, 0) / commands.length)\n : 0;\n return {\n enabled: savingsRecorded(root),\n days,\n commands,\n sources: toDimensionStats(bySource),\n clients: toDimensionStats(byClient),\n totals,\n avgSuccessPct,\n };\n}\n"]}
|
package/dist/fs-IPY4FJKH.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"fs-IPY4FJKH.js"}
|
package/dist/fs-KCABDURV.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"fs-KCABDURV.js"}
|